[Mesa-dev] [PATCH 02/10] i965: Adds support for horizontal location

Vincent Lejeune vljn at ovi.com
Thu Feb 23 12:12:23 PST 2012


v2: less invasive changes
---
 src/mesa/drivers/dri/i965/brw_fs.cpp           |    4 +-
 src/mesa/drivers/dri/i965/brw_vec4.h           |    5 ++-
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |   60 +++++++++++++++--------
 3 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index bf59da3..55cbf9e 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -462,7 +462,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
 	     * field of the setup reg.
 	     */
 	    for (unsigned int k = 0; k < type->vector_elements; k++) {
-	       struct brw_reg interp = interp_reg(location, k);
+	       struct brw_reg interp = interp_reg(location, k + ir->horizontal_location);
 	       interp = suboffset(interp, 3);
                interp.type = reg->type;
 	       emit(FS_OPCODE_CINTERP, attr, fs_reg(interp));
@@ -482,7 +482,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
 		   k == 3 && !(c->key.proj_attrib_mask & (1 << location))) {
 		  emit(BRW_OPCODE_MOV, attr, fs_reg(1.0f));
 	       } else {
-		  struct brw_reg interp = interp_reg(location, k);
+		  struct brw_reg interp = interp_reg(location, k + ir->horizontal_location);
                   brw_wm_barycentric_interp_mode barycoord_mode;
                   if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
                      barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index bc8b392..c7b2665 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -387,7 +387,10 @@ public:
    /* Regs for vertex results.  Generated at ir_variable visiting time
     * for the ir->location's used.
     */
-   dst_reg output_reg[BRW_VERT_RESULT_MAX];
+   dst_reg output_reg[4 * BRW_VERT_RESULT_MAX];
+   unsigned horizontal_shift[4 * BRW_VERT_RESULT_MAX];
+   unsigned components[4 * BRW_VERT_RESULT_MAX];
+   unsigned output_per_ref[BRW_VERT_RESULT_MAX];
    const char *output_reg_annotation[BRW_VERT_RESULT_MAX];
    int uniform_size[MAX_UNIFORMS];
    int uniform_vector_size[MAX_UNIFORMS];
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index f9a08a0..776b93f 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -857,10 +857,14 @@ vec4_visitor::visit(ir_variable *ir)
       reg = new(mem_ctx) dst_reg(this, ir->type);
 
       for (int i = 0; i < type_size(ir->type); i++) {
-	 output_reg[ir->location + i] = *reg;
-	 output_reg[ir->location + i].reg_offset = i;
-	 output_reg[ir->location + i].type =
+       unsigned location_and_lateral_offset = 4 * ir->location + 4 * i + output_per_ref[ir->location + i];
+       output_per_ref[ir->location + i] += 1;
+       output_reg[location_and_lateral_offset] = *reg;
+       output_reg[location_and_lateral_offset].reg_offset = i;
+       output_reg[location_and_lateral_offset].type =
             brw_type_for_base_type(ir->type->get_scalar_type());
+       horizontal_shift[location_and_lateral_offset] = ir->horizontal_location;
+       components[location_and_lateral_offset] = (ir->type->is_array())?ir->type->fields.array->vector_elements:ir->type->vector_elements;
 	 output_reg_annotation[ir->location + i] = ir->name;
       }
       break;
@@ -2020,11 +2024,11 @@ void
 vec4_visitor::emit_ndc_computation()
 {
    /* Get the position */
-   src_reg pos = src_reg(output_reg[VERT_RESULT_HPOS]);
+   src_reg pos = src_reg(output_reg[4 * VERT_RESULT_HPOS]);
 
    /* Build ndc coords, which are (x/w, y/w, z/w, 1/w) */
    dst_reg ndc = dst_reg(this, glsl_type::vec4_type);
-   output_reg[BRW_VERT_RESULT_NDC] = ndc;
+   output_reg[4 * BRW_VERT_RESULT_NDC] = ndc;
 
    current_annotation = "NDC";
    dst_reg ndc_w = ndc;
@@ -2053,7 +2057,7 @@ vec4_visitor::emit_psiz_and_flags(struct brw_reg reg)
       emit(MOV(header1, 0u));
 
       if (c->prog_data.outputs_written & BITFIELD64_BIT(VERT_RESULT_PSIZ)) {
-	 src_reg psiz = src_reg(output_reg[VERT_RESULT_PSIZ]);
+       src_reg psiz = src_reg(output_reg[4 * VERT_RESULT_PSIZ]);
 
 	 current_annotation = "Point size";
 	 emit(MUL(header1_w, psiz, src_reg((float)(1 << 11))));
@@ -2064,7 +2068,7 @@ vec4_visitor::emit_psiz_and_flags(struct brw_reg reg)
       for (i = 0; i < c->key.nr_userclip_plane_consts; i++) {
 	 vec4_instruction *inst;
 
-	 inst = emit(DP4(dst_null_f(), src_reg(output_reg[VERT_RESULT_HPOS]),
+       inst = emit(DP4(dst_null_f(), src_reg(output_reg[4 * VERT_RESULT_HPOS]),
                          src_reg(this->userplane[i])));
 	 inst->conditional_mod = BRW_CONDITIONAL_L;
 
@@ -2103,7 +2107,7 @@ vec4_visitor::emit_psiz_and_flags(struct brw_reg reg)
       emit(MOV(retype(reg, BRW_REGISTER_TYPE_D), src_reg(0)));
       if (c->prog_data.outputs_written & BITFIELD64_BIT(VERT_RESULT_PSIZ)) {
          emit(MOV(brw_writemask(reg, WRITEMASK_W),
-                  src_reg(output_reg[VERT_RESULT_PSIZ])));
+                  src_reg(output_reg[4 * VERT_RESULT_PSIZ])));
       }
    }
 }
@@ -2140,7 +2144,7 @@ vec4_visitor::emit_clip_distances(struct brw_reg reg, int offset)
    for (int i = 0; i + offset < c->key.nr_userclip_plane_consts && i < 4;
         ++i) {
       emit(DP4(dst_reg(brw_writemask(reg, 1 << i)),
-               src_reg(output_reg[clip_vertex]),
+               src_reg(output_reg[4 * clip_vertex]),
                src_reg(this->userplane[i + offset])));
    }
 }
@@ -2149,17 +2153,30 @@ void
 vec4_visitor::emit_generic_urb_slot(dst_reg reg, int vert_result)
 {
    assert (vert_result < VERT_RESULT_MAX);
-   reg.type = output_reg[vert_result].type;
+   reg.type = output_reg[4 * vert_result].type;
    current_annotation = output_reg_annotation[vert_result];
-   /* Copy the register, saturating if necessary */
-   vec4_instruction *inst = emit(MOV(reg,
-                                     src_reg(output_reg[vert_result])));
-   if ((vert_result == VERT_RESULT_COL0 ||
-        vert_result == VERT_RESULT_COL1 ||
-        vert_result == VERT_RESULT_BFC0 ||
-        vert_result == VERT_RESULT_BFC1) &&
-       c->key.clamp_vertex_color) {
-      inst->saturate = true;
+   for (unsigned i = 0; i < output_per_ref[vert_result]; i++) {
+      unsigned components_count = components[4 * vert_result + i], hs = horizontal_shift[4 * vert_result + i];
+      reg.writemask = ((1 << components_count) - 1 ) << hs;
+      src_reg src_gpr = src_reg(output_reg[4 * vert_result + i]);
+      unsigned swz = src_gpr.swizzle;
+      src_gpr.swizzle = BRW_SWIZZLE4(
+               BRW_GET_SWZ(swz,(0 + hs) % 4),
+               BRW_GET_SWZ(swz,(1 + hs) % 4),
+               BRW_GET_SWZ(swz,(2 + hs) % 4),
+               BRW_GET_SWZ(swz,(3 + hs) % 4)
+               );
+
+
+      /* Copy the register, saturating if necessary */
+      vec4_instruction *inst = emit(MOV(reg,   src_gpr));
+      if ((vert_result == VERT_RESULT_COL0 ||
+           vert_result == VERT_RESULT_COL1 ||
+           vert_result == VERT_RESULT_BFC0 ||
+           vert_result == VERT_RESULT_BFC1) &&
+          c->key.clamp_vertex_color) {
+         inst->saturate = true;
+      }
    }
 }
 
@@ -2178,12 +2195,12 @@ vec4_visitor::emit_urb_slot(int mrf, int vert_result)
       break;
    case BRW_VERT_RESULT_NDC:
       current_annotation = "NDC";
-      emit(MOV(reg, src_reg(output_reg[BRW_VERT_RESULT_NDC])));
+      emit(MOV(reg, src_reg(output_reg[4 *BRW_VERT_RESULT_NDC])));
       break;
    case BRW_VERT_RESULT_HPOS_DUPLICATE:
    case VERT_RESULT_HPOS:
       current_annotation = "gl_Position";
-      emit(MOV(reg, src_reg(output_reg[VERT_RESULT_HPOS])));
+      emit(MOV(reg, src_reg(output_reg[4 * VERT_RESULT_HPOS])));
       break;
    case VERT_RESULT_CLIP_DIST0:
    case VERT_RESULT_CLIP_DIST1:
@@ -2615,6 +2632,7 @@ vec4_visitor::vec4_visitor(struct brw_vs_compile *c,
    this->max_grf = intel->gen >= 7 ? GEN7_MRF_HACK_START : BRW_MAX_GRF;
 
    this->uniforms = 0;
+   memset(output_per_ref, 0, sizeof(output_per_ref));
 }
 
 vec4_visitor::~vec4_visitor()
-- 
1.7.7



More information about the mesa-dev mailing list