From 50b969549fbd6d82d6582daf37320b6a2cf1c957 Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Mon, 20 Dec 2021 00:48:25 -0600 Subject: [PATCH 1/2] sync XbSymbolDatabase --- import/XbSymbolDatabase | 2 +- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 12 ++++++------ src/core/hle/D3D8/Direct3D9/Direct3D9.h | 4 ++-- src/core/hle/Patches.cpp | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/import/XbSymbolDatabase b/import/XbSymbolDatabase index 02353e8aa..75ce58fa8 160000 --- a/import/XbSymbolDatabase +++ b/import/XbSymbolDatabase @@ -1 +1 @@ -Subproject commit 02353e8aa552f3db60804626e29838406f206443 +Subproject commit 75ce58fa8d135ef0a75bee729cde9542eda393b6 diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 58df9403c..ad2a4dc07 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -338,7 +338,7 @@ g_EmuCDPD; XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetVertexShaderInput, (xbox::dword_xt, xbox::uint_xt, xbox::X_STREAMINPUT*) ); \ XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetViewport, (CONST xbox::X_D3DVIEWPORT8*) ); \ XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTransform, (xbox::X_D3DTRANSFORMSTATETYPE, CONST D3DMATRIX*) ); \ - XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTransform_0, () ); \ + XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTransform_0__LTCG_eax1_edx2, () ); \ XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_MultiplyTransform, (xbox::X_D3DTRANSFORMSTATETYPE, CONST D3DMATRIX*) ); \ XB_MACRO(xbox::void_xt, WINAPI, D3D_DestroyResource, (xbox::X_D3DResource*) ); \ XB_MACRO(xbox::void_xt, WINAPI, D3D_DestroyResource__LTCG, (xbox::void_xt) ); \ @@ -4360,7 +4360,7 @@ void CxbxImpl_SetViewport(xbox::X_D3DVIEWPORT8* pViewport) // LTCG specific D3DDevice_SetShaderConstantMode function... // This uses a custom calling convention where parameter is passed in EAX -__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0__LTCG_eax1) ( ) { @@ -6738,7 +6738,7 @@ static thread_local uint32_t setTransformCount = 0; // Naked functions must not contain objects that would require unwinding // so we cheat a bit by stashing the function body in a separate function -static void D3DDevice_SetTransform_0 +static void D3DDevice_SetTransform_0__LTCG_eax1_edx2 ( xbox::X_D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix @@ -6755,13 +6755,13 @@ static void D3DDevice_SetTransform_0 // Trampoline to guest code to remove the need for a GetTransform patch mov eax, State mov edx, pMatrix - call XB_TRMP(D3DDevice_SetTransform_0) + call XB_TRMP(D3DDevice_SetTransform_0__LTCG_eax1_edx2) } CxbxImpl_SetTransform(State, pMatrix); } -__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTransform_0) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTransform_0__LTCG_eax1_edx2) ( ) { @@ -6774,7 +6774,7 @@ __declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTransform_0) } // Log + implementation - D3DDevice_SetTransform_0(State, pMatrix); + D3DDevice_SetTransform_0__LTCG_eax1_edx2(State, pMatrix); __asm { LTCG_EPILOGUE diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index d8014607f..2a114cdbe 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -366,7 +366,7 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetShaderConstantMode) X_VERTEXSHADERCONSTANTMODE Mode ); -xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetShaderConstantMode_0)(); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetShaderConstantMode_0__LTCG_eax1)(); // ****************************************************************** // * patch: D3DDevice_Reset @@ -1310,7 +1310,7 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTransform) CONST D3DMATRIX *pMatrix ); -xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTransform_0)(); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTransform_0__LTCG_eax1_edx2)(); // ****************************************************************** // * patch: D3DDevice_MultiplyTransform diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index f2503ea58..ca0166b95 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -144,7 +144,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_SetRenderTarget_0", xbox::EMUPATCH(D3DDevice_SetRenderTarget_0), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetScreenSpaceOffset", xbox::EMUPATCH(D3DDevice_SetScreenSpaceOffset), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetShaderConstantMode", xbox::EMUPATCH(D3DDevice_SetShaderConstantMode), PATCH_HLE_D3D), - PATCH_ENTRY("D3DDevice_SetShaderConstantMode_0", xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_SetShaderConstantMode_0__LTCG_eax1", xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0__LTCG_eax1), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetSoftDisplayFilter", xbox::EMUPATCH(D3DDevice_SetSoftDisplayFilter), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetStipple", xbox::EMUPATCH(D3DDevice_SetStipple), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetStreamSource", xbox::EMUPATCH(D3DDevice_SetStreamSource), PATCH_HLE_D3D), @@ -157,7 +157,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_SetTexture_4__LTCG_eax_pTexture", xbox::EMUPATCH(D3DDevice_SetTexture_4__LTCG_eax_pTexture), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetTexture_4", xbox::EMUPATCH(D3DDevice_SetTexture_4), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetTransform", xbox::EMUPATCH(D3DDevice_SetTransform), PATCH_HLE_D3D), - PATCH_ENTRY("D3DDevice_SetTransform_0", xbox::EMUPATCH(D3DDevice_SetTransform_0), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_SetTransform_0__LTCG_eax1_edx2", xbox::EMUPATCH(D3DDevice_SetTransform_0__LTCG_eax1_edx2), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetVertexData2f", xbox::EMUPATCH(D3DDevice_SetVertexData2f), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetVertexData2s", xbox::EMUPATCH(D3DDevice_SetVertexData2s), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SetVertexData4f", xbox::EMUPATCH(D3DDevice_SetVertexData4f), PATCH_HLE_D3D), From 54d3ee11bb93fb494faa9e9a4e7366c8e3ca5eb1 Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Mon, 20 Dec 2021 01:38:32 -0600 Subject: [PATCH 2/2] add missing patch for D3DDevice_GetBackBuffer2_0__LTCG_eax1 --- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 68 +++++++++++++++++++---- src/core/hle/D3D8/Direct3D9/Direct3D9.h | 2 + src/core/hle/Patches.cpp | 1 + 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index ad2a4dc07..86894a588 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -300,6 +300,7 @@ g_EmuCDPD; XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_DeleteVertexShader_0, () ); \ XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_GetBackBuffer, (xbox::int_xt, D3DBACKBUFFER_TYPE, xbox::X_D3DSurface**) ); \ XB_MACRO(xbox::X_D3DSurface*, WINAPI, D3DDevice_GetBackBuffer2, (xbox::int_xt) ); \ + XB_MACRO(xbox::X_D3DSurface*, WINAPI, D3DDevice_GetBackBuffer2_0__LTCG_eax1, () ); \ XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_GetDepthStencilSurface, (xbox::X_D3DSurface**) ); \ XB_MACRO(xbox::X_D3DSurface*, WINAPI, D3DDevice_GetDepthStencilSurface2, (xbox::void_xt) ); \ XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_GetDisplayMode, (xbox::X_D3DDISPLAYMODE*) ); \ @@ -3983,18 +3984,14 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_GetGammaRamp) free(pGammaRamp); } -// ****************************************************************** -// * patch: D3DDevice_GetBackBuffer2 -// ****************************************************************** + #define COPY_BACKBUFFER_TO_XBOX_SURFACE // Uncomment to enable writing Host Backbuffers back to Xbox surfaces -xbox::X_D3DSurface* WINAPI xbox::EMUPATCH(D3DDevice_GetBackBuffer2) +xbox::X_D3DSurface* CxbxrImpl_GetBackBuffer2 ( - int_xt BackBuffer + xbox::int_xt BackBuffer ) { - LOG_FUNC_ONE_ARG(BackBuffer); - - X_D3DSurface* pXboxBackBuffer = nullptr; + xbox::X_D3DSurface* pXboxBackBuffer = nullptr; #ifndef COPY_BACKBUFFER_TO_XBOX_SURFACE @@ -4068,9 +4065,16 @@ xbox::X_D3DSurface* WINAPI xbox::EMUPATCH(D3DDevice_GetBackBuffer2) if (XB_TRMP(D3DDevice_GetBackBuffer) != nullptr) { XB_TRMP(D3DDevice_GetBackBuffer)(BackBuffer, D3DBACKBUFFER_TYPE_MONO, &pXboxBackBuffer); } - else { + else if (XB_TRMP(D3DDevice_GetBackBuffer2) != nullptr) { pXboxBackBuffer = XB_TRMP(D3DDevice_GetBackBuffer2)(BackBuffer); } + else { + __asm { + mov eax, BackBuffer + call XB_TRMP(D3DDevice_GetBackBuffer2_0__LTCG_eax1) + mov pXboxBackBuffer, eax + } + } // Now pXboxBackbuffer points to the requested Xbox backbuffer if (pXboxBackBuffer == nullptr) { @@ -4118,6 +4122,50 @@ xbox::X_D3DSurface* WINAPI xbox::EMUPATCH(D3DDevice_GetBackBuffer2) #endif // COPY_BACKBUFFER_TO_XBOX_SURFACE } +// ****************************************************************** +// * patch: D3DDevice_GetBackBuffer2 +// ****************************************************************** +xbox::X_D3DSurface* WINAPI xbox::EMUPATCH(D3DDevice_GetBackBuffer2) +( + int_xt BackBuffer + ) +{ + LOG_FUNC_ONE_ARG(BackBuffer); + + return CxbxrImpl_GetBackBuffer2(BackBuffer); +} + +static void D3DDevice_GetBackBuffer2_0__LTCG_eax1(xbox::int_xt BackBuffer) +{ + LOG_FUNC_ONE_ARG(BackBuffer); +} + +// LTCG specific GetBackBuffer2 function... +// This uses a custom calling convention where parameter is passed in EAX +__declspec(naked) xbox::X_D3DSurface* WINAPI xbox::EMUPATCH(D3DDevice_GetBackBuffer2_0__LTCG_eax1) +( +) +{ + + int_xt BackBuffer; + xbox::X_D3DSurface* pBackBuffer; + __asm { + LTCG_PROLOGUE + mov BackBuffer, eax + } + + // Log + D3DDevice_GetBackBuffer2_0__LTCG_eax1(BackBuffer); + + pBackBuffer = CxbxrImpl_GetBackBuffer2(BackBuffer); + + __asm { + mov eax, pBackBuffer + LTCG_EPILOGUE + ret + } +} + // ****************************************************************** // * patch: D3DDevice_GetBackBuffer // ****************************************************************** @@ -4130,7 +4178,7 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_GetBackBuffer) { LOG_FORWARD("D3DDevice_GetBackBuffer2"); - *ppBackBuffer = EMUPATCH(D3DDevice_GetBackBuffer2)(BackBuffer); + *ppBackBuffer = CxbxrImpl_GetBackBuffer2(BackBuffer); } bool GetHostRenderTargetDimensions(DWORD *pHostWidth, DWORD *pHostHeight, IDirect3DSurface* pHostRenderTarget = nullptr) diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 2a114cdbe..91b001154 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -321,6 +321,8 @@ X_D3DSurface* WINAPI EMUPATCH(D3DDevice_GetBackBuffer2) int_xt BackBuffer ); +X_D3DSurface* WINAPI EMUPATCH(D3DDevice_GetBackBuffer2_0__LTCG_eax1)(); + // ****************************************************************** // * patch: D3DDevice_GetBackBuffer // ****************************************************************** diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index ca0166b95..c341fe3e6 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -85,6 +85,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_FlushVertexCache", xbox::EMUPATCH(D3DDevice_FlushVertexCache), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_GetBackBuffer", xbox::EMUPATCH(D3DDevice_GetBackBuffer), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_GetBackBuffer2", xbox::EMUPATCH(D3DDevice_GetBackBuffer2), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_GetBackBuffer2_0__LTCG_eax1", xbox::EMUPATCH(D3DDevice_GetBackBuffer2_0__LTCG_eax1), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_GetDisplayFieldStatus", xbox::EMUPATCH(D3DDevice_GetDisplayFieldStatus), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_GetGammaRamp", xbox::EMUPATCH(D3DDevice_GetGammaRamp), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_GetMaterial", xbox::EMUPATCH(D3DDevice_GetMaterial), PATCH_HLE_D3D),