Stefan Dösinger : wined3d: Implement IWineD3DDevice:: SetFrontBackBuffers.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 16 06:24:46 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 7cd41b944ba57914521f3502714802fd805a360f
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=7cd41b944ba57914521f3502714802fd805a360f

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon May 15 20:09:07 2006 +0200

wined3d: Implement IWineD3DDevice::SetFrontBackBuffers.

---

 dlls/wined3d/device.c |   66 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ed50b26..943e38f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6474,8 +6474,70 @@ HRESULT  WINAPI  IWineD3DDeviceImpl_GetR
 }
 
 HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *iface, IWineD3DSurface *Front, IWineD3DSurface *Back) {
-    FIXME("This call is a d3d7 merge stub. It will be implemented later\n");
-    return WINED3DERR_INVALIDCALL;
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+    IWineD3DSurfaceImpl *FrontImpl = (IWineD3DSurfaceImpl *) Front;
+    IWineD3DSurfaceImpl *BackImpl = (IWineD3DSurfaceImpl *) Back;
+    IWineD3DSwapChainImpl *Swapchain;
+    HRESULT hr;
+
+    TRACE("(%p)->(%p,%p)\n", This, FrontImpl, BackImpl);
+
+    hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **) &Swapchain);
+    if(hr != WINED3D_OK) {
+        ERR("Can't get the swapchain\n");
+        return hr;
+    }
+
+    /* Make sure to release the swapchain */
+    IWineD3DSwapChain_Release((IWineD3DSwapChain *) Swapchain);
+
+    if(FrontImpl && !(FrontImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) {
+        ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+    else if(BackImpl && !(BackImpl->resource.usage & WINED3DUSAGE_RENDERTARGET)) {
+        ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+
+    if(Swapchain->frontBuffer != Front) {
+        TRACE("Changing the front buffer from %p to %p\n", Swapchain->frontBuffer, Front);
+
+        if(Swapchain->frontBuffer)
+            IWineD3DSurface_SetContainer(Swapchain->frontBuffer, NULL);
+        Swapchain->frontBuffer = Front;
+
+        if(Swapchain->frontBuffer) {
+            IWineD3DSurface_SetContainer(Swapchain->frontBuffer, (IWineD3DBase *) Swapchain);
+        }
+    }
+    if(Swapchain->backBuffer != Back) {
+        TRACE("Changing the back buffer from %p to %p\n", Swapchain->backBuffer, Back);
+        ENTER_GL();
+        if(!Swapchain->backBuffer) {
+            /* GL was told to draw to the front buffer at creation,
+             * undo that
+             */
+            glDrawBuffer(GL_BACK);
+            checkGLcall("glDrawBuffer(GL_BACK)");
+        } else if (!Back) {
+            /* That makes problems - disable for now */
+            /* glDrawBuffer(GL_FRONT); */
+            checkGLcall("glDrawBuffer(GL_FRONT)");
+        }
+        LEAVE_GL();
+
+        if(Swapchain->backBuffer)
+            IWineD3DSurface_SetContainer(Swapchain->backBuffer, NULL);
+        Swapchain->backBuffer = Back;
+
+        if(Swapchain->backBuffer) {
+            IWineD3DSurface_SetContainer(Swapchain->backBuffer, (IWineD3DBase *) Swapchain);
+        }
+
+    }
+
+    return WINED3D_OK;
 }
 
 HRESULT  WINAPI  IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice* iface, IWineD3DSurface **ppZStencilSurface) {




More information about the wine-cvs mailing list