diff --git a/GPU/Directx9/DrawEngineDX9.cpp b/GPU/Directx9/DrawEngineDX9.cpp index 6092797550..7d6bd6c5c6 100644 --- a/GPU/Directx9/DrawEngineDX9.cpp +++ b/GPU/Directx9/DrawEngineDX9.cpp @@ -78,6 +78,14 @@ enum { enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MAX = 4 }; +static const D3DVERTEXELEMENT9 TransformedVertexElements[] = { + { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 16, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 28, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + { 0, 32, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1 }, + D3DDECL_END() +}; + DrawEngineDX9::DrawEngineDX9() : decodedVerts_(0), prevPrim_(GE_PRIM_INVALID), @@ -109,9 +117,15 @@ DrawEngineDX9::DrawEngineDX9() InitDeviceObjects(); tessDataTransfer = new TessellationDataTransferDX9(); + + pD3Ddevice->CreateVertexDeclaration(TransformedVertexElements, &transformedVertexDecl_); } DrawEngineDX9::~DrawEngineDX9() { + if (transformedVertexDecl_) { + transformedVertexDecl_->Release(); + } + DestroyDeviceObjects(); FreeMemoryPages(decoded, DECODED_VERTEX_BUFFER_SIZE); FreeMemoryPages(decIndex, DECODED_INDEX_BUFFER_SIZE); @@ -833,7 +847,7 @@ rotateVBO: // these spam the gDebugger log. const int vertexSize = sizeof(transformed[0]); - pD3Ddevice->SetVertexDeclaration(pSoftVertexDecl); + pD3Ddevice->SetVertexDeclaration(transformedVertexDecl_); if (drawIndexed) { pD3Ddevice->DrawIndexedPrimitiveUP(glprim[prim], 0, maxIndex, D3DPrimCount(glprim[prim], numTrans), inds, D3DFMT_INDEX16, drawBuffer, sizeof(TransformedVertex)); } else { diff --git a/GPU/Directx9/DrawEngineDX9.h b/GPU/Directx9/DrawEngineDX9.h index 3c4255a86e..0d15dd46c9 100644 --- a/GPU/Directx9/DrawEngineDX9.h +++ b/GPU/Directx9/DrawEngineDX9.h @@ -196,7 +196,10 @@ private: std::unordered_map vai_; std::unordered_map vertexDeclMap_; - + + // SimpleVertex + IDirect3DVertexDeclaration9* transformedVertexDecl_; + // Other ShaderManagerDX9 *shaderManager_; TextureCacheDX9 *textureCache_; diff --git a/GPU/Directx9/helper/global.cpp b/GPU/Directx9/helper/global.cpp index bab51a6c3e..09a135db34 100644 --- a/GPU/Directx9/helper/global.cpp +++ b/GPU/Directx9/helper/global.cpp @@ -59,16 +59,6 @@ static const D3DVERTEXELEMENT9 VertexElements[] = { D3DDECL_END() }; -IDirect3DVertexDeclaration9* pSoftVertexDecl = NULL; - -static const D3DVERTEXELEMENT9 SoftTransVertexElements[] = { - { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - { 0, 16, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, - { 0, 28, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, - { 0, 32, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1 }, - D3DDECL_END() -}; - LPDIRECT3DVERTEXSHADER9 pFramebufferVertexShader = NULL; // Vertex Shader LPDIRECT3DPIXELSHADER9 pFramebufferPixelShader = NULL; // Pixel Shader @@ -168,23 +158,21 @@ bool CompileShaders(std::string &errorMsg) { pD3Ddevice->CreateVertexDeclaration(VertexElements, &pFramebufferVertexDecl); pD3Ddevice->SetVertexDeclaration(pFramebufferVertexDecl); - pD3Ddevice->CreateVertexDeclaration(SoftTransVertexElements, &pSoftVertexDecl); - return true; } void DestroyShaders() { if (pFramebufferVertexShader) { pFramebufferVertexShader->Release(); + pFramebufferVertexShader = nullptr; } if (pFramebufferPixelShader) { pFramebufferPixelShader->Release(); + pFramebufferPixelShader = nullptr; } if (pFramebufferVertexDecl) { pFramebufferVertexDecl->Release(); - } - if (pSoftVertexDecl) { - pSoftVertexDecl->Release(); + pFramebufferVertexDecl = nullptr; } } diff --git a/GPU/Directx9/helper/global.h b/GPU/Directx9/helper/global.h index ea83628cbd..0af1b84b26 100644 --- a/GPU/Directx9/helper/global.h +++ b/GPU/Directx9/helper/global.h @@ -11,13 +11,11 @@ namespace DX9 { extern LPDIRECT3DDEVICE9 pD3Ddevice; extern LPDIRECT3DDEVICE9EX pD3DdeviceEx; -extern LPDIRECT3D9 pD3D; extern LPDIRECT3DVERTEXSHADER9 pFramebufferVertexShader; // Vertex Shader extern LPDIRECT3DPIXELSHADER9 pFramebufferPixelShader; // Pixel Shader extern IDirect3DVertexDeclaration9* pFramebufferVertexDecl; -extern IDirect3DVertexDeclaration9* pSoftVertexDecl; bool CompileShaders(std::string &errorMessage); bool CompilePixelShader(const char *code, LPDIRECT3DPIXELSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage); diff --git a/Windows/GPU/D3D9Context.cpp b/Windows/GPU/D3D9Context.cpp index 4c4d40a26b..ad789e99de 100644 --- a/Windows/GPU/D3D9Context.cpp +++ b/Windows/GPU/D3D9Context.cpp @@ -164,7 +164,6 @@ bool D3D9Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { device->BeginScene(); DX9::pD3Ddevice = device; DX9::pD3DdeviceEx = deviceEx; - DX9::pD3D = d3d; if (!DX9::CompileShaders(*error_message)) { *error_message = "Unable to compile shaders: " + *error_message; @@ -173,7 +172,6 @@ bool D3D9Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { d3d->Release(); DX9::pD3Ddevice = nullptr; DX9::pD3DdeviceEx = nullptr; - DX9::pD3D = nullptr; device = nullptr; UnloadD3DXDynamic(); return false; @@ -221,7 +219,6 @@ void D3D9Context::Shutdown() { UnloadD3DXDynamic(); DX9::pD3Ddevice = nullptr; DX9::pD3DdeviceEx = nullptr; - DX9::pD3D = nullptr; device = nullptr; hWnd = nullptr; FreeLibrary(hD3D9);