cell: propogate blend color to SPUs for the fallback fragment ops code
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user