aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/GL/internal/dri_interface.h17
-rw-r--r--src/mesa/drivers/dri/common/dri_util.c13
2 files changed, 30 insertions, 0 deletions
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index a7afa224664..48993b93930 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1270,4 +1270,21 @@ typedef struct __DRIconfigOptionsExtensionRec {
const char *xml;
} __DRIconfigOptionsExtension;
+/**
+ * This extension provides a driver vtable to a set of common driver helper
+ * functions (driCoreExtension, driDRI2Extension) within the driver
+ * implementation, as opposed to having to pass them through a global
+ * variable.
+ *
+ * It is not intended to be public API to the actual loader, and the vtable
+ * layout may change at any time.
+ */
+#define __DRI_DRIVER_VTABLE "DRI_DriverVtable"
+#define __DRI_DRIVER_VTABLE_VERSION 1
+
+typedef struct __DRIDriverVtableExtensionRec {
+ __DRIextension base;
+ const struct __DriverAPIRec *vtable;
+} __DRIDriverVtableExtension;
+
#endif
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 8a413daf043..2a85703f2ad 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -101,8 +101,21 @@ dri2CreateNewScreen2(int scrn, int fd,
if (!psp)
return NULL;
+ /* By default, use the global driDriverAPI symbol (non-megadrivers). */
psp->driver = &driDriverAPI;
+ /* If the driver exposes its vtable through its extensions list
+ * (megadrivers), use that instead.
+ */
+ if (driver_extensions) {
+ for (int i = 0; driver_extensions[i]; i++) {
+ if (strcmp(driver_extensions[i]->name, __DRI_DRIVER_VTABLE) == 0) {
+ psp->driver =
+ ((__DRIDriverVtableExtension *)driver_extensions[i])->vtable;
+ }
+ }
+ }
+
setupLoaderExtensions(psp, extensions);
#ifndef __NOT_HAVE_DRM_H