egl/glx: fallback to software when Zink is forced and fails
When `MESA_LOADER_DRIVER_OVERRIDE` is set to `zink` and the display initialization fails, fallback to software rendering. The error was reported in #10123 and it can be reproduced with: $ MESA_LOADER_DRIVER_OVERRIDE=zink eglinfo `eglinfo` would crash in `dri2_display_release()` because of `assert(dri2_dpy->ref_count > 0)`. After bisecting the error to commit8cd44b8843
("egl/glx: add autoloading for zink"), I found out that, before this change, the display was set to initialized even when `_eglDriver.Initialize(disp)` failed: disp->Options.Zink = env && !strcmp(env, "zink"); // disp->Options.Zink is true if (!_eglDriver.Initialize(disp)) { [...] // Zink initialization has failed at this point // However, success is set to true: bool success = disp->Options.Zink; if (!disp->Options.Zink && !getenv("GALLIUM_DRIVER")) { [...] } // Software initialization is ignored because success is true if (!success) { [...] } } // The display is set as initialized even though it shouldn't disp->Initialized = EGL_TRUE; Resolves: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10123 Fixes:8cd44b8843
("egl/glx: add autoloading for zink") Signed-off-by: José Expósito <jexposit@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26184> (cherry picked from commitd913927fe9
)
This commit is contained in:

committed by
Eric Engestrom

parent
684d11421c
commit
ab4a2e97a9
@@ -234,7 +234,7 @@
|
||||
"description": "egl/glx: fallback to software when Zink is forced and fails",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "8cd44b8843877a2f7d559d123eb3694841f16fdc",
|
||||
"notes": null
|
||||
|
@@ -695,7 +695,7 @@ eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
|
||||
if (disp->Options.ForceSoftware)
|
||||
RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
|
||||
else {
|
||||
bool success = disp->Options.Zink;
|
||||
bool success = false;
|
||||
if (!disp->Options.Zink && !getenv("GALLIUM_DRIVER")) {
|
||||
disp->Options.Zink = EGL_TRUE;
|
||||
success = _eglDriver.Initialize(disp);
|
||||
|
Reference in New Issue
Block a user