We were only flushing it in the fake-front case, which won't be enough if you're doing something like drawing into a GLXPixmap and using X rendering to composite from it. --- src/glx/dri2_glx.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 3cdd249..d813788 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -664,10 +664,30 @@ dri2_wait_gl(struct glx_context *gc) struct dri2_drawable *priv = (struct dri2_drawable *) GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); - if (priv == NULL || !priv->have_fake_front) - return; - - dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); + if (priv != NULL) { + if (priv->have_fake_front) { + dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); + } else { + struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; + + /* From the GLX 1.4 spec, page 33: + * + * "OpenGL calls made prior to glXWaitGL are guaranteed to be + * executed before X rendering calls made after glXWaitGL. While + * the same result can be achieved using glFinish, glXWaitGL + * does not require a round trip to the server, and is therefore + * more efficient in cases where the client and server are on + * separate machines." + * + * In DRI2, we assume that the kernel serializes operations on BOs + * appropriately, so a glFlush here that gets the GL commands down to + * the kernel is enough to ensure that later X rendering comes after + * it. + */ + if (psc->f) + (*psc->f->flush) (priv->driDrawable); + } + } } /** -- 1.8.3.rc0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev