@@ -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
227240IDirect3DDevice9* hwDevice = nullptr ;
228241ID3D11Device5* 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+
230258void 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