H. Verbeet : wined3d: Apply FBO state in ActivateContext().

Alexandre Julliard julliard at winehq.org
Tue Aug 5 07:26:14 CDT 2008


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

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Mon Aug  4 19:28:37 2008 +0200

wined3d: Apply FBO state in ActivateContext().

Fixes some GL errors due to calling glDrawBuffer(GL_BACK) when an FBO
is still active.

---

 dlls/wined3d/context.c  |   52 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/wined3d/device.c   |   12 ----------
 dlls/wined3d/drawprim.c |    6 -----
 3 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 3556714..56111ef 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1051,7 +1051,7 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
     return context;
 }
 
-static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target)
+static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target, BOOL blit)
 {
     HRESULT hr;
     IWineD3DSwapChain *swapchain;
@@ -1065,8 +1065,24 @@ static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target)
     }
     else
     {
-        glDrawBuffer(This->offscreenBuffer);
-        checkGLcall("glDrawBuffer()");
+        if (!blit && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+        {
+            if (GL_SUPPORT(ARB_DRAW_BUFFERS))
+            {
+                GL_EXTCALL(glDrawBuffersARB(GL_LIMITS(buffers), This->draw_buffers));
+                checkGLcall("glDrawBuffers()");
+            }
+            else
+            {
+                glDrawBuffer(This->draw_buffers[0]);
+                checkGLcall("glDrawBuffer()");
+            }
+        }
+        else
+        {
+            glDrawBuffer(This->offscreenBuffer);
+            checkGLcall("glDrawBuffer()");
+        }
     }
 }
 
@@ -1135,9 +1151,33 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
     /* We only need ENTER_GL for the gl calls made below and for the helper functions which make GL calls */
     ENTER_GL();
 
-    if (context->draw_buffer_dirty) {
-        apply_draw_buffer(This, target);
-        context->draw_buffer_dirty = FALSE;
+    switch (usage) {
+        case CTXUSAGE_CLEAR:
+        case CTXUSAGE_DRAWPRIM:
+            if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
+                apply_fbo_state((IWineD3DDevice *)This);
+            }
+            if (context->draw_buffer_dirty) {
+                apply_draw_buffer(This, target, FALSE);
+                context->draw_buffer_dirty = FALSE;
+            }
+            break;
+
+        case CTXUSAGE_BLIT:
+            if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
+                GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+                context->draw_buffer_dirty = TRUE;
+            }
+            if (context->draw_buffer_dirty) {
+                apply_draw_buffer(This, target, TRUE);
+                if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) {
+                    context->draw_buffer_dirty = FALSE;
+                }
+            }
+            break;
+
+        default:
+            break;
     }
 
     switch(usage) {
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 55c1f46..7867517 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5026,10 +5026,6 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This,  IWineD3DSurfa
     ActivateContext(This, (IWineD3DSurface *) target, CTXUSAGE_CLEAR);
     ENTER_GL();
 
-    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
-        apply_fbo_state((IWineD3DDevice *) This);
-    }
-
     /* Only set the values up once, as they are not changing */
     if (Flags & WINED3DCLEAR_STENCIL) {
         glClearStencil(Stencil);
@@ -6590,14 +6586,6 @@ void apply_fbo_state(IWineD3DDevice *iface) {
             set_depth_stencil_fbo(iface, This->stencilBufferTarget);
             This->fbo_depth_attachment = This->stencilBufferTarget;
         }
-
-        if (GL_SUPPORT(ARB_DRAW_BUFFERS)) {
-            GL_EXTCALL(glDrawBuffersARB(GL_LIMITS(buffers), This->draw_buffers));
-            checkGLcall("glDrawBuffers()");
-        } else {
-            glDrawBuffer(This->draw_buffers[0]);
-            checkGLcall("glDrawBuffer()");
-        }
     } else {
         GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
     }
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index fd96ea2..59e1f64 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -941,12 +941,6 @@ void drawPrimitive(IWineD3DDevice *iface,
 
     /* Ok, we will be updating the screen from here onwards so grab the lock */
 
-    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
-        ENTER_GL();
-        apply_fbo_state(iface);
-        LEAVE_GL();
-    }
-
     ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM);
     ENTER_GL();
 




More information about the wine-cvs mailing list