Use a macro to import Xbox function trampolines
This commit is contained in:
parent
a3c6974804
commit
b41a50de31
|
@ -205,6 +205,11 @@ g_EmuCDPD = {0};
|
|||
|
||||
#endif
|
||||
|
||||
// Declares an unpatched Xbox function trampoline, callable by name (with a 'XB_' prefix attached)
|
||||
#define XB_trampoline(ret, conv, name, arguments) \
|
||||
typedef ret(conv *XB_##name##_t)arguments; \
|
||||
static XB_##name##_t XB_##name = (XB_##name##_t)GetXboxFunctionPointer(#name);
|
||||
|
||||
// TODO: This should be a D3DDevice structure
|
||||
DWORD g_XboxD3DDevice[64 * ONE_KB / sizeof(DWORD)] = { 0 };
|
||||
|
||||
|
@ -2633,8 +2638,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_GetDisplayFieldStatus)(X_D3DFIELD_STATUS *pF
|
|||
// D3DDevice_GetDisplayMode and read the result
|
||||
|
||||
// Get a function pointer to the unpatched xbox function D3DDevice_GetDisplayMode
|
||||
typedef VOID(__stdcall *XB_D3DDevice_GetDisplayMode_t)(X_D3DDISPLAYMODE*);
|
||||
static XB_D3DDevice_GetDisplayMode_t XB_D3DDevice_GetDisplayMode = (XB_D3DDevice_GetDisplayMode_t)GetXboxFunctionPointer("D3DDevice_GetDisplayMode");
|
||||
XB_trampoline(VOID, WINAPI, D3DDevice_GetDisplayMode, (X_D3DDISPLAYMODE*));
|
||||
|
||||
X_D3DDISPLAYMODE displayMode;
|
||||
|
||||
|
@ -3075,10 +3079,9 @@ XTL::X_D3DSurface* WINAPI XTL::EMUPATCH(D3DDevice_GetBackBuffer2)
|
|||
// Rather than create a new surface, we should forward to the Xbox version of GetBackBuffer,
|
||||
// This gives us the correct Xbox surface to update.
|
||||
// We get signatures for both backbuffer functions as it changed in later XDKs
|
||||
typedef X_D3DSurface*(__stdcall *XB_D3DDevice_GetBackBuffer2_t)(INT);
|
||||
typedef VOID(__stdcall *XB_D3DDevice_GetBackBuffer_t)(INT, D3DBACKBUFFER_TYPE, X_D3DSurface**);
|
||||
static XB_D3DDevice_GetBackBuffer2_t XB_D3DDevice_GetBackBuffer2 = (XB_D3DDevice_GetBackBuffer2_t)GetXboxFunctionPointer("D3DDevice_GetBackBuffer2");
|
||||
static XB_D3DDevice_GetBackBuffer_t XB_D3DDevice_GetBackBuffer = (XB_D3DDevice_GetBackBuffer_t)GetXboxFunctionPointer("D3DDevice_GetBackBuffer");
|
||||
XB_trampoline(X_D3DSurface, WINAPI, D3DDevice_GetBackBuffer2, (INT));
|
||||
|
||||
XB_trampoline(VOID, WINAPI, D3DDevice_GetBackBuffer, (INT, D3DBACKBUFFER_TYPE, X_D3DSurface**));
|
||||
|
||||
// This also updates the reference count, so we don't need to do this ourselves
|
||||
if (XB_D3DDevice_GetBackBuffer != nullptr) {
|
||||
|
@ -3809,8 +3812,8 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_DeletePixelShader)
|
|||
LOG_FUNC_ONE_ARG(Handle);
|
||||
|
||||
// Forward to the Xbox version of DeletePixelShader, to free the xbox resource correctly
|
||||
typedef HRESULT(__stdcall *XB_D3DDevice_DeletePixelShader_t)(DWORD);
|
||||
static XB_D3DDevice_DeletePixelShader_t XB_D3DDevice_DeletePixelShader = (XB_D3DDevice_DeletePixelShader_t)GetXboxFunctionPointer("D3DDevice_DeletePixelShader");
|
||||
XB_trampoline(VOID, WINAPI, D3DDevice_DeletePixelShader, (DWORD));
|
||||
|
||||
XB_D3DDevice_DeletePixelShader(Handle);
|
||||
|
||||
DWORD hostShaderHandle = 0;
|
||||
|
@ -3867,9 +3870,8 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreatePixelShader)
|
|||
|
||||
// Call the Xbox version of CreatePixelShader, this gives us a handle we can safely return to Xbox code
|
||||
// and properly sets up the internal shader structure, pointed to by the handle
|
||||
typedef HRESULT(__stdcall *XB_D3DDevice_CreateTexture_t)(X_D3DPIXELSHADERDEF*, DWORD*);
|
||||
XB_trampoline(HRESULT, WINAPI, D3DDevice_CreatePixelShader, (X_D3DPIXELSHADERDEF*, DWORD*));
|
||||
|
||||
static XB_D3DDevice_CreateTexture_t XB_D3DDevice_CreatePixelShader = (XB_D3DDevice_CreateTexture_t)GetXboxFunctionPointer("D3DDevice_CreatePixelShader");
|
||||
if (XB_D3DDevice_CreatePixelShader) {
|
||||
hRet = XB_D3DDevice_CreatePixelShader(pPSDef, pHandle);
|
||||
|
||||
|
@ -4078,8 +4080,8 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetTexture)
|
|||
LOG_FUNC_END;
|
||||
|
||||
// Call the Xbox implementation of this function, to properly handle reference counting for us
|
||||
typedef ULONG(__stdcall *XB_D3DDevice_SetTexture_t)(DWORD, X_D3DBaseTexture*);
|
||||
static XB_D3DDevice_SetTexture_t XB_D3DDevice_SetTexture = (XB_D3DDevice_SetTexture_t)GetXboxFunctionPointer("D3DDevice_SetTexture");
|
||||
XB_trampoline(VOID, WINAPI, D3DDevice_SetTexture, (DWORD, X_D3DBaseTexture*));
|
||||
|
||||
XB_D3DDevice_SetTexture(Stage, pTexture);
|
||||
|
||||
EmuD3DActiveTexture[Stage] = pTexture;
|
||||
|
@ -5413,8 +5415,8 @@ ULONG WINAPI XTL::EMUPATCH(D3DResource_Release)
|
|||
auto key = GetHostResourceKey(pThis);
|
||||
|
||||
// Call the Xbox version of D3DResource_Release and store the result
|
||||
typedef ULONG(__stdcall *XB_D3DResource_Release_t)(X_D3DResource*);
|
||||
static XB_D3DResource_Release_t XB_D3DResource_Release = (XB_D3DResource_Release_t)GetXboxFunctionPointer("D3DResource_Release");
|
||||
XB_trampoline(ULONG, WINAPI, D3DResource_Release, (X_D3DResource*));
|
||||
|
||||
ULONG uRet = XB_D3DResource_Release(pThis);
|
||||
|
||||
// Was the Xbox resource freed?
|
||||
|
@ -6483,8 +6485,8 @@ VOID WINAPI XTL::EMUPATCH(Lock2DSurface)
|
|||
|
||||
|
||||
// Pass through to the Xbox implementation of this function
|
||||
typedef VOID(__stdcall *XB_Lock2DSurface_t)(X_D3DPixelContainer*, D3DCUBEMAP_FACES, UINT, D3DLOCKED_RECT*, RECT*, DWORD);
|
||||
static XB_Lock2DSurface_t XB_Lock2DSurface = (XB_Lock2DSurface_t)GetXboxFunctionPointer("Lock2DSurface");
|
||||
XB_trampoline(VOID, WINAPI, Lock2DSurface, (X_D3DPixelContainer*, D3DCUBEMAP_FACES, UINT, D3DLOCKED_RECT*, RECT*, DWORD));
|
||||
|
||||
XB_Lock2DSurface(pPixelContainer, FaceType, Level, pLockedRect, pRect, Flags);
|
||||
|
||||
// Mark the resource as modified
|
||||
|
@ -6515,8 +6517,8 @@ VOID WINAPI XTL::EMUPATCH(Lock3DSurface)
|
|||
LOG_FUNC_END;
|
||||
|
||||
// Pass through to the Xbox implementation of this function
|
||||
typedef VOID(__stdcall *XB_Lock3DSurface_t)(X_D3DPixelContainer*, UINT, D3DLOCKED_BOX*, D3DBOX*, DWORD);
|
||||
static XB_Lock3DSurface_t XB_Lock3DSurface = (XB_Lock3DSurface_t)GetXboxFunctionPointer("Lock3DSurface");
|
||||
XB_trampoline(VOID, WINAPI, Lock3DSurface, (X_D3DPixelContainer*, UINT, D3DLOCKED_BOX*, D3DBOX*, DWORD));
|
||||
|
||||
XB_Lock3DSurface(pPixelContainer, Level, pLockedVolume, pBox, Flags);
|
||||
|
||||
// Mark the resource as modified
|
||||
|
@ -6548,8 +6550,8 @@ VOID WINAPI XTL::EMUPATCH(D3DVertexBuffer_Lock)
|
|||
|
||||
|
||||
// Pass through to the Xbox implementation of this function
|
||||
typedef VOID(__stdcall *XB_D3DVertexBuffer_Lock_t)(X_D3DVertexBuffer*, UINT, UINT, BYTE**, DWORD);
|
||||
static XB_D3DVertexBuffer_Lock_t XB_D3DVertexBuffer_Lock = (XB_D3DVertexBuffer_Lock_t)GetXboxFunctionPointer("D3DVertexBuffer_Lock");
|
||||
XB_trampoline(VOID, WINAPI, D3DVertexBuffer_Lock, (X_D3DVertexBuffer*, UINT, UINT, BYTE**, DWORD));
|
||||
|
||||
XB_D3DVertexBuffer_Lock(pVertexBuffer, OffsetToLock, SizeToLock, ppbData, Flags);
|
||||
|
||||
// Mark the resource as modified
|
||||
|
@ -6573,8 +6575,8 @@ BYTE* WINAPI XTL::EMUPATCH(D3DVertexBuffer_Lock2)
|
|||
LOG_FUNC_END;
|
||||
|
||||
// Pass through to the Xbox implementation of this function
|
||||
typedef BYTE*(__stdcall *XB_D3DVertexBuffer_Lock2_t)(X_D3DVertexBuffer*, DWORD);
|
||||
static XB_D3DVertexBuffer_Lock2_t XB_D3DVertexBuffer_Lock2 = (XB_D3DVertexBuffer_Lock2_t)GetXboxFunctionPointer("D3DVertexBuffer_Lock2");
|
||||
XB_trampoline(BYTE*, WINAPI, D3DVertexBuffer_Lock2, (X_D3DVertexBuffer*, DWORD));
|
||||
|
||||
BYTE* pRet = XB_D3DVertexBuffer_Lock2(pVertexBuffer, Flags);
|
||||
|
||||
// Mark the resource as modified
|
||||
|
|
Loading…
Reference in New Issue