summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@hinata.boston.redhat.com>2007-05-15 12:31:31 -0400
committerKristian Høgsberg <krh@redhat.com>2007-10-10 18:47:22 -0400
commitf616a263a25eda135800bea7d3a863c569b93e30 (patch)
treef922c411d8d821a675eb32408e11aa1e16f93669
parent295dc2d225ccac1951c0fcc2c08119f31d1b575c (diff)
Implement new screen extension API.
This new API lets the loader examine DRI level extensions provided by the driver in a forward compatible manner. Much of the churn in the DRI interface is adding support for new extensions or removing old, unused extensions. This new extension mechanism lets the loader query the extensions provided by the driver and implement the extensions it knows about. Deprecating extensions is done by not exporting that extension in the list, which doesn't require keeping old function pointers around to preserve ABI.
-rw-r--r--include/GL/internal/dri_interface.h20
-rw-r--r--src/glx/x11/glxext.c14
-rw-r--r--src/mesa/drivers/dri/common/dri_util.c9
3 files changed, 43 insertions, 0 deletions
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index aa2b1cf805..ee73233771 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -56,10 +56,25 @@ typedef struct __DRIdriverRec __DRIdriver;
typedef struct __DRIframebufferRec __DRIframebuffer;
typedef struct __DRIversionRec __DRIversion;
typedef struct __DRIinterfaceMethodsRec __DRIinterfaceMethods;
+
+typedef struct __DRIextensionRec __DRIextension;
/*@}*/
/**
+ * Extension struct. Drivers 'inherit' from this struct by embedding
+ * it as the first element in the extension struct. The
+ * __DRIscreen::getExtensions entry point will return a list of these
+ * structs and the loader can use the extensions it knows about by
+ * casting it to a more specific extension and optionally advertising
+ * the GLX extension. See below for examples.
+ */
+struct __DRIextensionRec {
+ const char *name;
+};
+
+
+/**
* \name Functions provided by the driver loader.
*/
/*@{*/
@@ -275,6 +290,11 @@ struct __DRIscreenRec {
void (*destroyScreen)(__DRIscreen *screen);
/**
+ * Method to get screen extensions.
+ */
+ const __DRIextension **(*getExtensions)(__DRIscreen *screen);
+
+ /**
* Method to create the private DRI drawable data and initialize the
* drawable dependent methods.
*/
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index ee8e238bec..cb187717f1 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -1011,6 +1011,18 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
return psp;
}
+
+static void queryExtensions(__GLXscreenConfigs *psc)
+{
+ const __DRIextension **extensions;
+ int i;
+
+ extensions = psc->driScreen.getExtensions(&psc->driScreen);
+ for (i = 0; extensions[i]; i++) {
+ /* Unknown extension, just ignore... */
+ }
+}
+
#endif /* GLX_DIRECT_RENDERING */
@@ -1205,6 +1217,8 @@ static Bool AllocAndFetchScreenConfigs(Display *dpy, __GLXdisplayPrivate *priv)
CallCreateNewScreen(dpy, i, psc,
& priv->driDisplay,
priv->driDisplay.createNewScreen[i] );
+ if (psc->driScreen.private != NULL)
+ queryExtensions(psc);
}
}
#endif
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 84a6d819de..c8be7b0706 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -624,6 +624,14 @@ driCreateNewContext(__DRIscreen *screen, const __GLcontextModes *modes,
}
/*@}*/
+static const __DRIextension **
+driGetExtensions(__DRIscreen *screen)
+{
+ __DRIscreenPrivate *psp = screen->private;
+ static const __DRIextension *extensions[1];
+
+ return extensions;
+}
/*****************************************************************/
/** \name Screen handling functions */
@@ -750,6 +758,7 @@ void * __DRI_CREATE_NEW_SCREEN( int scrn, __DRIscreen *psc,
psp->dummyContextPriv.driScreenPriv = NULL;
psc->destroyScreen = driDestroyScreen;
+ psc->getExtensions = driGetExtensions;
psc->createNewDrawable = driCreateNewDrawable;
psc->getMSC = driGetMSC;
psc->createNewContext = driCreateNewContext;