Merge pull request #1976 from CookiePLMonster/set-texture-ltcg
Add several D3D8LTCG function variations for xdk-3911
This commit is contained in:
commit
756ad91cbe
|
@ -1 +1 @@
|
|||
Subproject commit 78d06c0d9d8fe3b5d43e90312fc5910928c9c651
|
||||
Subproject commit e6df7d42775fc35ae0dec546f94c5c40452cec02
|
|
@ -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
|
||||
// ******************************************************************
|
||||
|
|
|
@ -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
|
||||
// ******************************************************************
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue