more fixes for mesa's fbo handling (fixes tests/fbotest1/2)
authorRoland Scheidegger <sroland@tungstengraphics.com>
Wed, 18 Jul 2007 16:07:12 +0000 (18:07 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Thu, 19 Jul 2007 15:59:31 +0000 (17:59 +0200)
src/mesa/main/buffers.c
src/mesa/main/context.c
src/mesa/main/fbobject.c

index c280f89e1d1ba15e0735ec25d102fed5747fb335..68a0575d93de28bb905ad83087472db30f51ad35 100644 (file)
@@ -557,9 +557,8 @@ _mesa_ReadBuffer(GLenum buffer)
       }
    }
 
-   if (fb->Name == 0) {
-      ctx->Pixel.ReadBuffer = buffer;
-   }
+   ctx->Pixel.ReadBuffer = buffer;
+
    fb->ColorReadBuffer = buffer;
    fb->_ColorReadBufferIndex = srcBuffer;
 
index 2ad1badac7095137cccf7e8a24c241d524a1224c..4e6732dc7acc33cd28edb619da6945e7144a97ea 100644 (file)
@@ -1499,6 +1499,11 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
             if the DRIdrawable changes, and someone may rely on them.
           */
             /* What a mess!?! */
+            /* XXX this is still not quite correct. Imagine a user-created fbo
+               bound on a context. Now rebind with a completely new drawable.
+               Upon rebinding to the window-framebuffer, we have no idea what
+               the read and write buffers should be (front, back, ...) - that
+               information was only available in the previously used drawable... */
             int i;
             GLenum buffers[MAX_DRAW_BUFFERS];
             for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
index 5345310ca1f1a7d64bdf364c5a8455c7f08e86c2..f300e481ce089a789d43f091294cd928929d1a21 100644 (file)
@@ -1003,13 +1003,20 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
 
    if (bindReadBuf) {
       _mesa_reference_framebuffer(&ctx->ReadBuffer, newFbread);
+      /* set context value */
+      ctx->Pixel.ReadBuffer = newFbread->ColorReadBuffer;
    }
 
    if (bindDrawBuf) {
+      GLuint i;
       /* check if old FB had any texture attachments */
       check_end_texture_render(ctx, ctx->DrawBuffer);
       /* check if time to delete this framebuffer */
       _mesa_reference_framebuffer(&ctx->DrawBuffer, newFb);
+      /* set context value */
+      for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
+        ctx->Color.DrawBuffer[i] = newFb->ColorDrawBuffer[i];
+      }
       if (newFb->Name != 0) {
          /* check if newly bound framebuffer has any texture attachments */
          check_begin_texture_render(ctx, newFb);