Add method to set the swizzle of an ir_dereference
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 24 Mar 2010 22:12:21 +0000 (15:12 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 24 Mar 2010 22:12:21 +0000 (15:12 -0700)
ir.cpp
ir.h

diff --git a/ir.cpp b/ir.cpp
index 26e7394..49df754 100644 (file)
--- a/ir.cpp
+++ b/ir.cpp
@@ -87,6 +87,32 @@ ir_dereference::ir_dereference(ir_instruction *var)
 }
 
 
+void
+ir_dereference::set_swizzle(unsigned x, unsigned y, unsigned z, unsigned w,
+                           unsigned count)
+{
+   assert((count >= 1) && (count <= 4));
+
+   const unsigned dup_mask = 0
+      | ((count > 1) ? ((1U << y) & ((1U << x)                        )) : 0)
+      | ((count > 2) ? ((1U << z) & ((1U << x) | (1U << y)            )) : 0)
+      | ((count > 3) ? ((1U << w) & ((1U << x) | (1U << y) | (1U << z))) : 0);
+
+   assert(x <= 3);
+   assert(y <= 3);
+   assert(z <= 3);
+   assert(w <= 3);
+
+   selector.swizzle.x = x;
+   selector.swizzle.y = y;
+   selector.swizzle.z = z;
+   selector.swizzle.w = w;
+   selector.swizzle.num_components = count;
+   selector.swizzle.has_duplicates = dup_mask != 0;
+}
+
+
+
 ir_variable::ir_variable(const struct glsl_type *type, const char *name)
    : ir_instruction(ir_op_var_decl), read_only(false), centroid(false),
      invariant(false), mode(ir_var_auto), interpolation(ir_var_smooth)
diff --git a/ir.h b/ir.h
index 7db617d..bbf5354 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -398,6 +398,13 @@ public:
       v->visit(this);
    }
 
+   /**
+    * Setting the swizzle of a derefernce
+    */
+   void set_swizzle(unsigned x, unsigned y, unsigned z, unsigned w,
+                   unsigned count);
+
+
    enum {
       ir_reference_variable,
       ir_reference_array,