fix up mesa's probably bogus framebuffer updates with different read/write fbs
authorRoland Scheidegger <sroland@tungstengraphics.com>
Thu, 19 Jul 2007 15:58:21 +0000 (17:58 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Thu, 19 Jul 2007 15:58:21 +0000 (17:58 +0200)
Conflicts:

src/mesa/main/framebuffer.c

src/mesa/main/framebuffer.c

index dc10d9ffbc8ec851f4d07ea2f4813962942165eb..2ff067164bfaea221918124eadcd5792c1ab2520 100644 (file)
@@ -654,6 +654,27 @@ update_color_read_buffer(GLcontext *ctx, struct gl_framebuffer *fb)
 }
 
 
+static void
+update_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
+{
+   /* Completeness only matters for user-created framebuffers */
+   if (fb->Name != 0) {
+      /* XXX: EXT_framebuffer_blit:
+         framebuffer must still be complete wrt read/draw? */
+      _mesa_test_framebuffer_completeness(ctx, fb);
+      _mesa_update_framebuffer_visual(fb);
+   }
+
+   /* update_color_draw/read_buffers not needed for
+      read/draw only fb, but shouldn't hurt ??? */
+   update_color_draw_buffers(ctx, fb);
+   update_color_read_buffer(ctx, fb);
+   _mesa_update_depth_buffer(ctx, fb, BUFFER_DEPTH);
+   _mesa_update_stencil_buffer(ctx, fb, BUFFER_STENCIL);
+
+   compute_depth_max(fb);
+}
+
 /**
  * Update state related to the current draw/read framebuffers.
  * Specifically, update these framebuffer fields:
@@ -671,19 +692,12 @@ void
 _mesa_update_framebuffer(GLcontext *ctx)
 {
    struct gl_framebuffer *fb = ctx->DrawBuffer;
+   struct gl_framebuffer *fbread = ctx->ReadBuffer;
 
-   /* Completeness only matters for user-created framebuffers */
-   if (fb->Name != 0) {
-      _mesa_test_framebuffer_completeness(ctx, fb);
-      _mesa_update_framebuffer_visual(fb);
-   }
-
-   update_color_draw_buffers(ctx, fb);
-   update_color_read_buffer(ctx, fb);
-   _mesa_update_depth_buffer(ctx, fb, BUFFER_DEPTH);
-   _mesa_update_stencil_buffer(ctx, fb, BUFFER_STENCIL);
-
-   compute_depth_max(fb);
+   update_framebuffer(ctx, fb);
+   if (fbread != fb && fbread != NULL /* can happen at make_current -
+      core/driver circular dependencies, should be fixed up */)
+      update_framebuffer(ctx, fbread);
 }