d3d9: Partial implementation of IDirect3DSwapChain9Ex

Nikolay Sivov bunglehead at gmail.com
Fri Aug 30 03:31:58 CDT 2013


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.



More information about the wine-devel mailing list