summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/glsl/ir_constant_expression.cpp38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
index c013dfd3595..336ce176510 100644
--- a/src/glsl/ir_constant_expression.cpp
+++ b/src/glsl/ir_constant_expression.cpp
@@ -412,10 +412,27 @@ constant_referenced(const ir_dereference *deref,
store, offset);
break;
- case ir_type_dereference_record:
- ((ir_dereference_record *) deref)->constant_referenced(variable_context,
- store, offset);
+ case ir_type_dereference_record: {
+ const ir_dereference_record *const dr =
+ (const ir_dereference_record *) deref;
+
+ const ir_dereference *const deref = dr->record->as_dereference();
+ if (!deref)
+ break;
+
+ ir_constant *substore;
+ int suboffset;
+
+ if (!constant_referenced(deref, variable_context, substore, suboffset))
+ break;
+
+ /* Since we're dropping it on the floor...
+ */
+ assert(suboffset == 0);
+
+ store = substore->get_record_field(dr->field);
break;
+ }
case ir_type_dereference_variable: {
const ir_dereference_variable *const dv =
@@ -493,20 +510,7 @@ void
ir_dereference_record::constant_referenced(struct hash_table *variable_context,
ir_constant *&store, int &offset) const
{
- ir_constant *substore;
- int suboffset;
- const ir_dereference *deref = record->as_dereference();
- if (!deref) {
- store = 0;
- offset = 0;
- return;
- }
-
- if (!::constant_referenced(deref, variable_context, substore, suboffset))
- return;
-
- store = substore->get_record_field(field);
- offset = 0;
+ ::constant_referenced(this, variable_context, store, offset);
}
/*@}*/