[Mesa-dev] [PATCH 3/7] glsl_to_tgsi: Adds support for horizontal location

Vincent Lejeune vljn at ovi.com
Thu Feb 16 13:03:09 PST 2012


---
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp |   37 +++++++++++++++++++++++----
 1 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index ab05896..b65fad6 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1949,6 +1949,17 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
    }
 
    this->result = st_src_reg(entry->file, entry->index, var->type);
+   if (ir->type->is_scalar() || ir->type->is_vector())
+      this->result.swizzle = swizzle_for_size(ir->type->vector_elements);
+   else
+      this->result.swizzle = SWIZZLE_NOOP;
+   unsigned swz = this->result.swizzle;
+   this->result.swizzle = MAKE_SWIZZLE4(
+            GET_SWZ(swz, 0) + ir->var->horizontal_location % 4,
+            GET_SWZ(swz, 1) + ir->var->horizontal_location % 4,
+            GET_SWZ(swz, 2) + ir->var->horizontal_location % 4,
+            GET_SWZ(swz, 3) + ir->var->horizontal_location % 4
+            );
    if (!native_integers)
       this->result.type = GLSL_TYPE_FLOAT;
 }
@@ -2004,10 +2015,10 @@ glsl_to_tgsi_visitor::visit(ir_dereference_array *ir)
    }
 
    /* If the type is smaller than a vec4, replicate the last channel out. */
-   if (ir->type->is_scalar() || ir->type->is_vector())
+   /*if (ir->type->is_scalar() || ir->type->is_vector())
       src.swizzle = swizzle_for_size(ir->type->vector_elements);
    else
-      src.swizzle = SWIZZLE_NOOP;
+      src.swizzle = SWIZZLE_NOOP;*/
 
    this->result = src;
 }
@@ -2169,10 +2180,17 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
       l.writemask = WRITEMASK_XYZW;
    } else if (ir->lhs->type->is_scalar() &&
               ir->lhs->variable_referenced()->mode == ir_var_out) {
-      /* FINISHME: This hack makes writing to gl_FragDepth, which lives in the
-       * FINISHME: W component of fragment shader output zero, work correctly.
-       */
-      l.writemask = WRITEMASK_XYZW;
+
+	ir_variable *inside_var = ir->lhs->variable_referenced();
+	if (inside_var->location >= VERT_RESULT_VAR0) {
+	   l.writemask = 1 << inside_var->horizontal_location;
+	} else {
+	   /* FINISHME: This hack makes writing to gl_FragDepth, which lives in the
+		 * FINISHME: W component of fragment shader output zero, work correctly.
+		 */
+	   l.writemask = WRITEMASK_XYZW;
+	}
+
    } else {
       int swizzles[4];
       int first_enabled_chan = 0;
@@ -2180,6 +2198,13 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
 
       l.writemask = ir->write_mask;
 
+	if (ir_variable *inside_var = ir->lhs->variable_referenced()) {
+	   if (inside_var->location >= VERT_RESULT_VAR0) {
+		l.writemask = l.writemask << inside_var->horizontal_location;
+
+	   }
+	}
+
       for (int i = 0; i < 4; i++) {
          if (l.writemask & (1 << i)) {
             first_enabled_chan = GET_SWZ(r.swizzle, i);
-- 
1.7.7



More information about the mesa-dev mailing list