On 04/08/2013 03:24 PM, Ian Romanick wrote:
From: Ian Romanick <ian.d.roman...@intel.com>

Use a first function that extract the vector being indexed and the index
from the deref.  Call the second function that does the real work.

Coming patches will add a new ir_expression for variable indexing into a
vector.  Having the lowering pass split into two functions will make it
much easier to lower the new ir_expression.

Signed-off-by: Ian Romanick <ian.d.roman...@intel.com>
---
  src/glsl/lower_vec_index_to_cond_assign.cpp | 47 ++++++++++++++++++-----------
  1 file changed, 30 insertions(+), 17 deletions(-)

diff --git a/src/glsl/lower_vec_index_to_cond_assign.cpp 
b/src/glsl/lower_vec_index_to_cond_assign.cpp
index f85875f..6572cc4 100644
--- a/src/glsl/lower_vec_index_to_cond_assign.cpp
+++ b/src/glsl/lower_vec_index_to_cond_assign.cpp
@@ -53,6 +53,9 @@ public:
     }

     ir_rvalue *convert_vec_index_to_cond_assign(ir_rvalue *val);
+   ir_rvalue *convert_vec_index_to_cond_assign(void *mem_ctx,
+                                              ir_rvalue *orig_vector,
+                                              ir_rvalue *orig_index);

     virtual ir_visitor_status visit_enter(ir_expression *);
     virtual ir_visitor_status visit_enter(ir_swizzle *);
@@ -65,24 +68,15 @@ public:
  };

  ir_rvalue *
-ir_vec_index_to_cond_assign_visitor::convert_vec_index_to_cond_assign(ir_rvalue
 *ir)
+ir_vec_index_to_cond_assign_visitor::convert_vec_index_to_cond_assign(void 
*mem_ctx,
+                                                                     ir_rvalue 
*orig_vector,
+                                                                     ir_rvalue 
*orig_index)
  {
-   ir_dereference_array *orig_deref = ir->as_dereference_array();
     ir_assignment *assign, *value_assign;
     ir_variable *index, *var, *value;
     ir_dereference *deref, *deref_value;
     unsigned i;

-   if (!orig_deref)
-      return ir;
-
-   if (orig_deref->array->type->is_matrix() ||
-       orig_deref->array->type->is_array())
-      return ir;
-
-   void *mem_ctx = ralloc_parent(ir);
-
-   assert(orig_deref->array_index->type->base_type == GLSL_TYPE_INT);

     exec_list list;

@@ -92,15 +86,15 @@ 
ir_vec_index_to_cond_assign_visitor::convert_vec_index_to_cond_assign(ir_rvalue
                                    ir_var_temporary);
     list.push_tail(index);
     deref = new(base_ir) ir_dereference_variable(index);
-   assign = new(base_ir) ir_assignment(deref, orig_deref->array_index, NULL);
+   assign = new(base_ir) ir_assignment(deref, orig_index, NULL);
     list.push_tail(assign);

     /* Store the value inside a temp, thus avoiding matrixes duplication */
-   value = new(base_ir) ir_variable(orig_deref->array->type, "vec_value_tmp",
+   value = new(base_ir) ir_variable(orig_vector->type, "vec_value_tmp",
                                    ir_var_temporary);
     list.push_tail(value);
     deref_value = new(base_ir) ir_dereference_variable(value);
-   value_assign = new(base_ir) ir_assignment(deref_value, orig_deref->array);
+   value_assign = new(base_ir) ir_assignment(deref_value, orig_vector);
     list.push_tail(value_assign);

     /* Temporary where we store whichever value we swizzle out. */

Right below this line, the code reads:

   var = new(base_ir) ir_variable(ir->type, "vec_index_tmp_v",
                                  ir_var_temporary);

which fails to compile because you removed the variable called "ir".

Please make this compile. Perhaps you want to introduce your extra glsl_type parameter in this patch rather than patch 5?

--Ken
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to