diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 90b395734f1..fdfa31e477c 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -273,6 +273,7 @@ struct dri2_egl_display { bool has_dmabuf_import; bool has_dmabuf_export; + bool explicit_modifiers; bool multibuffers_available; #ifdef HAVE_X11_PLATFORM xcb_connection_t *conn; diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index a2a804ca7fa..c3ca16eae99 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -1783,7 +1783,7 @@ dri2_x11_check_multibuffers(_EGLDisplay *disp) #ifdef HAVE_DRI3_MODIFIERS bool err; - dri2_dpy->multibuffers_available = x11_dri3_check_multibuffer(dri2_dpy->conn, &err); + dri2_dpy->multibuffers_available = x11_dri3_check_multibuffer(dri2_dpy->conn, &err, &dri2_dpy->explicit_modifiers); if (disp->Options.Zink && !disp->Options.ForceSoftware && !dri2_dpy->multibuffers_available && diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 92d88fee6df..dbb8ff54288 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -598,6 +598,7 @@ struct glx_display __glxHashTable *dri2Hash; bool has_multibuffer; + bool has_explicit_modifiers; #endif #ifdef GLX_USE_WINDOWSGL __GLXDRIdisplay *windowsdriDisplay; diff --git a/src/glx/glxext.c b/src/glx/glxext.c index 52d17ecd727..cd7a25ba5b1 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -978,7 +978,7 @@ __glXInitialize(Display * dpy) #if defined(GLX_USE_DRM) bool dri3_err = false; if (glx_direct && glx_accel && dri3) - dpyPriv->has_multibuffer = x11_dri3_check_multibuffer(XGetXCBConnection(dpy), &dri3_err); + dpyPriv->has_multibuffer = x11_dri3_check_multibuffer(XGetXCBConnection(dpy), &dri3_err, &dpyPriv->has_explicit_modifiers); if (glx_direct && glx_accel && (!(glx_driver & GLX_DRIVER_ZINK_YES) || !kopper)) { #if defined(HAVE_DRI3) @@ -1006,7 +1006,7 @@ __glXInitialize(Display * dpy) if (glx_direct) glx_driver |= GLX_DRIVER_SW; - if (!dpyPriv->has_multibuffer && glx_accel && !debug_get_bool_option("LIBGL_KOPPER_DRI2", false)) { + if (!dpyPriv->has_explicit_modifiers && glx_accel && !debug_get_bool_option("LIBGL_KOPPER_DRI2", false)) { if (glx_driver & GLX_DRIVER_ZINK_YES) { /* only print error if zink was explicitly requested */ CriticalErrorMessageF("DRI3 not available\n"); diff --git a/src/x11/loader_x11.c b/src/x11/loader_x11.c index a417af86507..338c705cda6 100644 --- a/src/x11/loader_x11.c +++ b/src/x11/loader_x11.c @@ -93,7 +93,7 @@ x11_dri3_open(xcb_connection_t *conn, #endif bool -x11_dri3_check_multibuffer(xcb_connection_t *c, bool *err) +x11_dri3_check_multibuffer(xcb_connection_t *c, bool *err, bool *explicit_modifiers) { xcb_dri3_query_version_cookie_t dri3_cookie; xcb_dri3_query_version_reply_t *dri3_reply; @@ -140,9 +140,11 @@ x11_dri3_check_multibuffer(xcb_connection_t *c, bool *err) free(present_reply); #ifdef HAVE_DRI3_MODIFIERS - if ((dri3Major > 1 || (dri3Major == 1 && dri3Minor >= 2)) && - (presentMajor > 1 || (presentMajor == 1 && presentMinor >= 2))) - return true; + if (presentMajor > 1 || (presentMajor == 1 && presentMinor >= 2)) { + *explicit_modifiers = dri3Major > 1 || (dri3Major == 1 && dri3Minor >= 2); + if (dri3Major >= 1) + return true; + } #endif return false; error: diff --git a/src/x11/loader_x11.h b/src/x11/loader_x11.h index 27edd478148..5aa6262aa1d 100644 --- a/src/x11/loader_x11.h +++ b/src/x11/loader_x11.h @@ -27,6 +27,6 @@ #include #include int x11_dri3_open(xcb_connection_t *conn, xcb_window_t root, uint32_t provider); -bool x11_dri3_check_multibuffer(xcb_connection_t *c, bool *err); +bool x11_dri3_check_multibuffer(xcb_connection_t *c, bool *err, bool *explicit_modifiers); #endif