Fix D3DDevice_SetVertexShader_0 not calling a trampoline
Fixes NASCAR Heat 2002 rendering (again)
This commit is contained in:
parent
213dd2f86f
commit
c3568f6ea3
|
@ -301,6 +301,7 @@ g_EmuCDPD = {0};
|
|||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTexture_4__LTCG_eax_pTexture, (xbox::dword_xt) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTexture_4, (xbox::X_D3DBaseTexture*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetVertexShader, (xbox::dword_xt) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetVertexShader_0, () ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetVertexShaderInput, (xbox::dword_xt, xbox::uint_xt, xbox::X_STREAMINPUT*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetViewport, (CONST xbox::X_D3DVIEWPORT8*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTransform, (D3DTRANSFORMSTATETYPE, CONST D3DMATRIX*) ); \
|
||||
|
@ -6604,22 +6605,51 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetVertexShader)
|
|||
{
|
||||
LOG_FUNC_ONE_ARG(Handle);
|
||||
|
||||
if (XB_TRMP(D3DDevice_SetVertexShader))
|
||||
// This trampoline leads to calling D3DDevice_LoadVertexShader and D3DDevice_SelectVertexShader
|
||||
// Please raise the alarm if this is ever not the case
|
||||
XB_TRMP(D3DDevice_SetVertexShader)(Handle);
|
||||
|
||||
CxbxImpl_SetVertexShader(Handle);
|
||||
}
|
||||
|
||||
// Overload for logging
|
||||
static void D3DDevice_SetVertexShader_0
|
||||
(
|
||||
xbox::dword_xt Handle
|
||||
)
|
||||
{
|
||||
LOG_FUNC_ONE_ARG(Handle);
|
||||
}
|
||||
|
||||
// This uses a custom calling convention where Handle is passed in EBX
|
||||
// Test-case: NASCAR Heat 2002
|
||||
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetVertexShader_0)()
|
||||
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetVertexShader_0)()
|
||||
{
|
||||
dword_xt Handle;
|
||||
__asm mov Handle, ebx
|
||||
__asm {
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
sub esp, __LOCAL_SIZE
|
||||
mov Handle, ebx
|
||||
}
|
||||
|
||||
LOG_FUNC_ONE_ARG(Handle);
|
||||
// Log
|
||||
D3DDevice_SetVertexShader_0(Handle);
|
||||
|
||||
// This trampoline leads to calling D3DDevice_LoadVertexShader and D3DDevice_SelectVertexShader
|
||||
// Please raise the alarm if this is ever not the case
|
||||
__asm {
|
||||
mov ebx, Handle
|
||||
call XB_TRMP(D3DDevice_SetVertexShader_0)
|
||||
}
|
||||
|
||||
CxbxImpl_SetVertexShader(Handle);
|
||||
|
||||
__asm {
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
// TODO : Move to own file
|
||||
|
|
Loading…
Reference in New Issue