diff options
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; |