Merge pull request #2417 from RadWolfie/d3d-update

Update XbSymbolDatabase fix and add LTCG patch missing
This commit is contained in:
Luke Usher 2023-03-06 14:50:23 +00:00 committed by GitHub
commit 6389cb6524
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 102 additions and 27 deletions

@ -1 +1 @@
Subproject commit 313ed04a76e1079178652fa0deaf78c96c061e37 Subproject commit 774111351210e6f340246d6fb32741b09708f381

View File

@ -3317,12 +3317,12 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_GetDisplayFieldStatus)(X_D3DFIELD_
} }
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_BeginPush // * patch: D3DDevice_BeginPush_4
// TODO: Find a test case and verify this // TODO: Find a test case and verify this
// Starting from XDK 4531, this changed to 1 parameter only. // Starting from XDK 4531, this changed to 1 parameter only.
// Is this definition incorrect, or did it change at some point? // Is this definition incorrect, or did it change at some point?
// ****************************************************************** // ******************************************************************
xbox::PDWORD WINAPI xbox::EMUPATCH(D3DDevice_BeginPush)(dword_xt Count) xbox::PDWORD WINAPI xbox::EMUPATCH(D3DDevice_BeginPush_4)(dword_xt Count)
{ {
LOG_FUNC_ONE_ARG(Count); LOG_FUNC_ONE_ARG(Count);
@ -3340,11 +3340,11 @@ xbox::PDWORD WINAPI xbox::EMUPATCH(D3DDevice_BeginPush)(dword_xt Count)
} }
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_BeginPush2 // * patch: D3DDevice_BeginPush_8
// TODO: Find a test case and verify this: RalliSport Challenge XDK 4134 // TODO: Find a test case and verify this: RalliSport Challenge XDK 4134
// For XDK before 4531 // For XDK before 4531
// ****************************************************************** // ******************************************************************
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_BeginPush2)(dword_xt Count, dword_xt** ppPush) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_BeginPush_8)(dword_xt Count, dword_xt** ppPush)
{ {
LOG_FUNC_BEGIN LOG_FUNC_BEGIN
LOG_FUNC_ARG(Count) LOG_FUNC_ARG(Count)
@ -7851,7 +7851,7 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetPixelShader)
// This uses a custom calling convention where parameter is passed in ECX, EAX and Stack // This uses a custom calling convention where parameter is passed in ECX, EAX and Stack
// Test Case: Conker // Test Case: Conker
// ****************************************************************** // ******************************************************************
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_4) __declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_4__LTCG_ecx2_eax3)
( (
X_D3DPRIMITIVETYPE PrimitiveType X_D3DPRIMITIVETYPE PrimitiveType
) )
@ -7872,6 +7872,30 @@ __declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_4)
} }
} }
// ******************************************************************
// * patch: D3DDevice_DrawVertices_8__LTCG_eax3
// LTCG specific D3DDevice_DrawVertices function...
// ******************************************************************
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVertices_8__LTCG_eax3)
(
X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt StartVertex
)
{
uint_xt VertexCount;
__asm {
LTCG_PROLOGUE
mov VertexCount, eax
}
EMUPATCH(D3DDevice_DrawVertices)(PrimitiveType, StartVertex, VertexCount);
__asm {
LTCG_EPILOGUE
ret 4
}
}
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_DrawVertices // * patch: D3DDevice_DrawVertices
// ****************************************************************** // ******************************************************************
@ -8033,7 +8057,7 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP)
// LTCG specific D3DDevice_DrawVerticesUP function... // LTCG specific D3DDevice_DrawVerticesUP function...
// This uses a custom calling convention where pVertexStreamZeroData is passed in EBX // This uses a custom calling convention where pVertexStreamZeroData is passed in EBX
// Test-case: NASCAR Heat 20002 // Test-case: NASCAR Heat 20002
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12) __declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12__LTCG_ebx3)
( (
X_D3DPRIMITIVETYPE PrimitiveType, X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt VertexCount, uint_xt VertexCount,
@ -9120,15 +9144,52 @@ xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateVB_8)(addr_xt _this, ulong_x
// ****************************************************************** // ******************************************************************
// * patch: CDevice_SetStateUP (D3D::CDevice::SetStateUP) // * patch: CDevice_SetStateUP (D3D::CDevice::SetStateUP)
// ****************************************************************** // ******************************************************************
xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP)() xbox::void_xt CxbxrImpl_CDevice_SetStateUP(xbox::addr_xt _this)
{ {
LOG_FUNC();
LOG_UNIMPLEMENTED(); LOG_UNIMPLEMENTED();
// TODO: Anything? // TODO: Anything?
// __asm int 3; //__asm int 3;
}
xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP)()
{
addr_xt _this;
__asm mov _this, ecx;
LOG_FUNC_ONE_ARG(_this);
CxbxrImpl_CDevice_SetStateUP(_this);
}
xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP_4)(xbox::addr_xt _this)
{
LOG_FUNC_ONE_ARG(_this);
CxbxrImpl_CDevice_SetStateUP(_this);
}
static void CDevice_SetStateUP_0__LTCG_esi1(xbox::addr_xt _this)
{
LOG_FUNC_ONE_ARG(_this);
}
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(CDevice_SetStateUP_0__LTCG_esi1)()
{
addr_xt _this;
__asm {
LTCG_PROLOGUE
mov _this, esi
}
// Log
CDevice_SetStateUP_0__LTCG_esi1(_this);
CxbxrImpl_CDevice_SetStateUP(_this);
__asm {
LTCG_EPILOGUE
ret
}
} }
// ****************************************************************** // ******************************************************************

View File

@ -144,14 +144,14 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_GetDisplayFieldStatus)
); );
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_BeginPush // * patch: D3DDevice_BeginPush_4
// ****************************************************************** // ******************************************************************
xbox::PDWORD WINAPI EMUPATCH(D3DDevice_BeginPush)(dword_xt Count); xbox::PDWORD WINAPI EMUPATCH(D3DDevice_BeginPush_4)(dword_xt Count);
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_BeginPush2 //two arg version for xdk before 4531 // * patch: D3DDevice_BeginPush_8
// ****************************************************************** // ******************************************************************
xbox::void_xt WINAPI EMUPATCH(D3DDevice_BeginPush2)(dword_xt Count, dword_xt **ppPush); xbox::void_xt WINAPI EMUPATCH(D3DDevice_BeginPush_8)(dword_xt Count, dword_xt **ppPush);
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_EndPush // * patch: D3DDevice_EndPush
@ -1394,18 +1394,27 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetVertexShader_0)();
xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices) xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices)
( (
X_D3DPRIMITIVETYPE PrimitiveType, X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt StartVertex, uint_xt StartVertex,
uint_xt VertexCount uint_xt VertexCount
); );
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_DrawVertices_4 // * patch: D3DDevice_DrawVertices_4__LTCG_ecx2_eax3
// ****************************************************************** // ******************************************************************
xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices_4) xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices_4__LTCG_ecx2_eax3)
( (
X_D3DPRIMITIVETYPE PrimitiveType X_D3DPRIMITIVETYPE PrimitiveType
); );
// ******************************************************************
// * patch: D3DDevice_DrawVertices_8__LTCG_eax3
// ******************************************************************
xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVertices_8__LTCG_eax3)
(
X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt StartVertex
);
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_DrawVerticesUP // * patch: D3DDevice_DrawVerticesUP
// ****************************************************************** // ******************************************************************
@ -1417,11 +1426,11 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP)
uint_xt VertexStreamZeroStride uint_xt VertexStreamZeroStride
); );
xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP_12) xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP_12__LTCG_ebx3)
( (
X_D3DPRIMITIVETYPE PrimitiveType, X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt VertexCount, uint_xt VertexCount,
uint_xt VertexStreamZeroStride uint_xt VertexStreamZeroStride
); );
@ -1908,6 +1917,8 @@ xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateVB_8)(xbox::addr_xt _this, xbox::u
// * patch: CDevice_SetStateUP (D3D::CDevice::SetStateUP) // * patch: CDevice_SetStateUP (D3D::CDevice::SetStateUP)
// ****************************************************************** // ******************************************************************
xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP)(); xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP)();
xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP_4)(xbox::addr_xt _this);
xbox::void_xt WINAPI EMUPATCH(CDevice_SetStateUP_0__LTCG_esi1)();
// ****************************************************************** // ******************************************************************
// * patch: D3DDevice_SetStipple // * patch: D3DDevice_SetStipple

View File

@ -57,11 +57,13 @@ const uint32_t PATCH_IS_FIBER = 1 << 4;
std::map<const std::string, const xbox_patch_t> g_PatchTable = { std::map<const std::string, const xbox_patch_t> g_PatchTable = {
// Direct3D // Direct3D
PATCH_ENTRY("CDevice_SetStateUP", xbox::EMUPATCH(CDevice_SetStateUP), PATCH_HLE_D3D), PATCH_ENTRY("CDevice_SetStateUP", xbox::EMUPATCH(CDevice_SetStateUP), PATCH_HLE_D3D),
PATCH_ENTRY("CDevice_SetStateUP_4", xbox::EMUPATCH(CDevice_SetStateUP_4), PATCH_HLE_D3D),
PATCH_ENTRY("CDevice_SetStateUP_0__LTCG_esi1", xbox::EMUPATCH(CDevice_SetStateUP_0__LTCG_esi1), PATCH_HLE_D3D),
PATCH_ENTRY("CDevice_SetStateVB", xbox::EMUPATCH(CDevice_SetStateVB), PATCH_HLE_D3D), PATCH_ENTRY("CDevice_SetStateVB", xbox::EMUPATCH(CDevice_SetStateVB), PATCH_HLE_D3D),
PATCH_ENTRY("CDevice_SetStateVB_8", xbox::EMUPATCH(CDevice_SetStateVB_8), PATCH_HLE_D3D), PATCH_ENTRY("CDevice_SetStateVB_8", xbox::EMUPATCH(CDevice_SetStateVB_8), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_Begin", xbox::EMUPATCH(D3DDevice_Begin), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_Begin", xbox::EMUPATCH(D3DDevice_Begin), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_BeginPush", xbox::EMUPATCH(D3DDevice_BeginPush), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BeginPush_4", xbox::EMUPATCH(D3DDevice_BeginPush_4), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_BeginPush2", xbox::EMUPATCH(D3DDevice_BeginPush2), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BeginPush_8", xbox::EMUPATCH(D3DDevice_BeginPush_8), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_BeginVisibilityTest", xbox::EMUPATCH(D3DDevice_BeginVisibilityTest), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BeginVisibilityTest", xbox::EMUPATCH(D3DDevice_BeginVisibilityTest), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_BlockOnFence", xbox::EMUPATCH(D3DDevice_BlockOnFence), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BlockOnFence", xbox::EMUPATCH(D3DDevice_BlockOnFence), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_BlockUntilVerticalBlank", xbox::EMUPATCH(D3DDevice_BlockUntilVerticalBlank), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_BlockUntilVerticalBlank", xbox::EMUPATCH(D3DDevice_BlockUntilVerticalBlank), PATCH_HLE_D3D),
@ -75,9 +77,10 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("D3DDevice_DrawRectPatch", xbox::EMUPATCH(D3DDevice_DrawRectPatch), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawRectPatch", xbox::EMUPATCH(D3DDevice_DrawRectPatch), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawTriPatch", xbox::EMUPATCH(D3DDevice_DrawTriPatch), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawTriPatch", xbox::EMUPATCH(D3DDevice_DrawTriPatch), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawVertices", xbox::EMUPATCH(D3DDevice_DrawVertices), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawVertices", xbox::EMUPATCH(D3DDevice_DrawVertices), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawVertices_4", xbox::EMUPATCH(D3DDevice_DrawVertices_4), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawVertices_4__LTCG_ecx2_eax3", xbox::EMUPATCH(D3DDevice_DrawVertices_4__LTCG_ecx2_eax3), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawVertices_8__LTCG_eax3", xbox::EMUPATCH(D3DDevice_DrawVertices_8__LTCG_eax3), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawVerticesUP", xbox::EMUPATCH(D3DDevice_DrawVerticesUP), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawVerticesUP", xbox::EMUPATCH(D3DDevice_DrawVerticesUP), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawVerticesUP_12", xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_DrawVerticesUP_12__LTCG_ebx3", xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12__LTCG_ebx3), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_EnableOverlay", xbox::EMUPATCH(D3DDevice_EnableOverlay), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_EnableOverlay", xbox::EMUPATCH(D3DDevice_EnableOverlay), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_End", xbox::EMUPATCH(D3DDevice_End), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_End", xbox::EMUPATCH(D3DDevice_End), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_EndPush", xbox::EMUPATCH(D3DDevice_EndPush), PATCH_HLE_D3D), PATCH_ENTRY("D3DDevice_EndPush", xbox::EMUPATCH(D3DDevice_EndPush), PATCH_HLE_D3D),