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
+ * IDirect3DSwapChain9(Ex) interface
*/
#define INTERFACE IDirect3DSwapChain9
DECLARE_INTERFACE_(IDirect3DSwapChain9,IUnknown)
@@ -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.