diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 4aaae9a7de5..7e9663fd3ac 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -659,7 +659,7 @@ dri2_open_driver(_EGLDisplay *disp) }; return loader_open_driver(dri2_dpy->driver_name, &dri2_dpy->driver, - search_path_vars); + search_path_vars, disp->Options.FallbackZink); } static EGLBoolean diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index a20ed792699..109e8b7d0ee 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -699,7 +699,9 @@ eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) bool success = false; if (!disp->Options.Zink && !getenv("GALLIUM_DRIVER")) { disp->Options.Zink = EGL_TRUE; + disp->Options.FallbackZink = EGL_TRUE; success = _eglDriver.Initialize(disp); + disp->Options.FallbackZink = EGL_FALSE; } if (!success) { disp->Options.Zink = EGL_FALSE; diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index dc3d5a89309..38aef531a68 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -196,6 +196,7 @@ struct _egl_display { /* options that affect how the driver initializes the display */ struct { EGLBoolean Zink; /**< Use kopper only */ + EGLBoolean FallbackZink; /**< True if zink is tried as fallback */ EGLBoolean ForceSoftware; /**< Use software path only */ EGLBoolean GalliumHudWarn; /**< Using hud, warn when querying buffer age */ EGLAttrib *Attribs; /**< Platform-specific options */ diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 61e9a564f32..4d915a35a5a 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -262,7 +262,7 @@ static struct dri_extension_match gbm_swrast_device_extensions[] = { }; static const __DRIextension ** -dri_open_driver(struct gbm_dri_device *dri) +dri_open_driver(struct gbm_dri_device *dri, bool driver_name_is_inferred) { /* Temporarily work around dri driver libs that need symbols in libglapi * but don't automatically link it in. @@ -283,7 +283,8 @@ dri_open_driver(struct gbm_dri_device *dri) "LIBGL_DRIVERS_PATH", NULL }; - return loader_open_driver(dri->driver_name, &dri->driver, search_path_vars); + return loader_open_driver(dri->driver_name, &dri->driver, search_path_vars, + driver_name_is_inferred); } static int @@ -293,7 +294,7 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name, bool dri->driver_name = swrast ? strdup("swrast") : driver_name; - const __DRIextension **extensions = dri_open_driver(dri); + const __DRIextension **extensions = dri_open_driver(dri, driver_name_is_inferred); if (!extensions) goto fail; diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 8351be19f36..fbef32ac3fb 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -1058,7 +1058,7 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe } psc->driverName = driverName; - extensions = driOpenDriver(driverName, &psc->driver); + extensions = driOpenDriver(driverName, &psc->driver, driver_name_is_inferred); if (extensions == NULL) goto handle_error; diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 9a0119c6b1a..d27432896f6 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -842,7 +842,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in goto handle_error; } - extensions = driOpenDriver(driverName, &psc->driver); + extensions = driOpenDriver(driverName, &psc->driver, driver_name_is_inferred); if (extensions == NULL) goto handle_error; diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c index 40bbcfffb15..40cf9a0bae2 100644 --- a/src/glx/dri_common.c +++ b/src/glx/dri_common.c @@ -70,7 +70,7 @@ * file not found. */ _X_HIDDEN const __DRIextension ** -driOpenDriver(const char *driverName, void **out_driver_handle) +driOpenDriver(const char *driverName, void **out_driver_handle, bool driver_name_is_inferred) { void *glhandle; @@ -84,7 +84,7 @@ driOpenDriver(const char *driverName, void **out_driver_handle) }; const __DRIextension **extensions = - loader_open_driver(driverName, out_driver_handle, search_path_vars); + loader_open_driver(driverName, out_driver_handle, search_path_vars, driver_name_is_inferred); if (glhandle) dlclose(glhandle); @@ -744,7 +744,7 @@ get_driver_config(const char *driverName) { void *handle; char *config = NULL; - const __DRIextension **extensions = driOpenDriver(driverName, &handle); + const __DRIextension **extensions = driOpenDriver(driverName, &handle, false); if (extensions) { for (int i = 0; extensions[i]; i++) { if (strcmp(extensions[i]->name, __DRI_CONFIG_OPTIONS) != 0) diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h index d762308a4fb..1aa6a84e789 100644 --- a/src/glx/dri_common.h +++ b/src/glx/dri_common.h @@ -64,7 +64,8 @@ extern void driReleaseDrawables(struct glx_context *gc); extern const __DRIextension **driOpenDriver(const char *driverName, - void **out_driver_handle); + void **out_driver_handle, + bool driver_name_is_inferred); struct dri_ctx_attribs { unsigned major_ver; diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 0002cc0b3f8..98a69554eec 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -953,7 +953,7 @@ driswCreateScreenDriver(int screen, struct glx_display *priv, return NULL; } - extensions = driOpenDriver(driver, &psc->driver); + extensions = driOpenDriver(driver, &psc->driver, driver_name_is_inferred); if (extensions == NULL) goto handle_error; psc->name = driver; diff --git a/src/loader/loader.c b/src/loader/loader.c index db242b8f8f4..f76a18d9e3c 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -877,13 +877,15 @@ loader_open_driver_lib(const char *driver_name, const struct __DRIextensionRec ** loader_open_driver(const char *driver_name, void **out_driver_handle, - const char **search_path_vars) + const char **search_path_vars, + bool driver_name_is_inferred) { char *get_extensions_name; const struct __DRIextensionRec **extensions = NULL; const struct __DRIextensionRec **(*get_extensions)(void); + void *driver = loader_open_driver_lib(driver_name, "_dri", search_path_vars, - DEFAULT_DRIVER_DIR, true); + DEFAULT_DRIVER_DIR, !driver_name_is_inferred); if (!driver) goto failed; diff --git a/src/loader/loader.h b/src/loader/loader.h index 8cbfb1afc00..eb71dc176c8 100644 --- a/src/loader/loader.h +++ b/src/loader/loader.h @@ -72,7 +72,8 @@ loader_open_driver_lib(const char *driver_name, const struct __DRIextensionRec ** loader_open_driver(const char *driver_name, void **out_driver_handle, - const char **search_path_vars); + const char **search_path_vars, + bool driver_name_is_inferred); char * loader_get_device_name_for_fd(int fd);