about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-02-23 15:32:45 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-02-23 15:32:45 +0100
commit1f9973e6232be8f25b3b15489a9c913ba31b182f (patch)
tree89cd684f5f16dc6412891d748b457ef96591b6ab /src
parentce61d27d8d4cc9c4af8467ac1c202c38c2444e56 (diff)
downloadbox64-1f9973e6232be8f25b3b15489a9c913ba31b182f.tar.gz
box64-1f9973e6232be8f25b3b15489a9c913ba31b182f.zip
[D3DADAPTER9] Added support for CreateDeviceEx
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrapper.c4
-rw-r--r--src/wrapped/generated/wrapper.h2
-rw-r--r--src/wrapped/wrappedd3dadapter9.c60
-rw-r--r--src/wrapped/wrappedd3dadapter9_gen.h2
-rw-r--r--src/wrapped/wrappedd3dadapter9_genvate.h2
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)