[Mesa-dev] [PATCH v2 06/13] i965/fs: don't use ir->coordinate in emit_texture_*

Connor Abbott cwabbott0 at gmail.com
Mon Aug 4 15:20:42 PDT 2014


Signed-off-by: Connor Abbott <connor.abbott at intel.com>
---
 src/mesa/drivers/dri/i965/brw_fs.h           | 15 ++++---
 src/mesa/drivers/dri/i965/brw_fs_fp.cpp      |  9 ++--
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 67 +++++++++++++++-------------
 3 files changed, 49 insertions(+), 42 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index 21b7f23..3f45f35 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -373,14 +373,17 @@ public:
    fs_reg rescale_texcoord(fs_reg coordinate, const glsl_type *coord_type,
                            bool is_rect, int sampler, int texunit);
    fs_inst *emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
-                              fs_reg shadow_comp, fs_reg lod, fs_reg lod2);
+                              int coord_components, fs_reg shadow_comp,
+                              fs_reg lod, fs_reg lod2);
    fs_inst *emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
-                              fs_reg shadow_comp, fs_reg lod, fs_reg lod2,
-                              fs_reg sample_index, bool has_offset);
+                              int coord_components, fs_reg shadow_comp,
+                              fs_reg lod, fs_reg lod2, fs_reg sample_index,
+                              bool has_offset);
    fs_inst *emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
-                              fs_reg shadow_comp, fs_reg lod, fs_reg lod2,
-                              fs_reg sample_index, bool has_offset,
-                              fs_reg offset, fs_reg mcs, int sampler);
+                              int coord_components, fs_reg shadow_comp,
+                              fs_reg lod, fs_reg lod2, fs_reg sample_index,
+                              bool has_offset, fs_reg offset, fs_reg mcs,
+                              int sampler);
    fs_reg emit_mcs_fetch(fs_reg coordinate, int components, int sampler);
    void emit_gen6_gather_wa(uint8_t wa, fs_reg dst);
    fs_reg fix_math_operand(fs_reg src);
diff --git a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp
index a8f0133..c9215f4 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp
@@ -478,8 +478,7 @@ fs_visitor::emit_fragment_program_code()
             unreachable("not reached");
          }
 
-         ir_constant_data junk_data;
-         ir->coordinate = new(mem_ctx) ir_constant(coordinate_type, &junk_data);
+         int coord_components = coordinate_type->vector_elements;
 
          if (fpi->TexShadow)
             shadow_c = offset(coordinate, 2);
@@ -490,11 +489,11 @@ fs_visitor::emit_fragment_program_code()
 
          fs_inst *inst;
          if (brw->gen >= 7) {
-            inst = emit_texture_gen7(ir, dst, coordinate, shadow_c, lod, dpdy, sample_index, false, offset_reg, fs_reg(0u), fpi->TexSrcUnit);
+            inst = emit_texture_gen7(ir, dst, coordinate, coord_components, shadow_c, lod, dpdy, sample_index, false, offset_reg, fs_reg(0u), fpi->TexSrcUnit);
          } else if (brw->gen >= 5) {
-            inst = emit_texture_gen5(ir, dst, coordinate, shadow_c, lod, dpdy, sample_index, false);
+            inst = emit_texture_gen5(ir, dst, coordinate, coord_components, shadow_c, lod, dpdy, sample_index, false);
          } else {
-            inst = emit_texture_gen4(ir, dst, coordinate, shadow_c, lod, dpdy);
+            inst = emit_texture_gen4(ir, dst, coordinate, coord_components, shadow_c, lod, dpdy);
          }
 
          inst->sampler = fpi->TexSrcUnit;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 876847d..107d0eb 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -1095,7 +1095,8 @@ fs_visitor::visit(ir_assignment *ir)
 
 fs_inst *
 fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
-                              fs_reg shadow_c, fs_reg lod, fs_reg dPdy)
+                              int coord_components, fs_reg shadow_c,
+                              fs_reg lod, fs_reg dPdy)
 {
    int mlen;
    int base_mrf = 1;
@@ -1106,7 +1107,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
    mlen = 1;
 
    if (shadow_c.file != BAD_FILE) {
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i), coordinate));
          coordinate.reg_offset++;
       }
@@ -1114,7 +1115,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       /* gen4's SIMD8 sampler always has the slots for u,v,r present.
        * the unused slots must be zeroed.
        */
-      for (int i = ir->coordinate->type->vector_elements; i < 3; i++) {
+      for (int i = coord_components; i < 3; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i), fs_reg(0.0f)));
       }
       mlen += 3;
@@ -1135,12 +1136,12 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       emit(MOV(fs_reg(MRF, base_mrf + mlen), shadow_c));
       mlen++;
    } else if (ir->op == ir_tex) {
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i), coordinate));
          coordinate.reg_offset++;
       }
       /* zero the others. */
-      for (int i = ir->coordinate->type->vector_elements; i<3; i++) {
+      for (int i = coord_components; i<3; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i), fs_reg(0.0f)));
       }
       /* gen4's SIMD8 sampler always has the slots for u,v,r present. */
@@ -1148,12 +1149,12 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
    } else if (ir->op == ir_txd) {
       fs_reg &dPdx = lod;
 
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i), coordinate));
          coordinate.reg_offset++;
       }
       /* the slots for u and v are always present, but r is optional */
-      mlen += MAX2(ir->coordinate->type->vector_elements, 2);
+      mlen += MAX2(coord_components, 2);
 
       /*  P   = u, v, r
        * dPdx = dudx, dvdx, drdx
@@ -1192,7 +1193,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       simd16 = true;
       assert(ir->op == ir_txb || ir->op == ir_txl || ir->op == ir_txf);
 
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i * 2, coordinate.type),
                   coordinate));
          coordinate.reg_offset++;
@@ -1201,7 +1202,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       /* Initialize the rest of u/v/r with 0.0.  Empirically, this seems to
        * be necessary for TXF (ld), but seems wise to do for all messages.
        */
-      for (int i = ir->coordinate->type->vector_elements; i < 3; i++) {
+      for (int i = coord_components; i < 3; i++) {
          emit(MOV(fs_reg(MRF, base_mrf + mlen + i * 2), fs_reg(0.0f)));
       }
 
@@ -1276,15 +1277,14 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
  */
 fs_inst *
 fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
-                              fs_reg shadow_c, fs_reg lod, fs_reg lod2,
-                              fs_reg sample_index, bool has_offset)
+                              int coord_components, fs_reg shadow_c,
+                              fs_reg lod, fs_reg lod2, fs_reg sample_index,
+                              bool has_offset)
 {
    int mlen = 0;
    int base_mrf = 2;
    int reg_width = dispatch_width / 8;
    bool header_present = false;
-   const int vector_elements =
-      ir->coordinate ? ir->coordinate->type->vector_elements : 0;
 
    if (has_offset) {
       /* The offsets set up by the ir_texture visitor are in the
@@ -1295,12 +1295,12 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       base_mrf--;
    }
 
-   for (int i = 0; i < vector_elements; i++) {
+   for (int i = 0; i < coord_components; i++) {
       emit(MOV(fs_reg(MRF, base_mrf + mlen + i * reg_width, coordinate.type),
                coordinate));
       coordinate.reg_offset++;
    }
-   mlen += vector_elements * reg_width;
+   mlen += coord_components * reg_width;
 
    if (shadow_c.file != BAD_FILE) {
       mlen = MAX2(mlen, header_present + 4 * reg_width);
@@ -1403,9 +1403,10 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
 
 fs_inst *
 fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
-                              fs_reg shadow_c, fs_reg lod, fs_reg lod2,
-                              fs_reg sample_index, bool has_offset,
-                              fs_reg offset, fs_reg mcs, int sampler)
+                              int coord_components, fs_reg shadow_c,
+                              fs_reg lod, fs_reg lod2, fs_reg sample_index,
+                              bool has_offset, fs_reg offset, fs_reg mcs,
+                              int sampler)
 {
    int reg_width = dispatch_width / 8;
    bool header_present = false;
@@ -1459,7 +1460,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       /* Load dPdx and the coordinate together:
        * [hdr], [ref], x, dPdx.x, dPdy.x, y, dPdx.y, dPdy.y, z, dPdx.z, dPdy.z
        */
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(sources[length], coordinate));
          coordinate.reg_offset++;
          length++;
@@ -1498,7 +1499,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       emit(MOV(retype(sources[length], BRW_REGISTER_TYPE_D), lod));
       length++;
 
-      for (int i = 1; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 1; i < coord_components; i++) {
          emit(MOV(retype(sources[length], BRW_REGISTER_TYPE_D), coordinate));
          coordinate.reg_offset++;
          length++;
@@ -1517,7 +1518,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       /* there is no offsetting for this message; just copy in the integer
        * texture coordinates
        */
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(retype(sources[length], BRW_REGISTER_TYPE_D), coordinate));
          coordinate.reg_offset++;
          length++;
@@ -1543,7 +1544,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
             length++;
          }
 
-         if (ir->coordinate->type->vector_elements == 3) { /* r if present */
+         if (coord_components == 3) { /* r if present */
             emit(MOV(sources[length], coordinate));
             coordinate.reg_offset++;
             length++;
@@ -1555,8 +1556,8 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
    }
 
    /* Set up the coordinate (except for cases where it was done above) */
-   if (ir->coordinate && !coordinate_done) {
-      for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
+   if (!coordinate_done) {
+      for (int i = 0; i < coord_components; i++) {
          emit(MOV(sources[length], coordinate));
          coordinate.reg_offset++;
          length++;
@@ -1803,6 +1804,9 @@ fs_visitor::visit(ir_texture *ir)
                                     sampler, texunit);
    }
 
+   int coord_components =
+      ir->coordinate ? ir->coordinate->type->vector_elements : 0;
+
    fs_reg shadow_comparitor;
    if (ir->shadow_comparitor) {
       ir->shadow_comparitor->accept(this);
@@ -1860,15 +1864,16 @@ fs_visitor::visit(ir_texture *ir)
    }
 
    if (brw->gen >= 7) {
-      inst = emit_texture_gen7(ir, dst, coordinate, shadow_comparitor,
-                               lod, lod2, sample_index, has_offset, offset,
-                               mcs, sampler);
+      inst = emit_texture_gen7(ir, dst, coordinate, coord_components,
+                               shadow_comparitor, lod, lod2, sample_index,
+                               has_offset, offset, mcs, sampler);
    } else if (brw->gen >= 5) {
-      inst = emit_texture_gen5(ir, dst, coordinate, shadow_comparitor,
-                               lod, lod2, sample_index, has_offset);
+      inst = emit_texture_gen5(ir, dst, coordinate, coord_components,
+                               shadow_comparitor, lod, lod2, sample_index,
+                               has_offset);
    } else {
-      inst = emit_texture_gen4(ir, dst, coordinate, shadow_comparitor,
-                               lod, lod2);
+      inst = emit_texture_gen4(ir, dst, coordinate, coord_components,
+                               shadow_comparitor, lod, lod2);
    }
 
    if (ir->offset != NULL && ir->op != ir_txf)
-- 
1.9.3



More information about the mesa-dev mailing list