Merge pull request #1403 from LukeUsher/fix-delete-vertex-shader-crash

Fix a crash when deleting a declaration-only shader
This commit is contained in:
Luke Usher 2018-08-21 10:41:40 +01:00 committed by GitHub
commit 2e0f788805
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 19 additions and 16 deletions

View File

@ -8281,43 +8281,46 @@ VOID __stdcall XTL::EMUPATCH(D3DDevice_DeleteVertexShader_0)
// ******************************************************************
VOID WINAPI XTL::EMUPATCH(D3DDevice_DeleteVertexShader)
(
DWORD Handle
)
DWORD Handle
)
{
FUNC_EXPORTS
LOG_FUNC_ONE_ARG(Handle);
LOG_FUNC_ONE_ARG(Handle);
// Handle is always address of an Xbox VertexShader struct, or-ed with 1 (X_D3DFVF_RESERVED0)
// It's reference count is lowered. If it reaches zero (0), the struct is freed.
DWORD HostVertexShaderHandle = 0;
if(VshHandleIsVertexShader(Handle))
{
X_D3DVertexShader *pD3DVertexShader = VshHandleToXboxVertexShader(Handle);
CxbxVertexShader *pVertexShader = MapXboxVertexShaderHandleToCxbxVertexShader(Handle);
if (VshHandleIsVertexShader(Handle))
{
X_D3DVertexShader *pD3DVertexShader = VshHandleToXboxVertexShader(Handle);
CxbxVertexShader *pVertexShader = MapXboxVertexShaderHandleToCxbxVertexShader(Handle);
if (pVertexShader->pHostDeclaration) {
pVertexShader->pHostDeclaration->Release();
}
HostVertexShaderHandle = pVertexShader->Handle;
HostVertexShaderHandle = pVertexShader->Handle;
g_VMManager.Deallocate((VAddr)pVertexShader->pDeclaration);
if(pVertexShader->pFunction)
{
if (pVertexShader->pFunction)
{
g_VMManager.Deallocate((VAddr)pVertexShader->pFunction);
}
}
FreeVertexDynamicPatch(pVertexShader);
FreeVertexDynamicPatch(pVertexShader);
g_VMManager.Deallocate((VAddr)pVertexShader);
g_VMManager.Deallocate((VAddr)pD3DVertexShader);
}
g_VMManager.Deallocate((VAddr)pD3DVertexShader);
}
HRESULT hRet = ((IDirect3DVertexShader9*)HostVertexShaderHandle)->Release();
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->DeleteVertexShader");
// Don't attempt to release invalid null handles
if (HostVertexShaderHandle) {
HRESULT hRet = ((IDirect3DVertexShader9*)HostVertexShaderHandle)->Release();
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->DeleteVertexShader");
}
}
// ******************************************************************