summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 aa2b1cf8057..ee73233771c 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 ee8e238bec5..cb187717f1e 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 84a6d819def..c8be7b07064 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;