Skip to content

egl/glx: fallback to software when Zink is forced and fails

José Expósito requested to merge jexposit/mesa:issue-10123 into main

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")

Merge request reports