fix bogus fb/drawable information (fixes xdemos/wincopy)
authorRoland Scheidegger <sroland@tungstengraphics.com>
Sun, 15 Jul 2007 20:47:42 +0000 (22:47 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Sun, 15 Jul 2007 20:47:42 +0000 (22:47 +0200)
the framebuffer objects attached to drawables can have invalidate state
associated with them, since for the window framebuffer this is per-context
state and not per-fbo state. Since drivers may rely on that information
(otherwise would need to check if currently the window-framebuffer is
bound in a lot of places) fix it up in _mesa_make_current (ugly).

src/mesa/drivers/dri/i915tex/intel_context.c
src/mesa/main/context.c

index 146426fd3713b187dbb01ee169c020fa9bc7c119..cb3ec4ccfadfb3f17826abffb5b42046f8284b88 100644 (file)
@@ -289,8 +289,9 @@ static void
 intelCheckFrontUpdate(GLcontext * ctx)
 {
    struct intel_context *intel = intel_context(ctx);
-   if (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] ==
-       BUFFER_BIT_FRONT_LEFT) {
+   /* can't use _ColorDrawBufferMask as its value
+      might change if a different drawable is bound! */
+   if (ctx->Color.DrawBuffer[0] == GL_FRONT_LEFT) {
       intelScreenPrivate *screen = intel->intelScreen;
       __DRIdrawablePrivate *dPriv = intel->driDrawable;
       if (screen->current_rotation != 0) {
index 255023c0fa973ec26e1a31fd4a713486bdef5f19..183a552d406778a6bb9698fd8980da870b5fe86f 100644 (file)
@@ -1495,9 +1495,20 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
           */
          if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
             _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
+         /* fix up the fb fields - these will end up wrong otherwise
+            if the DRIdrawable changes, and someone may rely on them.
+          */
+            /* What a mess!?! */
+            int i;
+            GLenum buffers[MAX_DRAW_BUFFERS];
+            for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
+               buffers[i] = newCtx->Color.DrawBuffer[i];
+            }
+            _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
          }
          if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
             _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
+            _mesa_ReadBuffer(newCtx->Pixel.ReadBuffer);
          }
 
         newCtx->NewState |= _NEW_BUFFERS;