diff options
Diffstat (limited to 'src/glsl/ir_validate.cpp')
| -rw-r--r-- | src/glsl/ir_validate.cpp | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index 9ea11dd400..58ab8aa58f 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -61,6 +61,7 @@ public: virtual ir_visitor_status visit(ir_dereference_variable *ir); virtual ir_visitor_status visit(ir_if *ir); + virtual ir_visitor_status visit_leave(ir_loop *ir); virtual ir_visitor_status visit_enter(ir_function *ir); virtual ir_visitor_status visit_leave(ir_function *ir); virtual ir_visitor_status visit_enter(ir_function_signature *ir); @@ -114,6 +115,40 @@ ir_validate::visit(ir_if *ir) ir_visitor_status +ir_validate::visit_leave(ir_loop *ir) +{ + if (ir->counter != NULL) { + if ((ir->from == NULL) || (ir->from == NULL) || (ir->increment == NULL)) { + printf("ir_loop has invalid loop controls:\n" + " counter: %p\n" + " from: %p\n" + " to: %p\n" + " increment: %p\n", + ir->counter, ir->from, ir->to, ir->increment); + abort(); + } + + if ((ir->cmp < ir_binop_less) || (ir->cmp > ir_binop_nequal)) { + printf("ir_loop has invalid comparitor %d\n", ir->cmp); + abort(); + } + } else { + if ((ir->from != NULL) || (ir->from != NULL) || (ir->increment != NULL)) { + printf("ir_loop has invalid loop controls:\n" + " counter: %p\n" + " from: %p\n" + " to: %p\n" + " increment: %p\n", + ir->counter, ir->from, ir->to, ir->increment); + abort(); + } + } + + return visit_continue; +} + + +ir_visitor_status ir_validate::visit_enter(ir_function *ir) { /* Function definitions cannot be nested. @@ -240,6 +275,10 @@ ir_validate::visit_leave(ir_expression *ir) assert(ir->operands[0]->type == ir->type); break; + case ir_unop_noise: + /* XXX what can we assert here? */ + break; + case ir_binop_add: case ir_binop_sub: case ir_binop_mul: @@ -258,24 +297,30 @@ ir_validate::visit_leave(ir_expression *ir) assert(ir->operands[0]->type == ir->type); } break; + case ir_binop_less: case ir_binop_greater: case ir_binop_lequal: case ir_binop_gequal: - /* GLSL < > <= >= operators take scalar floats/ints, but in the - * IR we may want to do them for vectors instead to support the - * lessEqual() and friends builtins. + case ir_binop_equal: + case ir_binop_nequal: + /* The semantics of the IR operators differ from the GLSL <, >, <=, >=, + * ==, and != operators. The IR operators perform a component-wise + * comparison on scalar or vector types and return a boolean scalar or + * vector type of the same size. */ - assert(ir->type == glsl_type::bool_type); + assert(ir->type->base_type == GLSL_TYPE_BOOL); assert(ir->operands[0]->type == ir->operands[1]->type); + assert(ir->operands[0]->type->is_vector() + || ir->operands[0]->type->is_scalar()); + assert(ir->operands[0]->type->vector_elements + == ir->type->vector_elements); break; - case ir_binop_equal: - case ir_binop_nequal: - /* GLSL == and != operate on vectors and return a bool, and the - * IR matches that. We may want to switch up the IR to work on - * vectors and return a bvec and make the operators break down - * to ANDing/ORing the results of the vector comparison. + case ir_binop_all_equal: + case ir_binop_any_nequal: + /* GLSL == and != operate on scalars, vectors, matrices and arrays, and + * return a scalar boolean. The IR matches that. */ assert(ir->type == glsl_type::bool_type); assert(ir->operands[0]->type == ir->operands[1]->type); @@ -303,6 +348,7 @@ ir_validate::visit_leave(ir_expression *ir) case ir_binop_dot: assert(ir->type == glsl_type::float_type); assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); + assert(ir->operands[0]->type->is_vector()); assert(ir->operands[0]->type == ir->operands[1]->type); break; |
