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);
|
ir->replace_with(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (all_parameters_are_constant) {
|
if (all_parameters_are_constant)
|
||||||
/* FINISHME: Add support for generating constant arrays. */
|
return new(ctx) ir_constant(constructor_type, &actual_parameters);
|
||||||
}
|
|
||||||
|
|
||||||
ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor",
|
ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor",
|
||||||
ir_var_temporary);
|
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->ir_type = ir_type_constant;
|
||||||
this->type = type;
|
this->type = type;
|
||||||
|
|
||||||
/* FINISHME: Support array types. */
|
|
||||||
assert(type->is_scalar() || type->is_vector() || type->is_matrix()
|
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
|
/* 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
|
* 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;
|
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 *
|
||||||
ir_constant::get_record_field(const char *name)
|
ir_constant::get_record_field(const char *name)
|
||||||
|
|
|
@ -1268,6 +1268,8 @@ public:
|
||||||
unsigned get_uint_component(unsigned i) const;
|
unsigned get_uint_component(unsigned i) const;
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
ir_constant *get_array_element(unsigned i) const;
|
||||||
|
|
||||||
ir_constant *get_record_field(const char *name);
|
ir_constant *get_record_field(const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1284,6 +1286,10 @@ public:
|
||||||
*/
|
*/
|
||||||
union ir_constant_data value;
|
union ir_constant_data value;
|
||||||
|
|
||||||
|
/* Array elements */
|
||||||
|
ir_constant **array_elements;
|
||||||
|
|
||||||
|
/* Structure fields */
|
||||||
exec_list components;
|
exec_list components;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -337,6 +337,17 @@ ir_constant::clone(struct hash_table *ht) const
|
||||||
return c;
|
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:
|
default:
|
||||||
assert(!"Should not get here."); break;
|
assert(!"Should not get here."); break;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue