summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2013-09-26 10:51:29 -0700
committerEric Anholt <[email protected]>2013-10-24 14:04:20 -0700
commit4e54751624db7cb07cb4d36c3e683d9ed0a30016 (patch)
tree4b6ced37d1a6a696619ecb6f1608b53baed262da /src/mesa/drivers
parentf93533d118b6dab00022cc9bc1448615a25946dc (diff)
dri: Implement a DRI vtable extension to replace the global driDriverAPI.
As we move to megadrivers, we are unable to build multiple drivers with the same public global symbol per driver (Think an X Server with an intel and a nouveau driver, and the X Server implementing indirect for both -- we have to actually talk to the right driver). By slipping the driDriverAPI vtable into the driver's extension list, we can replace the usage of the global symbol with usage of the loader-dlsym()ed driver information. v2: Pull in the hunk to avoid crashing on null driver_extensions. Thanks, Emil! Reviewed-by: Matt Turner <[email protected]> (v1) Reviewed-by: Chad Versace <[email protected]> Reviewed-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/common/dri_util.c13
1 files changed, 13 insertions, 0 deletions
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