Refactor LTCG versions of Direct3D_CreateDevice
* Make Direct3D_CreateDevice_4 naked to remove the risk of trashing parameters * Split Direct3D_CreateDevice_16 into two separate functions with different calling convention
This commit is contained in:
parent
cbe534cb54
commit
feef6ffb3d
|
@ -1 +1 @@
|
||||||
Subproject commit e6df7d42775fc35ae0dec546f94c5c40452cec02
|
Subproject commit b20e55df4087606e21a865a707c6fa4a5a01bd50
|
|
@ -311,7 +311,8 @@ g_EmuCDPD = {0};
|
||||||
XB_MACRO(xbox::void_xt, WINAPI, D3D_DestroyResource, (xbox::X_D3DResource*) ); \
|
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::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**) ); \
|
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice, (xbox::uint_xt, D3DDEVTYPE, HWND, xbox::dword_xt, xbox::X_D3DPRESENT_PARAMETERS*, IDirect3DDevice**) ); \
|
||||||
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice_16, (xbox::uint_xt, D3DDEVTYPE, HWND, xbox::X_D3DPRESENT_PARAMETERS*) ); \
|
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface, (xbox::uint_xt, D3DDEVTYPE, HWND, xbox::X_D3DPRESENT_PARAMETERS*) ); \
|
||||||
|
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface, (xbox::uint_xt, D3DDEVTYPE, HWND, xbox::X_D3DPRESENT_PARAMETERS*) ); \
|
||||||
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice_4, (xbox::X_D3DPRESENT_PARAMETERS*) ); \
|
XB_MACRO(xbox::hresult_xt, WINAPI, Direct3D_CreateDevice_4, (xbox::X_D3DPRESENT_PARAMETERS*) ); \
|
||||||
XB_MACRO(xbox::void_xt, WINAPI, Lock2DSurface, (xbox::X_D3DPixelContainer*, D3DCUBEMAP_FACES, xbox::uint_xt, D3DLOCKED_RECT*, RECT*, xbox::dword_xt) ); \
|
XB_MACRO(xbox::void_xt, WINAPI, Lock2DSurface, (xbox::X_D3DPixelContainer*, D3DCUBEMAP_FACES, xbox::uint_xt, D3DLOCKED_RECT*, RECT*, xbox::dword_xt) ); \
|
||||||
XB_MACRO(xbox::void_xt, WINAPI, Lock3DSurface, (xbox::X_D3DPixelContainer*, xbox::uint_xt, D3DLOCKED_BOX*, D3DBOX*, xbox::dword_xt) ); \
|
XB_MACRO(xbox::void_xt, WINAPI, Lock3DSurface, (xbox::X_D3DPixelContainer*, xbox::uint_xt, D3DLOCKED_BOX*, D3DBOX*, xbox::dword_xt) ); \
|
||||||
|
@ -3146,10 +3147,25 @@ void Direct3D_CreateDevice_End()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Overload for logging
|
||||||
|
static void Direct3D_CreateDevice_4
|
||||||
|
(
|
||||||
|
xbox::dword_xt BehaviorFlags,
|
||||||
|
xbox::X_D3DPRESENT_PARAMETERS *pPresentationParameters,
|
||||||
|
IDirect3DDevice **ppReturnedDeviceInterface
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LOG_FUNC_BEGIN
|
||||||
|
LOG_FUNC_ARG(BehaviorFlags)
|
||||||
|
LOG_FUNC_ARG(pPresentationParameters)
|
||||||
|
LOG_FUNC_ARG_OUT(ppReturnedDeviceInterface)
|
||||||
|
LOG_FUNC_END;
|
||||||
|
}
|
||||||
|
|
||||||
// LTCG specific Direct3D_CreateDevice function...
|
// LTCG specific Direct3D_CreateDevice function...
|
||||||
// This uses a custom calling with parameters passed in eax, ecx and the stack
|
// This uses a custom calling with parameters passed in EAX, ECX and the stack
|
||||||
// Test-case: Ninja Gaiden, Halo 2
|
// Test-case: Ninja Gaiden, Halo 2
|
||||||
xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_4)
|
__declspec(naked) xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_4)
|
||||||
(
|
(
|
||||||
X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
||||||
)
|
)
|
||||||
|
@ -3158,58 +3174,178 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_4)
|
||||||
IDirect3DDevice **ppReturnedDeviceInterface;
|
IDirect3DDevice **ppReturnedDeviceInterface;
|
||||||
|
|
||||||
__asm {
|
__asm {
|
||||||
mov BehaviorFlags, eax
|
push ebp
|
||||||
mov ppReturnedDeviceInterface, ecx
|
mov ebp, esp
|
||||||
}
|
sub esp, __LOCAL_SIZE
|
||||||
|
mov BehaviorFlags, eax
|
||||||
|
mov ppReturnedDeviceInterface, ecx
|
||||||
|
}
|
||||||
|
|
||||||
LOG_FUNC_BEGIN
|
// Log
|
||||||
LOG_FUNC_ARG(pPresentationParameters)
|
Direct3D_CreateDevice_4(BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
|
||||||
LOG_FUNC_END;
|
|
||||||
|
|
||||||
Direct3D_CreateDevice_Start(pPresentationParameters);
|
Direct3D_CreateDevice_Start(pPresentationParameters);
|
||||||
|
|
||||||
hresult_xt hRet = 0;
|
|
||||||
|
|
||||||
// Only then call Xbox CreateDevice function
|
// Only then call Xbox CreateDevice function
|
||||||
__asm {
|
hresult_xt hRet;
|
||||||
mov eax, BehaviorFlags
|
__asm {
|
||||||
mov ecx, ppReturnedDeviceInterface
|
push pPresentationParameters
|
||||||
push pPresentationParameters
|
mov eax, BehaviorFlags
|
||||||
call XB_TRMP(Direct3D_CreateDevice_4)
|
mov ecx, ppReturnedDeviceInterface
|
||||||
mov hRet, eax
|
call XB_TRMP(Direct3D_CreateDevice_4)
|
||||||
}
|
mov hRet, eax
|
||||||
|
}
|
||||||
|
|
||||||
Direct3D_CreateDevice_End();
|
Direct3D_CreateDevice_End();
|
||||||
|
|
||||||
return hRet;
|
__asm {
|
||||||
|
mov eax, hRet
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebp
|
||||||
|
ret 4
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LTCG specific Direct3D_CreateDevice function...
|
// Overload for logging
|
||||||
// This uses a custom calling convention passed unknown parameters
|
static void Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface
|
||||||
// Test-case: Battle Engine Aquila
|
|
||||||
xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_16)
|
|
||||||
(
|
(
|
||||||
uint_xt Adapter,
|
xbox::uint_xt Adapter,
|
||||||
D3DDEVTYPE DeviceType,
|
D3DDEVTYPE DeviceType,
|
||||||
HWND hFocusWindow,
|
HWND hFocusWindow,
|
||||||
X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
xbox::dword_xt BehaviorFlags,
|
||||||
|
xbox::X_D3DPRESENT_PARAMETERS *pPresentationParameters,
|
||||||
|
IDirect3DDevice **ppReturnedDeviceInterface
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LOG_FUNC_BEGIN
|
LOG_FUNC_BEGIN
|
||||||
LOG_FUNC_ARG(Adapter)
|
LOG_FUNC_ARG(Adapter)
|
||||||
LOG_FUNC_ARG(DeviceType)
|
LOG_FUNC_ARG(DeviceType)
|
||||||
LOG_FUNC_ARG(hFocusWindow)
|
LOG_FUNC_ARG(hFocusWindow)
|
||||||
|
LOG_FUNC_ARG(BehaviorFlags)
|
||||||
LOG_FUNC_ARG(pPresentationParameters)
|
LOG_FUNC_ARG(pPresentationParameters)
|
||||||
|
LOG_FUNC_ARG_OUT(ppReturnedDeviceInterface)
|
||||||
LOG_FUNC_END;
|
LOG_FUNC_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LTCG specific Direct3D_CreateDevice function...
|
||||||
|
// This uses a custom calling convention passing parameters on stack, in EAX and ECX
|
||||||
|
// Test-case: Aggressive Inline, Midtown Madness 3
|
||||||
|
__declspec(naked) xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface)
|
||||||
|
(
|
||||||
|
uint_xt Adapter,
|
||||||
|
D3DDEVTYPE DeviceType,
|
||||||
|
HWND hFocusWindow,
|
||||||
|
X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
dword_xt BehaviorFlags;
|
||||||
|
IDirect3DDevice **ppReturnedDeviceInterface;
|
||||||
|
|
||||||
|
__asm {
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
sub esp, __LOCAL_SIZE
|
||||||
|
mov BehaviorFlags, eax
|
||||||
|
mov ppReturnedDeviceInterface, ecx
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log
|
||||||
|
Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface(Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
|
||||||
|
|
||||||
Direct3D_CreateDevice_Start(pPresentationParameters);
|
Direct3D_CreateDevice_Start(pPresentationParameters);
|
||||||
|
|
||||||
// Only then call Xbox CreateDevice function
|
// Only then call Xbox CreateDevice function
|
||||||
hresult_xt hRet = XB_TRMP(Direct3D_CreateDevice_16)(Adapter, DeviceType, hFocusWindow, pPresentationParameters);
|
hresult_xt hRet;
|
||||||
|
__asm {
|
||||||
|
push pPresentationParameters
|
||||||
|
push hFocusWindow
|
||||||
|
push DeviceType
|
||||||
|
push Adapter
|
||||||
|
mov eax, BehaviorFlags
|
||||||
|
mov ecx, ppReturnedDeviceInterface
|
||||||
|
call XB_TRMP(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface)
|
||||||
|
mov hRet, eax
|
||||||
|
}
|
||||||
|
|
||||||
Direct3D_CreateDevice_End();
|
Direct3D_CreateDevice_End();
|
||||||
|
|
||||||
return hRet;
|
__asm {
|
||||||
|
mov eax, hRet
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebp
|
||||||
|
ret 10h
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overload for logging
|
||||||
|
static void Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface
|
||||||
|
(
|
||||||
|
xbox::uint_xt Adapter,
|
||||||
|
D3DDEVTYPE DeviceType,
|
||||||
|
HWND hFocusWindow,
|
||||||
|
xbox::dword_xt BehaviorFlags,
|
||||||
|
xbox::X_D3DPRESENT_PARAMETERS *pPresentationParameters,
|
||||||
|
IDirect3DDevice **ppReturnedDeviceInterface
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LOG_FUNC_BEGIN
|
||||||
|
LOG_FUNC_ARG(Adapter)
|
||||||
|
LOG_FUNC_ARG(DeviceType)
|
||||||
|
LOG_FUNC_ARG(hFocusWindow)
|
||||||
|
LOG_FUNC_ARG(BehaviorFlags)
|
||||||
|
LOG_FUNC_ARG(pPresentationParameters)
|
||||||
|
LOG_FUNC_ARG_OUT(ppReturnedDeviceInterface)
|
||||||
|
LOG_FUNC_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LTCG specific Direct3D_CreateDevice function...
|
||||||
|
// This uses a custom calling convention passing parameters on stack, in EAX and EBX
|
||||||
|
// Test-case: NASCAR Heat 2002
|
||||||
|
__declspec(naked) xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface)
|
||||||
|
(
|
||||||
|
uint_xt Adapter,
|
||||||
|
D3DDEVTYPE DeviceType,
|
||||||
|
HWND hFocusWindow,
|
||||||
|
X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
dword_xt BehaviorFlags;
|
||||||
|
IDirect3DDevice **ppReturnedDeviceInterface;
|
||||||
|
|
||||||
|
__asm {
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
sub esp, __LOCAL_SIZE
|
||||||
|
mov BehaviorFlags, eax
|
||||||
|
mov ppReturnedDeviceInterface, ebx
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log
|
||||||
|
Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface(Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
|
||||||
|
|
||||||
|
Direct3D_CreateDevice_Start(pPresentationParameters);
|
||||||
|
|
||||||
|
// Only then call Xbox CreateDevice function
|
||||||
|
hresult_xt hRet;
|
||||||
|
__asm {
|
||||||
|
push pPresentationParameters
|
||||||
|
push hFocusWindow
|
||||||
|
push DeviceType
|
||||||
|
push Adapter
|
||||||
|
mov eax, BehaviorFlags
|
||||||
|
mov ebx, ppReturnedDeviceInterface
|
||||||
|
call XB_TRMP(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface)
|
||||||
|
mov hRet, eax
|
||||||
|
}
|
||||||
|
|
||||||
|
Direct3D_CreateDevice_End();
|
||||||
|
|
||||||
|
__asm {
|
||||||
|
mov eax, hRet
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebp
|
||||||
|
ret 10h
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
|
@ -3277,9 +3413,9 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(Direct3D_CreateDevice)
|
||||||
LOG_FUNC_ARG(Adapter)
|
LOG_FUNC_ARG(Adapter)
|
||||||
LOG_FUNC_ARG(DeviceType)
|
LOG_FUNC_ARG(DeviceType)
|
||||||
LOG_FUNC_ARG(hFocusWindow)
|
LOG_FUNC_ARG(hFocusWindow)
|
||||||
LOG_FUNC_ARG(BehaviorFlags) // Xbox ignores BehaviorFlags
|
LOG_FUNC_ARG(BehaviorFlags)
|
||||||
LOG_FUNC_ARG(pPresentationParameters)
|
LOG_FUNC_ARG(pPresentationParameters)
|
||||||
LOG_FUNC_ARG(ppReturnedDeviceInterface)
|
LOG_FUNC_ARG_OUT(ppReturnedDeviceInterface)
|
||||||
LOG_FUNC_END;
|
LOG_FUNC_END;
|
||||||
|
|
||||||
Direct3D_CreateDevice_Start(pPresentationParameters);
|
Direct3D_CreateDevice_Start(pPresentationParameters);
|
||||||
|
|
|
@ -92,7 +92,15 @@ xbox::hresult_xt WINAPI EMUPATCH(Direct3D_CreateDevice)
|
||||||
IDirect3DDevice **ppReturnedDeviceInterface
|
IDirect3DDevice **ppReturnedDeviceInterface
|
||||||
);
|
);
|
||||||
|
|
||||||
xbox::hresult_xt WINAPI EMUPATCH(Direct3D_CreateDevice_16)
|
xbox::hresult_xt WINAPI EMUPATCH(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface)
|
||||||
|
(
|
||||||
|
uint_xt Adapter,
|
||||||
|
D3DDEVTYPE DeviceType,
|
||||||
|
HWND hFocusWindow,
|
||||||
|
X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
||||||
|
);
|
||||||
|
|
||||||
|
xbox::hresult_xt WINAPI EMUPATCH(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface)
|
||||||
(
|
(
|
||||||
uint_xt Adapter,
|
uint_xt Adapter,
|
||||||
D3DDEVTYPE DeviceType,
|
D3DDEVTYPE DeviceType,
|
||||||
|
|
|
@ -189,7 +189,8 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
|
||||||
PATCH_ENTRY("D3D_LazySetPointParams", xbox::EMUPATCH(D3D_LazySetPointParams), PATCH_HLE_D3D),
|
PATCH_ENTRY("D3D_LazySetPointParams", xbox::EMUPATCH(D3D_LazySetPointParams), PATCH_HLE_D3D),
|
||||||
PATCH_ENTRY("D3D_SetCommonDebugRegisters", xbox::EMUPATCH(D3D_SetCommonDebugRegisters), PATCH_HLE_D3D),
|
PATCH_ENTRY("D3D_SetCommonDebugRegisters", xbox::EMUPATCH(D3D_SetCommonDebugRegisters), PATCH_HLE_D3D),
|
||||||
PATCH_ENTRY("Direct3D_CreateDevice", xbox::EMUPATCH(Direct3D_CreateDevice), PATCH_HLE_D3D),
|
PATCH_ENTRY("Direct3D_CreateDevice", xbox::EMUPATCH(Direct3D_CreateDevice), PATCH_HLE_D3D),
|
||||||
PATCH_ENTRY("Direct3D_CreateDevice_16", xbox::EMUPATCH(Direct3D_CreateDevice_16), PATCH_HLE_D3D),
|
PATCH_ENTRY("Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface", xbox::EMUPATCH(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ebx_ppReturnedDeviceInterface), PATCH_HLE_D3D),
|
||||||
|
PATCH_ENTRY("Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface", xbox::EMUPATCH(Direct3D_CreateDevice_16__LTCG_eax_BehaviorFlags_ecx_ppReturnedDeviceInterface), PATCH_HLE_D3D),
|
||||||
PATCH_ENTRY("Direct3D_CreateDevice_4", xbox::EMUPATCH(Direct3D_CreateDevice_4), PATCH_HLE_D3D),
|
PATCH_ENTRY("Direct3D_CreateDevice_4", xbox::EMUPATCH(Direct3D_CreateDevice_4), PATCH_HLE_D3D),
|
||||||
PATCH_ENTRY("Lock2DSurface", xbox::EMUPATCH(Lock2DSurface), PATCH_HLE_D3D),
|
PATCH_ENTRY("Lock2DSurface", xbox::EMUPATCH(Lock2DSurface), PATCH_HLE_D3D),
|
||||||
PATCH_ENTRY("Lock3DSurface", xbox::EMUPATCH(Lock3DSurface), PATCH_HLE_D3D),
|
PATCH_ENTRY("Lock3DSurface", xbox::EMUPATCH(Lock3DSurface), PATCH_HLE_D3D),
|
||||||
|
|
Loading…
Reference in New Issue