summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Ma <luc@sietium.com>2024-04-29 22:53:31 +0800
committerMarge Bot <emma+marge@anholt.net>2024-05-10 14:19:59 +0000
commit3825e24085a27d98b1ea050dd4d87f13f4c0b7b1 (patch)
tree5301da30bfa58b0f6b7ff10994b368639399c35e
parentdc7e80ce85578c3596f860da5a46f2e140c6d806 (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.c2
-rw-r--r--src/egl/main/eglapi.c2
-rw-r--r--src/egl/main/egldisplay.h1
-rw-r--r--src/gbm/backends/dri/gbm_dri.c7
-rw-r--r--src/glx/dri2_glx.c2
-rw-r--r--src/glx/dri3_glx.c2
-rw-r--r--src/glx/dri_common.c6
-rw-r--r--src/glx/dri_common.h3
-rw-r--r--src/glx/drisw_glx.c2
-rw-r--r--src/loader/loader.c6
-rw-r--r--src/loader/loader.h3
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);