xlib st: Fix makeCurrent.
authorThomas Hellstrom <thellstrom-at-vmware-dot-com>
Wed, 18 Mar 2009 10:52:24 +0000 (11:52 +0100)
committerThomas Hellstrom <thellstrom-at-vmware-dot-com>
Wed, 18 Mar 2009 10:58:40 +0000 (11:58 +0100)
Flush if we change context.
Also reinstate the old optimization of doing nothing if
nothing changes.

Signed-off-by: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
src/gallium/state_trackers/glx/xlib/xm_api.c
src/gallium/state_trackers/glx/xlib/xm_api.h

index 7f32b460aaed4f60b5a797b1fd3971442b91d5d6..75a4efd823e408a6b46364bc5ff0f6f728a6929c 100644 (file)
@@ -763,7 +763,8 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
 
    c->xm_visual = v;
    c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
-   
+   c->xm_read_buffer = NULL;
+
    /* XXX: create once per Xlib Display.
     */
    screen = driver.create_pipe_screen();
@@ -1037,22 +1038,25 @@ PUBLIC
 GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
                              XMesaBuffer readBuffer )
 {
+   XMesaContext old_ctx = XMesaGetCurrentContext();
+
+   if (old_ctx && old_ctx != c) {
+      XMesaFlush(old_ctx);
+      old_ctx->xm_buffer = NULL;
+      old_ctx->xm_read_buffer = NULL;
+   }
+
    if (c) {
       if (!drawBuffer || !readBuffer)
          return GL_FALSE;  /* must specify buffers! */
 
-#if 0
-      /* XXX restore this optimization */
-      if (&(c->mesa) == _mesa_get_current_context()
-          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
-          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
-          && xmesa_buffer(c->mesa.DrawBuffer)->wasCurrent) {
-         /* same context and buffer, do nothing */
-         return GL_TRUE;
-      }
-#endif
+      if (c == old_ctx &&
+         c->xm_buffer == drawBuffer &&
+         c->xm_read_buffer == readBuffer)
+        return GL_TRUE;
 
       c->xm_buffer = drawBuffer;
+      c->xm_read_buffer = readBuffer;
 
       /* Call this periodically to detect when the user has begun using
        * GL rendering from multiple threads.
@@ -1071,6 +1075,7 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
    else {
       /* Detach */
       st_make_current( NULL, NULL, NULL );
+
    }
    return GL_TRUE;
 }
index 2b8302d1747c2a12061d51b621e11502bb9aaffd..bdd434cd3643d812c4679f29fbb2be4cc925651a 100644 (file)
@@ -295,6 +295,7 @@ struct xmesa_context {
    struct st_context *st;
    XMesaVisual xm_visual;      /** pixel format info */
    XMesaBuffer xm_buffer;      /** current drawbuffer */
+   XMesaBuffer xm_read_buffer;  /** current readbuffer */
 };