diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2010-05-19 11:37:35 +0200 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-05-26 15:23:19 -0700 |
commit | 70fe8b66632f4afd87ebb12a450b1e639428e88f (patch) | |
tree | a3eae48e0cf4b2ae22a61efd4e825961938137ba /glsl_types.cpp | |
parent | 461c294ac57e387aa2355cfd2aa93cefaba03baa (diff) |
Begin refactoring ir_dereference
Create separate subclasses of ir_dereference for variable, array, and
record dereferences. As a side effect, array and record dereferences
no longer point to ir_variable objects directly. Instead they each
point to an ir_dereference_variable object.
This is the first of several steps in the refactoring process. The
intention is that ir_dereference will eventually become an abstract
base class.
Diffstat (limited to 'glsl_types.cpp')
-rw-r--r-- | glsl_types.cpp | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/glsl_types.cpp b/glsl_types.cpp index a293ce7286..e1beeefe89 100644 --- a/glsl_types.cpp +++ b/glsl_types.cpp @@ -171,10 +171,10 @@ glsl_type::generate_constructor(glsl_symbol_table *symtab) const for (unsigned i = 0; i < length; i++) { ir_dereference *const lhs = (this->base_type == GLSL_TYPE_ARRAY) - ? new ir_dereference(retval, new ir_constant(i)) - : new ir_dereference(retval, fields.structure[i].name); + ? (ir_dereference *) new ir_dereference_array(retval, new ir_constant(i)) + : (ir_dereference *) new ir_dereference_record(retval, fields.structure[i].name); - ir_dereference *const rhs = new ir_dereference(declarations[i]); + ir_dereference *const rhs = new ir_dereference_variable(declarations[i]); ir_instruction *const assign = new ir_assignment(lhs, rhs, NULL); sig->body.push_tail(assign); @@ -182,7 +182,7 @@ glsl_type::generate_constructor(glsl_symbol_table *symtab) const free(declarations); - ir_dereference *const retref = new ir_dereference(retval); + ir_dereference *const retref = new ir_dereference_variable(retval); ir_instruction *const inst = new ir_return(retref); sig->body.push_tail(inst); @@ -250,15 +250,16 @@ generate_vec_body_from_scalar(exec_list *instructions, /* Generate a single assignment of the parameter to __retval.x and return * __retval.xxxx for however many vector components there are. */ - ir_dereference *const lhs_ref = new ir_dereference(declarations[16]); - ir_dereference *const rhs = new ir_dereference(declarations[0]); + ir_dereference *const lhs_ref = + new ir_dereference_variable(declarations[16]); + ir_dereference *const rhs = new ir_dereference_variable(declarations[0]); ir_swizzle *lhs = new ir_swizzle(lhs_ref, 0, 0, 0, 0, 1); inst = new ir_assignment(lhs, rhs, NULL); instructions->push_tail(inst); - ir_dereference *const retref = new ir_dereference(declarations[16]); + ir_dereference *const retref = new ir_dereference_variable(declarations[16]); ir_swizzle *retval = new ir_swizzle(retref, 0, 0, 0, 0, declarations[16]->type->vector_elements); @@ -283,8 +284,9 @@ generate_vec_body_from_N_scalars(exec_list *instructions, * __retval.x and return __retval. */ for (unsigned i = 0; i < vec_type->vector_elements; i++) { - ir_dereference *const lhs_ref = new ir_dereference(declarations[16]); - ir_dereference *const rhs = new ir_dereference(declarations[i]); + ir_dereference *const lhs_ref = + new ir_dereference_variable(declarations[16]); + ir_dereference *const rhs = new ir_dereference_variable(declarations[i]); ir_swizzle *lhs = new ir_swizzle(lhs_ref, i, 0, 0, 0, 1); @@ -292,7 +294,7 @@ generate_vec_body_from_N_scalars(exec_list *instructions, instructions->push_tail(inst); } - ir_dereference *retval = new ir_dereference(declarations[16]); + ir_dereference *retval = new ir_dereference_variable(declarations[16]); inst = new ir_return(retval); instructions->push_tail(inst); @@ -334,8 +336,8 @@ generate_mat_body_from_scalar(exec_list *instructions, instructions->push_tail(column); - ir_dereference *const lhs_ref = new ir_dereference(column); - ir_dereference *const rhs = new ir_dereference(declarations[0]); + ir_dereference *const lhs_ref = new ir_dereference_variable(column); + ir_dereference *const rhs = new ir_dereference_variable(declarations[0]); ir_swizzle *lhs = new ir_swizzle(lhs_ref, 0, 0, 0, 0, 1); @@ -346,7 +348,7 @@ generate_mat_body_from_scalar(exec_list *instructions, ir_constant *const zero = new ir_constant(glsl_type::float_type, &z); for (unsigned i = 1; i < column_type->vector_elements; i++) { - ir_dereference *const lhs_ref = new ir_dereference(column); + ir_dereference *const lhs_ref = new ir_dereference_variable(column); ir_swizzle *lhs = new ir_swizzle(lhs_ref, i, 0, 0, 0, 1); @@ -357,7 +359,7 @@ generate_mat_body_from_scalar(exec_list *instructions, for (unsigned i = 0; i < row_type->vector_elements; i++) { static const unsigned swiz[] = { 1, 1, 1, 0, 1, 1, 1 }; - ir_dereference *const rhs_ref = new ir_dereference(column); + ir_dereference *const rhs_ref = new ir_dereference_variable(column); /* This will be .xyyy when i=0, .yxyy when i=1, etc. */ @@ -366,13 +368,14 @@ generate_mat_body_from_scalar(exec_list *instructions, column_type->vector_elements); ir_constant *const idx = new ir_constant(glsl_type::int_type, &i); - ir_dereference *const lhs = new ir_dereference(declarations[16], idx); + ir_dereference *const lhs = + new ir_dereference_array(declarations[16], idx); inst = new ir_assignment(lhs, rhs, NULL); instructions->push_tail(inst); } - ir_dereference *const retval = new ir_dereference(declarations[16]); + ir_dereference *const retval = new ir_dereference_variable(declarations[16]); inst = new ir_return(retval); instructions->push_tail(inst); } @@ -397,20 +400,21 @@ generate_mat_body_from_N_scalars(exec_list *instructions, for (unsigned j = 0; j < row_type->vector_elements; j++) { ir_constant *row_index = new ir_constant(glsl_type::int_type, &i); ir_dereference *const row_access = - new ir_dereference(declarations[16], row_index); + new ir_dereference_array(declarations[16], row_index); ir_swizzle *component_access = new ir_swizzle(row_access, j, 0, 0, 0, 1); const unsigned param = (i * row_type->vector_elements) + j; - ir_dereference *const rhs = new ir_dereference(declarations[param]); + ir_dereference *const rhs = + new ir_dereference_variable(declarations[param]); inst = new ir_assignment(component_access, rhs, NULL); instructions->push_tail(inst); } } - ir_dereference *retval = new ir_dereference(declarations[16]); + ir_dereference *retval = new ir_dereference_variable(declarations[16]); inst = new ir_return(retval); instructions->push_tail(inst); |