Mesa (master): i965/blorp: Generalize sampling code in preparation for Gen7

Paul Berry stereotype441 at kemper.freedesktop.org
Fri May 25 15:45:31 UTC 2012


Module: Mesa
Branch: master
Commit: 665dc82bdc0e83854dd0f700ec264021bfb5cb39
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=665dc82bdc0e83854dd0f700ec264021bfb5cb39

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Tue May  8 16:28:43 2012 -0700

i965/blorp: Generalize sampling code in preparation for Gen7

This patch generalizes the function
brw_blorp_blit_program::texture_lookup() so that it prepares the
arguments to the sampler message based on a caller-provided array
rather than assuming the argument order is always (u, v).

This paves the way for the messages we will need to use in Gen7, which
use argument orders (u, lod, v) and (si, u, v) (si=sample index).

It will also will allow us to read from arbitrary sample indices on
Gen6, by supplying the arguments (u, v, r, lod, si) to the SAMPLE_LD
message instead of just (u, v).

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   87 ++++++++++++++++++--------
 1 files changed, 61 insertions(+), 26 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
index 9792835..790b472 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
@@ -210,6 +210,18 @@ brw_blorp_framebuffer(struct intel_context *intel,
    return mask;
 }
 
+
+/**
+ * Enum to specify the order of arguments in a sampler message
+ */
+enum sampler_message_arg
+{
+   SAMPLER_MESSAGE_ARG_U_FLOAT,
+   SAMPLER_MESSAGE_ARG_V_FLOAT,
+   SAMPLER_MESSAGE_ARG_U_INT,
+   SAMPLER_MESSAGE_ARG_V_INT,
+};
+
 /**
  * Generator for WM programs used in BLORP blits.
  *
@@ -344,8 +356,9 @@ private:
    void single_to_blend();
    void sample();
    void texel_fetch();
-   void texture_lookup(GLuint msg_type,
-                       struct brw_reg mrf_u, struct brw_reg mrf_v);
+   void expand_to_32_bits(struct brw_reg src, struct brw_reg dst);
+   void texture_lookup(GLuint msg_type, const sampler_message_arg *args,
+                       int num_args);
    void render_target_write();
 
    void *mem_ctx;
@@ -398,12 +411,8 @@ private:
    struct brw_reg t1;
    struct brw_reg t2;
 
-   /* M2-3: u coordinate */
+   /* MRF used for sampling and render target writes */
    GLuint base_mrf;
-   struct brw_reg mrf_u_float;
-
-   /* M4-5: v coordinate */
-   struct brw_reg mrf_v_float;
 };
 
 brw_blorp_blit_program::brw_blorp_blit_program(
@@ -593,8 +602,6 @@ brw_blorp_blit_program::alloc_regs()
 
    int mrf = 2;
    this->base_mrf = mrf;
-   this->mrf_u_float = vec16(brw_message_reg(mrf)); mrf += 2;
-   this->mrf_v_float = vec16(brw_message_reg(mrf)); mrf += 2;
 }
 
 /* In the code that follows, X and Y can be used to quickly refer to the
@@ -898,7 +905,12 @@ brw_blorp_blit_program::single_to_blend()
 void
 brw_blorp_blit_program::sample()
 {
-   texture_lookup(GEN5_SAMPLER_MESSAGE_SAMPLE, mrf_u_float, mrf_v_float);
+   static const sampler_message_arg args[2] = {
+      SAMPLER_MESSAGE_ARG_U_FLOAT,
+      SAMPLER_MESSAGE_ARG_V_FLOAT
+   };
+
+   texture_lookup(GEN5_SAMPLER_MESSAGE_SAMPLE, args, ARRAY_SIZE(args));
 }
 
 /**
@@ -908,37 +920,60 @@ brw_blorp_blit_program::sample()
 void
 brw_blorp_blit_program::texel_fetch()
 {
+   static const sampler_message_arg args[2] = {
+      SAMPLER_MESSAGE_ARG_U_INT,
+      SAMPLER_MESSAGE_ARG_V_INT
+   };
+
    assert(s_is_zero);
-   texture_lookup(GEN5_SAMPLER_MESSAGE_SAMPLE_LD,
-                  retype(mrf_u_float, BRW_REGISTER_TYPE_UD),
-                  retype(mrf_v_float, BRW_REGISTER_TYPE_UD));
+   texture_lookup(GEN5_SAMPLER_MESSAGE_SAMPLE_LD, args, ARRAY_SIZE(args));
 }
 
 void
-brw_blorp_blit_program::texture_lookup(GLuint msg_type,
-                                       struct brw_reg mrf_u,
-                                       struct brw_reg mrf_v)
+brw_blorp_blit_program::expand_to_32_bits(struct brw_reg src,
+                                          struct brw_reg dst)
 {
-   /* Expand X and Y coordinates from 16 bits to 32 bits. */
-   brw_MOV(&func, vec8(mrf_u), vec8(X));
-   brw_set_compression_control(&func, BRW_COMPRESSION_2NDHALF);
-   brw_MOV(&func, offset(vec8(mrf_u), 1), suboffset(vec8(X), 8));
-   brw_set_compression_control(&func, BRW_COMPRESSION_NONE);
-   brw_MOV(&func, vec8(mrf_v), vec8(Y));
+   brw_MOV(&func, vec8(dst), vec8(src));
    brw_set_compression_control(&func, BRW_COMPRESSION_2NDHALF);
-   brw_MOV(&func, offset(vec8(mrf_v), 1), suboffset(vec8(Y), 8));
+   brw_MOV(&func, offset(vec8(dst), 1), suboffset(vec8(src), 8));
    brw_set_compression_control(&func, BRW_COMPRESSION_NONE);
+}
+
+void
+brw_blorp_blit_program::texture_lookup(GLuint msg_type,
+                                       const sampler_message_arg *args,
+                                       int num_args)
+{
+   struct brw_reg mrf =
+      retype(vec16(brw_message_reg(base_mrf)), BRW_REGISTER_TYPE_UD);
+   for (int arg = 0; arg < num_args; ++arg) {
+      switch (args[arg]) {
+      case SAMPLER_MESSAGE_ARG_U_FLOAT:
+         expand_to_32_bits(X, retype(mrf, BRW_REGISTER_TYPE_F));
+         break;
+      case SAMPLER_MESSAGE_ARG_V_FLOAT:
+         expand_to_32_bits(Y, retype(mrf, BRW_REGISTER_TYPE_F));
+         break;
+      case SAMPLER_MESSAGE_ARG_U_INT:
+         expand_to_32_bits(X, mrf);
+         break;
+      case SAMPLER_MESSAGE_ARG_V_INT:
+         expand_to_32_bits(Y, mrf);
+         break;
+      }
+      mrf.nr += 2;
+   }
 
    brw_SAMPLE(&func,
               retype(Rdata, BRW_REGISTER_TYPE_UW) /* dest */,
               base_mrf /* msg_reg_nr */,
-              vec8(mrf_u) /* src0 */,
+              brw_message_reg(base_mrf) /* src0 */,
               BRW_BLORP_TEXTURE_BINDING_TABLE_INDEX,
-              0 /* sampler -- ignored for SAMPLE_LD message */,
+              0 /* sampler */,
               WRITEMASK_XYZW,
               msg_type,
               8 /* response_length.  TODO: should be smaller for non-RGBA formats? */,
-              4 /* msg_length */,
+              mrf.nr - base_mrf /* msg_length */,
               0 /* header_present */,
               BRW_SAMPLER_SIMD_MODE_SIMD16,
               BRW_SAMPLER_RETURN_FORMAT_FLOAT32);




More information about the mesa-commit mailing list