Skip to content

Commit 0fd306d

Browse files
committed
add swapchain wrapping triggers
1 parent 253b678 commit 0fd306d

File tree

1 file changed

+54
-1
lines changed

1 file changed

+54
-1
lines changed

addon/d3d9_wrapper.cpp

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ HRESULT OnD3D11Create(DX11_CREATE_FDEF)
124124
{
125125
*ppDevice = wrap_CreateDevice11(*ppDevice);
126126
if (ppSwapChain)
127-
*ppSwapChain = wrap_CreateSwapchain(*ppSwapChain);
127+
*ppSwapChain = (IDXGISwapChain*)wrap_CreateSwapchain((IDXGISwapChain4*)*ppSwapChain);
128128
}
129129

130130
return res;
@@ -222,11 +222,39 @@ typedef struct d3d9_dev_Release_cp {
222222
ID3D11Device5* d11;
223223
} udev;
224224
} d3d9_dev_Release_cp;
225+
226+
typedef struct dxgi_CreateSwapChain_cp {
227+
IDXGIFactory5* dxgi;
228+
IUnknown* inDevice;
229+
DXGI_SWAP_CHAIN_DESC* desc;
230+
IDXGISwapChain4** ppSwapchain;
231+
} dxgi_CreateSwapChain_cp;
232+
233+
typedef struct iunk_QueryInterface_cp {
234+
IUnknown* base;
235+
REFIID iid;
236+
void** rptr;
237+
} iunk_QueryInterface_cp;
225238
#pragma pack(pop)
226239

227240
IDirect3DDevice9* hwDevice = nullptr;
228241
ID3D11Device5* hwDevice11 = nullptr;
229242

243+
void OnPostSWCQueryInterface(wrap_event_data* data)
244+
{
245+
//FIXME: looks like wrapped object will leak
246+
iunk_QueryInterface_cp* apiParams = (iunk_QueryInterface_cp*)data->stackPtr;
247+
248+
*apiParams->rptr = (IDXGISwapChain4*)wrap_CreateSwapchain((IDXGISwapChain4*)*apiParams->rptr);
249+
}
250+
251+
void OnPostDXGICreateSwapChain(wrap_event_data* data)
252+
{
253+
dxgi_CreateSwapChain_cp* apiParams = (dxgi_CreateSwapChain_cp*)data->stackPtr;
254+
255+
*apiParams->ppSwapchain = wrap_CreateSwapchain(*apiParams->ppSwapchain);
256+
}
257+
230258
void OnPostDeviceCreate(wrap_event_data* data)
231259
{
232260
d3d9_obj_CreateDevice_cp* apiParams = (d3d9_obj_CreateDevice_cp*)data->stackPtr;
@@ -363,11 +391,36 @@ gw2al_api_ret gw2addon_load(gw2al_core_vtable* core_api)
363391
0
364392
);
365393

394+
gAPI->watch_event(
395+
gAPI->query_event(gAPI->hash_name((wchar_t*)L"D3D9_POST_DXGI_Release")),
396+
gAPI->hash_name((wchar_t*)L"d3d9 wrapper"),
397+
(gw2al_api_event_handler)&OnPostObjWrappedRelease,
398+
0
399+
);
400+
401+
gAPI->watch_event(
402+
gAPI->query_event(gAPI->hash_name(L"D3D9_POST_DXGI_CreateSwapChain")),
403+
gAPI->hash_name(L"d3d9 wrapper"),
404+
(gw2al_api_event_handler)&OnPostDXGICreateSwapChain,
405+
-1
406+
);
407+
408+
gAPI->watch_event(
409+
gAPI->query_event(gAPI->hash_name((wchar_t*)L"D3D9_POST_SWC_QueryInterface")),
410+
gAPI->hash_name((wchar_t*)L"d3d9 wrapper"),
411+
(gw2al_api_event_handler)&OnPostSWCQueryInterface,
412+
-1
413+
);
414+
366415
d3d9_wrapper_enable_event(METH_OBJ_CreateDevice, WRAP_CB_POST);
416+
d3d9_wrapper_enable_event(METH_DXGI_CreateSwapChain, WRAP_CB_POST);
417+
d3d9_wrapper_enable_event(METH_SWC_QueryInterface, WRAP_CB_POST);
418+
367419
d3d9_wrapper_enable_event(METH_OBJ_Release, WRAP_CB_POST);
368420
d3d9_wrapper_enable_event(METH_DEV_Release, WRAP_CB_POST);
369421
d3d9_wrapper_enable_event(METH_DEV11_Release, WRAP_CB_POST);
370422
d3d9_wrapper_enable_event(METH_SWC_Release, WRAP_CB_POST);
423+
d3d9_wrapper_enable_event(METH_DXGI_Release, WRAP_CB_POST);
371424

372425
return GW2AL_OK;
373426
}

0 commit comments

Comments
 (0)