st/dri: Slight consolidation of DRI2 buffer handling.
authorMichel Dänzer <daenzer@vmware.com>
Wed, 2 Sep 2009 13:41:41 +0000 (15:41 +0200)
committerMichel Dänzer <daenzer@vmware.com>
Wed, 2 Sep 2009 13:41:41 +0000 (15:41 +0200)
Always use / assume a combined depth/stencil buffer.

Also update drawable formats from surfaces returned by the driver.

src/gallium/state_trackers/dri/dri_drawable.c
src/gallium/state_trackers/dri/dri_drawable.h

index bcfd1c06fec78df5ad1eb450fb8f7164eeffe568..5cec9e329d9d4250f7f59acc585e729e396f5999 100644 (file)
@@ -189,12 +189,10 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
         format = drawable->color_format;
         break;
       case __DRI_BUFFER_DEPTH:
-        index = ST_SURFACE_DEPTH;
-        format = drawable->depth_format;
-        break;
+      case __DRI_BUFFER_DEPTH_STENCIL:
       case __DRI_BUFFER_STENCIL:
         index = ST_SURFACE_DEPTH;
-        format = drawable->stencil_format;
+        format = drawable->depth_stencil_format;
         break;
       case __DRI_BUFFER_ACCUM:
       default:
@@ -215,6 +213,18 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
                                        dri_drawable->w,
                                        dri_drawable->h, buffers[i].pitch);
 
+      switch (buffers[i].attachment) {
+      case __DRI_BUFFER_FAKE_FRONT_LEFT:
+      case __DRI_BUFFER_BACK_LEFT:
+        drawable->color_format = surface->format;
+        break;
+      case __DRI_BUFFER_DEPTH:
+      case __DRI_BUFFER_DEPTH_STENCIL:
+      case __DRI_BUFFER_STENCIL:
+        drawable->depth_stencil_format = surface->format;
+        break;
+      }
+
       st_set_framebuffer_surface(drawable->stfb, index, surface);
       pipe_surface_reference(&surface, NULL);
    }
@@ -241,9 +251,7 @@ void dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
    st_get_framebuffer_surface(drawable->stfb, ST_SURFACE_FRONT_LEFT, &ps);
 
    st_bind_texture_surface(ps, target == GL_TEXTURE_2D ? ST_TEXTURE_2D :
-                           ST_TEXTURE_RECT, 0,
-                           format == GLX_TEXTURE_FORMAT_RGBA_EXT ?
-                           PIPE_FORMAT_R8G8B8A8_UNORM : PIPE_FORMAT_R8G8B8X8_UNORM);
+                           ST_TEXTURE_RECT, 0, drawable->color_format);
 }
 
 void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
@@ -311,43 +319,31 @@ dri_create_buffer(__DRIscreenPrivate * sPriv,
    switch(visual->depthBits) {
    default:
    case 0:
-      drawable->depth_format = PIPE_FORMAT_NONE;
+      drawable->depth_stencil_format = PIPE_FORMAT_NONE;
       break;
    case 16:
-      drawable->depth_format = PIPE_FORMAT_Z16_UNORM;
+      drawable->depth_stencil_format = PIPE_FORMAT_Z16_UNORM;
       break;
    case 24:
       if (visual->stencilBits == 0) {
-        drawable->depth_format = (screen->d_depth_bits_last) ?
+        drawable->depth_stencil_format = (screen->d_depth_bits_last) ?
            PIPE_FORMAT_X8Z24_UNORM:
            PIPE_FORMAT_Z24X8_UNORM;
       } else {
-        drawable->depth_format = (screen->sd_depth_bits_last) ?
+        drawable->depth_stencil_format = (screen->sd_depth_bits_last) ?
            PIPE_FORMAT_S8Z24_UNORM:
            PIPE_FORMAT_Z24S8_UNORM;
       }
       break;
    case 32:
-      drawable->depth_format = PIPE_FORMAT_Z32_UNORM;
-      break;
-   }
-
-   switch(visual->stencilBits) {
-   default:
-   case 0:
-      drawable->stencil_format = PIPE_FORMAT_NONE;
-      break;
-   case 8:
-      drawable->stencil_format = (screen->sd_depth_bits_last) ?
-        PIPE_FORMAT_S8Z24_UNORM:
-         PIPE_FORMAT_Z24S8_UNORM;
+      drawable->depth_stencil_format = PIPE_FORMAT_Z32_UNORM;
       break;
    }
 
    drawable->stfb = st_create_framebuffer(visual,
                                          drawable->color_format,
-                                         drawable->depth_format,
-                                         drawable->stencil_format,
+                                         drawable->depth_stencil_format,
+                                         drawable->depth_stencil_format,
                                          dPriv->w,
                                          dPriv->h, (void *)drawable);
    if (drawable->stfb == NULL)
@@ -366,9 +362,11 @@ dri_create_buffer(__DRIscreenPrivate * sPriv,
       drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT;
    else
       drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT;
-   if (visual->depthBits)
+   if (visual->depthBits && visual->stencilBits)
+      drawable->attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
+   else if (visual->depthBits)
       drawable->attachments[i++] = __DRI_BUFFER_DEPTH;
-   if (visual->stencilBits)
+   else if (visual->stencilBits)
       drawable->attachments[i++] = __DRI_BUFFER_STENCIL;
    drawable->num_attachments = i;
 
index 9f9cb29b974556b1875fbe7bf3d6db060abd1fc3..b910930db4235c58f5c4e8bba595071b491040fe 100644 (file)
@@ -63,8 +63,7 @@ struct dri_drawable
    unsigned int cur_fences;
 
    enum pipe_format color_format;
-   enum pipe_format depth_format;
-   enum pipe_format stencil_format;
+   enum pipe_format depth_stencil_format;
 };
 
 static INLINE struct dri_drawable *