From 99d5727d2d84c94f94c2e1c79807de781341929a Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Sat, 8 Aug 2020 19:21:58 +0200 Subject: [PATCH] egl/x11_dri3: enable & require xfixes 2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: 20.2 Signed-off-by: Eric Engestrom Acked-by: Michel Dänzer Part-of: (cherry picked from commit eae181e3eb9cabd98a78e8440c81cd08e8a26778) --- .pick_status.json | 2 +- meson.build | 2 +- src/egl/drivers/dri2/platform_x11_dri3.c | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index c3b9eb83c1b..cae33079c00 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1228,7 +1228,7 @@ "description": "egl/x11_dri3: enable & require xfixes 2.0", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/meson.build b/meson.build index 4d8d4aaae55..e8b641c6b1d 100644 --- a/meson.build +++ b/meson.build @@ -1707,7 +1707,7 @@ if with_platform_x11 dep_x11 = dependency('x11') dep_xext = dependency('xext') dep_xdamage = dependency('xdamage', version : '>= 1.1') - dep_xfixes = dependency('xfixes') + dep_xfixes = dependency('xfixes', version : '>= 2.0') dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1') endif if (with_any_vk or with_glx == 'dri' or with_egl or diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c index e1bacd804a7..21f9c108060 100644 --- a/src/egl/drivers/dri2/platform_x11_dri3.c +++ b/src/egl/drivers/dri2/platform_x11_dri3.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "util/macros.h" @@ -525,11 +526,14 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy) xcb_dri3_query_version_cookie_t dri3_query_cookie; xcb_present_query_version_reply_t *present_query; xcb_present_query_version_cookie_t present_query_cookie; + xcb_xfixes_query_version_reply_t *xfixes_query; + xcb_xfixes_query_version_cookie_t xfixes_query_cookie; xcb_generic_error_t *error; const xcb_query_extension_reply_t *extension; xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri3_id); xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_present_id); + xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_xfixes_id); extension = xcb_get_extension_data(dri2_dpy->conn, &xcb_dri3_id); if (!(extension && extension->present)) @@ -539,6 +543,10 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy) if (!(extension && extension->present)) return EGL_FALSE; + extension = xcb_get_extension_data(dri2_dpy->conn, &xcb_xfixes_id); + if (!(extension && extension->present)) + return EGL_FALSE; + dri3_query_cookie = xcb_dri3_query_version(dri2_dpy->conn, DRI3_SUPPORTED_MAJOR, DRI3_SUPPORTED_MINOR); @@ -547,6 +555,10 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy) PRESENT_SUPPORTED_MAJOR, PRESENT_SUPPORTED_MINOR); + xfixes_query_cookie = xcb_xfixes_query_version(dri2_dpy->conn, + XCB_XFIXES_MAJOR_VERSION, + XCB_XFIXES_MINOR_VERSION); + dri3_query = xcb_dri3_query_version_reply(dri2_dpy->conn, dri3_query_cookie, &error); if (dri3_query == NULL || error != NULL) { @@ -574,6 +586,18 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy) dri2_dpy->present_minor_version = present_query->minor_version; free(present_query); + xfixes_query = + xcb_xfixes_query_version_reply(dri2_dpy->conn, + xfixes_query_cookie, &error); + if (xfixes_query == NULL || error != NULL || + xfixes_query->major_version < 2) { + _eglLog(_EGL_WARNING, "DRI3: failed to query xfixes version"); + free(error); + free(xfixes_query); + return EGL_FALSE; + } + free(xfixes_query); + dri2_dpy->fd = loader_dri3_open(dri2_dpy->conn, dri2_dpy->screen->root, 0); if (dri2_dpy->fd < 0) { int conn_error = xcb_connection_has_error(dri2_dpy->conn);