From daa6a3d714e2c222fdf7c51e410920eebe8ad40c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Sat, 13 May 2006 23:33:00 +0200 Subject: [PATCH] wined3d: Support for single buffering. --- dlls/wined3d/device.c | 41 ++++++++++++++++++++++++++-------------- dlls/wined3d/swapchain.c | 25 ++++++++++++++---------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index d6c70f8300f..a7221ce950a 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1152,9 +1152,6 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac D3DCREATEOBJECTINSTANCE(object, SwapChain) - /* Initialize other useful values */ - object->presentParms.BackBufferCount = 1; /* TODO:? support for gl_aux buffers */ - /********************* * Lookup the window Handle and the relating X window handle ********************/ @@ -1382,18 +1379,34 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac NULL /* pShared (always null)*/); if (object->frontBuffer != NULL) IWineD3DSurface_SetContainer(object->frontBuffer, (IWineD3DBase *)object); - TRACE("calling rendertarget CB\n"); - hr = D3DCB_CreateRenderTarget((IUnknown *) This->parent, - object->presentParms.BackBufferWidth, - object->presentParms.BackBufferHeight, - object->presentParms.BackBufferFormat, - object->presentParms.MultiSampleType, - object->presentParms.MultiSampleQuality, - TRUE /* Lockable */, - &object->backBuffer, - NULL /* pShared (always null)*/); - if (object->backBuffer != NULL) + if(object->presentParms.BackBufferCount > 0) { + TRACE("calling rendertarget CB\n"); + hr = D3DCB_CreateRenderTarget((IUnknown *) This->parent, + object->presentParms.BackBufferWidth, + object->presentParms.BackBufferHeight, + object->presentParms.BackBufferFormat, + object->presentParms.MultiSampleType, + object->presentParms.MultiSampleQuality, + TRUE /* Lockable */, + &object->backBuffer, + NULL /* pShared (always null)*/); + } else { + object->backBuffer = NULL; + } + + if (object->backBuffer != NULL) { IWineD3DSurface_SetContainer(object->backBuffer, (IWineD3DBase *)object); + ENTER_GL(); + glDrawBuffer(GL_BACK); + checkGLcall("glDrawBuffer(GL_BACK)"); + LEAVE_GL(); + } else { + /* Single buffering - draw to front buffer */ + ENTER_GL(); + glDrawBuffer(GL_FRONT); + checkGLcall("glDrawBuffer(GL_FRONT)"); + LEAVE_GL(); + } /* Under directX swapchains share the depth stencil, so only create one depth-stencil */ if (pPresentationParameters->EnableAutoDepthStencil) { diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 05e31e45e97..29c3f1c1178 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -94,19 +94,24 @@ ULONG WINAPI IWineD3DSwapChainImpl_Release(IWineD3DSwapChain *iface) { IWineD3DDevice_SwapChainReleased((IWineD3DDevice *)This->wineD3DDevice, iface); /* release the ref to the front and back buffer parents */ - IWineD3DSurface_SetContainer(This->frontBuffer, 0); - IWineD3DSurface_GetParent(This->frontBuffer, &bufferParent); - IUnknown_Release(bufferParent); /* once for the get parent */ - if(IUnknown_Release(bufferParent) > 0){ - FIXME("(%p) Something's still holding the front buffer\n",This); + if(This->frontBuffer) { + IWineD3DSurface_SetContainer(This->frontBuffer, 0); + IWineD3DSurface_GetParent(This->frontBuffer, &bufferParent); + IUnknown_Release(bufferParent); /* once for the get parent */ + if(IUnknown_Release(bufferParent) > 0){ + FIXME("(%p) Something's still holding the front buffer\n",This); + } } - IWineD3DSurface_SetContainer(This->backBuffer, 0); - IWineD3DSurface_GetParent(This->backBuffer, &bufferParent); - IUnknown_Release(bufferParent); /* once for the get parent */ - if(IUnknown_Release(bufferParent) > 0){ - FIXME("(%p) Something's still holding the back buffer\n",This); + if(This->backBuffer) { + IWineD3DSurface_SetContainer(This->backBuffer, 0); + IWineD3DSurface_GetParent(This->backBuffer, &bufferParent); + IUnknown_Release(bufferParent); /* once for the get parent */ + if(IUnknown_Release(bufferParent) > 0){ + FIXME("(%p) Something's still holding the back buffer\n",This); + } } + /* Clean up the context */ /* check that we are the current context first */ if(glXGetCurrentContext() == This->glCtx){