diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 23bce2fd550..2d19f1f6401 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -786,7 +786,7 @@ static const struct glx_screen_vtable dri3_screen_vtable = { */ struct glx_screen * -dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_inferred) +dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_inferred, bool *return_zink) { xcb_connection_t *c = XGetXCBConnection(priv->dpy); const __DRIconfig **driver_configs; @@ -795,7 +795,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in __GLXDRIscreen *psp; struct glx_config *configs = NULL, *visuals = NULL; char *driverName, *driverNameDisplayGPU, *tmp; - bool return_zink = false; + *return_zink = false; psc = calloc(1, sizeof *psc); if (psc == NULL) @@ -832,7 +832,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in } if (!strcmp(driverName, "zink") && !debug_get_bool_option("LIBGL_KOPPER_DISABLE", false)) { - return_zink = true; + *return_zink = true; goto handle_error; } @@ -1012,7 +1012,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in return &psc->base; handle_error: - if (!return_zink) + if (!*return_zink) CriticalErrorMessageF("failed to load driver: %s\n", driverName ? driverName : "(null)"); if (configs) @@ -1034,7 +1034,7 @@ handle_error: glx_screen_cleanup(&psc->base); free(psc); - return return_zink ? GLX_LOADER_USE_ZINK : NULL; + return NULL; } #endif /* GLX_DIRECT_RENDERING */ diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 1c237aa202a..63e18ab844c 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -78,8 +78,6 @@ typedef struct __GLXDRIdisplay __GLXDRIdisplay; typedef struct __GLXDRIscreenRec __GLXDRIscreen; typedef struct __GLXDRIdrawableRec __GLXDRIdrawable; -#define GLX_LOADER_USE_ZINK ((struct glx_screen *)(uintptr_t)-1) - struct __GLXDRIscreenRec { void (*destroyScreen)(struct glx_screen *psc); @@ -146,7 +144,7 @@ extern __GLXDRIdisplay *driwindowsCreateDisplay(Display * dpy); #if defined(GLX_DIRECT_RENDERING) && (!defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE)) #ifdef HAVE_DRI3 -struct glx_screen *dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_inferred); +struct glx_screen *dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_inferred, bool *return_zink); void dri3_destroy_display(__GLXDRIdisplay * dpy); #endif diff --git a/src/glx/glxext.c b/src/glx/glxext.c index 328ce528ce9..039857110ed 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -769,7 +769,13 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv, enum glx_dr #if defined(GLX_USE_DRM) #if defined(HAVE_DRI3) if (glx_driver & GLX_DRIVER_DRI3) { - psc = dri3_create_screen(i, priv, driver_name_is_inferred); + bool use_zink; + psc = dri3_create_screen(i, priv, driver_name_is_inferred, &use_zink); + if (use_zink) { + glx_driver |= GLX_DRIVER_ZINK_YES; + zink = true; + driver_name_is_inferred = false; + } } #endif /* HAVE_DRI3 */ #if defined(HAVE_X11_DRI2) @@ -789,9 +795,9 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv, enum glx_dr #endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */ #if defined(GLX_DIRECT_RENDERING) && (!defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE)) - if ((psc == GLX_LOADER_USE_ZINK || psc == NULL) && + if (psc == NULL && (glx_driver & GLX_DRIVER_SW || zink)) { - psc = driswCreateScreen(i, priv, glx_driver, psc == GLX_LOADER_USE_ZINK ? false : driver_name_is_inferred); + psc = driswCreateScreen(i, priv, glx_driver, driver_name_is_inferred); } #endif