glx: Provide the __DRI_USE_INVALIDATE extension to the driver when we can

When we have DRI2 protocol at least 2.3, we get an event from the
server when the back buffers get invalidated.  When that's the case
let the driver know that it can rely on invalidate instead of the
glViewport polling.
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index ca2a753..eafb87c 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -73,6 +73,8 @@
    int driPatch;
    int swapAvailable;
    int invalidateAvailable;
+
+   const __DRIextension *loader_extensions[4];
 };
 
 struct __GLXDRIcontextPrivateRec
@@ -536,17 +538,11 @@
    NULL,
 };
 
-static const __DRIextension *loader_extensions[] = {
-   &dri2LoaderExtension.base,
-   &systemTimeExtension.base,
-   NULL
+#ifdef __DRI_USE_INVALIDATE
+static const __DRIuseInvalidateExtension dri2UseInvalidate = {
+   { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION }
 };
-
-static const __DRIextension *loader_extensions_old[] = {
-   &dri2LoaderExtension_old.base,
-   &systemTimeExtension.base,
-   NULL
-};
+#endif
 
 _X_HIDDEN void
 dri2InvalidateBuffers(Display *dpy, XID drawable)
@@ -622,13 +618,14 @@
       goto handle_error;
    }
 
+   
    /* If the server does not support the protocol for
     * DRI2GetBuffersWithFormat, don't supply that interface to the driver.
     */
    psc->__driScreen =
-      psc->dri2->createNewScreen(screen, psc->fd, ((pdp->driMinor < 1)
-						   ? loader_extensions_old
-						   : loader_extensions),
+      psc->dri2->createNewScreen(screen, psc->fd,
+				 (const __DRIextension **)
+				 &pdp->loader_extensions[0],
 				 &driver_configs, psc);
 
    if (psc->__driScreen == NULL) {
@@ -710,7 +707,7 @@
 dri2CreateDisplay(Display * dpy)
 {
    __GLXDRIdisplayPrivate *pdp;
-   int eventBase, errorBase;
+   int eventBase, errorBase, i;
 
    if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
       return NULL;
@@ -731,6 +728,20 @@
    pdp->base.destroyDisplay = dri2DestroyDisplay;
    pdp->base.createScreen = dri2CreateScreen;
 
+   i = 0;
+   if (pdp->driMinor < 1)
+      pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base;
+   else
+      pdp->loader_extensions[i++] = &dri2LoaderExtension.base;
+   
+   pdp->loader_extensions[i++] = &systemTimeExtension.base;
+
+#ifdef __DRI_USE_INVALIDATE
+   if (pdp->invalidateAvailable)
+      pdp->loader_extensions[i++] = &dri2UseInvalidate.base;
+   pdp->loader_extensions[i++] = NULL;
+#endif
+
    return &pdp->base;
 }