cell: fix/add some fallback blend cases

This commit is contained in:
Brian Paul
2008-10-15 10:53:48 -06:00
parent abcd28b0b3
commit 4e506f422a
@@ -40,6 +40,24 @@
#define LINEAR_QUAD_LAYOUT 1
static INLINE vector float
spu_min(vector float a, vector float b)
{
vector unsigned int m;
m = spu_cmpgt(a, b); /* m = a > b ? ~0 : 0 */
return spu_sel(a, b, m);
}
static INLINE vector float
spu_max(vector float a, vector float b)
{
vector unsigned int m;
m = spu_cmpgt(a, b); /* m = a > b ? ~0 : 0 */
return spu_sel(b, a, m);
}
/**
* Called by rasterizer for each quad after the shader has run. Do
* all the per-fragment operations including alpha test, z test,
@@ -293,9 +311,9 @@ spu_fallback_fragment_ops(uint x, uint y,
*/
switch (spu.blend.rgb_dst_factor) {
case PIPE_BLENDFACTOR_ONE:
term2r = fragR;
term2g = fragG;
term2b = fragB;
term2r = fbRGBA[0];
term2g = fbRGBA[1];
term2b = fbRGBA[2];
break;
case PIPE_BLENDFACTOR_ZERO:
term2r =
@@ -361,8 +379,24 @@ spu_fallback_fragment_ops(uint x, uint y,
fragG = spu_sub(term1g, term2g);
fragB = spu_sub(term1b, term2b);
break;
case PIPE_BLEND_REVERSE_SUBTRACT:
fragR = spu_sub(term2r, term1r);
fragG = spu_sub(term2g, term1g);
fragB = spu_sub(term2b, term1b);
break;
case PIPE_BLEND_MIN:
fragR = spu_min(term1r, term2r);
fragG = spu_min(term1g, term2g);
fragB = spu_min(term1b, term2b);
break;
case PIPE_BLEND_MAX:
fragR = spu_max(term1r, term2r);
fragG = spu_max(term1g, term2g);
fragB = spu_max(term1b, term2b);
break;
/* XXX more cases */
default:
printf("unsup 0x%x\n", spu.blend.rgb_func);
ASSERT(0);
}
@@ -376,6 +410,15 @@ spu_fallback_fragment_ops(uint x, uint y,
case PIPE_BLEND_SUBTRACT:
fragA = spu_sub(term1a, term2a);
break;
case PIPE_BLEND_REVERSE_SUBTRACT:
fragA = spu_sub(term2a, term1a);
break;
case PIPE_BLEND_MIN:
fragA = spu_min(term1a, term2a);
break;
case PIPE_BLEND_MAX:
fragA = spu_max(term1a, term2a);
break;
/* XXX more cases */
default:
ASSERT(0);