return LLVMConstVector(masks, type.length);
}
+
+
+/**
+ * Performs lp_build_const_mask_aos, but first swizzles the mask
+ */
+LLVMValueRef
+lp_build_const_mask_aos_swizzled(struct gallivm_state *gallivm,
+ struct lp_type type,
+ unsigned mask,
+ const unsigned char *swizzle)
+{
+ mask =
+ ((mask & (1 << swizzle[0])) >> swizzle[0])
+ | (((mask & (1 << swizzle[1])) >> swizzle[1]) << 1)
+ | (((mask & (1 << swizzle[2])) >> swizzle[2]) << 2)
+ | (((mask & (1 << swizzle[3])) >> swizzle[3]) << 3);
+
+ return lp_build_const_mask_aos(gallivm, type, mask);
+}
unsigned mask);
+LLVMValueRef
+lp_build_const_mask_aos_swizzled(struct gallivm_state *gallivm,
+ struct lp_type type,
+ unsigned mask,
+ const unsigned char *swizzle);
+
+
static INLINE LLVMValueRef
lp_build_const_int32(struct gallivm_state *gallivm, int i)
{
if (reg->Register.WriteMask != TGSI_WRITEMASK_XYZW) {
LLVMValueRef writemask;
- writemask = lp_build_const_mask_aos(bld->bld_base.base.gallivm, bld->bld_base.base.type,
- reg->Register.WriteMask);
+ writemask = lp_build_const_mask_aos_swizzled(bld->bld_base.base.gallivm,
+ bld->bld_base.base.type,
+ reg->Register.WriteMask,
+ bld->swizzles);
if (mask) {
mask = LLVMBuildAnd(builder, mask, writemask, "");
if (!fullcolormask) {
LLVMValueRef color_mask;
- unsigned color_mask_swizzle;
- /* Swizzle the color mask to ensure it matches target format */
- color_mask_swizzle =
- ((blend->rt[rt].colormask & (1 << swizzle[0])) >> swizzle[0])
- | (((blend->rt[rt].colormask & (1 << swizzle[1])) >> swizzle[1]) << 1)
- | (((blend->rt[rt].colormask & (1 << swizzle[2])) >> swizzle[2]) << 2)
- | (((blend->rt[rt].colormask & (1 << swizzle[3])) >> swizzle[3]) << 3);
-
- color_mask = lp_build_const_mask_aos(gallivm, bld.base.type, color_mask_swizzle);
+ color_mask = lp_build_const_mask_aos_swizzled(gallivm, bld.base.type, blend->rt[rt].colormask, swizzle);
lp_build_name(color_mask, "color_mask");
/* Combine with input mask if necessary */