Stefan Dösinger : wined3d: Support for single buffering.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 15 07:34:39 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: daa6a3d714e2c222fdf7c51e410920eebe8ad40c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=daa6a3d714e2c222fdf7c51e410920eebe8ad40c
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sat May 13 23:33:00 2006 +0200
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 d6c70f8..a7221ce 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1152,9 +1152,6 @@ HRESULT WINAPI IWineD3DDeviceImpl_Create
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 @@ #endif
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 05e31e4..29c3f1c 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -94,19 +94,24 @@ ULONG WINAPI IWineD3DSwapChainImpl_Relea
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){
More information about the wine-cvs
mailing list