From ef3439e46f31fd7bbf7a7584e1faf5bc839c6704 Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Mon, 6 Mar 2023 05:47:39 -0600 Subject: [PATCH] d3d8: fix GTA: SA bug and add LTCG patch for D3DDevice_DrawVertices variant Plus other variant LTCG patches that only does logging. And symbol renames. --- import/XbSymbolDatabase | 2 +- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 83 ++++++++++++++++++++--- src/core/hle/D3D8/Direct3D9/Direct3D9.h | 33 ++++++--- src/core/hle/Patches.cpp | 11 +-- 4 files changed, 102 insertions(+), 27 deletions(-) diff --git a/import/XbSymbolDatabase b/import/XbSymbolDatabase index 313ed04a7..774111351 160000 --- a/import/XbSymbolDatabase +++ b/import/XbSymbolDatabase @@ -1 +1 @@ -Subproject commit 313ed04a76e1079178652fa0deaf78c96c061e37 +Subproject commit 774111351210e6f340246d6fb32741b09708f381 diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 79f6bb446..9237c8197 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -3317,12 +3317,12 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_GetDisplayFieldStatus)(X_D3DFIELD_ } // ****************************************************************** -// * patch: D3DDevice_BeginPush +// * patch: D3DDevice_BeginPush_4 // TODO: Find a test case and verify this // Starting from XDK 4531, this changed to 1 parameter only. // Is this definition incorrect, or did it change at some point? // ****************************************************************** -xbox::PDWORD WINAPI xbox::EMUPATCH(D3DDevice_BeginPush)(dword_xt Count) +xbox::PDWORD WINAPI xbox::EMUPATCH(D3DDevice_BeginPush_4)(dword_xt Count) { LOG_FUNC_ONE_ARG(Count); @@ -3340,11 +3340,11 @@ xbox::PDWORD WINAPI xbox::EMUPATCH(D3DDevice_BeginPush)(dword_xt Count) } // ****************************************************************** -// * patch: D3DDevice_BeginPush2 +// * patch: D3DDevice_BeginPush_8 // TODO: Find a test case and verify this: RalliSport Challenge XDK 4134 // For XDK before 4531 // ****************************************************************** -xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_BeginPush2)(dword_xt Count, dword_xt** ppPush) +xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_BeginPush_8)(dword_xt Count, dword_xt** ppPush) { LOG_FUNC_BEGIN LOG_FUNC_ARG(Count) @@ -7851,7 +7851,7 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetPixelShader) // This uses a custom calling convention where parameter is passed in ECX, EAX and Stack // Test Case: Conker // ****************************************************************** -__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_4) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_4__LTCG_ecx2_eax3) ( X_D3DPRIMITIVETYPE PrimitiveType ) @@ -7872,6 +7872,30 @@ __declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_4) } } +// ****************************************************************** +// * patch: D3DDevice_DrawVertices_8__LTCG_eax3 +// LTCG specific D3DDevice_DrawVertices function... +// ****************************************************************** +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_8__LTCG_eax3) +( + X_D3DPRIMITIVETYPE PrimitiveType, + uint_xt StartVertex +) +{ + uint_xt VertexCount; + __asm { + LTCG_PROLOGUE + mov VertexCount, eax + } + + EMUPATCH(D3DDevice_DrawVertices)(PrimitiveType, StartVertex, VertexCount); + + __asm { + LTCG_EPILOGUE + ret 4 + } +} + // ****************************************************************** // * patch: D3DDevice_DrawVertices // ****************************************************************** @@ -8033,7 +8057,7 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP) // LTCG specific D3DDevice_DrawVerticesUP function... // This uses a custom calling convention where pVertexStreamZeroData is passed in EBX // Test-case: NASCAR Heat 20002 -__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12__LTCG_ebx3) ( X_D3DPRIMITIVETYPE PrimitiveType, uint_xt VertexCount, @@ -9120,15 +9144,52 @@ xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateVB_8)(addr_xt _this, ulong_x // ****************************************************************** // * patch: CDevice_SetStateUP (D3D::CDevice::SetStateUP) // ****************************************************************** -xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP)() +xbox::void_xt CxbxrImpl_CDevice_SetStateUP(xbox::addr_xt _this) { - LOG_FUNC(); - LOG_UNIMPLEMENTED(); // TODO: Anything? -// __asm int 3; - + //__asm int 3; +} + +xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP)() +{ + addr_xt _this; + __asm mov _this, ecx; + + LOG_FUNC_ONE_ARG(_this); + + CxbxrImpl_CDevice_SetStateUP(_this); +} + +xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP_4)(xbox::addr_xt _this) +{ + LOG_FUNC_ONE_ARG(_this); + + CxbxrImpl_CDevice_SetStateUP(_this); +} +static void CDevice_SetStateUP_0__LTCG_esi1(xbox::addr_xt _this) +{ + LOG_FUNC_ONE_ARG(_this); +} + +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP_0__LTCG_esi1)() +{ + addr_xt _this; + __asm { + LTCG_PROLOGUE + mov _this, esi + } + + // Log + CDevice_SetStateUP_0__LTCG_esi1(_this); + + CxbxrImpl_CDevice_SetStateUP(_this); + + __asm { + LTCG_EPILOGUE + ret + } } // ****************************************************************** diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 14ce0000e..aa13b1dd4 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -144,14 +144,14 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_GetDisplayFieldStatus) ); // ****************************************************************** -// * patch: D3DDevice_BeginPush +// * patch: D3DDevice_BeginPush_4 // ****************************************************************** -xbox::PDWORD WINAPI EMUPATCH(D3DDevice_BeginPush)(dword_xt Count); +xbox::PDWORD WINAPI EMUPATCH(D3DDevice_BeginPush_4)(dword_xt Count); // ****************************************************************** -// * patch: D3DDevice_BeginPush2 //two arg version for xdk before 4531 +// * patch: D3DDevice_BeginPush_8 // ****************************************************************** -xbox::void_xt WINAPI EMUPATCH(D3DDevice_BeginPush2)(dword_xt Count, dword_xt **ppPush); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_BeginPush_8)(dword_xt Count, dword_xt **ppPush); // ****************************************************************** // * patch: D3DDevice_EndPush @@ -1394,18 +1394,27 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetVertexShader_0)(); xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices) ( X_D3DPRIMITIVETYPE PrimitiveType, - uint_xt StartVertex, - uint_xt VertexCount + uint_xt StartVertex, + uint_xt VertexCount ); // ****************************************************************** -// * patch: D3DDevice_DrawVertices_4 +// * patch: D3DDevice_DrawVertices_4__LTCG_ecx2_eax3 // ****************************************************************** -xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices_4) +xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices_4__LTCG_ecx2_eax3) ( X_D3DPRIMITIVETYPE PrimitiveType ); +// ****************************************************************** +// * patch: D3DDevice_DrawVertices_8__LTCG_eax3 +// ****************************************************************** +xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices_8__LTCG_eax3) +( + X_D3DPRIMITIVETYPE PrimitiveType, + uint_xt StartVertex +); + // ****************************************************************** // * patch: D3DDevice_DrawVerticesUP // ****************************************************************** @@ -1417,11 +1426,11 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP) uint_xt VertexStreamZeroStride ); -xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP_12) +xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP_12__LTCG_ebx3) ( X_D3DPRIMITIVETYPE PrimitiveType, - uint_xt VertexCount, - uint_xt VertexStreamZeroStride + uint_xt VertexCount, + uint_xt VertexStreamZeroStride ); @@ -1908,6 +1917,8 @@ xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateVB_8)(xbox::addr_xt _this, xbox::u // * patch: CDevice_SetStateUP (D3D::CDevice::SetStateUP) // ****************************************************************** xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP)(); +xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP_4)(xbox::addr_xt _this); +xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP_0__LTCG_esi1)(); // ****************************************************************** // * patch: D3DDevice_SetStipple diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index 7c115ef02..236b4c9d2 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -57,11 +57,13 @@ const uint32_t PATCH_IS_FIBER = 1 << 4; std::map g_PatchTable = { // Direct3D PATCH_ENTRY("CDevice_SetStateUP", xbox::EMUPATCH(CDevice_SetStateUP), PATCH_HLE_D3D), + PATCH_ENTRY("CDevice_SetStateUP_4", xbox::EMUPATCH(CDevice_SetStateUP_4), PATCH_HLE_D3D), + PATCH_ENTRY("CDevice_SetStateUP_0__LTCG_esi1", xbox::EMUPATCH(CDevice_SetStateUP_0__LTCG_esi1), PATCH_HLE_D3D), PATCH_ENTRY("CDevice_SetStateVB", xbox::EMUPATCH(CDevice_SetStateVB), PATCH_HLE_D3D), PATCH_ENTRY("CDevice_SetStateVB_8", xbox::EMUPATCH(CDevice_SetStateVB_8), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_Begin", xbox::EMUPATCH(D3DDevice_Begin), PATCH_HLE_D3D), - PATCH_ENTRY("D3DDevice_BeginPush", xbox::EMUPATCH(D3DDevice_BeginPush), PATCH_HLE_D3D), - PATCH_ENTRY("D3DDevice_BeginPush2", xbox::EMUPATCH(D3DDevice_BeginPush2), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_BeginPush_4", xbox::EMUPATCH(D3DDevice_BeginPush_4), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_BeginPush_8", xbox::EMUPATCH(D3DDevice_BeginPush_8), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BeginVisibilityTest", xbox::EMUPATCH(D3DDevice_BeginVisibilityTest), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BlockOnFence", xbox::EMUPATCH(D3DDevice_BlockOnFence), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BlockUntilVerticalBlank", xbox::EMUPATCH(D3DDevice_BlockUntilVerticalBlank), PATCH_HLE_D3D), @@ -75,9 +77,10 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_DrawRectPatch", xbox::EMUPATCH(D3DDevice_DrawRectPatch), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawTriPatch", xbox::EMUPATCH(D3DDevice_DrawTriPatch), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawVertices", xbox::EMUPATCH(D3DDevice_DrawVertices), PATCH_HLE_D3D), - PATCH_ENTRY("D3DDevice_DrawVertices_4", xbox::EMUPATCH(D3DDevice_DrawVertices_4), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_DrawVertices_4__LTCG_ecx2_eax3", xbox::EMUPATCH(D3DDevice_DrawVertices_4__LTCG_ecx2_eax3), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_DrawVertices_8__LTCG_eax3", xbox::EMUPATCH(D3DDevice_DrawVertices_8__LTCG_eax3), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawVerticesUP", xbox::EMUPATCH(D3DDevice_DrawVerticesUP), PATCH_HLE_D3D), - PATCH_ENTRY("D3DDevice_DrawVerticesUP_12", xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_DrawVerticesUP_12__LTCG_ebx3", xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12__LTCG_ebx3), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_EnableOverlay", xbox::EMUPATCH(D3DDevice_EnableOverlay), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_End", xbox::EMUPATCH(D3DDevice_End), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_EndPush", xbox::EMUPATCH(D3DDevice_EndPush), PATCH_HLE_D3D),