diff options
author | Ian Romanick <[email protected]> | 2013-03-15 18:08:22 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-05-13 12:05:19 -0700 |
commit | 3acb21517b3a23cf1044531e96d9741bd1c122c3 (patch) | |
tree | 4b26c98b1665a4404fdb2f6d9e1dcc4467b330b5 /src/glsl | |
parent | 89704eb1b019d42c949e6e08a8cb8bacbacbf63b (diff) |
glsl: Generate ir_binop_vector_extract for indexing of vectors
Now ir_dereference_array of a vector will never occur in the RHS of an
expression.
v2: Add back the { } around the if-statement body to make it more
readable. Suggested by Eric.
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/ast_array_index.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/glsl/ast_array_index.cpp b/src/glsl/ast_array_index.cpp index 862f64c809b..4baeb6f9dc6 100644 --- a/src/glsl/ast_array_index.cpp +++ b/src/glsl/ast_array_index.cpp @@ -31,8 +31,6 @@ _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() @@ -40,7 +38,6 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, _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()) { @@ -174,5 +171,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; + } } |