diff --git a/import/XbSymbolDatabase b/import/XbSymbolDatabase index b67157637..a477ce6ad 160000 --- a/import/XbSymbolDatabase +++ b/import/XbSymbolDatabase @@ -1 +1 @@ -Subproject commit b671576370e044d5b3533ab4e35a296ed9a86021 +Subproject commit a477ce6ad6278e1c7358a446cdd8d995a8c45d12 diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index c6489325b..6fd582cfd 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -272,7 +272,6 @@ g_EmuCDPD; XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_LightEnable, (xbox::dword_xt, 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, __stdcall, D3DDevice_LoadVertexShader_0, () );*/\ /*XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_LoadVertexShader_4, (xbox::dword_xt) );*/\ XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_PersistDisplay, (xbox::void_xt) ); \ XB_MACRO(xbox::hresult_xt, WINAPI, D3DDevice_Reset, (xbox::X_D3DPRESENT_PARAMETERS*) ); \ @@ -3603,7 +3602,7 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_GetVisibilityTestResult) } // Overload for logging -static void D3DDevice_LoadVertexShader_0 +static void D3DDevice_LoadVertexShader_0__LTCG_eax_Address_ecx_Handle ( xbox::dword_xt Handle, xbox::dword_xt Address @@ -3618,7 +3617,7 @@ static void D3DDevice_LoadVertexShader_0 // LTCG specific D3DDevice_LoadVertexShader function... // This uses a custom calling convention where parameter is passed in EAX, ECX // Test-case: Aggressive Inline -__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader_0) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_eax_Address_ecx_Handle) ( ) { @@ -3631,7 +3630,46 @@ __declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader } // Log - D3DDevice_LoadVertexShader_0(Handle, Address); + D3DDevice_LoadVertexShader_0__LTCG_eax_Address_ecx_Handle(Handle, Address); + + CxbxImpl_LoadVertexShader(Handle, Address); + + __asm { + LTCG_EPILOGUE + ret + } +} + +// Overload for logging +static void D3DDevice_LoadVertexShader_0__LTCG_eax_Address_edx_Handle +( + xbox::dword_xt Handle, + xbox::dword_xt Address +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Address) + LOG_FUNC_END; +} + +// LTCG specific D3DDevice_LoadVertexShader function... +// This uses a custom calling convention where parameter is passed in EAX, EDX +// Test-case: World Racing 2, Project Zero 2 (PAL) +__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_eax_Address_edx_Handle) +( +) +{ + dword_xt Handle; + dword_xt Address; + __asm { + LTCG_PROLOGUE + mov Address, eax + mov Handle, edx + } + + // Log + D3DDevice_LoadVertexShader_0__LTCG_eax_Address_edx_Handle(Handle, Address); CxbxImpl_LoadVertexShader(Handle, Address); diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.h b/src/core/hle/D3D8/Direct3D9/Direct3D9.h index 06b6209b5..8f3c92459 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.h +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.h @@ -216,7 +216,8 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader) dword_xt Address ); -xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader_0)(); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_eax_Address_ecx_Handle)(); +xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_eax_Address_edx_Handle)(); xbox::void_xt WINAPI EMUPATCH(D3DDevice_LoadVertexShader_4) ( dword_xt Address diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index 23d70598c..ae49b40a4 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -107,7 +107,8 @@ std::map g_PatchTable = { PATCH_ENTRY("D3DDevice_LightEnable", xbox::EMUPATCH(D3DDevice_LightEnable), 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", xbox::EMUPATCH(D3DDevice_LoadVertexShader_0), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_LoadVertexShader_0__LTCG_eax_Address_ecx_Handle", xbox::EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_eax_Address_ecx_Handle), PATCH_HLE_D3D), + PATCH_ENTRY("D3DDevice_LoadVertexShader_0__LTCG_eax_Address_edx_Handle", xbox::EMUPATCH(D3DDevice_LoadVertexShader_0__LTCG_eax_Address_edx_Handle), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_LoadVertexShader_4", xbox::EMUPATCH(D3DDevice_LoadVertexShader_4), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_MultiplyTransform", xbox::EMUPATCH(D3DDevice_MultiplyTransform), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_PersistDisplay", xbox::EMUPATCH(D3DDevice_PersistDisplay), PATCH_HLE_D3D),