From 1d43b112c95b86102a02675ba59765a09b24f588 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 Sep 2018 01:02:48 +0200 Subject: [PATCH] switch to gdi on failure --- inc/main.h | 2 +- inc/opengl.h | 2 ++ src/opengl.c | 10 ++++++++++ src/render.c | 13 +------------ src/render_d3d9.c | 20 ++++++++++++++++---- src/render_soft.c | 6 ++++-- 6 files changed, 34 insertions(+), 19 deletions(-) diff --git a/inc/main.h b/inc/main.h index 89d1e09..0111d92 100644 --- a/inc/main.h +++ b/inc/main.h @@ -27,7 +27,7 @@ #define WM_AUTORENDERER WM_USER+111 #define WM_WINEFULLSCREEN WM_USER+112 -extern char OpenglVersion[]; +extern BOOL ShowDriverWarning; struct IDirectDrawImpl; struct IDirectDrawImplVtbl; diff --git a/inc/opengl.h b/inc/opengl.h index 2437ba5..32e3491 100644 --- a/inc/opengl.h +++ b/inc/opengl.h @@ -77,3 +77,5 @@ extern PFNGLTEXBUFFERPROC glTexBuffer; extern BOOL OpenGL_GotVersion2; extern BOOL OpenGL_GotVersion3; + +extern char OpenGL_Version[]; diff --git a/src/opengl.c b/src/opengl.c index 6731c8f..3804ebf 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -71,6 +71,8 @@ PFNGLTEXBUFFERPROC glTexBuffer = NULL; BOOL OpenGL_GotVersion2; BOOL OpenGL_GotVersion3; +char OpenGL_Version[128]; + void OpenGL_Init() { // Program @@ -137,6 +139,14 @@ void OpenGL_Init() glTexBuffer = (PFNGLTEXBUFFERPROC)wglGetProcAddress("glTexBuffer"); char *glversion = (char *)glGetString(GL_VERSION); + if (glversion) + { + strncpy(OpenGL_Version, glversion, sizeof(OpenGL_Version)); + const char deli[2] = " "; + strtok(OpenGL_Version, deli); + } + else + OpenGL_Version[0] = '0'; OpenGL_GotVersion2 = glGetUniformLocation && glActiveTexture && glUniform1i; diff --git a/src/render.c b/src/render.c index 28aec7a..73bc750 100644 --- a/src/render.c +++ b/src/render.c @@ -24,8 +24,6 @@ #define TEXTURE_COUNT 4 -char OpenglVersion[128]; - static HGLRC OpenGLContext; static int MaxFPS; static BOOL VSyncEnabled; @@ -92,6 +90,7 @@ DWORD WINAPI render_main(void) if (!UseOpenGL) { + ShowDriverWarning = TRUE; ddraw->renderer = render_soft_main; render_soft_main(); } @@ -104,16 +103,6 @@ static HGLRC CreateContext(HDC hdc) HGLRC context = wglCreateContext(hdc); BOOL madeCurrent = context && wglMakeCurrent(hdc, context); - char *glversion = (char *)glGetString(GL_VERSION); - if (glversion) - { - strncpy(OpenglVersion, glversion, sizeof(OpenglVersion)); - const char deli[2] = " "; - strtok(OpenglVersion, deli); - } - else - OpenglVersion[0] = '0'; - if (!madeCurrent || (ddraw->autorenderer && glGetError() != GL_NO_ERROR)) { if (madeCurrent) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 6196bda..858e534 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -33,6 +33,8 @@ IDirect3DTexture9 *PaletteTex; IDirect3DPixelShader9 *PixelShader; D3DPRESENT_PARAMETERS D3dpp; +DWORD WINAPI render_soft_main(void); + static void InitDirect3D(BOOL reset) { if (reset) @@ -61,8 +63,8 @@ static void InitDirect3D(BOOL reset) float vpX = (float)ddraw->render.viewport.x; float vpY = (float)ddraw->render.viewport.y; - float vpW = (float)(ddraw->render.viewport.width + vpX); - float vpH = (float)(ddraw->render.viewport.height + vpY); + float vpW = (float)(ddraw->render.viewport.width + ddraw->render.viewport.x); + float vpH = (float)(ddraw->render.viewport.height + ddraw->render.viewport.y); typedef struct CUSTOMVERTEX { float x, y, z, rhw, u, v; } CUSTOMVERTEX; CUSTOMVERTEX vertices[] = @@ -155,11 +157,12 @@ DWORD WINAPI render_d3d9_main(void) &D3dpp, &D3ddev); - InitDirect3D(FALSE); + if (D3ddev) + InitDirect3D(FALSE); } } - while (D3d && ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED) + while (D3ddev && ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED) { #if _DEBUG static DWORD tick_fps = 0; @@ -281,5 +284,14 @@ DWORD WINAPI render_d3d9_main(void) if (hD3D9) FreeLibrary(hD3D9); + if (!D3ddev) + { + ShowDriverWarning = TRUE; + ddraw->renderer = render_soft_main; + render_soft_main(); + } + + D3ddev = NULL; + return 0; } diff --git a/src/render_soft.c b/src/render_soft.c index c486c9c..98a275d 100644 --- a/src/render_soft.c +++ b/src/render_soft.c @@ -19,7 +19,9 @@ #include "main.h" #include "surface.h" +#include "opengl.h" +BOOL ShowDriverWarning; static unsigned char getPixel(int x, int y) { @@ -55,7 +57,7 @@ DWORD WINAPI render_soft_main(void) { DWORD warningEndTick = timeGetTime() + (15 * 1000); char warningText[512] = { 0 }; - if (OpenglVersion[0]) + if (ShowDriverWarning) { if (!ddraw->windowed) PostMessage(ddraw->hWnd, WM_AUTORENDERER, 0, 0); @@ -63,7 +65,7 @@ DWORD WINAPI render_soft_main(void) _snprintf( warningText, sizeof(warningText), "-WARNING- Using slow software rendering, please update your graphics card driver (%s)", - strlen(OpenglVersion) > 10 ? "" : OpenglVersion); + strlen(OpenGL_Version) > 10 ? "" : OpenGL_Version); } else Sleep(500);