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;
-}