diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2008-10-15 10:53:48 -0600 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2008-10-15 10:54:57 -0600 | 
| commit | 4e506f422a13b20fcc95edb6c7048a9de6e32efa (patch) | |
| tree | c229daebf44b02cb0ea251fc114843000bb31e39 | |
| parent | abcd28b0b3fb77d3f99da957faa94e21ed54cae6 (diff) | |
cell: fix/add some fallback blend cases
| -rw-r--r-- | src/gallium/drivers/cell/spu/spu_per_fragment_op.c | 49 | 
1 files changed, 46 insertions, 3 deletions
| diff --git a/src/gallium/drivers/cell/spu/spu_per_fragment_op.c b/src/gallium/drivers/cell/spu/spu_per_fragment_op.c index d252fa6dc1..9404704abf 100644 --- a/src/gallium/drivers/cell/spu/spu_per_fragment_op.c +++ b/src/gallium/drivers/cell/spu/spu_per_fragment_op.c @@ -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); | 
