d3d8ltcg: add D3DDevice_LightEnable_4__LTCG_eax1 patch

This commit is contained in:
RadWolfie 2025-07-22 22:06:38 -05:00
parent 433ef5c7f2
commit 540f7a9276
3 changed files with 72 additions and 6 deletions

View File

@ -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;

View File

@ -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
// ******************************************************************

View File

@ -116,6 +116,7 @@ std::map<const std::string, const xbox_patch_t> 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),