diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-02-23 15:32:45 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-02-23 15:32:45 +0100 |
| commit | 1f9973e6232be8f25b3b15489a9c913ba31b182f (patch) | |
| tree | 89cd684f5f16dc6412891d748b457ef96591b6ab /src | |
| parent | ce61d27d8d4cc9c4af8467ac1c202c38c2444e56 (diff) | |
| download | box64-1f9973e6232be8f25b3b15489a9c913ba31b182f.tar.gz box64-1f9973e6232be8f25b3b15489a9c913ba31b182f.zip | |
[D3DADAPTER9] Added support for CreateDeviceEx
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedd3dadapter9.c | 60 | ||||
| -rw-r--r-- | src/wrapped/wrappedd3dadapter9_gen.h | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedd3dadapter9_genvate.h | 2 |
6 files changed, 64 insertions, 8 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 242d5f91..631cbec0 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -2212,7 +2212,6 @@ #() iWEpuipupppp #() iWEpuuiiuipp #() iWEpuuuuiipp -#() iWpuipuppppp #() vFEpiiiupupup #() vFiiiiillliip #() vFiiiiilllilp @@ -2257,6 +2256,7 @@ #() pFEppuiipuuii #() pFpppppppiipp #() pFppppppppppp +#() iWEpuipuppppp #() iWEpuuiiuippu #() iWEpuuuuuiipp #() vFuiiiillliilp diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index b6caf5b2..301a4893 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -2246,7 +2246,6 @@ typedef void* (*pFpppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, typedef int64_t (*iWEpuipupppp_t)(x64emu_t*, void*, uint64_t, int64_t, void*, uint64_t, void*, void*, void*, void*); typedef int64_t (*iWEpuuiiuipp_t)(x64emu_t*, void*, uint64_t, uint64_t, int64_t, int64_t, uint64_t, int64_t, void*, void*); typedef int64_t (*iWEpuuuuiipp_t)(x64emu_t*, void*, uint64_t, uint64_t, uint64_t, uint64_t, int64_t, int64_t, void*, void*); -typedef int64_t (*iWpuipuppppp_t)(void*, uint64_t, int64_t, void*, uint64_t, void*, void*, void*, void*, void*); typedef void (*vFEpiiiupupup_t)(x64emu_t*, void*, int64_t, int64_t, int64_t, uint64_t, void*, uint64_t, void*, uint64_t, void*); typedef void (*vFiiiiillliip_t)(int64_t, int64_t, int64_t, int64_t, int64_t, intptr_t, intptr_t, intptr_t, int64_t, int64_t, void*); typedef void (*vFiiiiilllilp_t)(int64_t, int64_t, int64_t, int64_t, int64_t, intptr_t, intptr_t, intptr_t, int64_t, intptr_t, void*); @@ -2291,6 +2290,7 @@ typedef void* (*pFEppiiLpppip_t)(x64emu_t*, void*, void*, int64_t, int64_t, uint typedef void* (*pFEppuiipuuii_t)(x64emu_t*, void*, void*, uint64_t, int64_t, int64_t, void*, uint64_t, uint64_t, int64_t, int64_t); typedef void* (*pFpppppppiipp_t)(void*, void*, void*, void*, void*, void*, void*, int64_t, int64_t, void*, void*); typedef void* (*pFppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef int64_t (*iWEpuipuppppp_t)(x64emu_t*, void*, uint64_t, int64_t, void*, uint64_t, void*, void*, void*, void*, void*); typedef int64_t (*iWEpuuiiuippu_t)(x64emu_t*, void*, uint64_t, uint64_t, int64_t, int64_t, uint64_t, int64_t, void*, void*, uint64_t); typedef int64_t (*iWEpuuuuuiipp_t)(x64emu_t*, void*, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, int64_t, int64_t, void*, void*); typedef void (*vFuiiiillliilp_t)(uint64_t, int64_t, int64_t, int64_t, int64_t, intptr_t, intptr_t, intptr_t, int64_t, int64_t, intptr_t, void*); @@ -4613,7 +4613,6 @@ void pFpppppppppp(x64emu_t *emu, uintptr_t fcn) { pFpppppppppp_t fn = (pFppppppp void iWEpuipupppp(x64emu_t *emu, uintptr_t fcn) { iWEpuipupppp_t fn = (iWEpuipupppp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RCX, (uint64_t)R_RDX, (int64_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72)); } void iWEpuuiiuipp(x64emu_t *emu, uintptr_t fcn) { iWEpuuiiuipp_t fn = (iWEpuuiiuipp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RCX, (uint64_t)R_RDX, (uint64_t)R_R8, (int64_t)R_R9, *(int64_t*)(R_RSP + 40), *(uint64_t*)(R_RSP + 48), *(int64_t*)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72)); } void iWEpuuuuiipp(x64emu_t *emu, uintptr_t fcn) { iWEpuuuuiipp_t fn = (iWEpuuuuiipp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RCX, (uint64_t)R_RDX, (uint64_t)R_R8, (uint64_t)R_R9, *(uint64_t*)(R_RSP + 40), *(int64_t*)(R_RSP + 48), *(int64_t*)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72)); } -void iWpuipuppppp(x64emu_t *emu, uintptr_t fcn) { iWpuipuppppp_t fn = (iWpuipuppppp_t)fcn; R_RAX=(int64_t)fn((void*)R_RCX, (uint64_t)R_RDX, (int64_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); } void vFEpiiiupupup(x64emu_t *emu, uintptr_t fcn) { vFEpiiiupupup_t fn = (vFEpiiiupupup_t)fcn; fn(emu, (void*)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (uint64_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 8), *(void**)(R_RSP + 16), *(uint64_t*)(R_RSP + 24), *(void**)(R_RSP + 32)); } void vFiiiiillliip(x64emu_t *emu, uintptr_t fcn) { vFiiiiillliip_t fn = (vFiiiiillliip_t)fcn; fn((int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (intptr_t)R_R9, *(intptr_t*)(R_RSP + 8), *(intptr_t*)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(int64_t*)(R_RSP + 32), *(void**)(R_RSP + 40)); } void vFiiiiilllilp(x64emu_t *emu, uintptr_t fcn) { vFiiiiilllilp_t fn = (vFiiiiilllilp_t)fcn; fn((int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (intptr_t)R_R9, *(intptr_t*)(R_RSP + 8), *(intptr_t*)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(intptr_t*)(R_RSP + 32), *(void**)(R_RSP + 40)); } @@ -4658,6 +4657,7 @@ void pFEppiiLpppip(x64emu_t *emu, uintptr_t fcn) { pFEppiiLpppip_t fn = (pFEppii void pFEppuiipuuii(x64emu_t *emu, uintptr_t fcn) { pFEppuiipuuii_t fn = (pFEppuiipuuii_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uint64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 8), *(uint64_t*)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(int64_t*)(R_RSP + 32)); } void pFpppppppiipp(x64emu_t *emu, uintptr_t fcn) { pFpppppppiipp_t fn = (pFpppppppiipp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(int64_t*)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40)); } void pFppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFppppppppppp_t fn = (pFppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40)); } +void iWEpuipuppppp(x64emu_t *emu, uintptr_t fcn) { iWEpuipuppppp_t fn = (iWEpuipuppppp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RCX, (uint64_t)R_RDX, (int64_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); } void iWEpuuiiuippu(x64emu_t *emu, uintptr_t fcn) { iWEpuuiiuippu_t fn = (iWEpuuiiuippu_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RCX, (uint64_t)R_RDX, (uint64_t)R_R8, (int64_t)R_R9, *(int64_t*)(R_RSP + 40), *(uint64_t*)(R_RSP + 48), *(int64_t*)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(uint64_t*)(R_RSP + 80)); } void iWEpuuuuuiipp(x64emu_t *emu, uintptr_t fcn) { iWEpuuuuuiipp_t fn = (iWEpuuuuuiipp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RCX, (uint64_t)R_RDX, (uint64_t)R_R8, (uint64_t)R_R9, *(uint64_t*)(R_RSP + 40), *(uint64_t*)(R_RSP + 48), *(int64_t*)(R_RSP + 56), *(int64_t*)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); } void vFuiiiillliilp(x64emu_t *emu, uintptr_t fcn) { vFuiiiillliilp_t fn = (vFuiiiillliilp_t)fcn; fn((uint64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (intptr_t)R_R9, *(intptr_t*)(R_RSP + 8), *(intptr_t*)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(int64_t*)(R_RSP + 32), *(intptr_t*)(R_RSP + 40), *(void**)(R_RSP + 48)); } diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index f5338ad3..bd0ea250 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -2245,7 +2245,6 @@ void pFpppppppppp(x64emu_t *emu, uintptr_t fnc); void iWEpuipupppp(x64emu_t *emu, uintptr_t fnc); void iWEpuuiiuipp(x64emu_t *emu, uintptr_t fnc); void iWEpuuuuiipp(x64emu_t *emu, uintptr_t fnc); -void iWpuipuppppp(x64emu_t *emu, uintptr_t fnc); void vFEpiiiupupup(x64emu_t *emu, uintptr_t fnc); void vFiiiiillliip(x64emu_t *emu, uintptr_t fnc); void vFiiiiilllilp(x64emu_t *emu, uintptr_t fnc); @@ -2290,6 +2289,7 @@ void pFEppiiLpppip(x64emu_t *emu, uintptr_t fnc); void pFEppuiipuuii(x64emu_t *emu, uintptr_t fnc); void pFpppppppiipp(x64emu_t *emu, uintptr_t fnc); void pFppppppppppp(x64emu_t *emu, uintptr_t fnc); +void iWEpuipuppppp(x64emu_t *emu, uintptr_t fnc); void iWEpuuiiuippu(x64emu_t *emu, uintptr_t fnc); void iWEpuuuuuiipp(x64emu_t *emu, uintptr_t fnc); void vFuiiiillliilp(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedd3dadapter9.c b/src/wrapped/wrappedd3dadapter9.c index b7f08eda..c43331dc 100644 --- a/src/wrapped/wrappedd3dadapter9.c +++ b/src/wrapped/wrappedd3dadapter9.c @@ -114,6 +114,7 @@ typedef struct d3d_my_s { int (*create_adapter)(int, ID3DAdapter9Vtbl ***); int (*CreateDevice)(void*, unsigned, int, void*, unsigned, void*, void*, void*, IDirect3DDevice9Vtbl ***); + int (*CreateDeviceEx)(void*, unsigned, int, void*, unsigned, void*, void*, void*, void*, IDirect3DDevice9ExVtbl ***); int presentgroup_init; @@ -121,7 +122,7 @@ typedef struct d3d_my_s { ID3DAdapter9Vtbl adapter; int adapter_init; - IDirect3DDevice9Vtbl device; + IDirect3DDevice9ExVtbl device; int device_init; IDirect3DAuthenticatedChannel9Vtbl my_IDirect3DAuthenticatedChannel9Vtbl; @@ -332,6 +333,29 @@ IDirect3D9Vtbl my_Direct3D9_vtbl = { .Release = my_Direct3D9_Release, }; +typedef struct my_Direct3D9Ex { + IDirect3D9ExVtbl *vtbl; + IDirect3D9ExVtbl **real; +} my_Direct3D9Ex; + +unsigned my_Direct3D9Ex_AddRef(void *This) +{ + my_Direct3D9Ex *my = This; + return RunFunction(my_context, (uintptr_t)(*my->real)->AddRef, 1, my->real); +} + +unsigned my_Direct3D9Ex_Release(void *This) +{ + my_Direct3D9Ex *my = This; + return RunFunction(my_context, (uintptr_t)(*my->real)->Release, 1, my->real); +} + +IDirect3D9ExVtbl my_Direct3D9Ex_vtbl = { + .AddRef = my_Direct3D9Ex_AddRef, + .Release = my_Direct3D9Ex_Release, +}; + + static int my_GetDirect3D(x64emu_t* emu, void* This, void*** ppD3D9) { int r = my_GetDirect3D_real(This, ppD3D9); @@ -358,7 +382,36 @@ int my_create_device(x64emu_t* emu, void *This, unsigned RealAdapter, int Device if (r) return r; if (!my->vtables.device_init) { - make_vtable_IDirect3DDevice9Vtbl(emu, &my->vtables.device, *ret); + make_vtable_IDirect3DDevice9Vtbl(emu, (IDirect3DDevice9Vtbl*)&my->vtables.device, *ret); + my->vtables.device_init = 1; + } + + ret[0] = (IDirect3DDevice9Vtbl*)&my->vtables.device; + ret[1] = (IDirect3DDevice9Vtbl*)&my->vtables.device; + *ppReturnedDeviceInterface = ret; + + return 0; +} + +int my_create_device_ex(x64emu_t* emu, void *This, unsigned RealAdapter, int DeviceType, void *hFocusWindow, unsigned BehaviorFlags, void *pPresent, void *pFullscreenDisplayMode, IDirect3D9ExVtbl **pD3D9Ex, ID3DPresentGroupVtbl **pPresentationFactory, IDirect3DDevice9ExVtbl ***ppReturnedDeviceInterface) +{ + my_Direct3D9Ex *my_pD3D9Ex = malloc(sizeof(my_Direct3D9Ex)); + + my_pD3D9Ex->vtbl = &my_Direct3D9Ex_vtbl; + my_pD3D9Ex->real = pD3D9Ex; + + if (!my->presentgroup_init) { + fixup_PresentGroupVtbl(*pPresentationFactory); + my->presentgroup_init = 1; + } + + IDirect3DDevice9ExVtbl **ret; + int r = my->CreateDeviceEx(This, RealAdapter, DeviceType, hFocusWindow, BehaviorFlags, pPresent, pFullscreenDisplayMode, my_pD3D9Ex, pPresentationFactory, &ret); + + if (r) return r; + + if (!my->vtables.device_init) { + make_vtable_IDirect3DDevice9ExVtbl(emu, &my->vtables.device, *ret); my->vtables.device_init = 1; } @@ -380,6 +433,9 @@ int my_create_adapter(x64emu_t* emu, int fd, ID3DAdapter9Vtbl ***x_adapter) my->CreateDevice = (void*)(*adapter)->CreateDevice; (*adapter)->CreateDevice = (void*)my_create_device; + my->CreateDeviceEx = (void*)(*adapter)->CreateDeviceEx; + (*adapter)->CreateDeviceEx = (void*)my_create_device_ex; + make_vtable_ID3DAdapter9Vtbl(emu, &my->vtables.adapter, *adapter); my->vtables.adapter_init = 1; } diff --git a/src/wrapped/wrappedd3dadapter9_gen.h b/src/wrapped/wrappedd3dadapter9_gen.h index dca1dad8..05a9cb64 100644 --- a/src/wrapped/wrappedd3dadapter9_gen.h +++ b/src/wrapped/wrappedd3dadapter9_gen.h @@ -36,7 +36,7 @@ static void make_vtable_ID3DAdapter9Vtbl(x64emu_t* emu, ID3DAdapter9Vtbl* new, I GO(CheckDeviceFormatConversion, iWpiii); GO(GetDeviceCaps, iWpip); GO(CreateDevice, iWEpuipupppp); - GO(CreateDeviceEx, iWpuipuppppp); + GO(CreateDeviceEx, iWEpuipuppppp); } static void make_vtable_IDirect3D9Vtbl(x64emu_t* emu, IDirect3D9Vtbl* new, IDirect3D9Vtbl* real) diff --git a/src/wrapped/wrappedd3dadapter9_genvate.h b/src/wrapped/wrappedd3dadapter9_genvate.h index 0a4852ee..d2eeb149 100644 --- a/src/wrapped/wrappedd3dadapter9_genvate.h +++ b/src/wrapped/wrappedd3dadapter9_genvate.h @@ -23,7 +23,7 @@ GO(ColorFill, iWpppu) GO(ComposeRects, iWppppupiii) GO(Configure, iWpupp) GO(CreateDeviceEx, iWpuipuppp) -GO(CreateDeviceEx, iWpuipuppppp) +GOM(CreateDeviceEx, iWEpuipuppppp) // Note that this one is unique (not a real GOM as it is assigned manually) GOM(CreateDevice, iWEpuipupppp) // Note that this one is unique (not a real GOM as it is assigned manually) GO(CreateDevice, iWpuipupp) GO(DecryptionBlt, iWpppuppp) |