From 415f74887faba9742fddbab1a155b060f16594f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 02:17:33 +0200 Subject: [PATCH] try to avoid d3d9_release to workaround nvidia bug --- inc/render_d3d9.h | 4 +++- src/dd.c | 2 +- src/render_d3d9.c | 37 +++++++++++++++++++++++++++++-------- src/utils.c | 2 +- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index 29b8552..d95aad6 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -13,6 +13,7 @@ typedef struct D3D9RENDERER { HMODULE hmodule; D3DPRESENT_PARAMETERS params; + HWND hwnd; LPDIRECT3D9 instance; LPDIRECT3DDEVICE9 device; LPDIRECT3DVERTEXBUFFER9 vertex_buf; @@ -41,7 +42,8 @@ typedef struct _D3D9ON12_ARGS BOOL d3d9_is_available(); DWORD WINAPI d3d9_render_main(void); BOOL d3d9_create(); -BOOL d3d9_reset(); +BOOL d3d9_reset(BOOL windowed); +BOOL d3d9_release_resources(); BOOL d3d9_release(); BOOL d3d9_on_device_lost(); diff --git a/src/dd.c b/src/dd.c index 7640560..00a935e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -395,7 +395,7 @@ HRESULT dd_RestoreDisplayMode() if (g_ddraw->renderer == d3d9_render_main) { - d3d9_release(); + d3d9_reset(TRUE); } } diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 38c468c..12894df 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -36,8 +36,18 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (!d3d9_release()) - return FALSE; + if (g_d3d9.hwnd != g_ddraw->hwnd) + { + d3d9_release(); + } + else if (d3d9_release_resources() && d3d9_create_resouces() && d3d9_reset(g_ddraw->windowed)) + { + return TRUE; + } + else + { + d3d9_release(); + } if (!g_d3d9.hmodule) g_d3d9.hmodule = LoadLibrary("d3d9.dll"); @@ -73,6 +83,7 @@ BOOL d3d9_create() (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; + g_d3d9.hwnd = g_ddraw->hwnd; memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); @@ -116,17 +127,17 @@ BOOL d3d9_on_device_lost() { if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) { - return d3d9_reset(); + return d3d9_reset(g_ddraw->windowed); } return FALSE; } -BOOL d3d9_reset() +BOOL d3d9_reset(BOOL windowed) { - g_d3d9.params.Windowed = g_ddraw->windowed; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.Windowed = windowed; + g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; + g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) @@ -146,7 +157,7 @@ BOOL d3d9_reset() return FALSE; } -BOOL d3d9_release() +BOOL d3d9_release_resources() { if (g_d3d9.pixel_shader) { @@ -181,6 +192,13 @@ BOOL d3d9_release() g_d3d9.vertex_buf = NULL; } + return TRUE; +} + +BOOL d3d9_release() +{ + d3d9_release_resources(); + if (g_d3d9.device) { while (IDirect3DDevice9_Release(g_d3d9.device)); @@ -198,6 +216,9 @@ BOOL d3d9_release() static BOOL d3d9_create_resouces() { + if (!g_d3d9.device) + return FALSE; + BOOL err = FALSE; int width = g_ddraw->width; diff --git a/src/utils.c b/src/utils.c index f219806..8e56337 100644 --- a/src/utils.c +++ b/src/utils.c @@ -354,7 +354,7 @@ void util_toggle_fullscreen() if (g_ddraw->renderer == d3d9_render_main) { - d3d9_reset(); + d3d9_reset(g_ddraw->windowed); } else {