glsl: Group all of the constant_referenced functions together

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
Ian Romanick
2014-03-12 14:24:03 -07:00
parent 3bd65dc8a1
commit c11c7e4f01
2 changed files with 109 additions and 96 deletions
+6 -4
View File
@@ -265,10 +265,12 @@ ir_assignment::clone(void *mem_ctx, struct hash_table *ht) const
if (this->condition)
new_condition = this->condition->clone(mem_ctx, ht);
return new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht),
this->rhs->clone(mem_ctx, ht),
new_condition,
this->write_mask);
ir_assignment *cloned =
new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht),
this->rhs->clone(mem_ctx, ht),
new_condition);
cloned->write_mask = this->write_mask;
return cloned;
}
ir_function *
+103 -92
View File
@@ -386,6 +386,109 @@ unpack_half_1x16(uint16_t u)
return _mesa_half_to_float(u);
}
/**
* \name Functions to get the constant referenced by an r-value
*
* Get the constant that is ultimately referenced by an r-value, in a constant
* expression evaluation context.
*
* The offset is used when the reference is to a specific column of a matrix.
*/
/*@{*/
void
ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
ir_constant *&store, int &offset) const
{
if (variable_context) {
store = (ir_constant *)hash_table_find(variable_context, var);
offset = 0;
} else {
store = NULL;
offset = 0;
}
}
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;
}
deref->constant_referenced(variable_context, substore, suboffset);
if (!substore) {
store = 0;
offset = 0;
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;
}
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;
}
deref->constant_referenced(variable_context, substore, suboffset);
if (!substore) {
store = 0;
offset = 0;
return;
}
store = substore->get_record_field(field);
offset = 0;
}
/*@}*/
ir_constant *
ir_rvalue::constant_expression_value(struct hash_table *variable_context)
{
@@ -1570,19 +1673,6 @@ ir_swizzle::constant_expression_value(struct hash_table *variable_context)
}
void
ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
ir_constant *&store, int &offset) const
{
if (variable_context) {
store = (ir_constant *)hash_table_find(variable_context, var);
offset = 0;
} else {
store = NULL;
offset = 0;
}
}
ir_constant *
ir_dereference_variable::constant_expression_value(struct hash_table *variable_context)
{
@@ -1610,60 +1700,6 @@ ir_dereference_variable::constant_expression_value(struct hash_table *variable_c
}
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;
}
deref->constant_referenced(variable_context, substore, suboffset);
if (!substore) {
store = 0;
offset = 0;
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;
}
ir_constant *
ir_dereference_array::constant_expression_value(struct hash_table *variable_context)
{
@@ -1719,31 +1755,6 @@ ir_dereference_array::constant_expression_value(struct hash_table *variable_cont
}
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;
}
deref->constant_referenced(variable_context, substore, suboffset);
if (!substore) {
store = 0;
offset = 0;
return;
}
store = substore->get_record_field(field);
offset = 0;
}
ir_constant *
ir_dereference_record::constant_expression_value(struct hash_table *variable_context)
{