diff options
author | Luca Barbieri <[email protected]> | 2010-09-08 01:31:39 +0200 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-09-13 17:53:04 -0700 |
commit | 4dfb89904c0a3d2166e9a3fc0253a254680e91bc (patch) | |
tree | cbdcd0ef976c8cb33d604a29caf10bec1571af3b /src/glsl/ir_constant_expression.cpp | |
parent | 2cdbced10d98214616bcc5f960b21185c433d23b (diff) |
glsl: introduce ir_binop_all_equal and ir_binop_any_equal, allow vector cmps
Currently GLSL IR forbids any vector comparisons, and defines "ir_binop_equal"
and "ir_binop_nequal" to compare all elements and give a single bool.
This is highly unintuitive and prevents generation of optimal Mesa IR.
Hence, first rename "ir_binop_equal" to "ir_binop_all_equal" and
"ir_binop_nequal" to "ir_binop_any_nequal".
Second, readd "ir_binop_equal" and "ir_binop_nequal" with the same semantics
as less, lequal, etc.
Third, allow all comparisons to acts on vectors.
Signed-off-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl/ir_constant_expression.cpp')
-rw-r--r-- | src/glsl/ir_constant_expression.cpp | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp index ca12392a74f..ec0e26de185 100644 --- a/src/glsl/ir_constant_expression.cpp +++ b/src/glsl/ir_constant_expression.cpp @@ -89,9 +89,9 @@ ir_expression::constant_expression_value() if (op[0]->type->is_array()) { assert(op[1] != NULL && op[1]->type->is_array()); switch (this->operation) { - case ir_binop_equal: + case ir_binop_all_equal: return new(ctx) ir_constant(op[0]->has_value(op[1])); - case ir_binop_nequal: + case ir_binop_any_nequal: return new(ctx) ir_constant(!op[0]->has_value(op[1])); default: break; @@ -622,11 +622,41 @@ ir_expression::constant_expression_value() assert(0); } break; - case ir_binop_equal: - data.b[0] = op[0]->has_value(op[1]); + switch (op[0]->type->base_type) { + case GLSL_TYPE_UINT: + data.b[0] = op[0]->value.u[0] == op[1]->value.u[0]; + break; + case GLSL_TYPE_INT: + data.b[0] = op[0]->value.i[0] == op[1]->value.i[0]; + break; + case GLSL_TYPE_FLOAT: + data.b[0] = op[0]->value.f[0] == op[1]->value.f[0]; + break; + default: + assert(0); + } break; case ir_binop_nequal: + switch (op[0]->type->base_type) { + case GLSL_TYPE_UINT: + data.b[0] = op[0]->value.u[0] != op[1]->value.u[0]; + break; + case GLSL_TYPE_INT: + data.b[0] = op[0]->value.i[0] != op[1]->value.i[0]; + break; + case GLSL_TYPE_FLOAT: + data.b[0] = op[0]->value.f[0] != op[1]->value.f[0]; + break; + default: + assert(0); + } + break; + + case ir_binop_all_equal: + data.b[0] = op[0]->has_value(op[1]); + break; + case ir_binop_any_nequal: data.b[0] = !op[0]->has_value(op[1]); break; |