intel: flush old context before binding new context
authorBrian Paul <brianp@vmware.com>
Fri, 23 Oct 2009 00:32:48 +0000 (18:32 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 23 Oct 2009 00:33:26 +0000 (18:33 -0600)
Per the GLX spec, when changing rendering contexts, the old context
should first be flushed.

src/mesa/drivers/dri/intel/intel_context.c

index d24af46f59f7c642fadbab7e0f0fd3ff235d7964..ddb0550f77d217e4e23838753e2f4912357a989c 100644 (file)
@@ -944,10 +944,23 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
                  __DRIdrawablePrivate * driReadPriv)
 {
    __DRIscreenPrivate *psp = driDrawPriv->driScreenPriv;
+   struct intel_context *intel;
+   GET_CURRENT_CONTEXT(curCtx);
+
+   if (driContextPriv)
+      intel = (struct intel_context *) driContextPriv->driverPrivate;
+   else
+      intel = NULL;
+
+   /* According to the glXMakeCurrent() man page: "Pending commands to
+    * the previous context, if any, are flushed before it is released."
+    * But only flush if we're actually changing contexts.
+    */
+   if (intel_context(curCtx) && intel_context(curCtx) != intel) {
+      _mesa_flush(curCtx);
+   }
 
    if (driContextPriv) {
-      struct intel_context *intel =
-         (struct intel_context *) driContextPriv->driverPrivate;
       struct intel_framebuffer *intel_fb =
         (struct intel_framebuffer *) driDrawPriv->driverPrivate;
       GLframebuffer *readFb = (GLframebuffer *) driReadPriv->driverPrivate;