From c23fd547c060c4137eab0f878a1028c5903384eb Mon Sep 17 00:00:00 2001 From: James Benton Date: Wed, 25 Apr 2012 11:19:07 +0100 Subject: [PATCH] gallivm: Added lp_build_const_mask_aos_swizzled MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Allows the creation of const aos masks which have the mask swizzled to match the correct format. Updated existing mask creation code to use the swizzled version where necessary (tgsi register masks and llvmpipe aos blending). Signed-off-by: José Fonseca --- src/gallium/auxiliary/gallivm/lp_bld_const.c | 19 +++++++++++++++++++ src/gallium/auxiliary/gallivm/lp_bld_const.h | 7 +++++++ .../auxiliary/gallivm/lp_bld_tgsi_aos.c | 6 ++++-- .../drivers/llvmpipe/lp_bld_blend_aos.c | 10 +--------- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_const.c b/src/gallium/auxiliary/gallivm/lp_bld_const.c index 6d8b7c26fc8..77ec1a70860 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_const.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_const.c @@ -409,3 +409,22 @@ lp_build_const_mask_aos(struct gallivm_state *gallivm, 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); +} diff --git a/src/gallium/auxiliary/gallivm/lp_bld_const.h b/src/gallium/auxiliary/gallivm/lp_bld_const.h index 69718eb4b3d..fd398516952 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_const.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_const.h @@ -111,6 +111,13 @@ lp_build_const_mask_aos(struct gallivm_state *gallivm, 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) { diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c index 19652d13f3c..24bc13a9be8 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c @@ -325,8 +325,10 @@ lp_emit_store_aos( 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, ""); diff --git a/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c b/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c index e67286baf5e..59d5f545966 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c @@ -380,16 +380,8 @@ lp_build_blend_aos(struct gallivm_state *gallivm, 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 */ -- 2.30.2