glsl2: Extend ir_constant to store constant arrays, and generate them.
Since GLSL permits arrays of structures, we need to store each element as an ir_constant*, not just ir_constant_data. Fixes parser tests const-array-01.frag, const-array-03.frag, const-array-04.frag, const-array-05.frag, though 03 and 04 generate the wrong code.
This commit is contained in:
parent
13a19745d4
commit
74e1802f5d
|
@ -358,9 +358,8 @@ process_array_constructor(exec_list *instructions,
|
|||
ir->replace_with(result);
|
||||
}
|
||||
|
||||
if (all_parameters_are_constant) {
|
||||
/* FINISHME: Add support for generating constant arrays. */
|
||||
}
|
||||
if (all_parameters_are_constant)
|
||||
return new(ctx) ir_constant(constructor_type, &actual_parameters);
|
||||
|
||||
ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor",
|
||||
ir_var_temporary);
|
||||
|
|
|
@ -253,9 +253,20 @@ ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
|
|||
this->ir_type = ir_type_constant;
|
||||
this->type = type;
|
||||
|
||||
/* FINISHME: Support array types. */
|
||||
assert(type->is_scalar() || type->is_vector() || type->is_matrix()
|
||||
|| type->is_record());
|
||||
|| type->is_record() || type->is_array());
|
||||
|
||||
if (type->is_array()) {
|
||||
this->array_elements = talloc_array(this, ir_constant *, type->length);
|
||||
unsigned i = 0;
|
||||
foreach_list(node, value_list) {
|
||||
ir_constant *value = (ir_constant *) node;
|
||||
assert(value->as_constant() != NULL);
|
||||
|
||||
this->array_elements[i++] = value;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* If the constant is a record, the types of each of the entries in
|
||||
* value_list must be a 1-for-1 match with the structure components. Each
|
||||
|
@ -378,6 +389,14 @@ ir_constant::get_uint_component(unsigned i) const
|
|||
return 0;
|
||||
}
|
||||
|
||||
ir_constant *
|
||||
ir_constant::get_array_element(unsigned i) const
|
||||
{
|
||||
assert(this->type->is_array());
|
||||
assert(i < this->type->length);
|
||||
|
||||
return array_elements[i];
|
||||
}
|
||||
|
||||
ir_constant *
|
||||
ir_constant::get_record_field(const char *name)
|
||||
|
|
|
@ -1268,6 +1268,8 @@ public:
|
|||
unsigned get_uint_component(unsigned i) const;
|
||||
/*@}*/
|
||||
|
||||
ir_constant *get_array_element(unsigned i) const;
|
||||
|
||||
ir_constant *get_record_field(const char *name);
|
||||
|
||||
/**
|
||||
|
@ -1284,6 +1286,10 @@ public:
|
|||
*/
|
||||
union ir_constant_data value;
|
||||
|
||||
/* Array elements */
|
||||
ir_constant **array_elements;
|
||||
|
||||
/* Structure fields */
|
||||
exec_list components;
|
||||
|
||||
private:
|
||||
|
|
|
@ -337,6 +337,17 @@ ir_constant::clone(struct hash_table *ht) const
|
|||
return c;
|
||||
}
|
||||
|
||||
case GLSL_TYPE_ARRAY: {
|
||||
ir_constant *c = new(ctx) ir_constant;
|
||||
|
||||
c->type = this->type;
|
||||
c->array_elements = talloc_array(c, ir_constant *, this->type->length);
|
||||
for (unsigned i = 0; i < this->type->length; i++) {
|
||||
c->array_elements[i] = this->array_elements[i]->clone(NULL);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
default:
|
||||
assert(!"Should not get here."); break;
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue