mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
don't change display settings, let d3d9 do it
This commit is contained in:
parent
bbe8fa11d8
commit
04e063252c
2
ddraw.rc
2
ddraw.rc
@ -2,7 +2,7 @@
|
|||||||
#define vxstr(a,b,c,d) str(a##.##b##.##c##.##d)
|
#define vxstr(a,b,c,d) str(a##.##b##.##c##.##d)
|
||||||
#define str(s) #s
|
#define str(s) #s
|
||||||
|
|
||||||
#define VERSION 1,2,0,4
|
#define VERSION 1,2,0,5
|
||||||
|
|
||||||
1 VERSIONINFO
|
1 VERSIONINFO
|
||||||
FILEVERSION VERSION
|
FILEVERSION VERSION
|
||||||
|
30
src/main.c
30
src/main.c
@ -239,8 +239,10 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This)
|
|||||||
|
|
||||||
if(!ddraw->windowed)
|
if(!ddraw->windowed)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(&This->mode, 0);
|
if (!D3D9_Enabled)
|
||||||
InterlockedExchange(&ddraw->displayModeChanged, TRUE);
|
ChangeDisplaySettings(&This->mode, 0);
|
||||||
|
|
||||||
|
InterlockedExchange(&ddraw->minimized, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
@ -468,6 +470,8 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
|
|||||||
{
|
{
|
||||||
RedrawWindow(This->hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
|
RedrawWindow(This->hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InterlockedExchange(&ddraw->minimized, FALSE);
|
||||||
|
|
||||||
if(This->render.thread == NULL)
|
if(This->render.thread == NULL)
|
||||||
{
|
{
|
||||||
@ -625,14 +629,17 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
{
|
{
|
||||||
if (!ddraw->windowed)
|
if (!ddraw->windowed)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN);
|
if (!D3D9_Enabled)
|
||||||
|
{
|
||||||
|
ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN);
|
||||||
|
|
||||||
|
if (wParam == WA_ACTIVE)
|
||||||
|
{
|
||||||
|
mouse_lock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
InterlockedExchange(&ddraw->minimized, FALSE);
|
InterlockedExchange(&ddraw->minimized, FALSE);
|
||||||
|
|
||||||
if (wParam == WA_ACTIVE)
|
|
||||||
{
|
|
||||||
mouse_lock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (wParam == WA_INACTIVE)
|
else if (wParam == WA_INACTIVE)
|
||||||
@ -646,9 +653,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
if (!ddraw->windowed)
|
if (!ddraw->windowed)
|
||||||
{
|
{
|
||||||
if (!D3D9_Enabled)
|
if (!D3D9_Enabled)
|
||||||
ShowWindow(ddraw->hWnd, SW_MINIMIZE);
|
{
|
||||||
|
ShowWindow(ddraw->hWnd, SW_MINIMIZE);
|
||||||
ChangeDisplaySettings(&ddraw->mode, 0);
|
ChangeDisplaySettings(&ddraw->mode, 0);
|
||||||
|
}
|
||||||
|
|
||||||
InterlockedExchange(&ddraw->minimized, TRUE);
|
InterlockedExchange(&ddraw->minimized, TRUE);
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,8 @@ HMODULE D3D9_hModule;
|
|||||||
|
|
||||||
static D3DPRESENT_PARAMETERS D3dpp;
|
static D3DPRESENT_PARAMETERS D3dpp;
|
||||||
static LPDIRECT3D9 D3d;
|
static LPDIRECT3D9 D3d;
|
||||||
static LPDIRECT3DDEVICE9 D3ddev;
|
static LPDIRECT3DDEVICE9 D3dDev;
|
||||||
static LPDIRECT3DVERTEXBUFFER9 D3dvb;
|
static LPDIRECT3DVERTEXBUFFER9 VertexBuf;
|
||||||
static IDirect3DTexture9 *SurfaceTex;
|
static IDirect3DTexture9 *SurfaceTex;
|
||||||
static IDirect3DTexture9 *PaletteTex;
|
static IDirect3DTexture9 *PaletteTex;
|
||||||
static IDirect3DPixelShader9 *PixelShader;
|
static IDirect3DPixelShader9 *PixelShader;
|
||||||
@ -100,13 +100,13 @@ static BOOL CreateDirect3D()
|
|||||||
ddraw->hWnd,
|
ddraw->hWnd,
|
||||||
D3DCREATE_MULTITHREADED | D3DCREATE_NOWINDOWCHANGES | behaviorFlags[i],
|
D3DCREATE_MULTITHREADED | D3DCREATE_NOWINDOWCHANGES | behaviorFlags[i],
|
||||||
&D3dpp,
|
&D3dpp,
|
||||||
&D3ddev)))
|
&D3dDev)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return D3d && D3ddev && CreateResources() && SetStates();
|
return D3d && D3dDev && CreateResources() && SetStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL CreateResources()
|
static BOOL CreateResources()
|
||||||
@ -125,26 +125,26 @@ static BOOL CreateResources()
|
|||||||
ScaleW = (float)width / texWidth;;
|
ScaleW = (float)width / texWidth;;
|
||||||
ScaleH = (float)height / texHeight;
|
ScaleH = (float)height / texHeight;
|
||||||
|
|
||||||
D3ddev->lpVtbl->CreateVertexBuffer(
|
D3dDev->lpVtbl->CreateVertexBuffer(
|
||||||
D3ddev, sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &D3dvb, NULL);
|
D3dDev, sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &VertexBuf, NULL);
|
||||||
|
|
||||||
UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0));
|
UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0));
|
||||||
D3ddev->lpVtbl->CreateTexture(D3ddev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex, 0);
|
D3dDev->lpVtbl->CreateTexture(D3dDev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex, 0);
|
||||||
D3ddev->lpVtbl->CreateTexture(D3ddev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex, 0);
|
D3dDev->lpVtbl->CreateTexture(D3dDev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex, 0);
|
||||||
D3ddev->lpVtbl->CreatePixelShader(D3ddev, (DWORD *)PalettePixelShaderSrc, &PixelShader);
|
D3dDev->lpVtbl->CreatePixelShader(D3dDev, (DWORD *)PalettePixelShaderSrc, &PixelShader);
|
||||||
|
|
||||||
return SurfaceTex && PaletteTex && D3dvb && PixelShader;
|
return SurfaceTex && PaletteTex && VertexBuf && PixelShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL SetStates()
|
static BOOL SetStates()
|
||||||
{
|
{
|
||||||
BOOL err = FALSE;
|
BOOL err = FALSE;
|
||||||
|
|
||||||
err = err || FAILED(D3ddev->lpVtbl->SetFVF(D3ddev, D3DFVF_XYZRHW | D3DFVF_TEX1));
|
err = err || FAILED(D3dDev->lpVtbl->SetFVF(D3dDev, D3DFVF_XYZRHW | D3DFVF_TEX1));
|
||||||
err = err || FAILED(D3ddev->lpVtbl->SetStreamSource(D3ddev, 0, D3dvb, 0, sizeof(CUSTOMVERTEX)));
|
err = err || FAILED(D3dDev->lpVtbl->SetStreamSource(D3dDev, 0, VertexBuf, 0, sizeof(CUSTOMVERTEX)));
|
||||||
err = err || FAILED(D3ddev->lpVtbl->SetTexture(D3ddev, 0, (IDirect3DBaseTexture9 *)SurfaceTex));
|
err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex));
|
||||||
err = err || FAILED(D3ddev->lpVtbl->SetTexture(D3ddev, 1, (IDirect3DBaseTexture9 *)PaletteTex));
|
err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex));
|
||||||
err = err || FAILED(D3ddev->lpVtbl->SetPixelShader(D3ddev, PixelShader));
|
err = err || FAILED(D3dDev->lpVtbl->SetPixelShader(D3dDev, PixelShader));
|
||||||
|
|
||||||
D3DVIEWPORT9 viewData = {
|
D3DVIEWPORT9 viewData = {
|
||||||
ddraw->render.viewport.x,
|
ddraw->render.viewport.x,
|
||||||
@ -154,7 +154,7 @@ static BOOL SetStates()
|
|||||||
0.0f,
|
0.0f,
|
||||||
1.0f };
|
1.0f };
|
||||||
|
|
||||||
err = err || FAILED(D3ddev->lpVtbl->SetViewport(D3ddev, &viewData));
|
err = err || FAILED(D3dDev->lpVtbl->SetViewport(D3dDev, &viewData));
|
||||||
|
|
||||||
return !err;
|
return !err;
|
||||||
}
|
}
|
||||||
@ -179,10 +179,10 @@ static void UpdateVertices(BOOL inCutscene)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void *data;
|
void *data;
|
||||||
if (D3dvb && SUCCEEDED(D3dvb->lpVtbl->Lock(D3dvb, 0, 0, (void**)&data, 0)))
|
if (VertexBuf && SUCCEEDED(VertexBuf->lpVtbl->Lock(VertexBuf, 0, 0, (void**)&data, 0)))
|
||||||
{
|
{
|
||||||
memcpy(data, vertices, sizeof(vertices));
|
memcpy(data, vertices, sizeof(vertices));
|
||||||
D3dvb->lpVtbl->Unlock(D3dvb);
|
VertexBuf->lpVtbl->Unlock(VertexBuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ static BOOL Reset()
|
|||||||
D3dpp.BackBufferHeight = D3dpp.Windowed ? 0 : ddraw->render.height;
|
D3dpp.BackBufferHeight = D3dpp.Windowed ? 0 : ddraw->render.height;
|
||||||
D3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
|
D3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
|
||||||
|
|
||||||
if (SUCCEEDED(D3ddev->lpVtbl->Reset(D3ddev, &D3dpp)))
|
if (SUCCEEDED(D3dDev->lpVtbl->Reset(D3dDev, &D3dpp)))
|
||||||
return SetStates();
|
return SetStates();
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -296,18 +296,23 @@ static void Render()
|
|||||||
|
|
||||||
LeaveCriticalSection(&ddraw->cs);
|
LeaveCriticalSection(&ddraw->cs);
|
||||||
|
|
||||||
HRESULT hr = D3ddev->lpVtbl->TestCooperativeLevel(D3ddev);
|
HRESULT hr = D3dDev->lpVtbl->TestCooperativeLevel(D3dDev);
|
||||||
LONG modeChanged = InterlockedExchange(&ddraw->displayModeChanged, FALSE);
|
LONG modeChanged = InterlockedExchange(&ddraw->displayModeChanged, FALSE);
|
||||||
LONG minimized = InterlockedExchangeAdd(&ddraw->minimized, 0);
|
LONG minimized = InterlockedExchangeAdd(&ddraw->minimized, 0);
|
||||||
|
|
||||||
if (minimized || modeChanged)
|
if (minimized || modeChanged)
|
||||||
{
|
{
|
||||||
active = FALSE;
|
active = FALSE;
|
||||||
ReleaseDirect3D();
|
BOOL released = ReleaseDirect3D();
|
||||||
Sleep(200);
|
Sleep(500);
|
||||||
|
|
||||||
if (minimized)
|
if (minimized)
|
||||||
|
{
|
||||||
ShowWindow(ddraw->hWnd, SW_SHOWMINNOACTIVE);
|
ShowWindow(ddraw->hWnd, SW_SHOWMINNOACTIVE);
|
||||||
|
|
||||||
|
if (!released)
|
||||||
|
ChangeDisplaySettings(&ddraw->mode, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (hr == D3DERR_DEVICENOTRESET && D3dpp.Windowed)
|
else if (hr == D3DERR_DEVICENOTRESET && D3dpp.Windowed)
|
||||||
{
|
{
|
||||||
@ -315,11 +320,11 @@ static void Render()
|
|||||||
}
|
}
|
||||||
else if (SUCCEEDED(hr))
|
else if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
D3ddev->lpVtbl->BeginScene(D3ddev);
|
D3dDev->lpVtbl->BeginScene(D3dDev);
|
||||||
D3ddev->lpVtbl->DrawPrimitive(D3ddev, D3DPT_TRIANGLESTRIP, 0, 2);
|
D3dDev->lpVtbl->DrawPrimitive(D3dDev, D3DPT_TRIANGLESTRIP, 0, 2);
|
||||||
D3ddev->lpVtbl->EndScene(D3ddev);
|
D3dDev->lpVtbl->EndScene(D3dDev);
|
||||||
|
|
||||||
D3ddev->lpVtbl->Present(D3ddev, NULL, NULL, NULL, NULL);
|
D3dDev->lpVtbl->Present(D3dDev, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
@ -338,10 +343,10 @@ static void Render()
|
|||||||
|
|
||||||
static BOOL ReleaseDirect3D()
|
static BOOL ReleaseDirect3D()
|
||||||
{
|
{
|
||||||
if (D3dvb)
|
if (VertexBuf)
|
||||||
{
|
{
|
||||||
D3dvb->lpVtbl->Release(D3dvb);
|
VertexBuf->lpVtbl->Release(VertexBuf);
|
||||||
D3dvb = NULL;
|
VertexBuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SurfaceTex)
|
if (SurfaceTex)
|
||||||
@ -362,12 +367,12 @@ static BOOL ReleaseDirect3D()
|
|||||||
PixelShader = NULL;
|
PixelShader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (D3ddev)
|
if (D3dDev)
|
||||||
{
|
{
|
||||||
if (FAILED(D3ddev->lpVtbl->Release(D3ddev)))
|
if (FAILED(D3dDev->lpVtbl->Release(D3dDev)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
D3ddev = NULL;
|
D3dDev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (D3d)
|
if (D3d)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user