From aeba69deaa536776452ec8b22a3131f187e82cac Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 12 Aug 2020 13:54:46 -0400 Subject: [PATCH] drisw: Port the MIT-SHM check to XCB MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The old version isn't thread-safe, and xlib makes it unreasonably difficult to write thread-safely. Fixes: mesa/mesa#3398 Reviewed-by: Kristian H. Kristensen Reviewed-by: Michel Dänzer Part-of: --- .gitlab-ci.yml | 2 +- .gitlab-ci/container/x86_test-gl.sh | 1 + meson.build | 2 ++ src/glx/drisw_glx.c | 32 +++++++++++++++-------------- src/glx/meson.build | 2 +- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ed6dabce0ba..22c2ef57cb9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -294,7 +294,7 @@ x86_test-base: x86_test-gl: extends: .use-x86_test-base variables: - FDO_DISTRIBUTION_TAG: &x86_test-gl "2020-07-28-x86-2" + FDO_DISTRIBUTION_TAG: &x86_test-gl "2020-08-14-xcb-shm" # Debian 10 based x86 test image for VK x86_test-vk: diff --git a/.gitlab-ci/container/x86_test-gl.sh b/.gitlab-ci/container/x86_test-gl.sh index d7672d9de87..aaed8ec1459 100644 --- a/.gitlab-ci/container/x86_test-gl.sh +++ b/.gitlab-ci/container/x86_test-gl.sh @@ -33,6 +33,7 @@ STABLE_EPHEMERAL=" \ " apt-get install -y --no-remove \ + libxcb-shm0 \ $STABLE_EPHEMERAL diff --git a/meson.build b/meson.build index db4f8fc551b..2478753f2af 100644 --- a/meson.build +++ b/meson.build @@ -1701,6 +1701,7 @@ dep_xcb_sync = null_dep dep_xcb_xfixes = null_dep dep_xshmfence = null_dep dep_xcb_xrandr = null_dep +dep_xcb_shm = null_dep dep_xlib_xrandr = null_dep if with_platform_x11 if with_glx == 'xlib' or with_glx == 'gallium-xlib' @@ -1713,6 +1714,7 @@ if with_platform_x11 dep_xdamage = dependency('xdamage', version : '>= 1.1') dep_xfixes = dependency('xfixes') dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1') + dep_xcb_shm = dependency('xcb-shm') endif if (with_any_vk or with_glx == 'dri' or with_egl or (with_gallium_vdpau or with_gallium_xvmc or with_gallium_va or diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 07ace2c82b1..b282db8cf83 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -23,7 +23,10 @@ #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) +#include +#include #include +#include #include "glxclient.h" #include #include "dri_common.h" @@ -823,27 +826,26 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions) static int check_xshm(Display *dpy) { - int (*old_handler)(Display *, XErrorEvent *); - + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_void_cookie_t cookie; + xcb_generic_error_t *error; + int ret = True; int ignore; - XShmSegmentInfo info = { 0, }; if (!XQueryExtension(dpy, "MIT-SHM", &xshm_opcode, &ignore, &ignore)) return False; - old_handler = XSetErrorHandler(handle_xerror); - XShmDetach(dpy, &info); - XSync(dpy, False); - (void) XSetErrorHandler(old_handler); - - /* BadRequest means we're a remote client. If we were local we'd - * expect BadValue since 'info' has an invalid segment name. - */ - if (xshm_error == BadRequest) - return False; + cookie = xcb_shm_detach_checked(c, 0); + if ((error = xcb_request_check(c, cookie))) { + /* BadRequest means we're a remote client. If we were local we'd + * expect BadValue since 'info' has an invalid segment name. + */ + if (error->error_code == BadRequest) + ret = False; + free(error); + } - xshm_error = 0; - return True; + return ret; } static struct glx_screen * diff --git a/src/glx/meson.build b/src/glx/meson.build index bceed2f5fc7..d602bc14306 100644 --- a/src/glx/meson.build +++ b/src/glx/meson.build @@ -159,7 +159,7 @@ libgl = shared_library( dependencies : [ dep_libdrm, dep_dl, dep_m, dep_thread, dep_x11, dep_xcb_glx, dep_xcb, dep_x11_xcb, dep_xcb_dri2, dep_xext, dep_xfixes, dep_xdamage, dep_xxf86vm, - extra_deps_libgl, + dep_xcb_shm, extra_deps_libgl, ], version : gl_lib_version, install : true, -- 2.30.2