Mesa (master): glsl: Add validation that a swizzle only references valid channels.

Eric Anholt anholt at kemper.freedesktop.org
Mon Sep 27 23:00:22 UTC 2010


Module: Mesa
Branch: master
Commit: 5e8ed7a79b381d559b059987bd99c68d40f641ca
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5e8ed7a79b381d559b059987bd99c68d40f641ca

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Sep 27 15:48:15 2010 -0700

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

Caught the bug in the previous commit.

---

 src/glsl/ir_validate.cpp |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index e35514a..70fb939 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -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);
 
@@ -365,6 +366,23 @@ ir_validate::visit_leave(ir_expression *ir)
 }
 
 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)
 {
    /* An ir_variable is the one thing that can (and will) appear multiple times




More information about the mesa-commit mailing list