From b04dc011045891e0295eec4ea0c07aa99d0c7951 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Nov 2018 06:16:09 +0100 Subject: [PATCH] make opengl compatible with older versions than 2.0 (for 16bit games only) --- inc/opengl.h | 1 + src/opengl.c | 4 +++- src/render.c | 8 +++++--- src/surface.c | 8 ++++---- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/inc/opengl.h b/inc/opengl.h index 9d7e5c1..39961d4 100644 --- a/inc/opengl.h +++ b/inc/opengl.h @@ -50,6 +50,7 @@ extern PFNGLGETERRORPROC glGetError; extern PFNGLGETSTRINGPROC glGetString; extern PFNGLGETTEXIMAGEPROC glGetTexImage; extern PFNGLPIXELSTOREIPROC glPixelStorei; +extern PFNGLENABLEPROC glEnable; extern PFNGLCREATEPROGRAMPROC glCreateProgram; extern PFNGLDELETEPROGRAMPROC glDeleteProgram; diff --git a/src/opengl.c b/src/opengl.c index 7057f2e..7deb1b0 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -19,6 +19,7 @@ PFNGLGETERRORPROC glGetError; PFNGLGETSTRINGPROC glGetString; PFNGLGETTEXIMAGEPROC glGetTexImage; PFNGLPIXELSTOREIPROC glPixelStorei; +PFNGLENABLEPROC glEnable; PFNGLBEGINPROC glBegin; PFNGLENDPROC glEnd; @@ -121,6 +122,7 @@ BOOL OpenGL_LoadDll() glGetString = (PFNGLGETSTRINGPROC)GetProcAddress(OpenGL_hModule, "glGetString"); glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(OpenGL_hModule, "glGetTexImage"); glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(OpenGL_hModule, "glPixelStorei"); + glEnable = (PFNGLENABLEPROC)GetProcAddress(OpenGL_hModule, "glEnable"); glBegin = (PFNGLBEGINPROC)GetProcAddress(OpenGL_hModule, "glBegin"); glEnd = (PFNGLENDPROC)GetProcAddress(OpenGL_hModule, "glEnd"); @@ -131,7 +133,7 @@ BOOL OpenGL_LoadDll() return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport && glBindTexture && glGenTextures && glTexParameteri && glDeleteTextures && glTexImage2D && glDrawElements && glTexSubImage2D && glGetError && glGetString && glGetTexImage && glPixelStorei && - glBegin && glEnd && glTexCoord2f && glVertex2f; + glEnable && glBegin && glEnd && glTexCoord2f && glVertex2f; } void OpenGL_Init() diff --git a/src/render.c b/src/render.c index 886ea2e..8e895c1 100644 --- a/src/render.c +++ b/src/render.c @@ -78,7 +78,7 @@ DWORD WINAPI render_main(void) GotError = GotError || !TextureUploadTest(); GotError = GotError || !ShaderTest(); GotError = GotError || glGetError() != GL_NO_ERROR; - UseOpenGL = MainProgram && !GotError; + UseOpenGL = (MainProgram || ddraw->bpp == 16) && !GotError; Render(); @@ -552,6 +552,8 @@ static void Render() if (MainProgram) glUseProgram(MainProgram); + else if (ddraw->bpp == 16) + glEnable(GL_TEXTURE_2D); while (UseOpenGL && ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED) { @@ -689,9 +691,9 @@ static void Render() { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, PaletteTexIds[palIndex]); - } - glActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); + } if (ScaleProgram && MainProgram) { diff --git a/src/surface.c b/src/surface.c index 83ea4d0..07001df 100644 --- a/src/surface.c +++ b/src/surface.c @@ -230,10 +230,10 @@ HRESULT __stdcall ddraw_surface_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestR if (dst_w == src_w && dst_h == src_h) { unsigned char *src = - (unsigned char *)Source->surface + ((src_x + (Source->width * src_y)) * Source->lXPitch); + (unsigned char *)Source->surface + (src_x * Source->lXPitch) + (Source->lPitch * src_y); unsigned char *dst = - (unsigned char *)This->surface + ((dst_x + (This->width * dst_y)) * This->lXPitch); + (unsigned char *)This->surface + (dst_x * This->lXPitch) + (This->lPitch * dst_y); int i; for (i = 0; i < dst_h; i++) @@ -375,10 +375,10 @@ HRESULT __stdcall ddraw_surface_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_ else { unsigned char *src = - (unsigned char *)Source->surface + ((src_x + (Source->width * src_y)) * Source->lXPitch); + (unsigned char *)Source->surface + (src_x * Source->lXPitch) + (Source->lPitch * src_y); unsigned char *dst = - (unsigned char *)This->surface + ((dst_x + (This->width * dst_y)) * This->lXPitch); + (unsigned char *)This->surface + (dst_x * This->lXPitch) + (This->lPitch * dst_y); int i; for (i = 0; i < dst_h; i++)