From: Kristian Høgsberg Date: Sun, 15 Sep 2013 06:06:36 +0000 (-0700) Subject: egl_dri2: Match X11 visuals using rgba masks instead of depth X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e3d0a0eac7a742de9ef427b86d2ca0051a957bf7;p=mesa.git egl_dri2: Match X11 visuals using rgba masks instead of depth 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 --- 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); + } } }