On 8/30/2013 12:19, Michael Müller wrote:
This patch implements the IDirect3DSwapChain9Ex interface as an extension of IDirect3DSwapChain9 and thus fixes bug 34252 - "Silverlight accelerated graphics cause a D3D critical section lockup" since Silverlight does no longer try to create a Direct3D context in an endless loop. The functions d3d9_swapchain_GetLastPresentCount and d3d9_swapchain_GetPresentStatistics are just stubs so far.
dlls/d3d9/swapchain.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++- include/d3d9.h | 14 +++++++++- include/d3d9types.h | 8 ++++++ 3 files changed, 91 insertions(+), 2 deletions(-)
@@ -34,7 +34,7 @@ static HRESULT WINAPI d3d9_swapchain_QueryInterface(IDirect3DSwapChain9 *iface, { TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IDirect3DSwapChain9)
- if (IsEqualGUID(riid, &IID_IDirect3DSwapChain9) || IsEqualGUID(riid, &IID_IDirect3DSwapChain9Ex) || IsEqualGUID(riid, &IID_IUnknown)) { IDirect3DSwapChain9_AddRef(iface);
@@ -221,12 +221,76 @@ static HRESULT WINAPI d3d9_swapchain_GetPresentParameters(IDirect3DSwapChain9 *i return D3D_OK; }
I don't know if d3d9 is special in this regard, but this is a wrong way to implement derived interface. You need you make everything IDirect3DSwapChain9Ex, for example this one:
/*****************************************************************************
- IDirect3DSwapChain9 interface
*/ #define INTERFACE IDirect3DSwapChain9 DECLARE_INTERFACE_(IDirect3DSwapChain9,IUnknown)
- IDirect3DSwapChain9(Ex) interface
@@ -405,6 +405,10 @@ DECLARE_INTERFACE_(IDirect3DSwapChain9,IUnknown) STDMETHOD(GetDisplayMode)(THIS_ D3DDISPLAYMODE* pMode) PURE; STDMETHOD(GetDevice)(THIS_ struct IDirect3DDevice9** ppDevice) PURE; STDMETHOD(GetPresentParameters)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters) PURE;
- /*** IDirect3DSwapChain9Ex methods ***/
- STDMETHOD(GetLastPresentCount)(THIS_ UINT* pLastPresentCount) PURE;
- STDMETHOD(GetPresentStats)(THIS_ D3DPRESENTSTATS* pPresentationStatistics) PURE;
- STDMETHOD(GetDisplayModeEx)(THIS_ D3DDISPLAYMODEEX* pMode,D3DDISPLAYROTATION* pRotation) PURE; }; #undef INTERFACE
is no longer just IDirect3DSwapChain9. This will fix vtbl type too.