Add a new LTCG variation of D3DDevice_SetStreamSource

Found in Juiced.
This commit is contained in:
Silent 2021-04-25 16:23:11 +02:00
parent 1034185a62
commit 1e92046b0b
No known key found for this signature in database
GPG Key ID: AE53149BB0C45AF1
4 changed files with 51 additions and 1 deletions

@ -1 +1 @@
Subproject commit 5b8d3feb15c2edae309c1613ca0bc26e54f0c23e
Subproject commit c2fe7365adae51ffabd9fe318ecdfaeac2cbe097

View File

@ -322,6 +322,7 @@ g_EmuCDPD;
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetRenderTarget, (xbox::X_D3DSurface*, xbox::X_D3DSurface*) ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetRenderTarget_0, () ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetStreamSource, (xbox::uint_xt, xbox::X_D3DVertexBuffer*, xbox::uint_xt) ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride, () ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetStreamSource_4, (xbox::uint_xt) ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetStreamSource_8, (xbox::X_D3DVertexBuffer*, xbox::uint_xt) ); \
XB_MACRO(xbox::void_xt, __fastcall, D3DDevice_SetStreamSource_8__LTCG_edx_StreamNumber, (void*, xbox::uint_xt, xbox::X_D3DVertexBuffer*, xbox::uint_xt) ); \
@ -6879,6 +6880,52 @@ xbox::void_xt WINAPI xbox::EMUPATCH(Lock3DSurface)
ForceResourceRehash(pPixelContainer);
}
// Overload for logging
static void D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride
(
xbox::uint_xt StreamNumber,
xbox::X_D3DVertexBuffer *pStreamData,
xbox::uint_xt Stride
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(StreamNumber)
LOG_FUNC_ARG(pStreamData)
LOG_FUNC_ARG(Stride)
LOG_FUNC_END;
}
// LTCG specific D3DDevice_SetStreamSource function...
// This uses a custom calling convention where parameters are passed in EAX, EDI, EBX
// Test-case: Juiced
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride)()
{
uint_xt StreamNumber;
X_D3DVertexBuffer *pStreamData;
uint_xt Stride;
__asm {
LTCG_PROLOGUE
mov StreamNumber, eax
mov pStreamData, edi
mov Stride, ebx
}
// Log
D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride(StreamNumber, pStreamData, Stride);
CxbxImpl_SetStreamSource(StreamNumber, pStreamData, Stride);
__asm {
mov eax, StreamNumber
mov edi, pStreamData
mov ebx, Stride
call XB_TRMP(D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride)
LTCG_EPILOGUE
ret
}
}
// Overload for logging
static void D3DDevice_SetStreamSource_4
(

View File

@ -1370,6 +1370,8 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetStreamSource)
uint_xt Stride
);
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride)();
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetStreamSource_4)
(
uint_xt Stride

View File

@ -148,6 +148,7 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("D3DDevice_SetStateVB", xbox::EMUPATCH(D3DDevice_SetStateVB), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetStipple", xbox::EMUPATCH(D3DDevice_SetStipple), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetStreamSource", xbox::EMUPATCH(D3DDevice_SetStreamSource), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride", xbox::EMUPATCH(D3DDevice_SetStreamSource_0__LTCG_eax_StreamNumber_edi_pStreamData_ebx_Stride), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetStreamSource_4", xbox::EMUPATCH(D3DDevice_SetStreamSource_4), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetStreamSource_8", xbox::EMUPATCH(D3DDevice_SetStreamSource_8), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetStreamSource_8__LTCG_edx_StreamNumber", xbox::EMUPATCH(D3DDevice_SetStreamSource_8__LTCG_edx_StreamNumber), PATCH_HLE_D3D),