fix mesa fb binding
authorRoland Scheidegger <sroland@tungstengraphics.com>
Tue, 17 Jul 2007 15:29:55 +0000 (17:29 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Tue, 17 Jul 2007 15:29:55 +0000 (17:29 +0200)
Make sure that we bind the right buffer (draw or read) when rebinding
the window framebuffer (the api doesn't allow binding different draw and
read buffers at the same time, but the default window framebuffer is basically
2 fb objects, one for read, one for write, which can be different). Pass both
of these two down the driver api (no driver uses this right now).

src/mesa/drivers/dri/i915tex/intel_fbo.c
src/mesa/drivers/dri/nouveau/nouveau_buffers.c
src/mesa/main/dd.h
src/mesa/main/fbobject.c

index afee07c6898e7dce87642ba26661fb235706078d..b0c243ebe022703adb088201e5cad213d310d348 100644 (file)
@@ -513,7 +513,7 @@ intel_new_renderbuffer(GLcontext * ctx, GLuint name)
  */
 static void
 intel_bind_framebuffer(GLcontext * ctx, GLenum target,
-                       struct gl_framebuffer *fb)
+                       struct gl_framebuffer *fb, struct gl_framebuffer *fbread)
 {
    if (target == GL_FRAMEBUFFER_EXT || target == GL_DRAW_FRAMEBUFFER_EXT) {
       intel_draw_buffer(ctx, fb);
index 857cd30584ccad91be8779257eb66a310adf31e4..6a2c2013e34b62d9847afb9f0a1aaa80030a7b2a 100644 (file)
@@ -395,9 +395,12 @@ nouveauNewRenderbuffer(GLcontext *ctx, GLuint name)
 }
 
 static void
-nouveauBindFramebuffer(GLcontext *ctx, GLenum target, struct gl_framebuffer *fb)
+nouveauBindFramebuffer(GLcontext *ctx, GLenum target,
+                       struct gl_framebuffer *fb, struct gl_framebuffer *fbread)
 {
-   nouveau_build_framebuffer(ctx, fb);
+   if (target == GL_FRAMEBUFFER_EXT || target == GL_DRAW_FRAMEBUFFER_EXT) {
+      nouveau_build_framebuffer(ctx, fb);
+   }
 }
 
 static void
index 88f33943b3153292d42eef33ee4bec9f448bf6fa..caa50dd6826c6173bd52022ce7ff040bf0b44522 100644 (file)
@@ -782,7 +782,7 @@ struct dd_function_table {
    struct gl_framebuffer * (*NewFramebuffer)(GLcontext *ctx, GLuint name);
    struct gl_renderbuffer * (*NewRenderbuffer)(GLcontext *ctx, GLuint name);
    void (*BindFramebuffer)(GLcontext *ctx, GLenum target,
-                           struct gl_framebuffer *fb);
+                           struct gl_framebuffer *fb, struct gl_framebuffer *fbread);
    void (*FramebufferRenderbuffer)(GLcontext *ctx, 
                                    struct gl_framebuffer *fb,
                                    GLenum attachment,
index e3bada5ae89088f5b0879dbd588160444d2b144d..5345310ca1f1a7d64bdf364c5a8455c7f08e86c2 100644 (file)
@@ -924,7 +924,7 @@ check_end_texture_render(GLcontext *ctx, struct gl_framebuffer *fb)
 void GLAPIENTRY
 _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
 {
-   struct gl_framebuffer *newFb;
+   struct gl_framebuffer *newFb, *newFbread;
    GLboolean bindReadBuf, bindDrawBuf;
    GET_CURRENT_CONTEXT(ctx);
 
@@ -984,12 +984,14 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
         }
          _mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb);
       }
+      newFbread = newFb;
    }
    else {
       /* Binding the window system framebuffer (which was originally set
        * with MakeCurrent).
        */
       newFb = ctx->WinSysDrawBuffer;
+      newFbread = ctx->WinSysReadBuffer;
    }
 
    ASSERT(newFb);
@@ -1000,7 +1002,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
     */
 
    if (bindReadBuf) {
-      _mesa_reference_framebuffer(&ctx->ReadBuffer, newFb);
+      _mesa_reference_framebuffer(&ctx->ReadBuffer, newFbread);
    }
 
    if (bindDrawBuf) {
@@ -1015,7 +1017,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
    }
 
    if (ctx->Driver.BindFramebuffer) {
-      ctx->Driver.BindFramebuffer(ctx, target, newFb);
+      ctx->Driver.BindFramebuffer(ctx, target, newFb, newFbread);
    }
 }