diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index d0e91de19..c3737eb8f 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -6487,25 +6487,16 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_EnableOverlay_0__LTCG)() CxbxrImpl_EnableOverlay(); } -// ****************************************************************** -// * patch: D3DDevice_UpdateOverlay -// ****************************************************************** -xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_UpdateOverlay) +static void CxbxrImpl_UpdateOverlay ( - X_D3DSurface *pSurface, - CONST RECT *SrcRect, - CONST RECT *DstRect, - bool_xt EnableColorKey, - D3DCOLOR ColorKey + xbox::X_D3DSurface *pSurface, + CONST RECT *SrcRect, + CONST RECT *DstRect, + xbox::bool_xt EnableColorKey, + D3DCOLOR ColorKey ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG(pSurface) - LOG_FUNC_ARG(SrcRect) - LOG_FUNC_ARG(DstRect) - LOG_FUNC_ARG(EnableColorKey) - LOG_FUNC_ARG(ColorKey) - LOG_FUNC_END; + using namespace xbox; // Reset and remember the overlay arguments, so our D3DDevice_Swap patch // can correctly show this overlay surface data. @@ -6530,6 +6521,76 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_UpdateOverlay) } } +// ****************************************************************** +// * patch: D3DDevice_UpdateOverlay +// ****************************************************************** +xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_UpdateOverlay) +( + X_D3DSurface *pSurface, + CONST RECT *SrcRect, + CONST RECT *DstRect, + bool_xt EnableColorKey, + D3DCOLOR ColorKey +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(pSurface) + LOG_FUNC_ARG(SrcRect) + LOG_FUNC_ARG(DstRect) + LOG_FUNC_ARG(EnableColorKey) + LOG_FUNC_ARG(ColorKey) + LOG_FUNC_END; + + CxbxrImpl_UpdateOverlay(pSurface, SrcRect, DstRect, EnableColorKey, ColorKey); +} + +// ****************************************************************** +// * patch: D3DDevice_UpdateOverlay_16__LTCG_eax2 +// ****************************************************************** +static void D3DDevice_UpdateOverlay_16__LTCG_eax2 +( + xbox::X_D3DSurface *pSurface, + CONST RECT *SrcRect, + CONST RECT *DstRect, + xbox::bool_xt EnableColorKey, + D3DCOLOR ColorKey +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(pSurface) + LOG_FUNC_ARG(SrcRect) + LOG_FUNC_ARG(DstRect) + LOG_FUNC_ARG(EnableColorKey) + LOG_FUNC_ARG(ColorKey) + LOG_FUNC_END; +} + +// This uses a custom calling convention where parameter is passed in EAX +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_UpdateOverlay_16__LTCG_eax2) +( + X_D3DSurface *pSurface, + CONST RECT *DstRect, + bool_xt EnableColorKey, + D3DCOLOR ColorKey +) +{ + RECT* SrcRect; + __asm { + LTCG_PROLOGUE + mov SrcRect, eax + } + + // Log + D3DDevice_UpdateOverlay_16__LTCG_eax2(pSurface, SrcRect, DstRect, EnableColorKey, ColorKey); + + CxbxrImpl_UpdateOverlay(pSurface, SrcRect, DstRect, EnableColorKey, ColorKey); + + __asm { + LTCG_EPILOGUE + ret 16 + } +} + // ****************************************************************** // * patch: D3DDevice_GetOverlayUpdateStatus // ****************************************************************** diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 6010b2e82..d9fc2020f 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -999,7 +999,18 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_UpdateOverlay) X_D3DSurface *pSurface, CONST RECT *SrcRect, CONST RECT *DstRect, - bool_xt EnableColorKey, + bool_xt EnableColorKey, + D3DCOLOR ColorKey +); + +// ****************************************************************** +// * patch: D3DDevice_UpdateOverlay +// ****************************************************************** +xbox::void_xt WINAPI EMUPATCH(D3DDevice_UpdateOverlay_16__LTCG_eax2) +( + X_D3DSurface *pSurface, + CONST RECT *DstRect, + bool_xt EnableColorKey, D3DCOLOR ColorKey ); diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index 9228a8cb3..c3161efc8 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -194,6 +194,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_Swap_0__LTCG_eax1", xbox::EMUPATCH(D3DDevice_Swap_0__LTCG_eax1), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_SwitchTexture", xbox::EMUPATCH(D3DDevice_SwitchTexture), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_UpdateOverlay", xbox::EMUPATCH(D3DDevice_UpdateOverlay), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_UpdateOverlay_16__LTCG_eax2", xbox::EMUPATCH(D3DDevice_UpdateOverlay_16__LTCG_eax2), 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__LTCG_eax1", xbox::EMUPATCH(D3D_BlockOnTime_4__LTCG_eax1), PATCH_HLE_D3D),