From 1cb5c1775b0a647600d3159c287063bccd0cc38c Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 13 Dec 2021 15:07:13 +0100 Subject: [PATCH] glx: fix querying GLX_FBCONFIG_ID for Window This commit fixes apps using the following sequence: 1. XCreateWindow(dpy) -> win 2. glXCreateContextAttribsARB(dpy, ...) -> ctx 3. glXMakeCurrent(dpy, win, ctx) 4. glXQueryDrawable(dpy, win, GLX_FBCONFIG_ID, ...) glXQueryDrawable returned 0 (while correctly returning a valid GLXFCONFIG_ID for other types of drawables). This commit adds the same dance as driInferDrawableConfig to get the GLX visual from the Window, and then the GLXFBCONFIG_ID of this visual. This fixes: * piglit: glx-query-drawable --attr=GLX_FBCONFIG_ID --type=WINDOW * Maya which uses the config ID from step 4 as an input to glXChooseFBConfig. Reviewed-by: Adam Jackson Part-of: --- src/broadcom/ci/v3d-rpi4-fails.txt | 1 - src/broadcom/ci/vc4-rpi3-fails.txt | 1 - src/freedreno/ci/freedreno-a307-fails.txt | 1 - src/freedreno/ci/freedreno-a530-fails.txt | 1 - src/freedreno/ci/freedreno-a630-fails.txt | 1 - src/gallium/drivers/iris/ci/iris-amly-fails.txt | 3 -- .../drivers/llvmpipe/ci/llvmpipe-quick_gl.txt | 1 - .../radeonsi/ci/navi10-piglit-quick-fail.csv | 1 - .../radeonsi/ci/raven-piglit-quick-fail.csv | 1 - .../ci/sienna_cichlid-piglit-quick-fail.csv | 1 - src/gallium/drivers/softpipe/ci/softpipe-quick.txt | 1 - src/gallium/drivers/zink/ci/zink-lvp-fails.txt | 1 - src/gallium/drivers/zink/ci/zink-radv-fails.txt | 1 - src/glx/glx_pbuffer.c | 41 ++++++++++++++++++++++ src/panfrost/ci/panfrost-g52-fails.txt | 1 - 15 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/broadcom/ci/v3d-rpi4-fails.txt b/src/broadcom/ci/v3d-rpi4-fails.txt index 0d1e3cc..7efeb73 100644 --- a/src/broadcom/ci/v3d-rpi4-fails.txt +++ b/src/broadcom/ci/v3d-rpi4-fails.txt @@ -1,7 +1,6 @@ glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail glx@glx-multithread-buffer,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash diff --git a/src/broadcom/ci/vc4-rpi3-fails.txt b/src/broadcom/ci/vc4-rpi3-fails.txt index ec52369..7d397f2 100644 --- a/src/broadcom/ci/vc4-rpi3-fails.txt +++ b/src/broadcom/ci/vc4-rpi3-fails.txt @@ -420,7 +420,6 @@ glx@glx-copy-sub-buffer samples=2,Crash glx@glx-copy-sub-buffer samples=4,Crash glx@glx-make-current,Crash glx@glx-multithread-buffer,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-depth,Crash diff --git a/src/freedreno/ci/freedreno-a307-fails.txt b/src/freedreno/ci/freedreno-a307-fails.txt index 2aaec12..c471767 100644 --- a/src/freedreno/ci/freedreno-a307-fails.txt +++ b/src/freedreno/ci/freedreno-a307-fails.txt @@ -161,7 +161,6 @@ spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth- glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash diff --git a/src/freedreno/ci/freedreno-a530-fails.txt b/src/freedreno/ci/freedreno-a530-fails.txt index 19bead6..314a838 100644 --- a/src/freedreno/ci/freedreno-a530-fails.txt +++ b/src/freedreno/ci/freedreno-a530-fails.txt @@ -133,7 +133,6 @@ KHR-GLES3.packed_pixels.varied_rectangle.rgba32ui,Fail glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash diff --git a/src/freedreno/ci/freedreno-a630-fails.txt b/src/freedreno/ci/freedreno-a630-fails.txt index 6263bf7..ccf7d5a 100644 --- a/src/freedreno/ci/freedreno-a630-fails.txt +++ b/src/freedreno/ci/freedreno-a630-fails.txt @@ -59,7 +59,6 @@ glx@glx_ext_import_context@make current- single process,Fail glx@glx_ext_import_context@query context info,Fail glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash diff --git a/src/gallium/drivers/iris/ci/iris-amly-fails.txt b/src/gallium/drivers/iris/ci/iris-amly-fails.txt index d244936..15e274b 100644 --- a/src/gallium/drivers/iris/ci/iris-amly-fails.txt +++ b/src/gallium/drivers/iris/ci/iris-amly-fails.txt @@ -54,9 +54,6 @@ glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -# error: no fbconfig id returned -glx@glx-query-drawable-glx_fbconfig_id-window,Fail - glx@glx-swap-pixmap-bad,Fail # failed to create drawable diff --git a/src/gallium/drivers/llvmpipe/ci/llvmpipe-quick_gl.txt b/src/gallium/drivers/llvmpipe/ci/llvmpipe-quick_gl.txt index d13603c..ef0a8cf 100644 --- a/src/gallium/drivers/llvmpipe/ci/llvmpipe-quick_gl.txt +++ b/src/gallium/drivers/llvmpipe/ci/llvmpipe-quick_gl.txt @@ -14,7 +14,6 @@ glx/glx-multithread-makecurrent-2: skip glx/glx-multithread-makecurrent-3: skip glx/glx-multithread-makecurrent-4: skip glx/glx-multithread-texture: fail -glx/glx-query-drawable-glx_fbconfig_id-window: fail glx/glx-swap-copy: fail glx/glx-swap-event_async: skip glx/glx-swap-event_event: skip diff --git a/src/gallium/drivers/radeonsi/ci/navi10-piglit-quick-fail.csv b/src/gallium/drivers/radeonsi/ci/navi10-piglit-quick-fail.csv index af005bf..312ee4b 100644 --- a/src/gallium/drivers/radeonsi/ci/navi10-piglit-quick-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/navi10-piglit-quick-fail.csv @@ -1,6 +1,5 @@ glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash glx@glx_arb_create_context_es2_profile@invalid opengl es version,Fail diff --git a/src/gallium/drivers/radeonsi/ci/raven-piglit-quick-fail.csv b/src/gallium/drivers/radeonsi/ci/raven-piglit-quick-fail.csv index 39d0d20..26918ae 100644 --- a/src/gallium/drivers/radeonsi/ci/raven-piglit-quick-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/raven-piglit-quick-fail.csv @@ -1,6 +1,5 @@ glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash glx@glx_arb_create_context_es2_profile@invalid opengl es version,Fail diff --git a/src/gallium/drivers/radeonsi/ci/sienna_cichlid-piglit-quick-fail.csv b/src/gallium/drivers/radeonsi/ci/sienna_cichlid-piglit-quick-fail.csv index 2f92769..a393fbc 100644 --- a/src/gallium/drivers/radeonsi/ci/sienna_cichlid-piglit-quick-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/sienna_cichlid-piglit-quick-fail.csv @@ -1,6 +1,5 @@ glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash glx@glx_arb_create_context_es2_profile@invalid opengl es version,Fail diff --git a/src/gallium/drivers/softpipe/ci/softpipe-quick.txt b/src/gallium/drivers/softpipe/ci/softpipe-quick.txt index 03209b8..6d9d49e 100644 --- a/src/gallium/drivers/softpipe/ci/softpipe-quick.txt +++ b/src/gallium/drivers/softpipe/ci/softpipe-quick.txt @@ -16,7 +16,6 @@ glx/glx-multithread-makecurrent-1: skip glx/glx-multithread-makecurrent-2: skip glx/glx-multithread-makecurrent-3: skip glx/glx-multithread-makecurrent-4: skip -glx/glx-query-drawable-glx_fbconfig_id-window: fail glx/glx-swap-copy: fail glx/glx-swap-event_async: skip glx/glx-swap-event_event: skip diff --git a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt index 14ecc82..8a10a7d 100644 --- a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt @@ -91,7 +91,6 @@ glx@glx-visuals-depth,Crash glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil,Crash glx@glx-visuals-stencil -pixmap,Crash -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx_arb_create_context_es2_profile@invalid opengl es version,Fail glx@glx_arb_create_context_no_error@no error,Fail glx@glx_ext_import_context@free context,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-fails.txt index 43779da..a12f2c7 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-fails.txt @@ -656,7 +656,6 @@ glx@glx_ext_import_context@make current- single process,Fail glx@glx_ext_import_context@query context info,Fail glx@glx-make-current,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-copy,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth,Crash diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c index 7500651..f7d9a63 100644 --- a/src/glx/glx_pbuffer.c +++ b/src/glx/glx_pbuffer.c @@ -38,6 +38,9 @@ #include #include "glxextensions.h" +#include +#include + #ifdef GLX_USE_APPLEGL #include #include "apple/apple_glx_drawable.h" @@ -387,6 +390,44 @@ __glXGetDrawableAttribute(Display * dpy, GLXDrawable drawable, UnlockDisplay(dpy); SyncHandle(); +#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) + if (pdraw && attribute == GLX_FBCONFIG_ID && !found && priv && priv->screens != NULL) { + /* If we failed to lookup the GLX_FBCONFIG_ID, it may be because the drawable is + * a bare Window, so try differently by first figure out its visual, then GLX + * visual like driInferDrawableConfig does. + */ + xcb_get_window_attributes_cookie_t cookie = { 0 }; + xcb_get_window_attributes_reply_t *attr = NULL; + + xcb_connection_t *conn = XGetXCBConnection(dpy); + + if (conn) { + cookie = xcb_get_window_attributes(conn, drawable); + attr = xcb_get_window_attributes_reply(conn, cookie, NULL); + if (attr) { + /* Find the Window's GLX Visual */ + struct glx_config *conf = glx_config_find_visual(pdraw->psc->visuals, attr->visual); + free(attr); + + if (conf && conf->screen >= 0 && conf->screen < ScreenCount(dpy)) { + /* Then find the GLXFBConfig of the GLX Visual */ + struct glx_config *c; + for (c = priv->screens[conf->screen]->configs; c != NULL; + c = c->next) { + if (!c->visualID) + continue; + if (c->visualID == conf->visualID) { + *value = c->fbconfigID; + found = 1; + break; + } + } + } + } + } + } +#endif + return found; } diff --git a/src/panfrost/ci/panfrost-g52-fails.txt b/src/panfrost/ci/panfrost-g52-fails.txt index a8e12d9..cbfbfbe 100644 --- a/src/panfrost/ci/panfrost-g52-fails.txt +++ b/src/panfrost/ci/panfrost-g52-fails.txt @@ -13,7 +13,6 @@ glx@glx_ext_import_context@query context info,Fail glx@glx-make-current,Crash glx@glx-multithread-clearbuffer,Crash glx@glx-multi-window-single-context,Fail -glx@glx-query-drawable-glx_fbconfig_id-window,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth -pixmap,Crash glx@glx-visuals-stencil -pixmap,Crash -- 2.7.4