[Mesa-dev] [PATCH 03/15] i965/blorp: Emit sample index in SAMPLE_LD message when necessary

Paul Berry stereotype441 at gmail.com
Fri May 11 11:03:46 PDT 2012


This patch modifies the function brw_blorp_blit_program::texel_fetch()
to emit the SI (sample index) argument to the SAMPLE_LD message when
reading from a sample index other than zero.

Previously we were using the ugly hack of configuring multisampled
source surfaces as single-sampled, and accessing sample indices other
than zero by swizzling the texture coordinates in the WM program.
---
 src/mesa/drivers/dri/i965/brw_blorp.cpp      |    7 +---
 src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   45 ++++++++++++++++---------
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp b/src/mesa/drivers/dri/i965/brw_blorp.cpp
index 8e22511..f6aff44 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp
@@ -57,19 +57,16 @@ brw_blorp_surface_info::set(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;
 
    if (mt->format == 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.  Furthermore, we need to set up the
-       * surface state as single-sampled, because the memory layout of related
-       * samples doesn't match between W and Y tiling.
+       * program swizzle the coordinates.
        */
       this->map_stencil_as_y_tiled = true;
-      this->num_samples = 0;
    } else {
       this->map_stencil_as_y_tiled = false;
-      this->num_samples = mt->num_samples;
    }
 }
 
diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
index d3ab0ba..e985fad 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
@@ -220,6 +220,8 @@ enum sampler_message_arg
    SAMPLER_MESSAGE_ARG_V_FLOAT,
    SAMPLER_MESSAGE_ARG_U_INT,
    SAMPLER_MESSAGE_ARG_V_INT,
+   SAMPLER_MESSAGE_ARG_SI_INT,
+   SAMPLER_MESSAGE_ARG_ZERO_INT,
 };
 
 /**
@@ -435,14 +437,6 @@ brw_blorp_blit_program::compile(struct brw_context *brw,
                                 GLuint *program_size)
 {
    /* Sanity checks */
-   if (key->src_tiled_w) {
-      /* If the source image is W tiled, then tex_samples must be 0.
-       * Otherwise, after conversion between W and Y tiling, there's no
-       * guarantee that the sample index will be 0.
-       */
-      assert(key->tex_samples == 0);
-   }
-
    if (key->dst_tiled_w) {
       /* If the destination image is W tiled, then dst_samples must be 0.
        * Otherwise, after conversion between W and Y tiling, there's no
@@ -920,13 +914,15 @@ brw_blorp_blit_program::sample()
 void
 brw_blorp_blit_program::texel_fetch()
 {
-   static const sampler_message_arg args[2] = {
+   static const sampler_message_arg args[5] = {
       SAMPLER_MESSAGE_ARG_U_INT,
-      SAMPLER_MESSAGE_ARG_V_INT
+      SAMPLER_MESSAGE_ARG_V_INT,
+      SAMPLER_MESSAGE_ARG_ZERO_INT, /* R */
+      SAMPLER_MESSAGE_ARG_ZERO_INT, /* LOD */
+      SAMPLER_MESSAGE_ARG_SI_INT
    };
 
-   assert(s_is_zero);
-   texture_lookup(GEN5_SAMPLER_MESSAGE_SAMPLE_LD, args, ARRAY_SIZE(args));
+   texture_lookup(GEN5_SAMPLER_MESSAGE_SAMPLE_LD, args, s_is_zero ? 2 : 5);
 }
 
 void
@@ -960,6 +956,15 @@ brw_blorp_blit_program::texture_lookup(GLuint msg_type,
       case SAMPLER_MESSAGE_ARG_V_INT:
          expand_to_32_bits(Y, mrf);
          break;
+      case SAMPLER_MESSAGE_ARG_SI_INT:
+         if (s_is_zero)
+            brw_MOV(&func, mrf, brw_imm_ud(0));
+         else
+            expand_to_32_bits(S, mrf);
+         break;
+      case SAMPLER_MESSAGE_ARG_ZERO_INT:
+         brw_MOV(&func, mrf, brw_imm_ud(0));
+         break;
       }
       mrf.nr += 2;
    }
@@ -1060,14 +1065,22 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct intel_mipmap_tree *src_mt,
    use_wm_prog = true;
    memset(&wm_prog_key, 0, sizeof(wm_prog_key));
 
+   if (dst.map_stencil_as_y_tiled) {
+      /* If the destination surface is a W-tiled stencil buffer that we're
+       * mapping as Y tiled, then we need to set up the surface state as
+       * single-sampled, because the memory layout of related samples doesn't
+       * match between W and Y tiling.
+       */
+      dst.num_samples = 0;
+   }
+
    if (src_mt->num_samples > 0 && dst_mt->num_samples > 0) {
       /* We are blitting from a multisample buffer to a multisample buffer, so
        * we must preserve samples within a pixel.  This means we have to
-       * configure the render target and texture surface states as
-       * single-sampled, so that the WM program can access each sample
-       * individually.
+       * configure the render target as single-sampled, so that the WM program
+       * generate each sample separately.
        */
-      src.num_samples = dst.num_samples = 0;
+      dst.num_samples = 0;
    }
 
    /* The render path must be configured to use the same number of samples as
-- 
1.7.7.6



More information about the mesa-dev mailing list