glsl: Add is_basis function

Determines whether it's a basis vector, i.e., a vector with one element
equal to 1 and all other elements equal to 0.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Matt Turner
2012-06-04 16:26:32 -04:00
parent d7bef19c7f
commit 9aa3fbcc2e
2 changed files with 70 additions and 4 deletions

View File

@@ -46,6 +46,11 @@ bool ir_rvalue::is_negative_one() const
return false;
}
bool ir_rvalue::is_basis() const
{
return false;
}
/**
* Modify the swizzle make to move one component to another
*
@@ -1125,6 +1130,49 @@ ir_constant::is_negative_one() const
return true;
}
bool
ir_constant::is_basis() const
{
if (!this->type->is_scalar() && !this->type->is_vector())
return false;
if (this->type->is_boolean())
return false;
unsigned ones = 0;
for (unsigned c = 0; c < this->type->vector_elements; c++) {
switch (this->type->base_type) {
case GLSL_TYPE_FLOAT:
if (this->value.f[c] == 1.0)
ones++;
else if (this->value.f[c] != 0.0)
return false;
break;
case GLSL_TYPE_INT:
if (this->value.i[c] == 1)
ones++;
else if (this->value.i[c] != 0)
return false;
break;
case GLSL_TYPE_UINT:
if (int(this->value.u[c]) == 1)
ones++;
else if (int(this->value.u[c]) != 0)
return false;
break;
default:
/* The only other base types are structures, arrays, samplers, and
* booleans. Samplers cannot be constants, and the others should
* have been filtered out above.
*/
assert(!"Should not get here.");
return false;
}
}
return ones == 1;
}
ir_loop::ir_loop()
{
this->ir_type = ir_type_loop;