st/dri: don't expose visuals we'll have trouble supporting
authorZack Rusin <zackr@vmware.com>
Thu, 11 Feb 2010 03:15:24 +0000 (22:15 -0500)
committerZack Rusin <zack@kde.org>
Fri, 12 Feb 2010 21:00:45 +0000 (16:00 -0500)
without getBuffersWithFormat some visuals will just cause headaches (crashes),
so if we're running on an older system simply don't advertise them.

src/gallium/state_trackers/dri/dri_screen.c

index 4064976b2345ecf9af55d34c682cb9cab144052f..b36ea43db5faf9ca35bfe87d1a3e1d8da5a45407 100644 (file)
@@ -97,12 +97,6 @@ dri_fill_in_modes(struct dri_screen *screen,
    stencil_bits_array[0] = 0;
    depth_buffer_factor = 1;
 
-   pf_z16 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z16_UNORM,
-                                         PIPE_TEXTURE_2D,
-                                         PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
-   pf_z32 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z32_UNORM,
-                                         PIPE_TEXTURE_2D,
-                                         PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
    pf_x8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_X8Z24_UNORM,
                                            PIPE_TEXTURE_2D,
                                            PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
@@ -115,9 +109,6 @@ dri_fill_in_modes(struct dri_screen *screen,
    pf_z24s8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24S8_UNORM,
                                            PIPE_TEXTURE_2D,
                                            PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
-   pf_r5g6b5 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_R5G6B5_UNORM,
-                                            PIPE_TEXTURE_2D,
-                                            PIPE_TEXTURE_USAGE_RENDER_TARGET, 0);
    pf_a8r8g8b8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_A8R8G8B8_UNORM,
                                               PIPE_TEXTURE_2D,
                                               PIPE_TEXTURE_USAGE_RENDER_TARGET, 0);
@@ -125,6 +116,26 @@ dri_fill_in_modes(struct dri_screen *screen,
                                               PIPE_TEXTURE_2D,
                                               PIPE_TEXTURE_USAGE_RENDER_TARGET, 0);
 
+   /* we support buffers with different depths only if we can tell the driver
+    * the actual depth of each of them. */
+   if (screen->sPriv->dri2.loader
+       && (screen->sPriv->dri2.loader->base.version > 2)
+       && (screen->sPriv->dri2.loader->getBuffersWithFormat != NULL)) {
+      pf_z16 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z16_UNORM,
+                                             PIPE_TEXTURE_2D,
+                                             PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
+      pf_z32 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z32_UNORM,
+                                             PIPE_TEXTURE_2D,
+                                             PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
+      pf_r5g6b5 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_R5G6B5_UNORM,
+                                                PIPE_TEXTURE_2D,
+                                                PIPE_TEXTURE_USAGE_RENDER_TARGET, 0);
+   } else {
+      pf_z16 = FALSE;
+      pf_z32 = FALSE;
+      pf_r5g6b5 = FALSE;
+   }
+
    if (pf_z16) {
       depth_bits_array[depth_buffer_factor] = 16;
       stencil_bits_array[depth_buffer_factor++] = 0;