fix up mesa's probably bogus framebuffer updates with different read/write fbs
authorRoland Scheidegger <sroland@tungstengraphics.com>
Tue, 17 Jul 2007 17:22:23 +0000 (19:22 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Tue, 17 Jul 2007 17:22:23 +0000 (19:22 +0200)
src/mesa/main/framebuffer.c

index a95e44c51335569a6e597647335e5136e8af0cb0..f8716f30d37708c278b1a0354175620a38693da2 100644 (file)
@@ -652,6 +652,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:
@@ -668,22 +689,13 @@ update_color_read_buffer(GLcontext *ctx, struct gl_framebuffer *fb)
 void
 _mesa_update_framebuffer(GLcontext *ctx)
 {
-   /* XXX might not be quite correct for different draw/read buffers ? */
    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);
-   }
+   struct gl_framebuffer *fbread = ctx->ReadBuffer;
 
-   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);
 }