From d02afcd668539e4ebac01c11046672d6e3ed7268 Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Tue, 22 Jul 2025 21:28:40 -0500 Subject: [PATCH] d3d8ltcg: add D3DDevice_RunPushBuffer_4__LTCG_eax2 patch --- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 39 +++++++++++++++++++++++ src/core/hle/D3D8/Direct3D9/Direct3D9.h | 8 +++++ src/core/hle/Patches.cpp | 1 + 3 files changed, 48 insertions(+) diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index d3923c645..ea7eb36bf 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -4822,6 +4822,45 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_RunPushBuffer) EmuExecutePushBuffer(pPushBuffer, pFixup); } +// ****************************************************************** +// * patch: D3DDevice_RunPushBuffer_4__LTCG_eax2 +// ****************************************************************** +// Overload for logging +static void D3DDevice_RunPushBuffer_4__LTCG_eax2 +( + xbox::X_D3DPushBuffer *pPushBuffer, + xbox::X_D3DFixup *pFixup +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(pPushBuffer) + LOG_FUNC_ARG(pFixup) + LOG_FUNC_END; +} + +// This uses a custom calling convention where parameter is passed in EAX +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_RunPushBuffer_4__LTCG_eax2) +( + X_D3DPushBuffer *pPushBuffer +) +{ + X_D3DFixup* pFixup; + __asm { + LTCG_PROLOGUE + mov pFixup, eax + } + + // Log + D3DDevice_RunPushBuffer_4__LTCG_eax2(pPushBuffer, pFixup); + + EmuExecutePushBuffer(pPushBuffer, pFixup); + + __asm { + LTCG_EPILOGUE + ret 4 + } +} + // ****************************************************************** // * patch: D3DDevice_Clear // ****************************************************************** diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 8c2fbe113..9c7979a5c 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -736,6 +736,14 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_RunPushBuffer) X_D3DFixup *pFixup ); +// ****************************************************************** +// * patch: D3DDevice_RunPushBuffer_4__LTCG_eax2 +// ****************************************************************** +xbox::void_xt WINAPI EMUPATCH(D3DDevice_RunPushBuffer_4__LTCG_eax2) +( + X_D3DPushBuffer *pPushBuffer +); + // ****************************************************************** // * patch: D3DDevice_Clear // ****************************************************************** diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index 6f634cff2..17d114428 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -128,6 +128,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_Reset_0__LTCG_edi1", xbox::EMUPATCH(D3DDevice_Reset_0__LTCG_edi1), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_Reset_0__LTCG_ebx1", xbox::EMUPATCH(D3DDevice_Reset_0__LTCG_ebx1), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_RunPushBuffer", xbox::EMUPATCH(D3DDevice_RunPushBuffer), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_RunPushBuffer_4__LTCG_eax2", xbox::EMUPATCH(D3DDevice_RunPushBuffer_4__LTCG_eax2), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_RunVertexStateShader", xbox::EMUPATCH(D3DDevice_RunVertexStateShader), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_RunVertexStateShader_4__LTCG_esi2", xbox::EMUPATCH(D3DDevice_RunVertexStateShader_4__LTCG_esi2), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SelectVertexShader", xbox::EMUPATCH(D3DDevice_SelectVertexShader), PATCH_HLE_D3D),