From ab4a2e97a9ae8340f755193f8d0b4f8cfa929b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Date: Tue, 14 Nov 2023 09:23:23 +0100 Subject: [PATCH] egl/glx: fallback to software when Zink is forced and fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 commit 8cd44b884387 ("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: 8cd44b884387 ("egl/glx: add autoloading for zink") Signed-off-by: José Expósito Part-of: (cherry picked from commit d913927fe9201f0fea71ef0e614b9c400c122d49) --- .pick_status.json | 2 +- src/egl/main/eglapi.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 2056adad921..446acdb8812 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index b9f179c2ce3..d50be23e871 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -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);