diff options
-rw-r--r-- | include/GL/internal/dri_interface.h | 17 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/dri_util.c | 13 |
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 |