Tidy up SetShaderConstantMode and SetTexture patches

This commit is contained in:
Silent 2020-12-20 12:33:09 +01:00
parent c9a7911d15
commit 77579a6113
No known key found for this signature in database
GPG Key ID: AE53149BB0C45AF1
2 changed files with 83 additions and 41 deletions

View File

@ -4255,16 +4255,22 @@ void CxbxImpl_SetViewport(xbox::X_D3DVIEWPORT8* pViewport)
// LTCG specific D3DDevice_SetShaderConstantMode function...
// This uses a custom calling convention where parameter is passed in EAX
xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0)
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0)
(
)
{
xbox::X_VERTEXSHADERCONSTANTMODE param;
X_VERTEXSHADERCONSTANTMODE Mode;
__asm {
mov param, eax;
LTCG_PROLOGUE
mov Mode, eax
}
return EMUPATCH(D3DDevice_SetShaderConstantMode)(param);
EMUPATCH(D3DDevice_SetShaderConstantMode)(Mode);
__asm {
LTCG_EPILOGUE
ret
}
}
// ******************************************************************
@ -4272,7 +4278,7 @@ xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_SetShaderConstantMode_0)
// ******************************************************************
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetShaderConstantMode)
(
xbox::X_VERTEXSHADERCONSTANTMODE Mode
X_VERTEXSHADERCONSTANTMODE Mode
)
{
LOG_FUNC_ONE_ARG(Mode);
@ -4412,22 +4418,35 @@ xbox::void_xt __fastcall xbox::EMUPATCH(D3DDevice_SetVertexShaderConstantNotInli
EMUPATCH(D3DDevice_SetVertexShaderConstant)(Register - X_D3DSCM_CORRECTION, pConstantData, ConstantCount / 4);
}
// Overload for logging
static void D3DDevice_SetTexture_4__LTCG_eax_pTexture
(
xbox::dword_xt Stage,
xbox::X_D3DBaseTexture *pTexture
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(Stage)
LOG_FUNC_ARG(pTexture)
LOG_FUNC_END;
}
// LTCG specific D3DDevice_SetTexture function...
// This uses a custom calling convention where pTexture is passed in EAX
// Test-case: NASCAR Heat 2002
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4__LTCG_eax_pTexture)
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4__LTCG_eax_pTexture)
(
dword_xt Stage
)
{
X_D3DBaseTexture *pTexture;
__asm mov pTexture, eax;
__asm {
LTCG_PROLOGUE
mov pTexture, eax
}
//LOG_FUNC_BEGIN
// LOG_FUNC_ARG(Stage)
// LOG_FUNC_ARG(pTexture)
// LOG_FUNC_END;
EmuLog(LOG_LEVEL::DEBUG, "D3DDevice_SetTexture_4__LTCG_eax_pTexture(Stage : %d pTexture : %08x);", Stage, pTexture);
// Log
D3DDevice_SetTexture_4__LTCG_eax_pTexture(Stage, pTexture);
// Call the Xbox implementation of this function, to properly handle reference counting for us
__asm {
@ -4437,24 +4456,42 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4__LTCG_eax_pTexture)
}
g_pXbox_SetTexture[Stage] = pTexture;
__asm {
LTCG_EPILOGUE
ret 4
}
}
// Overload for logging
static void D3DDevice_SetTexture_4
(
xbox::dword_xt Stage,
xbox::X_D3DBaseTexture *pTexture
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(Stage)
LOG_FUNC_ARG(pTexture)
LOG_FUNC_END;
}
// LTCG specific D3DDevice_SetTexture function...
// This uses a custom calling convention where Stage is passed in EAX
// Test-case: Metal Wolf Chaos
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4)
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4)
(
X_D3DBaseTexture *pTexture
)
{
dword_xt Stage;
__asm mov Stage, eax;
__asm {
LTCG_PROLOGUE
mov Stage, eax
}
//LOG_FUNC_BEGIN
// LOG_FUNC_ARG(Stage)
// LOG_FUNC_ARG(pTexture)
// LOG_FUNC_END;
EmuLog(LOG_LEVEL::DEBUG, "D3DDevice_SetTexture_4(Stage : %d pTexture : %08x);", Stage, pTexture);
// Log
D3DDevice_SetTexture_4(Stage, pTexture);
// Call the Xbox implementation of this function, to properly handle reference counting for us
__asm {
@ -4464,6 +4501,11 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4)
}
g_pXbox_SetTexture[Stage] = pTexture;
__asm {
LTCG_EPILOGUE
ret 4
}
}
// ******************************************************************

View File

@ -362,10 +362,10 @@ xbox::void_xt __stdcall EMUPATCH(D3DDevice_GetViewportOffsetAndScale_0)();
// ******************************************************************
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetShaderConstantMode)
(
xbox::X_VERTEXSHADERCONSTANTMODE Mode
X_VERTEXSHADERCONSTANTMODE Mode
);
xbox::void_xt __stdcall EMUPATCH(D3DDevice_SetShaderConstantMode_0)();
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetShaderConstantMode_0)();
// ******************************************************************
// * patch: D3DDevice_Reset