diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 492df0e19..ce228c265 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -8608,6 +8608,33 @@ void WINAPI xbox::EMUPATCH(D3D_BlockOnTime)( dword_xt Unknown1, int Unknown2 ) LOG_UNIMPLEMENTED(); } +// LTCG specific D3D_BlockOnTime function +// This uses a custom calling convention where parameter is passed in EAX +// Test case: Burnout 3 +__declspec(naked) void WINAPI xbox::EMUPATCH(D3D_BlockOnTime_4)( dword_xt Unknown1 ) +{ + int Unknown2; + + // prologue + __asm { + push ebp + mov ebp, esp + sub esp, __LOCAL_SIZE + mov Unknown2, eax // get parameter from eax + } + + // LOG_FORWARD requires unwinding, so carry on without it + EMUPATCH(D3D_BlockOnTime)(Unknown1, Unknown2); + + // epilogue + __asm { + mov esp, ebp + pop ebp + ret 4 + } +} + + bool DestroyResource_Common(xbox::X_D3DResource* pResource) { if (pResource == g_pXbox_RenderTarget) { diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 9232494c3..b00c54d37 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -2068,6 +2068,12 @@ void WINAPI EMUPATCH(D3D_SetCommonDebugRegisters)(); // ****************************************************************** void WINAPI EMUPATCH(D3D_BlockOnTime)( dword_xt Unknown1, int Unknown2 ); +// ****************************************************************** +// * patch: D3D_BlockOnTime_4 +// One of the parameters (unknown which) passed in EAX +// ****************************************************************** +void WINAPI EMUPATCH(D3D_BlockOnTime_4)( dword_xt Unknown1 ); + // ****************************************************************** // * patch: D3D_BlockOnResource // ****************************************************************** diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index 3fef16dfa..11b43665a 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -181,6 +181,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_UpdateOverlay", xbox::EMUPATCH(D3DDevice_UpdateOverlay), PATCH_HLE_D3D), PATCH_ENTRY("D3DResource_BlockUntilNotBusy", xbox::EMUPATCH(D3DResource_BlockUntilNotBusy), PATCH_HLE_D3D), PATCH_ENTRY("D3D_BlockOnTime", xbox::EMUPATCH(D3D_BlockOnTime), PATCH_HLE_D3D), + PATCH_ENTRY("D3D_BlockOnTime_4", xbox::EMUPATCH(D3D_BlockOnTime_4), PATCH_HLE_D3D), PATCH_ENTRY("D3D_DestroyResource", xbox::EMUPATCH(D3D_DestroyResource), PATCH_HLE_D3D), PATCH_ENTRY("D3D_DestroyResource__LTCG", xbox::EMUPATCH(D3D_DestroyResource__LTCG), PATCH_HLE_D3D), PATCH_ENTRY("D3D_LazySetPointParams", xbox::EMUPATCH(D3D_LazySetPointParams), PATCH_HLE_D3D),