mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
use multiple textures to reduce latency
This commit is contained in:
parent
d98cf4f6ea
commit
c5975902ee
84
src/render.c
84
src/render.c
@ -134,42 +134,52 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
// primary surface texture
|
// primary surface texture
|
||||||
GLenum surfaceFormat = GL_LUMINANCE;
|
GLenum surfaceFormat = GL_LUMINANCE;
|
||||||
GLuint surfaceTexId = 0;
|
GLuint surfaceTexIds[2];
|
||||||
glGenTextures(1, &surfaceTexId);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, surfaceTexId);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
|
|
||||||
while (glGetError() != GL_NO_ERROR);
|
glGenTextures(2, surfaceTexIds);
|
||||||
|
|
||||||
if (paletteConvProgram)
|
int i;
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE8, tex_width, tex_height, 0, surfaceFormat = GL_LUMINANCE, GL_UNSIGNED_BYTE, 0);
|
glBindTexture(GL_TEXTURE_2D, surfaceTexIds[i]);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
if (glGetError() != GL_NO_ERROR)
|
while (glGetError() != GL_NO_ERROR);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, tex_width, tex_height, 0, surfaceFormat = GL_RED, GL_UNSIGNED_BYTE, 0);
|
|
||||||
|
|
||||||
if (glGetError() != GL_NO_ERROR)
|
if (paletteConvProgram)
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, tex_width, tex_height, 0, surfaceFormat = GL_RED, GL_UNSIGNED_BYTE, 0);
|
{
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE8, tex_width, tex_height, 0, surfaceFormat = GL_LUMINANCE, GL_UNSIGNED_BYTE, 0);
|
||||||
|
|
||||||
if (!ddraw->autorenderer && glGetError() != GL_NO_ERROR) // very slow...
|
if (glGetError() != GL_NO_ERROR)
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, tex_height, 0, surfaceFormat = GL_RED, GL_UNSIGNED_BYTE, 0);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, tex_width, tex_height, 0, surfaceFormat = GL_RED, GL_UNSIGNED_BYTE, 0);
|
||||||
|
|
||||||
|
if (glGetError() != GL_NO_ERROR)
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, tex_width, tex_height, 0, surfaceFormat = GL_RED, GL_UNSIGNED_BYTE, 0);
|
||||||
|
|
||||||
|
if (!ddraw->autorenderer && glGetError() != GL_NO_ERROR) // very slow...
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, tex_height, 0, surfaceFormat = GL_RED, GL_UNSIGNED_BYTE, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// palette texture
|
// palette texture
|
||||||
GLuint paletteTexId = 0;
|
GLuint paletteTexIds[2];
|
||||||
glGenTextures(1, &paletteTexId);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, paletteTexId);
|
glGenTextures(2, paletteTexIds);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
for (i = 0; i < 2; i++)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
{
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glBindTexture(GL_TEXTURE_2D, paletteTexIds[i]);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
glViewport(
|
glViewport(
|
||||||
ddraw->render.viewport.x, ddraw->render.viewport.y,
|
ddraw->render.viewport.x, ddraw->render.viewport.y,
|
||||||
@ -461,6 +471,8 @@ DWORD WINAPI render_main(void)
|
|||||||
scale_w = (float)ddraw->width / tex_width;
|
scale_w = (float)ddraw->width / tex_width;
|
||||||
scale_h = (float)ddraw->height / tex_height;
|
scale_h = (float)ddraw->height / tex_height;
|
||||||
|
|
||||||
|
static int texIndex = 0, palIndex = 0;
|
||||||
|
|
||||||
BOOL scaleChanged = FALSE;
|
BOOL scaleChanged = FALSE;
|
||||||
|
|
||||||
if (maxfps > 0)
|
if (maxfps > 0)
|
||||||
@ -493,16 +505,20 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
if (paletteConvProgram)
|
if (paletteConvProgram)
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, paletteTexId);
|
|
||||||
if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE))
|
if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE))
|
||||||
{
|
{
|
||||||
|
palIndex = (palIndex + 1) % 2;
|
||||||
|
glBindTexture(GL_TEXTURE_2D, paletteTexIds[palIndex]);
|
||||||
|
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
||||||
ddraw->primary->palette->data_bgr);
|
ddraw->primary->palette->data_bgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, surfaceTexId);
|
|
||||||
if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE))
|
if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE))
|
||||||
{
|
{
|
||||||
|
texIndex = (texIndex + 1) % 2;
|
||||||
|
glBindTexture(GL_TEXTURE_2D, surfaceTexIds[texIndex]);
|
||||||
|
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ddraw->width, ddraw->height, surfaceFormat, GL_UNSIGNED_BYTE,
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ddraw->width, ddraw->height, surfaceFormat, GL_UNSIGNED_BYTE,
|
||||||
ddraw->primary->surface);
|
ddraw->primary->surface);
|
||||||
}
|
}
|
||||||
@ -540,7 +556,7 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
if (!paletteConvProgram)
|
if (!paletteConvProgram)
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, surfaceTexId);
|
glBindTexture(GL_TEXTURE_2D, surfaceTexIds[texIndex]);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ddraw->width, ddraw->height, GL_RGBA, GL_UNSIGNED_BYTE, tex);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ddraw->width, ddraw->height, GL_RGBA, GL_UNSIGNED_BYTE, tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -583,9 +599,9 @@ DWORD WINAPI render_main(void)
|
|||||||
if (paletteConvProgram)
|
if (paletteConvProgram)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, surfaceTexId);
|
glBindTexture(GL_TEXTURE_2D, surfaceTexIds[texIndex]);
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, paletteTexId);
|
glBindTexture(GL_TEXTURE_2D, paletteTexIds[palIndex]);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -657,8 +673,8 @@ DWORD WINAPI render_main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, tex);
|
HeapFree(GetProcessHeap(), 0, tex);
|
||||||
glDeleteTextures(1, &surfaceTexId);
|
glDeleteTextures(2, &surfaceTexIds);
|
||||||
glDeleteTextures(1, &paletteTexId);
|
glDeleteTextures(2, &paletteTexIds);
|
||||||
|
|
||||||
if (glUseProgram)
|
if (glUseProgram)
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user