From: Ian Romanick <ian.d.roman...@intel.com> Now ir_dereference_array of a vector will never occur in the RHS of an expression.
Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/glsl/ast_array_index.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/glsl/ast_array_index.cpp b/src/glsl/ast_array_index.cpp index 862f64c..e7bc299 100644 --- a/src/glsl/ast_array_index.cpp +++ b/src/glsl/ast_array_index.cpp @@ -31,17 +31,13 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, ir_rvalue *array, ir_rvalue *idx, YYLTYPE &loc, YYLTYPE &idx_loc) { - ir_rvalue *result = new(mem_ctx) ir_dereference_array(array, idx); - if (!array->type->is_error() && !array->type->is_array() && !array->type->is_matrix() - && !array->type->is_vector()) { + && !array->type->is_vector()) _mesa_glsl_error(& idx_loc, state, "cannot dereference non-array / non-matrix / " "non-vector"); - result->type = glsl_type::error_type; - } if (!idx->type->is_error()) { if (!idx->type->is_integer()) { @@ -174,5 +170,20 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, } } - return result; + /* After performing all of the error checking, generate the IR for the + * expression. + */ + if (array->type->is_array() + || array->type->is_matrix()) { + return new(mem_ctx) ir_dereference_array(array, idx); + } else if (array->type->is_vector()) { + return new(mem_ctx) ir_expression(ir_binop_vector_extract, array, idx); + } else if (array->type->is_error()) { + return array; + } else { + ir_rvalue *result = new(mem_ctx) ir_dereference_array(array, idx); + result->type = glsl_type::error_type; + + return result; + } } -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev