diff --git a/GPU/Directx9/helper/global.cpp b/GPU/Directx9/helper/global.cpp index da82f0303e..dbe08ff789 100644 --- a/GPU/Directx9/helper/global.cpp +++ b/GPU/Directx9/helper/global.cpp @@ -139,22 +139,25 @@ bool CompileVertexShader(const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, LPD return true; } -void CompileShaders() { - std::string errorMsg; - +bool CompileShaders(std::string &errorMsg) { if (!CompileVertexShader(vscode, &pFramebufferVertexShader, NULL, errorMsg)) { OutputDebugStringA(errorMsg.c_str()); - DebugBreak(); + return false; } if (!CompilePixelShader(pscode, &pFramebufferPixelShader, NULL, errorMsg)) { OutputDebugStringA(errorMsg.c_str()); - DebugBreak(); + if (pFramebufferVertexShader) { + pFramebufferVertexShader->Release(); + } + return false; } pD3Ddevice->CreateVertexDeclaration(VertexElements, &pFramebufferVertexDecl); pD3Ddevice->SetVertexDeclaration(pFramebufferVertexDecl); pD3Ddevice->CreateVertexDeclaration(SoftTransVertexElements, &pSoftVertexDecl); + + return true; } void DestroyShaders() { @@ -207,7 +210,8 @@ void DirectxInit(HWND window) { pD3Ddevice->SetRingBufferParameters( &d3dr ); #endif - CompileShaders(); + std::string errorMessage; + CompileShaders(errorMessage); fbo_init(pD3D); } diff --git a/GPU/Directx9/helper/global.h b/GPU/Directx9/helper/global.h index 6f44f2864b..4eebbca15a 100644 --- a/GPU/Directx9/helper/global.h +++ b/GPU/Directx9/helper/global.h @@ -25,7 +25,7 @@ extern LPDIRECT3DPIXELSHADER9 pFramebufferPixelShader; // Pixel Shader extern IDirect3DVertexDeclaration9* pFramebufferVertexDecl; extern IDirect3DVertexDeclaration9* pSoftVertexDecl; -void CompileShaders(); +bool CompileShaders(std::string &errorMessage); bool CompilePixelShader(const char *code, LPDIRECT3DPIXELSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage); bool CompileVertexShader(const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage); void DestroyShaders(); diff --git a/Windows/D3D9Base.cpp b/Windows/D3D9Base.cpp index 069f643f9d..976106f62a 100644 --- a/Windows/D3D9Base.cpp +++ b/Windows/D3D9Base.cpp @@ -153,11 +153,7 @@ bool D3D9_Init(HWND hWnd, bool windowed, std::string *error_message) { if (FAILED(hr)) { *error_message = "Failed to create D3D device"; - if (has9Ex) { - d3dEx->Release(); - } else { - d3d->Release(); - } + d3d->Release(); return false; } @@ -167,7 +163,18 @@ bool D3D9_Init(HWND hWnd, bool windowed, std::string *error_message) { LoadD3DX9Dynamic(); - DX9::CompileShaders(); + if (!DX9::CompileShaders(*error_message)) { + *error_message = "Unable to compile shaders: " + *error_message; + device->EndScene(); + device->Release(); + d3d->Release(); + DX9::pD3Ddevice = nullptr; + DX9::pD3DdeviceEx = nullptr; + device = nullptr; + UnloadD3DXDynamic(); + return false; + } + DX9::fbo_init(d3d); if (deviceEx && IsWin7OrLater()) { @@ -182,12 +189,13 @@ void D3D9_Resize(HWND window) { // TODO! } -void D3D9_Shutdown() { +void D3D9_Shutdown() { DX9::DestroyShaders(); DX9::fbo_shutdown(); device->EndScene(); device->Release(); d3d->Release(); + UnloadD3DXDynamic(); DX9::pD3Ddevice = nullptr; DX9::pD3DdeviceEx = nullptr; device = nullptr;