Merge pull request #2007 from CookiePLMonster/burnout-patches
Changes to D3D patches
This commit is contained in:
commit
3b82af621d
|
@ -303,6 +303,9 @@ g_EmuCDPD = {0};
|
|||
/*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*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTransform, (D3DTRANSFORMSTATETYPE, CONST D3DMATRIX*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_SetTransform_0, () ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3DDevice_MultiplyTransform, (D3DTRANSFORMSTATETYPE, CONST D3DMATRIX*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3D_DestroyResource, (xbox::X_D3DResource*) ); \
|
||||
XB_MACRO(xbox::void_xt, WINAPI, D3D_DestroyResource__LTCG, (xbox::void_xt) ); \
|
||||
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice, (xbox::uint_xt, D3DDEVTYPE, HWND, xbox::dword_xt, xbox::X_D3DPRESENT_PARAMETERS*, IDirect3DDevice**) ); \
|
||||
|
@ -6445,21 +6448,51 @@ xbox::void_xt __fastcall xbox::EMUPATCH(D3DDevice_SetRenderState_Simple)
|
|||
XboxRenderStates.SetXboxRenderState(XboxRenderStateIndex, Value);
|
||||
}
|
||||
|
||||
void CxbxImpl_SetTransform
|
||||
(
|
||||
D3DTRANSFORMSTATETYPE State,
|
||||
CONST D3DMATRIX *pMatrix
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(State)
|
||||
LOG_FUNC_ARG(pMatrix)
|
||||
LOG_FUNC_END;
|
||||
|
||||
State = EmuXB2PC_D3DTS(State);
|
||||
|
||||
HRESULT hRet = g_pD3DDevice->SetTransform(State, pMatrix);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetTransform");
|
||||
}
|
||||
|
||||
// LTCG specific D3DDevice_SetTransform function...
|
||||
// This uses a custom calling convention where parameter is passed in EAX, EDX
|
||||
xbox::void_xt __stdcall xbox::EMUPATCH(D3DDevice_SetTransform_0)
|
||||
__declspec(naked) xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTransform_0)
|
||||
(
|
||||
)
|
||||
{
|
||||
D3DTRANSFORMSTATETYPE param1;
|
||||
CONST D3DMATRIX *param2;
|
||||
D3DTRANSFORMSTATETYPE State;
|
||||
CONST D3DMATRIX *pMatrix;
|
||||
|
||||
// prologue
|
||||
__asm {
|
||||
mov param1, eax
|
||||
mov param2, edx
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
sub esp, __LOCAL_SIZE
|
||||
mov State, eax
|
||||
mov pMatrix, edx
|
||||
// Trampoline to guest code to remove the need for a GetTransform patch
|
||||
call XB_TRMP(D3DDevice_SetTransform_0)
|
||||
}
|
||||
|
||||
return EMUPATCH(D3DDevice_SetTransform)(param1, param2);
|
||||
CxbxImpl_SetTransform(State, pMatrix);
|
||||
|
||||
// epilogue
|
||||
__asm {
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -6471,36 +6504,9 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_SetTransform)
|
|||
CONST D3DMATRIX *pMatrix
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(State)
|
||||
LOG_FUNC_ARG(pMatrix)
|
||||
LOG_FUNC_END;
|
||||
|
||||
/*
|
||||
printf("pMatrix (%d)\n", State);
|
||||
printf("{\n");
|
||||
printf(" %.08f,%.08f,%.08f,%.08f\n", pMatrix->_11, pMatrix->_12, pMatrix->_13, pMatrix->_14);
|
||||
printf(" %.08f,%.08f,%.08f,%.08f\n", pMatrix->_21, pMatrix->_22, pMatrix->_23, pMatrix->_24);
|
||||
printf(" %.08f,%.08f,%.08f,%.08f\n", pMatrix->_31, pMatrix->_32, pMatrix->_33, pMatrix->_34);
|
||||
printf(" %.08f,%.08f,%.08f,%.08f\n", pMatrix->_41, pMatrix->_42, pMatrix->_43, pMatrix->_44);
|
||||
printf("}\n");
|
||||
|
||||
if(State == 6 && (pMatrix->_11 == 1.0f) && (pMatrix->_22 == 1.0f) && (pMatrix->_33 == 1.0f) && (pMatrix->_44 == 1.0f))
|
||||
{
|
||||
g_bSkipPush = TRUE;
|
||||
printf("SkipPush ON\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
g_bSkipPush = FALSE;
|
||||
printf("SkipPush OFF\n");
|
||||
}
|
||||
*/
|
||||
|
||||
State = EmuXB2PC_D3DTS(State);
|
||||
|
||||
HRESULT hRet = g_pD3DDevice->SetTransform(State, pMatrix);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetTransform");
|
||||
// Trampoline to guest code to remove the need for a GetTransform patch
|
||||
XB_TRMP(D3DDevice_SetTransform)(State, pMatrix);
|
||||
CxbxImpl_SetTransform(State, pMatrix);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -6517,33 +6523,16 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_MultiplyTransform)
|
|||
LOG_FUNC_ARG(pMatrix)
|
||||
LOG_FUNC_END;
|
||||
|
||||
|
||||
// Trampoline to guest code to remove the need for a GetTransform patch
|
||||
XB_TRMP(D3DDevice_MultiplyTransform)(State, pMatrix);
|
||||
|
||||
State = EmuXB2PC_D3DTS(State);
|
||||
|
||||
HRESULT hRet = g_pD3DDevice->MultiplyTransform(State, pMatrix);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->MultiplyTransform");
|
||||
}
|
||||
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: D3DDevice_GetTransform
|
||||
// ******************************************************************
|
||||
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_GetTransform)
|
||||
(
|
||||
D3DTRANSFORMSTATETYPE State,
|
||||
D3DMATRIX *pMatrix
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(State)
|
||||
LOG_FUNC_ARG(pMatrix)
|
||||
LOG_FUNC_END;
|
||||
|
||||
State = EmuXB2PC_D3DTS(State);
|
||||
|
||||
HRESULT hRet = g_pD3DDevice->GetTransform(State, pMatrix);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->GetTransform");
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: Lock2DSurface
|
||||
// ******************************************************************
|
||||
|
@ -8608,6 +8597,33 @@ void WINAPI xbox::EMUPATCH(D3D_BlockOnTime)( dword_xt Unknown1, int Unknown2 )
|
|||
LOG_UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
// LTCG specific D3D_BlockOnTime function
|
||||
// This uses a custom calling convention where parameter is passed in EAX
|
||||
// Test case: Burnout 3
|
||||
__declspec(naked) void WINAPI xbox::EMUPATCH(D3D_BlockOnTime_4)( dword_xt Unknown1 )
|
||||
{
|
||||
int Unknown2;
|
||||
|
||||
// prologue
|
||||
__asm {
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
sub esp, __LOCAL_SIZE
|
||||
mov Unknown2, eax // get parameter from eax
|
||||
}
|
||||
|
||||
// LOG_FORWARD requires unwinding, so carry on without it
|
||||
EMUPATCH(D3D_BlockOnTime)(Unknown1, Unknown2);
|
||||
|
||||
// epilogue
|
||||
__asm {
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
ret 4
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool DestroyResource_Common(xbox::X_D3DResource* pResource)
|
||||
{
|
||||
if (pResource == g_pXbox_RenderTarget) {
|
||||
|
|
|
@ -4135,3 +4135,23 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_GetVertexShaderFunction)
|
|||
|
||||
return hRet;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: D3DDevice_GetTransform
|
||||
// ******************************************************************
|
||||
xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_GetTransform)
|
||||
(
|
||||
D3DTRANSFORMSTATETYPE State,
|
||||
D3DMATRIX *pMatrix
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(State)
|
||||
LOG_FUNC_ARG(pMatrix)
|
||||
LOG_FUNC_END;
|
||||
|
||||
State = EmuXB2PC_D3DTS(State);
|
||||
|
||||
HRESULT hRet = g_pD3DDevice->GetTransform(State, pMatrix);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->GetTransform");
|
||||
}
|
||||
|
|
|
@ -1313,7 +1313,7 @@ xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTransform)
|
|||
CONST D3DMATRIX *pMatrix
|
||||
);
|
||||
|
||||
xbox::void_xt __stdcall EMUPATCH(D3DDevice_SetTransform_0)();
|
||||
xbox::void_xt WINAPI EMUPATCH(D3DDevice_SetTransform_0)();
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: D3DDevice_MultiplyTransform
|
||||
|
@ -2068,6 +2068,12 @@ void WINAPI EMUPATCH(D3D_SetCommonDebugRegisters)();
|
|||
// ******************************************************************
|
||||
void WINAPI EMUPATCH(D3D_BlockOnTime)( dword_xt Unknown1, int Unknown2 );
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: D3D_BlockOnTime_4
|
||||
// One of the parameters (unknown which) passed in EAX
|
||||
// ******************************************************************
|
||||
void WINAPI EMUPATCH(D3D_BlockOnTime_4)( dword_xt Unknown1 );
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: D3D_BlockOnResource
|
||||
// ******************************************************************
|
||||
|
|
|
@ -90,7 +90,7 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
|
|||
PATCH_ENTRY("D3DDevice_GetOverlayUpdateStatus", xbox::EMUPATCH(D3DDevice_GetOverlayUpdateStatus), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3DDevice_GetProjectionViewportMatrix", xbox::EMUPATCH(D3DDevice_GetProjectionViewportMatrix), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3DDevice_GetShaderConstantMode", xbox::EMUPATCH(D3DDevice_GetShaderConstantMode), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3DDevice_GetTransform", xbox::EMUPATCH(D3DDevice_GetTransform), PATCH_HLE_D3D),
|
||||
//PATCH_ENTRY("D3DDevice_GetTransform", xbox::EMUPATCH(D3DDevice_GetTransform), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3DDevice_GetVertexShader", xbox::EMUPATCH(D3DDevice_GetVertexShader), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3DDevice_GetVertexShaderConstant", xbox::EMUPATCH(D3DDevice_GetVertexShaderConstant), PATCH_HLE_D3D),
|
||||
//PATCH_ENTRY("D3DDevice_GetVertexShaderDeclaration", xbox::EMUPATCH(D3DDevice_GetVertexShaderDeclaration), PATCH_HLE_D3D),
|
||||
|
@ -181,6 +181,7 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
|
|||
PATCH_ENTRY("D3DDevice_UpdateOverlay", xbox::EMUPATCH(D3DDevice_UpdateOverlay), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3DResource_BlockUntilNotBusy", xbox::EMUPATCH(D3DResource_BlockUntilNotBusy), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3D_BlockOnTime", xbox::EMUPATCH(D3D_BlockOnTime), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3D_BlockOnTime_4", xbox::EMUPATCH(D3D_BlockOnTime_4), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3D_DestroyResource", xbox::EMUPATCH(D3D_DestroyResource), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3D_DestroyResource__LTCG", xbox::EMUPATCH(D3D_DestroyResource__LTCG), PATCH_HLE_D3D),
|
||||
PATCH_ENTRY("D3D_LazySetPointParams", xbox::EMUPATCH(D3D_LazySetPointParams), PATCH_HLE_D3D),
|
||||
|
|
Loading…
Reference in New Issue