diff options
author | Luc Ma <luc@sietium.com> | 2024-04-29 22:53:31 +0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-05-10 14:19:59 +0000 |
commit | 3825e24085a27d98b1ea050dd4d87f13f4c0b7b1 (patch) | |
tree | 5301da30bfa58b0f6b7ff10994b368639399c35e | |
parent | dc7e80ce85578c3596f860da5a46f2e140c6d806 (diff) |
loader: silence implicit-load zink error by the loader
Since commit 7d9ea77b4598 ("glx: add automatic zink fallback loading between hw
and sw drivers"), zink could be tried as a fallback. It'd better silence
if the zink loading is implicit and on fail as what commit 4cc975c6e912 ("glx: silence
more implicit-load zink errors") has done. But there seems to be one
left bebind, which is spit when building swrast but no zink with -Dglx=dri.
v2: plumb the flag through from egl/glx to the loader (zmike)
Signed-off-by: Luc Ma <luc@sietium.com>
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28970>
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 2 | ||||
-rw-r--r-- | src/egl/main/eglapi.c | 2 | ||||
-rw-r--r-- | src/egl/main/egldisplay.h | 1 | ||||
-rw-r--r-- | src/gbm/backends/dri/gbm_dri.c | 7 | ||||
-rw-r--r-- | src/glx/dri2_glx.c | 2 | ||||
-rw-r--r-- | src/glx/dri3_glx.c | 2 | ||||
-rw-r--r-- | src/glx/dri_common.c | 6 | ||||
-rw-r--r-- | src/glx/dri_common.h | 3 | ||||
-rw-r--r-- | src/glx/drisw_glx.c | 2 | ||||
-rw-r--r-- | src/loader/loader.c | 6 | ||||
-rw-r--r-- | src/loader/loader.h | 3 |
11 files changed, 22 insertions, 14 deletions
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); |