Henri Verbeet : wined3d: Mark the draw buffer as dirty in context_create().

Alexandre Julliard julliard at winehq.org
Wed Dec 16 09:41:30 CST 2009


Module: wine
Branch: master
Commit: cd623036fc1b01517e789fe675675a9f94428dcd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cd623036fc1b01517e789fe675675a9f94428dcd

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Dec 15 17:51:37 2009 +0100

wined3d: Mark the draw buffer as dirty in context_create().

Currently callers of this function are responsible for setting the draw buffer
correctly, but they don't do a very good job:
  - swapchain_init() sets the draw buffer to GL_BACK if there's a back buffer,
    even though the context's target is always the front buffer.
  - swapchain_create_context_for_thread() depends on (eventually) being called
    by FindContext().
  - create_primary_opengl_context() and
    IWineD3DSwapChainImpl_SetDestWindowOverride() don't bother setting a draw
    buffer at all.
Just marking the draw buffer dirty lets the context management sort it all
out, and is much simpler.

---

 dlls/wined3d/context.c   |    1 +
 dlls/wined3d/swapchain.c |   22 +---------------------
 2 files changed, 2 insertions(+), 21 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 2f27997..30590af 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1349,6 +1349,7 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
     ret->surface = (IWineD3DSurface *) target;
     ret->current_rt = (IWineD3DSurface *)target;
     ret->render_offscreen = surface_is_offscreen((IWineD3DSurface *) target);
+    ret->draw_buffer_dirty = TRUE;
     ret->tid = GetCurrentThreadId();
     if(This->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *) This)) {
         /* Create the dirty constants array and initialize them to dirty */
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index fb902ea..7e6c71e 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -809,6 +809,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
             hr = WINED3DERR_NOTAVAILABLE;
             goto err;
         }
+        context_release(swapchain->context[0]);
     }
     else
     {
@@ -841,30 +842,9 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
 
             IWineD3DSurface_SetContainer(swapchain->backBuffer[i], (IWineD3DBase *)swapchain);
             ((IWineD3DSurfaceImpl *)swapchain->backBuffer[i])->Flags |= SFLAG_SWAPCHAIN;
-
-            if (surface_type == SURFACE_OPENGL)
-            {
-                ENTER_GL();
-                glDrawBuffer(GL_BACK);
-                checkGLcall("glDrawBuffer(GL_BACK)");
-                LEAVE_GL();
-            }
-        }
-    }
-    else
-    {
-        /* Single buffering - draw to front buffer */
-        if (surface_type == SURFACE_OPENGL)
-        {
-            ENTER_GL();
-            glDrawBuffer(GL_FRONT);
-            checkGLcall("glDrawBuffer(GL_FRONT)");
-            LEAVE_GL();
         }
     }
 
-    if (swapchain->context[0]) context_release(swapchain->context[0]);
-
     /* Swapchains share the depth/stencil buffer, so only create a single depthstencil surface. */
     if (present_parameters->EnableAutoDepthStencil && surface_type == SURFACE_OPENGL)
     {




More information about the wine-cvs mailing list