egl/glx: fallback to software when Zink is forced and fails
What does this MR do and why?
When MESA_LOADER_DRIVER_OVERRIDE
is set to zink
and the display
initialization fails, fallback to software rendering.
The error was reported in #10123 (closed) 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 8cd44b88 ("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: #10123 (closed)
Fixes: 8cd44b88 ("egl/glx: add autoloading for zink")