cell: propogate blend color to SPUs for the fallback fragment ops code

This commit is contained in:
Brian Paul
2008-10-15 12:35:51 -06:00
parent 5f76a77b31
commit 53951531ae
6 changed files with 74 additions and 9 deletions
+4
View File
@@ -118,12 +118,16 @@
/**
* Command to specify per-fragment operations state and generated code.
* Note that the dsa, blend, blend_color fields are really only needed
* for the fallback/C per-pixel code. They're not used when we generate
* dynamic SPU fragment code (which is the normal case).
*/
struct cell_command_fragment_ops
{
uint64_t opcode; /**< CELL_CMD_STATE_FRAGMENT_OPS */
struct pipe_depth_stencil_alpha_state dsa;
struct pipe_blend_state blend;
struct pipe_blend_color blend_color;
unsigned code[SPU_MAX_FRAGMENT_OPS_INSTS];
};
@@ -74,6 +74,7 @@ struct cell_fragment_shader_state
struct cell_fragment_ops_key
{
struct pipe_blend_state blend;
struct pipe_blend_color blend_color;
struct pipe_depth_stencil_alpha_state dsa;
enum pipe_format color_format;
enum pipe_format zs_format;
@@ -52,6 +52,7 @@ lookup_fragment_ops(struct cell_context *cell)
*/
memset(&key, 0, sizeof(key));
key.blend = *cell->blend;
key.blend_color = cell->blend_color;
key.dsa = *cell->depth_stencil;
if (cell->framebuffer.cbufs[0])
@@ -195,6 +195,7 @@ cmd_state_fragment_ops(const struct cell_command_fragment_ops *fops)
/* Copy state info (for fallback case only) */
memcpy(&spu.depth_stencil_alpha, &fops->dsa, sizeof(fops->dsa));
memcpy(&spu.blend, &fops->blend, sizeof(fops->blend));
memcpy(&spu.blend_color, &fops->blend_color, sizeof(fops->blend_color));
/* Parity twist! For now, always use the fallback code by default,
* only switching to codegen when specifically requested. This
+1
View File
@@ -145,6 +145,7 @@ struct spu_global
struct spu_framebuffer fb;
struct pipe_depth_stencil_alpha_state depth_stencil_alpha;
struct pipe_blend_state blend;
struct pipe_blend_color blend_color;
struct pipe_sampler_state sampler[PIPE_MAX_SAMPLERS];
struct spu_texture texture[PIPE_MAX_SAMPLERS];
struct vertex_info vertex_info;
@@ -260,7 +260,7 @@ spu_fallback_fragment_ops(uint x, uint y,
}
/*
* Compute Src RGB terms
* Compute Src RGB terms (fragment color * factor)
*/
switch (spu.blend.rgb_src_factor) {
case PIPE_BLENDFACTOR_ONE:
@@ -283,13 +283,33 @@ spu_fallback_fragment_ops(uint x, uint y,
term1g = spu_mul(fragG, fragA);
term1b = spu_mul(fragB, fragA);
break;
case PIPE_BLENDFACTOR_DST_COLOR:
term1r = spu_mul(fragR, fbRGBA[0]);
term1g = spu_mul(fragG, fbRGBA[1]);
term1b = spu_mul(fragB, fbRGBA[1]);
break;
case PIPE_BLENDFACTOR_DST_ALPHA:
term1r = spu_mul(fragR, fbRGBA[3]);
term1g = spu_mul(fragG, fbRGBA[3]);
term1b = spu_mul(fragB, fbRGBA[3]);
break;
case PIPE_BLENDFACTOR_CONST_COLOR:
term1r = spu_mul(fragR, spu_splats(spu.blend_color.color[0]));
term1g = spu_mul(fragG, spu_splats(spu.blend_color.color[1]));
term1b = spu_mul(fragB, spu_splats(spu.blend_color.color[2]));
break;
case PIPE_BLENDFACTOR_CONST_ALPHA:
term1r = spu_mul(fragR, spu_splats(spu.blend_color.color[3]));
term1g = spu_mul(fragG, spu_splats(spu.blend_color.color[3]));
term1b = spu_mul(fragB, spu_splats(spu.blend_color.color[3]));
break;
/* XXX more cases */
default:
ASSERT(0);
}
/*
* Compute Src Alpha term
* Compute Src Alpha term (fragment alpha * factor)
*/
switch (spu.blend.alpha_src_factor) {
case PIPE_BLENDFACTOR_ONE:
@@ -301,13 +321,23 @@ spu_fallback_fragment_ops(uint x, uint y,
case PIPE_BLENDFACTOR_SRC_ALPHA:
term1a = spu_mul(fragA, fragA);
break;
case PIPE_BLENDFACTOR_DST_COLOR:
/* fall-through */
case PIPE_BLENDFACTOR_DST_ALPHA:
term1a = spu_mul(fragA, fbRGBA[3]);
break;
case PIPE_BLENDFACTOR_CONST_COLOR:
/* fall-through */
case PIPE_BLENDFACTOR_CONST_ALPHA:
term1a = spu_mul(fragR, spu_splats(spu.blend_color.color[3]));
break;
/* XXX more cases */
default:
ASSERT(0);
}
/*
* Compute Dest RGB terms
* Compute Dest RGB terms (framebuffer color * factor)
*/
switch (spu.blend.rgb_dst_factor) {
case PIPE_BLENDFACTOR_ONE:
@@ -337,17 +367,37 @@ spu_fallback_fragment_ops(uint x, uint y,
term2g = spu_mul(fbRGBA[1], tmp);
term2b = spu_mul(fbRGBA[2], tmp);
break;
/* XXX more cases */
case PIPE_BLENDFACTOR_DST_COLOR:
term2r = spu_mul(fbRGBA[0], fbRGBA[0]);
term2g = spu_mul(fbRGBA[1], fbRGBA[1]);
term2b = spu_mul(fbRGBA[2], fbRGBA[2]);
break;
case PIPE_BLENDFACTOR_DST_ALPHA:
term2r = spu_mul(fbRGBA[0], fbRGBA[3]);
term2g = spu_mul(fbRGBA[1], fbRGBA[3]);
term2b = spu_mul(fbRGBA[2], fbRGBA[3]);
break;
case PIPE_BLENDFACTOR_CONST_COLOR:
term2r = spu_mul(fbRGBA[0], spu_splats(spu.blend_color.color[0]));
term2g = spu_mul(fbRGBA[1], spu_splats(spu.blend_color.color[1]));
term2b = spu_mul(fbRGBA[2], spu_splats(spu.blend_color.color[2]));
break;
case PIPE_BLENDFACTOR_CONST_ALPHA:
term2r = spu_mul(fbRGBA[0], spu_splats(spu.blend_color.color[3]));
term2g = spu_mul(fbRGBA[1], spu_splats(spu.blend_color.color[3]));
term2b = spu_mul(fbRGBA[2], spu_splats(spu.blend_color.color[3]));
break;
/* XXX more cases */
default:
ASSERT(0);
}
/*
* Compute Dest Alpha term
* Compute Dest Alpha term (framebuffer alpha * factor)
*/
switch (spu.blend.alpha_dst_factor) {
case PIPE_BLENDFACTOR_ONE:
term2a = fragA;
term2a = fbRGBA[3];
break;
case PIPE_BLENDFACTOR_SRC_COLOR:
term2a = spu_splats(0.0f);
@@ -360,6 +410,16 @@ spu_fallback_fragment_ops(uint x, uint y,
tmp = spu_sub(one, fragA);
term2a = spu_mul(fbRGBA[3], tmp);
break;
case PIPE_BLENDFACTOR_DST_COLOR:
/* fall-through */
case PIPE_BLENDFACTOR_DST_ALPHA:
term2a = spu_mul(fbRGBA[3], fbRGBA[3]);
break;
case PIPE_BLENDFACTOR_CONST_COLOR:
/* fall-through */
case PIPE_BLENDFACTOR_CONST_ALPHA:
term2a = spu_mul(fbRGBA[3], spu_splats(spu.blend_color.color[3]));
break;
/* XXX more cases */
default:
ASSERT(0);
@@ -394,9 +454,7 @@ spu_fallback_fragment_ops(uint x, uint y,
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);
}
@@ -419,7 +477,6 @@ spu_fallback_fragment_ops(uint x, uint y,
case PIPE_BLEND_MAX:
fragA = spu_max(term1a, term2a);
break;
/* XXX more cases */
default:
ASSERT(0);
}