diff options
author | Ian Romanick <[email protected]> | 2014-03-12 15:10:59 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2014-03-25 12:09:36 -0700 |
commit | bb0d6db974ea920491aca2eb011064fd3c2fb676 (patch) | |
tree | b371082918a8907da3463cfc6eeaeee5973bd120 | |
parent | 35bf94f901fcbd47cf0e631d370b130b31cd28ee (diff) |
glsl: Fold implementation of ir_dereference_array::constant_referenced into wrapper
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Topi Pohjolainen <[email protected]>
-rw-r--r-- | src/glsl/ir_constant_expression.cpp | 89 |
1 files changed, 43 insertions, 46 deletions
diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp index 336ce176510..53db618067d 100644 --- a/src/glsl/ir_constant_expression.cpp +++ b/src/glsl/ir_constant_expression.cpp @@ -407,10 +407,49 @@ constant_referenced(const ir_dereference *deref, return false; switch (deref->ir_type) { - case ir_type_dereference_array: - ((ir_dereference_array *) deref)->constant_referenced(variable_context, - store, offset); + case ir_type_dereference_array: { + const ir_dereference_array *const da = + (const ir_dereference_array *) deref; + + ir_constant *index_c = + da->array_index->constant_expression_value(variable_context); + + if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) + break; + + int index = index_c->type->base_type == GLSL_TYPE_INT ? + index_c->get_int_component(0) : + index_c->get_uint_component(0); + + ir_constant *substore; + int suboffset; + + const ir_dereference *deref = da->array->as_dereference(); + if (!deref) + break; + + if (!constant_referenced(deref, variable_context, substore, suboffset)) + break; + + const glsl_type *vt = da->array->type; + if (vt->is_array()) { + store = substore->get_array_element(index); + offset = 0; + break; + } + if (vt->is_matrix()) { + store = substore; + offset = index * vt->vector_elements; + break; + } + if (vt->is_vector()) { + store = substore; + offset = suboffset + index; + break; + } + break; + } case ir_type_dereference_record: { const ir_dereference_record *const dr = @@ -461,49 +500,7 @@ void ir_dereference_array::constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const { - ir_constant *index_c = array_index->constant_expression_value(variable_context); - - if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) { - store = 0; - offset = 0; - return; - } - - int index = index_c->type->base_type == GLSL_TYPE_INT ? - index_c->get_int_component(0) : - index_c->get_uint_component(0); - - ir_constant *substore; - int suboffset; - const ir_dereference *deref = array->as_dereference(); - if (!deref) { - store = 0; - offset = 0; - return; - } - - if (!::constant_referenced(deref, variable_context, substore, suboffset)) - return; - - const glsl_type *vt = array->type; - if (vt->is_array()) { - store = substore->get_array_element(index); - offset = 0; - return; - } - if (vt->is_matrix()) { - store = substore; - offset = index * vt->vector_elements; - return; - } - if (vt->is_vector()) { - store = substore; - offset = suboffset + index; - return; - } - - store = 0; - offset = 0; + ::constant_referenced(this, variable_context, store, offset); } void |