From e3d0a0eac7a742de9ef427b86d2ca0051a957bf7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Sat, 14 Sep 2013 23:06:36 -0700 Subject: [PATCH] egl_dri2: Match X11 visuals using rgba masks instead of depth MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Matching on visual depth to buffer size makes 8 bpc RGBA look similar to 10 bit RGB with 2 bit alphs - both have buffer size 32. Instead, build the rgba masks from the visual data and use that for finding matching DRI configs. We need to keep the special case that allows us to match 24 bit visuals to DRI configs with buffer size 32. We do that by creating an alpha mask of "all the non-rgb bits" for 24 bit visuals and matching a second time with that. Signed-off-by: Kristian Høgsberg --- src/egl/drivers/dri2/platform_x11.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index ec76aecfdd7..d1ceb6238ef 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -630,6 +630,7 @@ dri2_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, xcb_depth_iterator_t d; xcb_visualtype_t *visuals; int i, j, id; + unsigned int rgba_masks[4]; EGLint surface_type; EGLint config_attrs[] = { EGL_NATIVE_VISUAL_ID, 0, @@ -660,8 +661,26 @@ dri2_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, config_attrs[1] = visuals[i].visual_id; config_attrs[3] = visuals[i]._class; + rgba_masks[0] = visuals[i].red_mask; + rgba_masks[1] = visuals[i].green_mask; + rgba_masks[2] = visuals[i].blue_mask; + rgba_masks[3] = 0; dri2_add_config(disp, dri2_dpy->driver_configs[j], id++, - d.data->depth, surface_type, config_attrs, NULL); + 0, surface_type, config_attrs, rgba_masks); + + /* Allow a 24-bit RGB visual to match a 32-bit RGBA EGLConfig. + * Otherwise it will only match a 32-bit RGBA visual. On a + * composited window manager on X11, this will make all of the + * EGLConfigs with destination alpha get blended by the + * compositor. This is probably not what the application + * wants... especially on drivers that only have 32-bit RGBA + * EGLConfigs! */ + if (d.data->depth == 24) { + rgba_masks[3] = + ~(rgba_masks[0] | rgba_masks[1] | rgba_masks[2]); + dri2_add_config(disp, dri2_dpy->driver_configs[j], id++, + 0, surface_type, config_attrs, rgba_masks); + } } } -- 2.30.2