st/xlib: Notify the context when the front/back buffers are swapped.
authorChia-I Wu <olv@lunarg.com>
Tue, 7 Sep 2010 16:30:27 +0000 (00:30 +0800)
committerChia-I Wu <olv@lunarg.com>
Thu, 16 Sep 2010 05:09:48 +0000 (13:09 +0800)
The current context should be notified when the the front/back buffers
of the current drawable are swapped.  The notification was skipped when
xmesa_strict_invalidate is false (the default).

This fixes fdo bug #29774.

src/gallium/state_trackers/glx/xlib/xm_api.c
src/gallium/state_trackers/glx/xlib/xm_api.h
src/gallium/state_trackers/glx/xlib/xm_st.c

index 36d63c30d6c043cde9c24d171dba928859bc1c8e..f950c8858bc164dfccbde3e770de39e29d679245 100644 (file)
@@ -1087,19 +1087,29 @@ XMesaDestroyBuffer(XMesaBuffer b)
 
 
 /**
- * Query the current drawable size and notify the binding context.
+ * Notify the binding context to validate the buffer.
  */
 void
-xmesa_check_buffer_size(XMesaBuffer b)
+xmesa_notify_invalid_buffer(XMesaBuffer b)
 {
    XMesaContext xmctx = XMesaGetCurrentContext();
 
+   if (xmctx && xmctx->xm_buffer == b)
+      xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
+}
+
+
+/**
+ * Query the current drawable size and notify the binding context.
+ */
+void
+xmesa_check_buffer_size(XMesaBuffer b)
+{
    if (b->type == PBUFFER)
       return;
 
    xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height);
-   if (xmctx && xmctx->xm_buffer == b)
-      xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
+   xmesa_notify_invalid_buffer(b);
 }
 
 
index f209b14ea1342b47c3523d63bc0d372d0b44a0f4..fedf2b2d5a135ba394390007040af56336a9a7e1 100644 (file)
@@ -360,6 +360,9 @@ extern void
 xmesa_get_window_size(Display *dpy, XMesaBuffer b,
                       GLuint *width, GLuint *height);
 
+extern void
+xmesa_notify_invalid_buffer(XMesaBuffer b);
+
 extern void
 xmesa_check_buffer_size(XMesaBuffer b);
 
index 4c0ce07a6b57d575bb43ec0fddb9229aa8566ec7..4d0f5e66256510d909584b2b53deb11a45887bff 100644 (file)
@@ -339,6 +339,10 @@ xmesa_swap_st_framebuffer(struct st_framebuffer_iface *stfbi)
          tmp = *front;
          *front = *back;
          *back = tmp;
+
+         /* the current context should validate the buffer after swapping */
+         if (!xmesa_strict_invalidate)
+            xmesa_notify_invalid_buffer(xstfb->buffer);
       }
 
       if (xmesa_strict_invalidate)