i965/blorp: Implement logic for additional buffer formats.
authorPaul Berry <stereotype441@gmail.com>
Wed, 6 Jun 2012 18:05:02 +0000 (11:05 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 7 Jun 2012 18:03:15 +0000 (11:03 -0700)
Previously the blorp engine only supported RGBA8 color buffers and
24-bit depth buffers.  This patch adds support for any color buffer
format that is supported as a render target, and for 16-bit and 32-bit
depth buffers.

This required threading the brw_context struct through into
brw_blorp_surface_info::set() so that it can consult the
brw->render_target_format array.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_blorp.cpp
src/mesa/drivers/dri/i965/brw_blorp.h
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index d6d00e718a8af04eb37c7e66067b86198d8c6626..afb453001d4f0e72cf546a564b9579202c4d175c 100644 (file)
@@ -53,23 +53,52 @@ brw_blorp_mip_info::set(struct intel_mipmap_tree *mt,
 }
 
 void
-brw_blorp_surface_info::set(struct intel_mipmap_tree *mt,
+brw_blorp_surface_info::set(struct brw_context *brw,
+                            struct intel_mipmap_tree *mt,
                             unsigned int level, unsigned int layer)
 {
    brw_blorp_mip_info::set(mt, level, layer);
    this->num_samples = mt->num_samples;
    this->array_spacing_lod0 = mt->array_spacing_lod0;
+   this->map_stencil_as_y_tiled = false;
 
-   if (mt->format == MESA_FORMAT_S8) {
+   switch (mt->format) {
+   case MESA_FORMAT_S8:
       /* The miptree is a W-tiled stencil buffer.  Surface states can't be set
        * up for W tiling, so we'll need to use Y tiling and have the WM
        * program swizzle the coordinates.
        */
       this->map_stencil_as_y_tiled = true;
       this->brw_surfaceformat = BRW_SURFACEFORMAT_R8_UNORM;
-   } else {
-      this->map_stencil_as_y_tiled = false;
+      break;
+   case MESA_FORMAT_X8_Z24:
+   case MESA_FORMAT_Z32_FLOAT:
+      /* The miptree consists of 32 bits per pixel, arranged either as 24-bit
+       * depth values interleaved with 8 "don't care" bits, or as 32-bit
+       * floating point depth values.  Since depth values don't require any
+       * blending, it doesn't matter how we interpret the bit pattern as long
+       * as we copy the right amount of data, so just map it as 8-bit BGRA.
+       */
       this->brw_surfaceformat = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
+      break;
+   case MESA_FORMAT_Z16:
+      /* The miptree consists of 16 bits per pixel of depth data.  Since depth
+       * values don't require any blending, it doesn't matter how we interpret
+       * the bit pattern as long as we copy the right amount of data, so just
+       * map is as 8-bit RG.
+       */
+      this->brw_surfaceformat = BRW_SURFACEFORMAT_R8G8_UNORM;
+      break;
+   default:
+      /* Blorp blits don't support any sort of format conversion, so we can
+       * safely assume that the same format is being used for the source and
+       * destination.  Therefore the format must be supported as a render
+       * target, even if this is the source image.  So we can convert to a
+       * surface format using brw->render_target_format.
+       */
+      assert(brw->format_supported_as_render_target[mt->format]);
+      this->brw_surfaceformat = brw->render_target_format[mt->format];
+      break;
    }
 }
 
index 0de3d1e5d24df91f0ad330eb7e81cbc868d68c59..4c74c91e3a10190b1712098fd8cae9c774f3f5b0 100644 (file)
@@ -66,7 +66,8 @@ class brw_blorp_surface_info : public brw_blorp_mip_info
 public:
    brw_blorp_surface_info();
 
-   void set(struct intel_mipmap_tree *mt,
+void set(struct brw_context *brw,
+         struct intel_mipmap_tree *mt,
             unsigned int level, unsigned int layer);
 
    /* Setting this flag indicates that the buffer's contents are W-tiled
index 93c3f73c1e7ec1a9aec883e4adf48c49fe08a6d7..180468b20a669f6c20f509da6f108bbdb42dd0d0 100644 (file)
@@ -1274,8 +1274,8 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
                                              GLuint dst_x1, GLuint dst_y1,
                                              bool mirror_x, bool mirror_y)
 {
-   src.set(src_mt, 0, 0);
-   dst.set(dst_mt, 0, 0);
+   src.set(brw, src_mt, 0, 0);
+   dst.set(brw, dst_mt, 0, 0);
 
    use_wm_prog = true;
    memset(&wm_prog_key, 0, sizeof(wm_prog_key));