Skip to content

Commit 21127c3

Browse files
committed
add dx11 dev&swapchain wrapping
1 parent b2da2f2 commit 21127c3

11 files changed

+745
-33
lines changed

addon/com_wrapper.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ static void* wrap_pass_vtable[METHOD_WRAP_COUNT+1] = {
1313

1414
#define WRAPPED_METH_PREFIX(b) wrap_pass_obj_##b, __SPECIAL_IGNORANCE
1515
#include "com_wrapper_obj_methods.inc"
16+
#undef WRAPPED_METH_PREFIX
17+
18+
#define WRAPPED_METH_PREFIX(b) wrap_pass_dev11_##b, __SPECIAL_IGNORANCE
19+
#include "com_wrapper_dev11_methods.inc"
20+
#undef WRAPPED_METH_PREFIX
21+
22+
#define WRAPPED_METH_PREFIX(b) wrap_pass_swc_##b, __SPECIAL_IGNORANCE
23+
#include "com_wrapper_swc_methods.inc"
1624
#undef WRAPPED_METH_PREFIX
1725

1826
0
@@ -26,6 +34,14 @@ static void* wrap_pre_vtable[METHOD_WRAP_COUNT+1] = {
2634

2735
#define WRAPPED_METH_PREFIX(b) wrap_pre_obj_##b, __SPECIAL_IGNORANCE
2836
#include "com_wrapper_obj_methods.inc"
37+
#undef WRAPPED_METH_PREFIX
38+
39+
#define WRAPPED_METH_PREFIX(b) wrap_pre_dev11_##b, __SPECIAL_IGNORANCE
40+
#include "com_wrapper_dev11_methods.inc"
41+
#undef WRAPPED_METH_PREFIX
42+
43+
#define WRAPPED_METH_PREFIX(b) wrap_pre_swc_##b, __SPECIAL_IGNORANCE
44+
#include "com_wrapper_swc_methods.inc"
2945
#undef WRAPPED_METH_PREFIX
3046

3147
0
@@ -40,6 +56,15 @@ static void* wrap_post_vtable[METHOD_WRAP_COUNT+1] = {
4056
#define WRAPPED_METH_PREFIX(b) wrap_post_obj_##b, __SPECIAL_IGNORANCE
4157
#include "com_wrapper_obj_methods.inc"
4258
#undef WRAPPED_METH_PREFIX
59+
60+
#define WRAPPED_METH_PREFIX(b) wrap_post_dev11_##b, __SPECIAL_IGNORANCE
61+
#include "com_wrapper_dev11_methods.inc"
62+
#undef WRAPPED_METH_PREFIX
63+
64+
#define WRAPPED_METH_PREFIX(b) wrap_post_swc_##b, __SPECIAL_IGNORANCE
65+
#include "com_wrapper_swc_methods.inc"
66+
#undef WRAPPED_METH_PREFIX
67+
4368
0
4469
};
4570

@@ -51,6 +76,14 @@ static void* wrap_prepost_vtable[METHOD_WRAP_COUNT+1] = {
5176

5277
#define WRAPPED_METH_PREFIX(b) wrap_prepost_obj_##b, __SPECIAL_IGNORANCE
5378
#include "com_wrapper_obj_methods.inc"
79+
#undef WRAPPED_METH_PREFIX
80+
81+
#define WRAPPED_METH_PREFIX(b) wrap_prepost_dev11_##b, __SPECIAL_IGNORANCE
82+
#include "com_wrapper_dev11_methods.inc"
83+
#undef WRAPPED_METH_PREFIX
84+
85+
#define WRAPPED_METH_PREFIX(b) wrap_prepost_swc_##b, __SPECIAL_IGNORANCE
86+
#include "com_wrapper_swc_methods.inc"
5487
#undef WRAPPED_METH_PREFIX
5588

5689
0
@@ -90,6 +123,26 @@ IDirect3D9 * wrap_CreateObj(IDirect3D9 * origObj)
90123
return (IDirect3D9*)ret;
91124
}
92125

126+
ID3D11Device* wrap_CreateDevice11(ID3D11Device* origDev)
127+
{
128+
wrapped_com_obj * ret = (wrapped_com_obj*)malloc(sizeof(wrapped_com_obj));
129+
130+
ret->vtable = (com_vtable*)&g_main_vtable[METH_DEV11_QueryInterface];
131+
ret->orig_dev11 = origDev;
132+
133+
return (ID3D11Device*)ret;
134+
}
135+
136+
IDXGISwapChain* wrap_CreateSwapchain(IDXGISwapChain* origSwc)
137+
{
138+
wrapped_com_obj* ret = (wrapped_com_obj*)malloc(sizeof(wrapped_com_obj));
139+
140+
ret->vtable = (com_vtable*)&g_main_vtable[METH_SWC_QueryInterface];
141+
ret->orig_swc = origSwc;
142+
143+
return (IDXGISwapChain*)ret;
144+
}
145+
93146
void wrap_SwitchMethod(d3d9_vtable_method method, vtable_wrap_mode mode)
94147
{
95148
g_main_vtable[method] = wrap_vtable_arr[mode][method];
@@ -135,5 +188,20 @@ void wrap_InitEvents()
135188
#include "com_wrapper_obj_methods.inc"
136189
#undef WRAPPED_METH_PREFIX
137190

191+
#define WRAPPED_METH_PREFIX(b) \
192+
preCallEvents[METH_DEV11_##b] = gAPI->query_event(gAPI->hash_name((wchar_t*)EVENT_NAME_STR(DEV11_##b, PRE_))); \
193+
postCallEvents[METH_DEV11_##b] = gAPI->query_event(gAPI->hash_name((wchar_t*)EVENT_NAME_STR(DEV11_##b, POST_))); \
194+
g_main_vtable[METH_DEV11_##b] = wrap_pass_vtable[METH_DEV11_##b]; \
195+
__SPECIAL_IGNORANCE
196+
#include "com_wrapper_dev11_methods.inc"
197+
#undef WRAPPED_METH_PREFIX
198+
199+
#define WRAPPED_METH_PREFIX(b) \
200+
preCallEvents[METH_SWC_##b] = gAPI->query_event(gAPI->hash_name((wchar_t*)EVENT_NAME_STR(SWC_##b, PRE_))); \
201+
postCallEvents[METH_SWC_##b] = gAPI->query_event(gAPI->hash_name((wchar_t*)EVENT_NAME_STR(SWC_##b, POST_))); \
202+
g_main_vtable[METH_SWC_##b] = wrap_pass_vtable[METH_SWC_##b]; \
203+
__SPECIAL_IGNORANCE
204+
#include "com_wrapper_swc_methods.inc"
205+
#undef WRAPPED_METH_PREFIX
138206

139207
}

addon/com_wrapper.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ typedef struct com_vtable {
66
void* methods[1024];
77
} com_vtable;
88

9+
#pragma pack(push, 1)
910
typedef struct wrapped_com_obj {
1011
com_vtable* vtable;
1112
union {
1213
IDirect3D9* orig_obj;
1314
IDirect3DDevice9* orig_dev;
15+
ID3D11Device* orig_dev11;
16+
IDXGISwapChain* orig_swc;
1417
};
1518
} wrapped_com_obj;
19+
#pragma pack(pop)
1620

1721
#define WRAPPED_METH_DECL_(a,b) WRAPPED_METH_PREFIX(b)
1822
#define WRAPPED_METH_DECL(b) WRAPPED_METH_DECL_(HRESULT, b)
@@ -60,7 +64,16 @@ typedef enum d3d9_vtable_method {
6064

6165
#define WRAPPED_METH_PREFIX(b) METH_OBJ_##b, __SPECIAL_IGNORANCE
6266
#include "com_wrapper_obj_methods.inc"
63-
#undef WRAPPED_METH_PREFIX
67+
#undef WRAPPED_METH_PREFIX
68+
69+
#define WRAPPED_METH_PREFIX(b) METH_DEV11_##b, __SPECIAL_IGNORANCE
70+
#include "com_wrapper_dev11_methods.inc"
71+
#undef WRAPPED_METH_PREFIX
72+
73+
#define WRAPPED_METH_PREFIX(b) METH_SWC_##b, __SPECIAL_IGNORANCE
74+
#include "com_wrapper_swc_methods.inc"
75+
#undef WRAPPED_METH_PREFIX
76+
6477
METHOD_WRAP_COUNT
6578
} d3d9_vtable_method;
6679

@@ -77,6 +90,8 @@ typedef enum vtable_wrap_mode {
7790

7891
IDirect3DDevice9* wrap_CreateDevice(IDirect3DDevice9* origDev);
7992
IDirect3D9* wrap_CreateObj(IDirect3D9* origObj);
93+
ID3D11Device* wrap_CreateDevice11(ID3D11Device* origDev);
94+
IDXGISwapChain* wrap_CreateSwapchain(IDXGISwapChain* origSwc);
8095

8196
typedef struct wrap_event_data {
8297
void* ret;

0 commit comments

Comments
 (0)