1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

try to avoid d3d9_release to workaround nvidia bug

This commit is contained in:
FunkyFr3sh 2022-09-23 02:17:33 +02:00
parent 9f134dc6ed
commit 415f74887f
4 changed files with 34 additions and 11 deletions

View File

@ -13,6 +13,7 @@ typedef struct D3D9RENDERER
{ {
HMODULE hmodule; HMODULE hmodule;
D3DPRESENT_PARAMETERS params; D3DPRESENT_PARAMETERS params;
HWND hwnd;
LPDIRECT3D9 instance; LPDIRECT3D9 instance;
LPDIRECT3DDEVICE9 device; LPDIRECT3DDEVICE9 device;
LPDIRECT3DVERTEXBUFFER9 vertex_buf; LPDIRECT3DVERTEXBUFFER9 vertex_buf;
@ -41,7 +42,8 @@ typedef struct _D3D9ON12_ARGS
BOOL d3d9_is_available(); BOOL d3d9_is_available();
DWORD WINAPI d3d9_render_main(void); DWORD WINAPI d3d9_render_main(void);
BOOL d3d9_create(); BOOL d3d9_create();
BOOL d3d9_reset(); BOOL d3d9_reset(BOOL windowed);
BOOL d3d9_release_resources();
BOOL d3d9_release(); BOOL d3d9_release();
BOOL d3d9_on_device_lost(); BOOL d3d9_on_device_lost();

View File

@ -395,7 +395,7 @@ HRESULT dd_RestoreDisplayMode()
if (g_ddraw->renderer == d3d9_render_main) if (g_ddraw->renderer == d3d9_render_main)
{ {
d3d9_release(); d3d9_reset(TRUE);
} }
} }

View File

@ -36,8 +36,18 @@ BOOL d3d9_is_available()
BOOL d3d9_create() BOOL d3d9_create()
{ {
if (!d3d9_release()) if (g_d3d9.hwnd != g_ddraw->hwnd)
return FALSE; {
d3d9_release();
}
else if (d3d9_release_resources() && d3d9_create_resouces() && d3d9_reset(g_ddraw->windowed))
{
return TRUE;
}
else
{
d3d9_release();
}
if (!g_d3d9.hmodule) if (!g_d3d9.hmodule)
g_d3d9.hmodule = LoadLibrary("d3d9.dll"); g_d3d9.hmodule = LoadLibrary("d3d9.dll");
@ -73,6 +83,7 @@ BOOL d3d9_create()
(d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) (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.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)); 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) if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET)
{ {
return d3d9_reset(); return d3d9_reset(g_ddraw->windowed);
} }
return FALSE; return FALSE;
} }
BOOL d3d9_reset() BOOL d3d9_reset(BOOL windowed)
{ {
g_d3d9.params.Windowed = g_ddraw->windowed; g_d3d9.params.Windowed = windowed;
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width;
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height;
g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; 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))) if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
@ -146,7 +157,7 @@ BOOL d3d9_reset()
return FALSE; return FALSE;
} }
BOOL d3d9_release() BOOL d3d9_release_resources()
{ {
if (g_d3d9.pixel_shader) if (g_d3d9.pixel_shader)
{ {
@ -181,6 +192,13 @@ BOOL d3d9_release()
g_d3d9.vertex_buf = NULL; g_d3d9.vertex_buf = NULL;
} }
return TRUE;
}
BOOL d3d9_release()
{
d3d9_release_resources();
if (g_d3d9.device) if (g_d3d9.device)
{ {
while (IDirect3DDevice9_Release(g_d3d9.device)); while (IDirect3DDevice9_Release(g_d3d9.device));
@ -198,6 +216,9 @@ BOOL d3d9_release()
static BOOL d3d9_create_resouces() static BOOL d3d9_create_resouces()
{ {
if (!g_d3d9.device)
return FALSE;
BOOL err = FALSE; BOOL err = FALSE;
int width = g_ddraw->width; int width = g_ddraw->width;

View File

@ -354,7 +354,7 @@ void util_toggle_fullscreen()
if (g_ddraw->renderer == d3d9_render_main) if (g_ddraw->renderer == d3d9_render_main)
{ {
d3d9_reset(); d3d9_reset(g_ddraw->windowed);
} }
else else
{ {