glsl: Add validation that a swizzle only references valid channels.

Caught the bug in the previous commit.
This commit is contained in:
Eric Anholt
2010-09-27 15:48:15 -07:00
parent 668cdbe129
commit 5e8ed7a79b

View File

@@ -67,6 +67,7 @@ public:
virtual ir_visitor_status visit_enter(ir_function_signature *ir);
virtual ir_visitor_status visit_leave(ir_expression *ir);
virtual ir_visitor_status visit_leave(ir_swizzle *ir);
virtual ir_visitor_status visit_enter(ir_assignment *ir);
@@ -364,6 +365,23 @@ ir_validate::visit_leave(ir_expression *ir)
return visit_continue;
}
ir_visitor_status
ir_validate::visit_leave(ir_swizzle *ir)
{
int chans[4] = {ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w};
for (unsigned int i = 0; i < ir->type->vector_elements; i++) {
if (chans[i] >= ir->val->type->vector_elements) {
printf("ir_swizzle @ %p specifies a channel not present "
"in the value.\n", (void *) ir);
ir->print();
abort();
}
}
return visit_continue;
}
ir_visitor_status
ir_validate::visit(ir_variable *ir)
{