From c9a7911d1558565775fd5b0bfb6f6d412ac25d24 Mon Sep 17 00:00:00 2001 From: Silent Date: Fri, 18 Dec 2020 21:51:53 +0100 Subject: [PATCH] Tidy up SetIndices, EndVisibilityTest, LoadVertexShader, SelectVertexShader patches --- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 206 ++++++++++++++++------ src/core/hle/D3D8/Direct3D9/Direct3D9.h | 10 +- 2 files changed, 159 insertions(+), 57 deletions(-) diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 7df4d77c1..713c991dc 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -3242,30 +3242,50 @@ __declspec(naked) xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_1 } } +// Overload for logging +static void D3DDevice_SetIndices_4 +( + xbox::X_D3DIndexBuffer *pIndexData, + xbox::uint_xt BaseVertexIndex +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(pIndexData) + LOG_FUNC_ARG(BaseVertexIndex) + LOG_FUNC_END; +} + // ****************************************************************** // * patch: D3DDevice_SetIndices_4 // LTCG specific D3DDevice_SetIndices function... // This uses a custom calling convention where parameter is passed in EBX and Stack // Test Case: Conker // ****************************************************************** -xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetIndices_4) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetIndices_4) ( uint_xt BaseVertexIndex ) { X_D3DIndexBuffer *pIndexData; - __asm { - mov pIndexData, ebx + LTCG_PROLOGUE + mov pIndexData, ebx } + + // Log + D3DDevice_SetIndices_4(pIndexData, BaseVertexIndex); + // Cache the base vertex index g_Xbox_BaseVertexIndex = BaseVertexIndex; // Call LTCG-specific trampoline __asm { - mov ebx, pIndexData + mov ebx, pIndexData push BaseVertexIndex call XB_TRMP(D3DDevice_SetIndices_4); + + LTCG_EPILOGUE + ret 4 } } @@ -3497,17 +3517,24 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_BeginVisibilityTest)() // LTCG specific D3DDevice_EndVisibilityTest function... // This uses a custom calling convention where parameter is passed in EAX // Test-case: Test Drive: Eve of Destruction -xbox::hresult_xt __stdcall xbox::EMUPATCH(D3DDevice_EndVisibilityTest_0) +__declspec(naked) xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_EndVisibilityTest_0) ( ) { - dword_xt Index; + dword_xt Index; + xbox::hresult_xt result; + __asm { + LTCG_PROLOGUE + mov Index, eax + } - __asm { - mov Index, eax - } + result = EMUPATCH(D3DDevice_EndVisibilityTest)(Index); - return EMUPATCH(D3DDevice_EndVisibilityTest)(Index); + __asm { + mov eax, result + LTCG_EPILOGUE + ret + } } // ****************************************************************** @@ -3608,50 +3635,80 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_GetVisibilityTestResult) return D3D_OK; } +// Overload for logging +static void D3DDevice_LoadVertexShader_0 +( + xbox::dword_xt Handle, + xbox::dword_xt Address +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Address) + LOG_FUNC_END; +} + // LTCG specific D3DDevice_LoadVertexShader function... // This uses a custom calling convention where parameter is passed in EAX, ECX // Test-case: Aggressive Inline -xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_LoadVertexShader_0) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader_0) ( ) { - dword_xt Handle; - dword_xt Address; + dword_xt Handle; + dword_xt Address; + __asm { + LTCG_PROLOGUE + mov Address, eax + mov Handle, ecx + } - __asm { - mov Address, eax - mov Handle, ecx - } + // Log + D3DDevice_LoadVertexShader_0(Handle, Address); - return EMUPATCH(D3DDevice_LoadVertexShader)(Handle, Address); + CxbxImpl_LoadVertexShader(Handle, Address); + + __asm { + LTCG_EPILOGUE + ret + } +} + +// Overload for logging +static void D3DDevice_LoadVertexShader_4 +( + xbox::dword_xt Handle, + xbox::dword_xt Address +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Address) + LOG_FUNC_END; } // This uses a custom calling convention where parameter is passed in EAX // Test-case: Ninja Gaiden -__declspec(naked) VOID xbox::EMUPATCH(D3DDevice_LoadVertexShader_4) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader_4) ( dword_xt Address ) { - dword_xt Handle; + dword_xt Handle; + __asm { + LTCG_PROLOGUE + mov Handle, eax + } - // prologue - __asm - { - push ebp - mov ebp, esp - sub esp, __LOCAL_SIZE - mov Handle, eax // get parameter from eax - } + // Log + D3DDevice_LoadVertexShader_4(Handle, Address); - CxbxImpl_LoadVertexShader(Handle, Address); + CxbxImpl_LoadVertexShader(Handle, Address); - // epilogue - __asm { - mov esp, ebp - pop ebp - ret 4 - } + __asm { + LTCG_EPILOGUE + ret 4 + } } // ****************************************************************** @@ -3671,36 +3728,81 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader) CxbxImpl_LoadVertexShader(Handle, Address); } +// Overload for logging +static void D3DDevice_SelectVertexShader_0 +( + xbox::dword_xt Handle, + xbox::dword_xt Address +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Address) + LOG_FUNC_END; +} + // LTCG specific D3DDevice_SelectVertexShader function... // This uses a custom calling convention where parameter is passed in EAX, EBX // Test-case: Star Wars - Battlefront -xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_SelectVertexShader_0) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SelectVertexShader_0) ( ) { - dword_xt Handle; - dword_xt Address; + dword_xt Handle; + dword_xt Address; + __asm { + LTCG_PROLOGUE + mov Handle, eax + mov Address, ebx + } - __asm { - mov Handle, eax - mov Address, ebx - } + // Log + D3DDevice_SelectVertexShader_0(Handle, Address); - return EMUPATCH(D3DDevice_SelectVertexShader)(Handle, Address); + CxbxImpl_SelectVertexShader(Handle, Address); + + __asm { + LTCG_EPILOGUE + ret + } +} + +// Overload for logging +static void D3DDevice_SelectVertexShader_4 +( + xbox::dword_xt Handle, + xbox::dword_xt Address +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Address) + LOG_FUNC_END; } // LTCG specific D3DDevice_SelectVertexShader function... // This uses a custom calling convention where parameter is passed in EAX // Test-case: Aggressive Inline -xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_SelectVertexShader_4) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SelectVertexShader_4) ( dword_xt Address ) { - dword_xt Handle; - __asm mov Handle, eax; + dword_xt Handle; + __asm { + LTCG_PROLOGUE + mov Handle, eax + } - return EMUPATCH(D3DDevice_SelectVertexShader)(Handle, Address); + // Log + D3DDevice_SelectVertexShader_4(Handle, Address); + + CxbxImpl_SelectVertexShader(Handle, Address); + + __asm { + LTCG_EPILOGUE + ret 4 + } } // ****************************************************************** @@ -3712,12 +3814,12 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SelectVertexShader) dword_xt Address ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG(Handle) - LOG_FUNC_ARG(Address) - LOG_FUNC_END; + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Address) + LOG_FUNC_END; - CxbxImpl_SelectVertexShader(Handle, Address); + CxbxImpl_SelectVertexShader(Handle, Address); } // ****************************************************************** diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index b35e8b876..7636f48b4 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -190,7 +190,7 @@ xbox::hresult_xt WINAPI EMUPATCH(D3DDevice_EndVisibilityTest) dword_xt Index ); -xbox::hresult_xt __stdcall EMUPATCH(D3DDevice_EndVisibilityTest_0)(); +xbox::hresult_xt WINAPI EMUPATCH(D3DDevice_EndVisibilityTest_0)(); // ****************************************************************** // * patch: D3DDevice_GetVisibilityTestResult @@ -216,8 +216,8 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader) dword_xt Address ); -xbox::void_xt __stdcall EMUPATCH(D3DDevice_LoadVertexShader_0)(); -xbox::void_xt EMUPATCH(D3DDevice_LoadVertexShader_4) +xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader_0)(); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader_4) ( dword_xt Address ); @@ -231,8 +231,8 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SelectVertexShader) dword_xt Address ); -xbox::void_xt __stdcall EMUPATCH(D3DDevice_SelectVertexShader_0)(); -xbox::void_xt __stdcall EMUPATCH(D3DDevice_SelectVertexShader_4) +xbox::void_xt WINAPI EMUPATCH(D3DDevice_SelectVertexShader_0)(); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_SelectVertexShader_4) ( dword_xt Address );