diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 02893a8e2..4290bc995 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -313,6 +313,7 @@ g_EmuCDPD; XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_GetRenderTarget, (xbox::X_D3DSurface**) ); \ XB_MACRO(xbox::X_D3DSurface*, WINAPI, D3DDevice_GetRenderTarget2, (xbox::void_xt) ); \ XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_LightEnable, (xbox::dword_xt, xbox::bool_xt) ); \ + XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_LightEnable_4__LTCG_eax1, (xbox::bool_xt) ); \ /*XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_LoadVertexShader, (xbox::dword_xt, xbox::dword_xt) );*/\ /*XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_LoadVertexShaderProgram, (CONST xbox::dword_xt*, xbox::dword_xt) );*/\ /*XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_LoadVertexShader_4__LTCG_eax1, (xbox::dword_xt) );*/\ @@ -8604,13 +8605,25 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetMaterial) DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetMaterial"); } +static HRESULT CxbxrImpl_LightEnable(xbox::dword_xt Index, xbox::bool_xt bEnable) +{ + LOG_INIT; + + d3d8LightState.EnableLight(Index, bEnable); + + HRESULT hRet = g_pD3DDevice->LightEnable(Index, bEnable); + DEBUG_D3DRESULT(hRet, "g_pD3DDevice->LightEnable"); + + return hRet; +} + // ****************************************************************** // * patch: D3DDevice_LightEnable // ****************************************************************** xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_LightEnable) ( - dword_xt Index, - bool_xt bEnable + dword_xt Index, + bool_xt bEnable ) { LOG_FUNC_BEGIN @@ -8620,14 +8633,58 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_LightEnable) XB_TRMP(D3DDevice_LightEnable)(Index, bEnable); - d3d8LightState.EnableLight(Index, bEnable); - - HRESULT hRet = g_pD3DDevice->LightEnable(Index, bEnable); - DEBUG_D3DRESULT(hRet, "g_pD3DDevice->LightEnable"); + HRESULT hRet = CxbxrImpl_LightEnable(Index, bEnable); return hRet; } +// ****************************************************************** +// * patch: D3DDevice_LightEnable_4__LTCG_eax1 +// ****************************************************************** +// Overload for logging +static void D3DDevice_LightEnable_4__LTCG_eax1 +( + xbox::dword_xt Index, + xbox::bool_xt bEnable +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Index) + LOG_FUNC_ARG(bEnable) + LOG_FUNC_END; +} + +// This uses a custom calling convention where parameter is passed in EAX +__declspec(naked) xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_LightEnable_4__LTCG_eax1) +( + bool_xt bEnable +) +{ + xbox::dword_xt Index; + HRESULT hRet; + __asm { + LTCG_PROLOGUE + mov Index, eax + } + + // Log + D3DDevice_LightEnable_4__LTCG_eax1(Index, bEnable); + + __asm { + push bEnable + mov eax, Index + call XB_TRMP(D3DDevice_LightEnable_4__LTCG_eax1) + } + + hRet = CxbxrImpl_LightEnable(Index, bEnable); + + __asm { + mov eax, hRet + LTCG_EPILOGUE + ret 4 + } +} + // SetRenderTarget can call CommonSetRenderTarget, nested call detection is required // Test case: Midtown Madness 3 static thread_local uint32_t setRenderTargetCount = 0; diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 860bdb982..d3cfbf8d8 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -1556,6 +1556,14 @@ xbox::hresult_xt WINAPI EMUPATCH(D3DDevice_LightEnable) bool_xt bEnable ); +// ****************************************************************** +// * patch: D3DDevice_LightEnable_4__LTCG_eax1 +// ****************************************************************** +xbox::hresult_xt WINAPI EMUPATCH(D3DDevice_LightEnable_4__LTCG_eax1) +( + bool_xt bEnable +); + // ****************************************************************** // * patch: D3DDevice_Release // ****************************************************************** diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index bfc30563c..71da3b716 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -116,6 +116,7 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_IsBusy", xbox::EMUPATCH(D3DDevice_IsBusy), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_IsFencePending", xbox::EMUPATCH(D3DDevice_IsFencePending), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_LightEnable", xbox::EMUPATCH(D3DDevice_LightEnable), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_LightEnable_4__LTCG_eax1", xbox::EMUPATCH(D3DDevice_LightEnable_4__LTCG_eax1), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_LoadVertexShader", xbox::EMUPATCH(D3DDevice_LoadVertexShader), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_LoadVertexShaderProgram", xbox::EMUPATCH(D3DDevice_LoadVertexShaderProgram), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_LoadVertexShader_0__LTCG_ecx1_eax2", xbox::EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_ecx1_eax2), PATCH_HLE_D3D),