diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 670fb03..a3b4c71 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -26,6 +26,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 93af5df..822037c 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -95,6 +95,9 @@ Header Files + + Header Files + diff --git a/inc/d3d9renderer.h b/inc/d3d9renderer.h new file mode 100644 index 0000000..c0b09fd --- /dev/null +++ b/inc/d3d9renderer.h @@ -0,0 +1,11 @@ +#pragma once + +typedef struct CUSTOMVERTEX { float x, y, z, rhw, u, v; } CUSTOMVERTEX; + +DWORD WINAPI render_d3d9_main(void); +BOOL Direct3D9_Create(); +BOOL Direct3D9_Reset(); +BOOL Direct3D9_Release(); +BOOL Direct3D9_DeviceLost(); + +extern HMODULE Direct3D9_hModule; diff --git a/inc/main.h b/inc/main.h index aaef0e9..8a73bd8 100644 --- a/inc/main.h +++ b/inc/main.h @@ -30,6 +30,9 @@ extern BOOL ShowDriverWarning; +BOOL detect_cutscene(); +DWORD WINAPI render_soft_main(void); + struct IDirectDrawImpl; struct IDirectDrawImplVtbl; struct IDirectDrawSurfaceImpl; diff --git a/src/main.c b/src/main.c index cae43c1..1d9e68b 100644 --- a/src/main.c +++ b/src/main.c @@ -24,6 +24,7 @@ #include "palette.h" #include "surface.h" #include "clipper.h" +#include "d3d9renderer.h" #define IDR_MYMENU 93 @@ -38,19 +39,11 @@ void mouse_unlock(); BOOL screenshot(struct IDirectDrawSurfaceImpl *); #endif -extern HMODULE D3D9_hModule; - -BOOL CreateDirect3D9(); -BOOL ResetDirect3D9(); -BOOL ReleaseDirect3D9(); -BOOL DeviceLostDirect3D9(); - IDirectDrawImpl *ddraw = NULL; DWORD WINAPI render_main(void); DWORD WINAPI render_soft_main(void); DWORD WINAPI render_dummy_main(void); -DWORD WINAPI render_d3d9_main(void); int WindowPosX; int WindowPosY; @@ -242,7 +235,7 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This) This->render.thread = NULL; if (This->renderer == render_d3d9_main) - ReleaseDirect3D9(); + Direct3D9_Release(); } if(!ddraw->windowed) @@ -256,10 +249,10 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This) void InitDirect3D9() { - Direct3D9Active = CreateDirect3D9(); + Direct3D9Active = Direct3D9_Create(); if (!Direct3D9Active) { - ReleaseDirect3D9(); + Direct3D9_Release(); ShowDriverWarning = TRUE; ddraw->renderer = render_soft_main; } @@ -557,7 +550,7 @@ void ToggleFullscreen() LastSetWindowPosTick = timeGetTime(); if (Direct3D9Active) - ResetDirect3D9(); + Direct3D9_Reset(); else ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN); } @@ -589,7 +582,7 @@ void ToggleFullscreen() ddraw->windowed_init = TRUE; if (Direct3D9Active) - ResetDirect3D9(); + Direct3D9_Reset(); } mouse_lock(); } @@ -603,7 +596,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { case WM_D3D9DEVICELOST: { - if (Direct3D9Active && DeviceLostDirect3D9()) + if (Direct3D9Active && Direct3D9_DeviceLost()) { if (!ddraw->windowed) mouse_lock(); @@ -975,7 +968,7 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This) This->render.thread = NULL; if (This->renderer == render_d3d9_main) - ReleaseDirect3D9(); + Direct3D9_Release(); } if(This->render.hDC) @@ -1298,10 +1291,10 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk LPDIRECT3D9 d3d = NULL; // Windows = Direct3D 9, Wine = OpenGL - if (!This->wine && (D3D9_hModule = LoadLibrary("d3d9.dll"))) + if (!This->wine && (Direct3D9_hModule = LoadLibrary("d3d9.dll"))) { IDirect3D9 *(WINAPI *D3DCreate9)(UINT) = - (IDirect3D9 *(WINAPI *)(UINT))GetProcAddress(D3D9_hModule, "Direct3DCreate9"); + (IDirect3D9 *(WINAPI *)(UINT))GetProcAddress(Direct3D9_hModule, "Direct3DCreate9"); if (D3DCreate9 && (d3d = D3DCreate9(D3D_SDK_VERSION))) d3d->lpVtbl->Release(d3d); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 2a01919..4c4ed0f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -4,10 +4,10 @@ #include "main.h" #include "surface.h" #include "d3d9shader.h" +#include "d3d9renderer.h" -typedef struct CUSTOMVERTEX { float x, y, z, rhw, u, v; } CUSTOMVERTEX; -HMODULE D3D9_hModule; +HMODULE Direct3D9_hModule; static D3DPRESENT_PARAMETERS D3dpp; static LPDIRECT3D9 D3d; @@ -28,14 +28,6 @@ static BOOL UpdateVertices(BOOL inCutscene); static void SetMaxFPS(); static void Render(); -BOOL CreateDirect3D9(); -BOOL ResetDirect3D9(); -BOOL ReleaseDirect3D9(); -BOOL DeviceLostDirect3D9(); - -BOOL detect_cutscene(); -DWORD WINAPI render_soft_main(void); - DWORD WINAPI render_d3d9_main(void) { Sleep(500); @@ -46,18 +38,18 @@ DWORD WINAPI render_d3d9_main(void) return 0; } -BOOL CreateDirect3D9() +BOOL Direct3D9_Create() { - if (!ReleaseDirect3D9()) + if (!Direct3D9_Release()) return FALSE; - if (!D3D9_hModule) - D3D9_hModule = LoadLibrary("d3d9.dll"); + if (!Direct3D9_hModule) + Direct3D9_hModule = LoadLibrary("d3d9.dll"); - if (D3D9_hModule) + if (Direct3D9_hModule) { IDirect3D9 *(WINAPI *D3DCreate9)(UINT) = - (IDirect3D9 *(WINAPI *)(UINT))GetProcAddress(D3D9_hModule, "Direct3DCreate9"); + (IDirect3D9 *(WINAPI *)(UINT))GetProcAddress(Direct3D9_hModule, "Direct3DCreate9"); if (D3DCreate9 && (D3d = D3DCreate9(D3D_SDK_VERSION))) { @@ -100,6 +92,72 @@ BOOL CreateDirect3D9() return FALSE; } +BOOL Direct3D9_DeviceLost() +{ + if (D3dDev && D3dDev->lpVtbl->TestCooperativeLevel(D3dDev) == D3DERR_DEVICENOTRESET) + return Direct3D9_Reset(); + + return FALSE; +} + +BOOL Direct3D9_Reset() +{ + D3dpp.Windowed = ddraw->windowed; + D3dpp.BackBufferWidth = D3dpp.Windowed ? 0 : ddraw->render.width; + D3dpp.BackBufferHeight = D3dpp.Windowed ? 0 : ddraw->render.height; + D3dpp.BackBufferFormat = BitsPerPixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + + if (SUCCEEDED(D3dDev->lpVtbl->Reset(D3dDev, &D3dpp))) + return SetStates(); + + return FALSE; +} + +BOOL Direct3D9_Release() +{ + if (VertexBuf) + { + VertexBuf->lpVtbl->Release(VertexBuf); + VertexBuf = NULL; + } + + if (SurfaceTex) + { + SurfaceTex->lpVtbl->Release(SurfaceTex); + SurfaceTex = NULL; + } + + if (PaletteTex) + { + PaletteTex->lpVtbl->Release(PaletteTex); + PaletteTex = NULL; + } + + if (PixelShader) + { + PixelShader->lpVtbl->Release(PixelShader); + PixelShader = NULL; + } + + if (D3dDev) + { + if (FAILED(D3dDev->lpVtbl->Release(D3dDev))) + return FALSE; + + D3dDev = NULL; + } + + if (D3d) + { + if (FAILED(D3d->lpVtbl->Release(D3d))) + return FALSE; + + D3d = NULL; + } + + return TRUE; +} + static BOOL CreateResources() { BOOL err = FALSE; @@ -190,27 +248,6 @@ static BOOL UpdateVertices(BOOL inCutscene) return FALSE; } -BOOL DeviceLostDirect3D9() -{ - if (D3dDev && D3dDev->lpVtbl->TestCooperativeLevel(D3dDev) == D3DERR_DEVICENOTRESET) - return ResetDirect3D9(); - - return FALSE; -} - -BOOL ResetDirect3D9() -{ - D3dpp.Windowed = ddraw->windowed; - D3dpp.BackBufferWidth = D3dpp.Windowed ? 0 : ddraw->render.width; - D3dpp.BackBufferHeight = D3dpp.Windowed ? 0 : ddraw->render.height; - D3dpp.BackBufferFormat = BitsPerPixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; - - if (SUCCEEDED(D3dDev->lpVtbl->Reset(D3dDev, &D3dpp))) - return SetStates(); - - return FALSE; -} - static void SetMaxFPS() { MaxFPS = ddraw->render.maxfps; @@ -328,48 +365,3 @@ static void Render() } } } - -BOOL ReleaseDirect3D9() -{ - if (VertexBuf) - { - VertexBuf->lpVtbl->Release(VertexBuf); - VertexBuf = NULL; - } - - if (SurfaceTex) - { - SurfaceTex->lpVtbl->Release(SurfaceTex); - SurfaceTex = NULL; - } - - if (PaletteTex) - { - PaletteTex->lpVtbl->Release(PaletteTex); - PaletteTex = NULL; - } - - if (PixelShader) - { - PixelShader->lpVtbl->Release(PixelShader); - PixelShader = NULL; - } - - if (D3dDev) - { - if (FAILED(D3dDev->lpVtbl->Release(D3dDev))) - return FALSE; - - D3dDev = NULL; - } - - if (D3d) - { - if (FAILED(D3d->lpVtbl->Release(D3d))) - return FALSE; - - D3d = NULL; - } - - return TRUE; -}