summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2010-05-11 09:42:57 -0400
committerKristian Høgsberg <krh@bitplanet.net>2010-05-11 10:23:53 -0400
commit4258e3a2e1c3278694ed10f7fc544d2154d91a96 (patch)
tree4d58bff9d09f8d9a888d13b85bb0781b185fe322 /src
parent97a6cbc6dd8e62653d7481c6f651f2a5fb10aa0e (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/glx/dri2_glx.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index ca2a753cbb0..eafb87c3597 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -73,6 +73,8 @@ struct __GLXDRIdisplayPrivateRec
int driPatch;
int swapAvailable;
int invalidateAvailable;
+
+ const __DRIextension *loader_extensions[4];
};
struct __GLXDRIcontextPrivateRec
@@ -536,17 +538,11 @@ static const __DRIdri2LoaderExtension dri2LoaderExtension_old = {
NULL,
};
-static const __DRIextension *loader_extensions[] = {
- &dri2LoaderExtension.base,
- &systemTimeExtension.base,
- NULL
-};
-
-static const __DRIextension *loader_extensions_old[] = {
- &dri2LoaderExtension_old.base,
- &systemTimeExtension.base,
- NULL
+#ifdef __DRI_USE_INVALIDATE
+static const __DRIuseInvalidateExtension dri2UseInvalidate = {
+ { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION }
};
+#endif
_X_HIDDEN void
dri2InvalidateBuffers(Display *dpy, XID drawable)
@@ -622,13 +618,14 @@ dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
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 @@ _X_HIDDEN __GLXDRIdisplay *
dri2CreateDisplay(Display * dpy)
{
__GLXDRIdisplayPrivate *pdp;
- int eventBase, errorBase;
+ int eventBase, errorBase, i;
if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
return NULL;
@@ -731,6 +728,20 @@ dri2CreateDisplay(Display * dpy)
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;
}