llvmpipe: Make rgb/alpha bland func/factors match, when there is no alpha.

Makes AoS blending easier, and state more canonical.
This commit is contained in:
José Fonseca 2010-09-22 15:02:10 +01:00
parent 9a8e9f4595
commit 87267c71f6
1 changed files with 8 additions and 14 deletions

View File

@ -1049,7 +1049,7 @@ llvmpipe_set_constant_buffer(struct pipe_context *pipe,
* Return the blend factor equivalent to a destination alpha of one. * Return the blend factor equivalent to a destination alpha of one.
*/ */
static INLINE unsigned static INLINE unsigned
force_dst_alpha_one(unsigned factor, boolean alpha) force_dst_alpha_one(unsigned factor)
{ {
switch(factor) { switch(factor) {
case PIPE_BLENDFACTOR_DST_ALPHA: case PIPE_BLENDFACTOR_DST_ALPHA:
@ -1060,15 +1060,6 @@ force_dst_alpha_one(unsigned factor, boolean alpha)
return PIPE_BLENDFACTOR_ZERO; return PIPE_BLENDFACTOR_ZERO;
} }
if (alpha) {
switch(factor) {
case PIPE_BLENDFACTOR_DST_COLOR:
return PIPE_BLENDFACTOR_ONE;
case PIPE_BLENDFACTOR_INV_DST_COLOR:
return PIPE_BLENDFACTOR_ZERO;
}
}
return factor; return factor;
} }
@ -1145,12 +1136,15 @@ make_variant_key(struct llvmpipe_context *lp,
* *
* TODO: This should be generalized to all channels for better * TODO: This should be generalized to all channels for better
* performance, but only alpha causes correctness issues. * performance, but only alpha causes correctness issues.
*
* Also, force rgb/alpha func/factors match, to make AoS blending easier.
*/ */
if (format_desc->swizzle[3] > UTIL_FORMAT_SWIZZLE_W) { if (format_desc->swizzle[3] > UTIL_FORMAT_SWIZZLE_W) {
blend_rt->rgb_src_factor = force_dst_alpha_one(blend_rt->rgb_src_factor, FALSE); blend_rt->rgb_src_factor = force_dst_alpha_one(blend_rt->rgb_src_factor);
blend_rt->rgb_dst_factor = force_dst_alpha_one(blend_rt->rgb_dst_factor, FALSE); blend_rt->rgb_dst_factor = force_dst_alpha_one(blend_rt->rgb_dst_factor);
blend_rt->alpha_src_factor = force_dst_alpha_one(blend_rt->alpha_src_factor, TRUE); blend_rt->alpha_func = blend_rt->rgb_func;
blend_rt->alpha_dst_factor = force_dst_alpha_one(blend_rt->alpha_dst_factor, TRUE); blend_rt->alpha_src_factor = blend_rt->rgb_src_factor;
blend_rt->alpha_dst_factor = blend_rt->rgb_dst_factor;
} }
} }