[Mesa-dev] [PATCH 7/7] i965/blorp: Use IMS layout when texturing from depth/stencil surfaces.

Paul Berry stereotype441 at gmail.com
Thu Jul 12 10:43:45 PDT 2012


Previously, on Gen7, when texturing from a depth or stencil surface,
the blorp engine would configure the 3D pipeline as though the input
surface was non-multisampled, and perform the necessary coordinate
transformations in the fragment shader to account for the IMS layout.
This meant outputting a lot of extra fragment shader code, and it
raised some uncertainty about how to deal with very large surfaces.

This patch modifies blorp to configure the 3D pipeline properly for
IMS layout when reading from depth and stencil surfaces.
---
 src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   66 +++++++++++++++++---------
 1 files changed, 43 insertions(+), 23 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
index c5e0ef9..f72145f 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
@@ -1246,18 +1246,31 @@ brw_blorp_blit_program::texel_fetch(struct brw_reg dst)
                      s_is_zero ? 2 : 5);
       break;
    case 7:
-      if (key->tex_samples > 0) {
-         if (key->tex_layout == INTEL_MSAA_LAYOUT_CMS) {
-            texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS,
-                           gen7_ld2dms_args, ARRAY_SIZE(gen7_ld2dms_args));
-         } else {
-            texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS,
-                           gen7_ld2dss_args, ARRAY_SIZE(gen7_ld2dss_args));
-         }
-      } else {
+      switch (key->tex_layout) {
+      case INTEL_MSAA_LAYOUT_IMS:
+         /* From the Ivy Bridge PRM, Vol4 Part1 p72 (Multisampled Surface Storage
+          * Format):
+          *
+          *     If this field is MSFMT_DEPTH_STENCIL
+          *     [a.k.a. INTEL_MSAA_LAYOUT_IMS], the only sampling engine
+          *     messages allowed are "ld2dms", "resinfo", and "sampleinfo".
+          *
+          * So fall through to emit the same message as we use for
+          * INTEL_MSAA_LAYOUT_CMS.
+          */
+      case INTEL_MSAA_LAYOUT_CMS:
+         texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS,
+                        gen7_ld2dms_args, ARRAY_SIZE(gen7_ld2dms_args));
+         break;
+      case INTEL_MSAA_LAYOUT_UMS:
+         texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS,
+                        gen7_ld2dss_args, ARRAY_SIZE(gen7_ld2dss_args));
+         break;
+      case INTEL_MSAA_LAYOUT_NONE:
          assert(s_is_zero);
          texture_lookup(dst, GEN5_SAMPLER_MESSAGE_SAMPLE_LD, gen7_ld_args,
                         ARRAY_SIZE(gen7_ld_args));
+         break;
       }
       break;
    default:
@@ -1321,7 +1334,22 @@ brw_blorp_blit_program::texture_lookup(struct brw_reg dst,
             expand_to_32_bits(S, mrf);
          break;
       case SAMPLER_MESSAGE_ARG_MCS_INT:
-         brw_MOV(&func, mrf, mcs_data);
+         switch (key->tex_layout) {
+         case INTEL_MSAA_LAYOUT_CMS:
+            brw_MOV(&func, mrf, mcs_data);
+            break;
+         case INTEL_MSAA_LAYOUT_IMS:
+            /* When sampling from an IMS surface, MCS data is not relevant,
+             * and the hardware ignores it.  So don't bother populating it.
+             */
+            break;
+         default:
+            /* We shouldn't be trying to send MCS data with any other
+             * layouts.
+             */
+            assert (!"Unsupported layout for MCS data");
+            break;
+         }
          break;
       case SAMPLER_MESSAGE_ARG_ZERO_INT:
          brw_MOV(&func, mrf, brw_imm_ud(0));
@@ -1485,19 +1513,11 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
    }
 
    if (brw->intel.gen > 6) {
-      /* Gen7's texturing hardware only supports the IMS layout with the
-       * ld2dms instruction (which blorp doesn't use).  So if the source is
-       * IMS, we'll have to map it as a single-sampled texture and
-       * de-interleave the samples ourselves.
-       */
-      if (src_mt->msaa_layout == INTEL_MSAA_LAYOUT_IMS)
-         src.num_samples = 0;
-
-      /* Similarly, Gen7's rendering hardware only supports the IMS layout for
-       * depth and stencil render targets.  Blorp always maps its destination
-       * surface as a color render target (even if it's actually a depth or
-       * stencil buffer).  So if the destination is IMS, we'll have to map it
-       * as a single-sampled texture and interleave the samples ourselves.
+      /* Gen7's rendering hardware only supports the IMS layout for depth and
+       * stencil render targets.  Blorp always maps its destination surface as
+       * a color render target (even if it's actually a depth or stencil
+       * buffer).  So if the destination is IMS, we'll have to map it as a
+       * single-sampled texture and interleave the samples ourselves.
        */
       if (dst_mt->msaa_layout == INTEL_MSAA_LAYOUT_IMS)
          dst.num_samples = 0;
-- 
1.7.7.6



More information about the mesa-dev mailing list