OSDN Git Service

r300/compiler: add a function for swizzling a mask
authorMarek Olšák <maraeo@gmail.com>
Thu, 25 Nov 2010 03:34:31 +0000 (04:34 +0100)
committerMarek Olšák <maraeo@gmail.com>
Fri, 26 Nov 2010 01:23:13 +0000 (02:23 +0100)
src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
src/mesa/drivers/dri/r300/compiler/radeon_program.h

index 27b10ff..44f4c0f 100644 (file)
@@ -54,12 +54,7 @@ static struct rc_src_register chain_srcregs(struct rc_src_register outer, struct
                combine.Negate = outer.Negate;
        } else {
                combine.Abs = inner.Abs;
-               combine.Negate = 0;
-               for(unsigned int chan = 0; chan < 4; ++chan) {
-                       unsigned int swz = GET_SWZ(outer.Swizzle, chan);
-                       if (swz < 4)
-                               combine.Negate |= GET_BIT(inner.Negate, swz) << chan;
-               }
+               combine.Negate = swizzle_mask(outer.Swizzle, inner.Negate);
                combine.Negate ^= outer.Negate;
        }
        combine.Swizzle = combine_swizzles(inner.Swizzle, outer.Swizzle);
index 913815b..772ea14 100644 (file)
@@ -204,6 +204,20 @@ static inline rc_swizzle rc_mask_to_swizzle(unsigned int mask)
        }
        return RC_SWIZZLE_UNUSED;
 }
+
+/* Reorder mask bits according to swizzle. */
+static inline unsigned swizzle_mask(unsigned swizzle, unsigned mask)
+{
+       unsigned ret = 0;
+       for (unsigned chan = 0; chan < 4; ++chan) {
+               unsigned swz = GET_SWZ(swizzle, chan);
+               if (swz < 4)
+                       ret |= GET_BIT(mask, swz) << chan;
+       }
+       return ret;
+}
+
+
 struct rc_src_register lmul_swizzle(unsigned int swizzle, struct rc_src_register srcreg);
 
 static inline void reset_srcreg(struct rc_src_register* reg)