glsl: Add validation that a swizzle only references valid channels.
Caught the bug in the previous commit.
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user