+From 2d00d16da7f5d2255cb37b48edaf4cbb9ca7e930 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net>
+Date: Mon, 10 May 2010 15:51:31 -0400
+Subject: [PATCH] glx: Only call DRI2 invalidate when necessary
+
+We only need this when the server may have swapped the buffers or
+when we receive an invalidate event from the server. The default
+behaviour is still that the DRI driver will invalidate its own buffers
+when glViewport is called.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=27277
+---
+ src/glx/dri2_glx.c | 16 ++++------------
+ 1 files changed, 4 insertions(+), 12 deletions(-)
+
+diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
+index 6058c72..ca2a753 100644
+--- a/src/glx/dri2_glx.c
++++ b/src/glx/dri2_glx.c
+@@ -359,14 +359,6 @@ dri2WaitGL(__GLXDRIdrawable * pdraw)
+ static void
+ dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
+ {
+- __GLXDRIdrawablePrivate *pdraw = loaderPrivate;
+- __GLXdisplayPrivate *priv = __glXInitialize(pdraw->base.psc->dpy);
+- __GLXDRIdisplayPrivate *pdp = (__GLXDRIdisplayPrivate *)priv->dri2Display;
+-
+- /* Old servers don't send invalidate events */
+- if (!pdp->invalidateAvailable)
+- dri2InvalidateBuffers(priv->dpy, pdraw->base.drawable);
+-
+ dri2WaitGL(loaderPrivate);
+ }
+
+@@ -427,16 +419,16 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
+ (*pdraw->psc->f->flush)(pdraw->driDrawable);
+ #endif
+
+- /* Old servers don't send invalidate events */
+- if (!pdp->invalidateAvailable)
+- dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable);
+-
+ /* Old servers can't handle swapbuffers */
+ if (!pdp->swapAvailable) {
+ dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height);
+ return 0;
+ }
+
++ /* Old servers don't send invalidate events */
++ if (!pdp->invalidateAvailable)
++ dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable);
++
+ #ifdef X_DRI2SwapBuffers
+ DRI2SwapBuffers(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor,
+ remainder, &ret);
+--
+1.6.4.4
+