gallivm: Added lp_build_const_mask_aos_swizzled
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 <jfonseca@vmware.com>
This commit is contained in:
parent
7d1f414103
commit
c23fd547c0
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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, "");
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue