Merge pull request #1976 from CookiePLMonster/set-texture-ltcg

Add several D3D8LTCG function variations for xdk-3911
This commit is contained in:
Luke Usher 2020-10-12 08:41:01 +01:00 committed by GitHub
commit 756ad91cbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 139 additions and 21 deletions

@ -1 +1 @@
Subproject commit 78d06c0d9d8fe3b5d43e90312fc5910928c9c651
Subproject commit e6df7d42775fc35ae0dec546f94c5c40452cec02

View File

@ -294,8 +294,10 @@ g_EmuCDPD = {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_4, (xbox::uint_xt, xbox::X_D3DVertexBuffer*, 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) ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTexture, (xbox::dword_xt, xbox::X_D3DBaseTexture*) ); \
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTexture_4, (xbox::X_D3DBaseTexture*) ); \
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_SetVertexShaderInput, (xbox::dword_xt, xbox::uint_xt, xbox::X_STREAMINPUT*) );*/\
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetViewport, (CONST xbox::X_D3DVIEWPORT8*) ); \
@ -4188,26 +4190,23 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_CreateVertexShader)
}
// LTCG specific D3DDevice_SetVertexShaderConstant function...
// This uses a custom calling convention where parameter is passed in EDX
// This uses a custom calling convention where ConstantCount parameter is passed in EDX
// Test-case: Murakumo
xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_SetVertexShaderConstant_8)
xbox::void_xt __fastcall xbox::EMUPATCH(D3DDevice_SetVertexShaderConstant_8)
(
void*,
dword_xt ConstantCount,
int_xt Register,
CONST PVOID pConstantData
)
{
static uint32_t returnAddr;
LOG_FUNC_BEGIN
LOG_FUNC_ARG(Register)
LOG_FUNC_ARG(pConstantData)
LOG_FUNC_ARG(ConstantCount)
LOG_FUNC_END;
#ifdef _DEBUG_TRACE
__asm add esp, 4
#endif
__asm {
pop returnAddr
push edx
call EmuPatch_D3DDevice_SetVertexShaderConstant
mov eax, 0
push returnAddr
ret
}
CxbxImpl_SetVertexShaderConstant(Register, pConstantData, ConstantCount);
}
// ******************************************************************
@ -4317,8 +4316,34 @@ xbox::void_xt __fastcall xbox::EMUPATCH(D3DDevice_SetVertexShaderConstantNotInli
}
// LTCG specific D3DDevice_SetTexture function...
// This uses a custom calling convention where parameter is passed in EAX
// TODO: XB_trampoline plus Log function is not working due lost parameter in EAX.
// 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)
(
dword_xt Stage
)
{
X_D3DBaseTexture *pTexture;
__asm 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);
// Call the Xbox implementation of this function, to properly handle reference counting for us
__asm {
mov eax, pTexture
push Stage
call XB_TRMP(D3DDevice_SetTexture_4__LTCG_eax_pTexture)
}
g_pXbox_SetTexture[Stage] = pTexture;
}
// 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)
(
@ -4335,7 +4360,11 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTexture_4)
EmuLog(LOG_LEVEL::DEBUG, "D3DDevice_SetTexture_4(Stage : %d pTexture : %08x);", Stage, pTexture);
// Call the Xbox implementation of this function, to properly handle reference counting for us
//XB_TRMP(D3DDevice_SetTexture_4)(pTexture);
__asm {
mov eax, Stage
push pTexture
call XB_TRMP(D3DDevice_SetTexture_4)
}
g_pXbox_SetTexture[Stage] = pTexture;
}
@ -6606,6 +6635,29 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetStreamSource_8)
//XB_TRMP(D3DDevice_SetStreamSource_8)(pStreamData, Stride);
}
// This uses a custom calling convention where StreamNumber parameter is passed in EDX
// Test-case: NASCAR Heat 2002
xbox::void_xt __fastcall xbox::EMUPATCH(D3DDevice_SetStreamSource_8__LTCG_edx_StreamNumber)
(
void*,
uint_xt StreamNumber,
X_D3DVertexBuffer *pStreamData,
uint_xt Stride
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(StreamNumber)
LOG_FUNC_ARG(pStreamData)
LOG_FUNC_ARG(Stride)
LOG_FUNC_END;
CxbxImpl_SetStreamSource(StreamNumber, pStreamData, Stride);
// Forward to Xbox implementation
// This should stop us having to patch GetStreamSource!
XB_TRMP(D3DDevice_SetStreamSource_8__LTCG_edx_StreamNumber)(nullptr, StreamNumber, pStreamData, Stride);
}
// ******************************************************************
// * patch: D3DDevice_SetStreamSource
// ******************************************************************
@ -6644,6 +6696,20 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetVertexShader)
UpdateViewPortOffsetAndScaleConstants();
}
// 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)()
{
dword_xt Handle;
__asm mov Handle, ebx
LOG_FUNC_ONE_ARG(Handle);
CxbxImpl_SetVertexShader(Handle);
UpdateViewPortOffsetAndScaleConstants();
}
// TODO : Move to own file
constexpr unsigned int IndicesPerPage = PAGE_SIZE / sizeof(INDEX16);
constexpr unsigned int InputQuadsPerPage = ((IndicesPerPage * VERTICES_PER_QUAD) / VERTICES_PER_TRIANGLE) / TRIANGLES_PER_QUAD;
@ -7431,6 +7497,24 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP)
CxbxHandleXboxCallbacks();
}
// LTCG specific D3DDevice_DrawVerticesUP function...
// This uses a custom calling convention where pVertexStreamZeroData is passed in EBX
// Test-case: NASCAR Heat 20002
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12)
(
X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt VertexCount,
uint_xt VertexStreamZeroStride
)
{
PVOID pVertexStreamZeroData;
__asm mov pVertexStreamZeroData, ebx
LOG_FORWARD("D3DDevice_DrawVerticesUP");
EMUPATCH(D3DDevice_DrawVerticesUP)(PrimitiveType, VertexCount, pVertexStreamZeroData, VertexStreamZeroStride);
}
// ******************************************************************
// * patch: D3DDevice_DrawIndexedVertices
// ******************************************************************

View File

@ -444,7 +444,14 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetVertexShaderConstant)
dword_xt ConstantCount
);
xbox::void_xt __stdcall EMUPATCH(D3DDevice_SetVertexShaderConstant_8)();
xbox::void_xt __fastcall EMUPATCH(D3DDevice_SetVertexShaderConstant_8)
(
void*,
dword_xt ConstantCount,
int_xt Register,
CONST PVOID pConstantData
);
// ******************************************************************
// * patch: D3DDevice_SetVertexShaderConstant1
@ -619,6 +626,11 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTexture)
X_D3DBaseTexture *pTexture
);
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTexture_4__LTCG_eax_pTexture)
(
dword_xt Stage
);
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTexture_4)
(
X_D3DBaseTexture *pTexture
@ -1372,6 +1384,14 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetStreamSource_8)
uint_xt Stride
);
xbox::void_xt __fastcall EMUPATCH(D3DDevice_SetStreamSource_8__LTCG_edx_StreamNumber)
(
void*,
uint_xt StreamNumber,
X_D3DVertexBuffer *pStreamData,
uint_xt Stride
);
// ******************************************************************
// * patch: D3DDevice_SetVertexShader
// ******************************************************************
@ -1380,6 +1400,8 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetVertexShader)
dword_xt Handle
);
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetVertexShader_0)();
// ******************************************************************
// * patch: D3DDevice_DrawVertices
// ******************************************************************
@ -1409,6 +1431,14 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP)
uint_xt VertexStreamZeroStride
);
xbox::void_xt WINAPI EMUPATCH(D3DDevice_DrawVerticesUP_12)
(
X_D3DPRIMITIVETYPE PrimitiveType,
uint_xt VertexCount,
uint_xt VertexStreamZeroStride
);
// ******************************************************************
// * patch: D3DDevice_DrawIndexedVertices
// ******************************************************************

View File

@ -74,6 +74,7 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
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_DrawVerticesUP", xbox::EMUPATCH(D3DDevice_DrawVerticesUP), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_DrawVerticesUP_12", xbox::EMUPATCH(D3DDevice_DrawVerticesUP_12), 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_EndPush", xbox::EMUPATCH(D3DDevice_EndPush), PATCH_HLE_D3D),
@ -147,8 +148,10 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("D3DDevice_SetStreamSource", xbox::EMUPATCH(D3DDevice_SetStreamSource), 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),
PATCH_ENTRY("D3DDevice_SetSwapCallback", xbox::EMUPATCH(D3DDevice_SetSwapCallback), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetTexture", xbox::EMUPATCH(D3DDevice_SetTexture), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetTexture_4__LTCG_eax_pTexture", xbox::EMUPATCH(D3DDevice_SetTexture_4__LTCG_eax_pTexture), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetTexture_4", xbox::EMUPATCH(D3DDevice_SetTexture_4), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetTransform", xbox::EMUPATCH(D3DDevice_SetTransform), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetTransform_0", xbox::EMUPATCH(D3DDevice_SetTransform_0), PATCH_HLE_D3D),
@ -160,6 +163,7 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("D3DDevice_SetVertexData4ub", xbox::EMUPATCH(D3DDevice_SetVertexData4ub), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetVertexDataColor", xbox::EMUPATCH(D3DDevice_SetVertexDataColor), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetVertexShader", xbox::EMUPATCH(D3DDevice_SetVertexShader), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetVertexShader_0", xbox::EMUPATCH(D3DDevice_SetVertexShader_0), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetVertexShaderConstant", xbox::EMUPATCH(D3DDevice_SetVertexShaderConstant), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetVertexShaderConstant1", xbox::EMUPATCH(D3DDevice_SetVertexShaderConstant1), PATCH_HLE_D3D),
PATCH_ENTRY("D3DDevice_SetVertexShaderConstant1Fast", xbox::EMUPATCH(D3DDevice_SetVertexShaderConstant1Fast), PATCH_HLE_D3D),