st/dri2: use pipe_screen.is_format_supported to choose depth/stencil format
authorBen Skeggs <bskeggs@redhat.com>
Tue, 17 Mar 2009 22:21:32 +0000 (08:21 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 17 Mar 2009 23:44:40 +0000 (09:44 +1000)
src/gallium/state_trackers/dri2/dri_drawable.c

index aa86411190df401de1d955cb270d286ee7bd195a..2e3f4099e2ab6dfce3e32fb320787e93723d43df 100644 (file)
@@ -233,7 +233,9 @@ dri_create_buffer(__DRIscreenPrivate *sPriv,
                   boolean isPixmap)
 {
    enum pipe_format colorFormat, depthFormat, stencilFormat;
+   struct dri_screen *screen = sPriv->private;
    struct dri_drawable *drawable = NULL;
+   struct pipe_screen *pscreen = screen->pipe_screen;
    int i;
 
    if (isPixmap)
@@ -252,14 +254,26 @@ dri_create_buffer(__DRIscreenPrivate *sPriv,
 
    colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;
 
-   if (visual->depthBits)
-      depthFormat = PIPE_FORMAT_S8Z24_UNORM;
-   else
+   if (visual->depthBits) {
+      if (pscreen->is_format_supported(pscreen, PIPE_FORMAT_Z24S8_UNORM,
+                                       PIPE_TEXTURE_2D,
+                                       PIPE_TEXTURE_USAGE_RENDER_TARGET |
+                                       PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0))
+         depthFormat = PIPE_FORMAT_Z24S8_UNORM;
+      else
+         depthFormat = PIPE_FORMAT_S8Z24_UNORM;
+   } else
       depthFormat = PIPE_FORMAT_NONE;
 
-   if (visual->stencilBits)
-      stencilFormat = PIPE_FORMAT_S8Z24_UNORM;
-   else
+   if (visual->stencilBits) {
+      if (pscreen->is_format_supported(pscreen, PIPE_FORMAT_Z24S8_UNORM,
+                                       PIPE_TEXTURE_2D,
+                                       PIPE_TEXTURE_USAGE_RENDER_TARGET |
+                                       PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0))
+         stencilFormat = PIPE_FORMAT_Z24S8_UNORM;
+      else
+         stencilFormat = PIPE_FORMAT_S8Z24_UNORM;
+   } else
       stencilFormat = PIPE_FORMAT_NONE;
 
    drawable->stfb = st_create_framebuffer(visual,