diff options
author | Chad Versace <[email protected]> | 2010-10-13 08:29:58 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2010-10-15 00:20:18 -0700 |
commit | e2c1fe3eb0fa47f5501b4ec8cd6b732db7ca84be (patch) | |
tree | 9cee253665d9fb2d495391cb2444e3d3ab981467 /src/glsl/ir_validate.cpp | |
parent | 4761d0d22ba79fa34adf679007498287e9fedca2 (diff) |
glsl: Fix ir validation for bit logic ops
In ir_validate::visit_leave(), the cases for
- ir_binop_bit_and
- ir_binop_bit_xor
- ir_binop_bit_or
were incorrect. It was incorrectly asserted that both operands must be the
same type, when in fact one may be scalar and the other a vector. It was also
incorrectly asserted that the resultant type was the type of the left operand,
which in fact does not hold when the left operand is a scalar and the right
operand is a vector.
Diffstat (limited to 'src/glsl/ir_validate.cpp')
-rw-r--r-- | src/glsl/ir_validate.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index db1ffb2de3f..df64ed638c2 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -347,11 +347,15 @@ ir_validate::visit_leave(ir_expression *ir) case ir_binop_bit_and: case ir_binop_bit_xor: case ir_binop_bit_or: - assert(ir->operands[0]->type == ir->operands[1]->type); - assert(ir->type == ir->operands[0]->type); - assert(ir->type->base_type == GLSL_TYPE_INT || - ir->type->base_type == GLSL_TYPE_UINT); - break; + assert(ir->operands[0]->type->base_type == + ir->operands[1]->type->base_type); + assert(ir->type->is_integer()); + if (ir->operands[0]->type->is_vector() && + ir->operands[1]->type->is_vector()) { + assert(ir->operands[0]->type->vector_elements == + ir->operands[1]->type->vector_elements); + } + break; case ir_binop_logic_and: case ir_binop_logic_xor: |