Henri Verbeet : wined3d: Avoid redundant FBO binds.

Alexandre Julliard julliard at winehq.org
Fri Jul 17 09:03:29 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Jul 17 10:34:05 2009 +0200

wined3d: Avoid redundant FBO binds.

Apparently this is an expensive operation for certain drivers, even if the
binding doesn't actually change.

---

 dlls/wined3d/context.c         |   24 ++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |    2 ++
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 86e73c5..172cd6b 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -64,6 +64,30 @@ void context_bind_fbo(struct WineD3DContext *context, GLenum target, GLuint *fbo
         f = *fbo;
     }
 
+    switch (target)
+    {
+        case GL_READ_FRAMEBUFFER_EXT:
+            if (context->fbo_read_binding == f) return;
+            context->fbo_read_binding = f;
+            break;
+
+        case GL_DRAW_FRAMEBUFFER_EXT:
+            if (context->fbo_draw_binding == f) return;
+            context->fbo_draw_binding = f;
+            break;
+
+        case GL_FRAMEBUFFER_EXT:
+            if (context->fbo_read_binding == f
+                    && context->fbo_draw_binding == f) return;
+            context->fbo_read_binding = f;
+            context->fbo_draw_binding = f;
+            break;
+
+        default:
+            FIXME("Unhandled target %#x.\n", target);
+            break;
+    }
+
     GL_EXTCALL(glBindFramebufferEXT(target, f));
     checkGLcall("glBindFramebuffer()");
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d02bfdc..5d61c6a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1242,6 +1242,8 @@ struct WineD3DContext
     struct fbo_entry        *current_fbo;
     GLuint                  src_fbo;
     GLuint                  dst_fbo;
+    GLuint                  fbo_read_binding;
+    GLuint                  fbo_draw_binding;
 
     /* Extension emulation */
     GLint                   gl_fog_source;




More information about the wine-cvs mailing list