summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2014-03-12 14:38:42 -0700
committerIan Romanick <ian.d.romanick@intel.com>2014-03-25 12:09:36 -0700
commit14f0faacb631e8bcd3948e6711768d39f844a70a (patch)
tree1907bc0a3e8d4ec509b45dde52f7fce11a3b4e4a
parentc11c7e4f0131356c13c4433cd5c8bec3e883ac91 (diff)
glsl: Add wrapper function that calls ir_dereference::constant_referenced
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
-rw-r--r--src/glsl/ir_constant_expression.cpp52
1 files changed, 36 insertions, 16 deletions
diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
index a31e57910f..4149a0e6e2 100644
--- a/src/glsl/ir_constant_expression.cpp
+++ b/src/glsl/ir_constant_expression.cpp
@@ -395,6 +395,37 @@ unpack_half_1x16(uint16_t u)
* The offset is used when the reference is to a specific column of a matrix.
*/
/*@{*/
+static bool
+constant_referenced(const ir_dereference *deref,
+ struct hash_table *variable_context,
+ ir_constant *&store, int &offset)
+{
+ switch (deref->ir_type) {
+ case ir_type_dereference_array:
+ ((ir_dereference_array *) deref)->constant_referenced(variable_context,
+ store, offset);
+ break;
+
+ case ir_type_dereference_record:
+ ((ir_dereference_record *) deref)->constant_referenced(variable_context,
+ store, offset);
+ break;
+
+ case ir_type_dereference_variable:
+ ((ir_dereference_variable *) deref)->constant_referenced(variable_context,
+ store, offset);
+ break;
+
+ default:
+ assert(!"Should not get here.");
+ store = NULL;
+ offset = 0;
+ break;
+ }
+
+ return store != NULL;
+}
+
void
ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
ir_constant *&store, int &offset) const
@@ -433,13 +464,8 @@ ir_dereference_array::constant_referenced(struct hash_table *variable_context,
return;
}
- deref->constant_referenced(variable_context, substore, suboffset);
-
- if (!substore) {
- store = 0;
- offset = 0;
+ if (!::constant_referenced(deref, variable_context, substore, suboffset))
return;
- }
const glsl_type *vt = array->type;
if (vt->is_array()) {
@@ -475,13 +501,8 @@ ir_dereference_record::constant_referenced(struct hash_table *variable_context,
return;
}
- deref->constant_referenced(variable_context, substore, suboffset);
-
- if (!substore) {
- store = 0;
- offset = 0;
+ if (!::constant_referenced(deref, variable_context, substore, suboffset))
return;
- }
store = substore->get_record_field(field);
offset = 0;
@@ -1814,9 +1835,8 @@ bool ir_function_signature::constant_expression_evaluate_expression_list(const s
ir_constant *store = NULL;
int offset = 0;
- asg->lhs->constant_referenced(variable_context, store, offset);
- if (!store)
+ if (!constant_referenced(asg->lhs, variable_context, store, offset))
return false;
ir_constant *value = asg->rhs->constant_expression_value(variable_context);
@@ -1847,9 +1867,9 @@ bool ir_function_signature::constant_expression_evaluate_expression_list(const s
ir_constant *store = NULL;
int offset = 0;
- call->return_deref->constant_referenced(variable_context, store, offset);
- if (!store)
+ if (!constant_referenced(call->return_deref, variable_context,
+ store, offset))
return false;
ir_constant *value = call->constant_expression_value(variable_context);