GLX/DRI1: Mark GLX visuals with depth != screen depth non-conformant.
authorMichel Dänzer <daenzer@vmware.com>
Tue, 7 Jul 2009 11:52:35 +0000 (13:52 +0200)
committerMichel Dänzer <michel@daenzer.net>
Tue, 7 Jul 2009 11:59:59 +0000 (13:59 +0200)
Such visuals are subject to automatic compositing in the X server, so DRI1
can't render to them properly.

src/glx/x11/dri_glx.c

index 3ce410d9be3671a9c69ee7fcc74ecbddbc0d9e75..ac2eb05341afff07599c46173277e3e0b72133d9 100644 (file)
@@ -305,6 +305,7 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
     drm_handle_t  hFB;
     int        junk;
     const __DRIconfig **driver_configs;
+    __GLcontextModes *visual;
 
     /* DRI protocol version. */
     dri_version.major = driDpy->driMajor;
@@ -417,6 +418,28 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
     psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
     psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
 
+    /* Visuals with depth != screen depth are subject to automatic compositing
+     * in the X server, so DRI1 can't render to them properly. Mark them as
+     * non-conformant to prevent apps from picking them up accidentally.
+     */
+    for (visual = psc->visuals; visual; visual = visual->next) {
+       XVisualInfo template;
+       XVisualInfo *visuals;
+       int num_visuals;
+       long mask;
+
+       template.visualid = visual->visualID;
+       mask = VisualIDMask;
+       visuals = XGetVisualInfo(dpy, mask, &template, &num_visuals);
+
+       if (visuals) {
+           if (num_visuals > 0 && visuals->depth != DefaultDepth(dpy, scrn))
+               visual->visualRating = GLX_NON_CONFORMANT_CONFIG;
+
+           XFree(visuals);
+       }
+    }
+
     return psp;
 
  handle_error: