diff options
author | Ian Romanick <[email protected]> | 2010-11-16 11:59:22 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-11-19 15:00:25 -0800 |
commit | 8e498050dc1a1285c2218fdf4ea506c1cdcd9dd8 (patch) | |
tree | 3cebc43709d6e214ccadbf8c3aaf10b8ebd6d343 /src/glsl/ir.cpp | |
parent | fc92e87b9757eda01caf0bb3e2c31b1dbbd73aa0 (diff) |
glsl: Add ir_rvalue::is_negative_one predicate
Diffstat (limited to 'src/glsl/ir.cpp')
-rw-r--r-- | src/glsl/ir.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 714826343c7..308b7c2010d 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -41,6 +41,11 @@ bool ir_rvalue::is_one() const return false; } +bool ir_rvalue::is_negative_one() const +{ + return false; +} + /** * Modify the swizzle make to move one component to another * @@ -764,6 +769,42 @@ ir_constant::is_one() const return true; } +bool +ir_constant::is_negative_one() const +{ + if (!this->type->is_scalar() && !this->type->is_vector()) + return false; + + if (this->type->is_boolean()) + return false; + + 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) + return false; + break; + case GLSL_TYPE_INT: + if (this->value.i[c] != -1) + return false; + break; + case GLSL_TYPE_UINT: + if (int(this->value.u[c]) != -1) + 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 true; +} + ir_loop::ir_loop() { this->ir_type = ir_type_loop; |