From: Ian Romanick Date: Wed, 24 Mar 2010 22:12:21 +0000 (-0700) Subject: Add method to set the swizzle of an ir_dereference X-Git-Tag: 062012170305~10660^2~625^2~602 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2f4240fb0276bd18b86adadd41664ca0c9f10da6;p=profile%2Fivi%2Fmesa.git Add method to set the swizzle of an ir_dereference --- diff --git a/ir.cpp b/ir.cpp index 26e7394..49df754 100644 --- 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 --- 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,