cell: implement colormask on fallback path
Also, some var renaming and additional comments
This commit is contained in:
@@ -60,9 +60,12 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
vector unsigned int mask)
|
||||
{
|
||||
vector float frag_aos[4];
|
||||
unsigned int c0, c1, c2, c3;
|
||||
unsigned int fbc0, fbc1, fbc2, fbc3 ; /* framebuffer/tile colors */
|
||||
unsigned int fragc0, fragc1, fragc2, fragc3; /* fragment colors */
|
||||
|
||||
/* do alpha test */
|
||||
/*
|
||||
* Do alpha test
|
||||
*/
|
||||
if (spu.depth_stencil_alpha.alpha.enabled) {
|
||||
vector float ref = spu_splats(spu.depth_stencil_alpha.alpha.ref);
|
||||
vector unsigned int amask;
|
||||
@@ -102,7 +105,10 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
mask = spu_and(mask, amask);
|
||||
}
|
||||
|
||||
/* Z and/or stencil testing... */
|
||||
|
||||
/*
|
||||
* Z and/or stencil testing...
|
||||
*/
|
||||
if (spu.depth_stencil_alpha.depth.enabled ||
|
||||
spu.depth_stencil_alpha.stencil[0].enabled) {
|
||||
|
||||
@@ -178,6 +184,32 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If we'll need the current framebuffer/tile colors for blending
|
||||
* or logicop or colormask, fetch them now.
|
||||
*/
|
||||
if (spu.blend.blend_enable ||
|
||||
spu.blend.logicop_enable ||
|
||||
spu.blend.colormask != 0xf) {
|
||||
|
||||
#if LINEAR_QUAD_LAYOUT /* See comments/diagram below */
|
||||
fbc0 = colorTile->ui[y][x*2+0];
|
||||
fbc1 = colorTile->ui[y][x*2+1];
|
||||
fbc2 = colorTile->ui[y][x*2+2];
|
||||
fbc3 = colorTile->ui[y][x*2+3];
|
||||
#else
|
||||
fbc0 = colorTile->ui[y+0][x+0];
|
||||
fbc1 = colorTile->ui[y+0][x+1];
|
||||
fbc2 = colorTile->ui[y+1][x+0];
|
||||
fbc3 = colorTile->ui[y+1][x+1];
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Do blending
|
||||
*/
|
||||
if (spu.blend.blend_enable) {
|
||||
/* blending terms, misc regs */
|
||||
vector float term1r, term1g, term1b, term1a;
|
||||
@@ -186,39 +218,26 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
|
||||
vector float fbRGBA[4]; /* current framebuffer colors */
|
||||
|
||||
/* get colors from framebuffer/tile */
|
||||
/* convert framebuffer colors from packed int to vector float */
|
||||
{
|
||||
vector float fc[4];
|
||||
uint c0, c1, c2, c3;
|
||||
|
||||
#if LINEAR_QUAD_LAYOUT /* See comments/diagram below */
|
||||
c0 = colorTile->ui[y][x*2+0];
|
||||
c1 = colorTile->ui[y][x*2+1];
|
||||
c2 = colorTile->ui[y][x*2+2];
|
||||
c3 = colorTile->ui[y][x*2+3];
|
||||
#else
|
||||
c0 = colorTile->ui[y+0][x+0];
|
||||
c1 = colorTile->ui[y+0][x+1];
|
||||
c2 = colorTile->ui[y+1][x+0];
|
||||
c3 = colorTile->ui[y+1][x+1];
|
||||
#endif
|
||||
vector float temp[4]; /* float colors in AOS form */
|
||||
switch (spu.fb.color_format) {
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||
fc[0] = spu_unpack_B8G8R8A8(c0);
|
||||
fc[1] = spu_unpack_B8G8R8A8(c1);
|
||||
fc[2] = spu_unpack_B8G8R8A8(c2);
|
||||
fc[3] = spu_unpack_B8G8R8A8(c3);
|
||||
temp[0] = spu_unpack_B8G8R8A8(fbc0);
|
||||
temp[1] = spu_unpack_B8G8R8A8(fbc1);
|
||||
temp[2] = spu_unpack_B8G8R8A8(fbc2);
|
||||
temp[3] = spu_unpack_B8G8R8A8(fbc3);
|
||||
break;
|
||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||
fc[0] = spu_unpack_A8R8G8B8(c0);
|
||||
fc[1] = spu_unpack_A8R8G8B8(c1);
|
||||
fc[2] = spu_unpack_A8R8G8B8(c2);
|
||||
fc[3] = spu_unpack_A8R8G8B8(c3);
|
||||
temp[0] = spu_unpack_A8R8G8B8(fbc0);
|
||||
temp[1] = spu_unpack_A8R8G8B8(fbc1);
|
||||
temp[2] = spu_unpack_A8R8G8B8(fbc2);
|
||||
temp[3] = spu_unpack_A8R8G8B8(fbc3);
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
}
|
||||
_transpose_matrix4x4(fbRGBA, fc);
|
||||
_transpose_matrix4x4(fbRGBA, temp); /* fbRGBA = transpose(temp) */
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -384,21 +403,20 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Pack float colors into 32-bit RGBA words.
|
||||
* Pack fragment float colors into 32-bit RGBA words.
|
||||
*/
|
||||
switch (spu.fb.color_format) {
|
||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||
c0 = spu_pack_A8R8G8B8(frag_aos[0]);
|
||||
c1 = spu_pack_A8R8G8B8(frag_aos[1]);
|
||||
c2 = spu_pack_A8R8G8B8(frag_aos[2]);
|
||||
c3 = spu_pack_A8R8G8B8(frag_aos[3]);
|
||||
fragc0 = spu_pack_A8R8G8B8(frag_aos[0]);
|
||||
fragc1 = spu_pack_A8R8G8B8(frag_aos[1]);
|
||||
fragc2 = spu_pack_A8R8G8B8(frag_aos[2]);
|
||||
fragc3 = spu_pack_A8R8G8B8(frag_aos[3]);
|
||||
break;
|
||||
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||
c0 = spu_pack_B8G8R8A8(frag_aos[0]);
|
||||
c1 = spu_pack_B8G8R8A8(frag_aos[1]);
|
||||
c2 = spu_pack_B8G8R8A8(frag_aos[2]);
|
||||
c3 = spu_pack_B8G8R8A8(frag_aos[3]);
|
||||
fragc0 = spu_pack_B8G8R8A8(frag_aos[0]);
|
||||
fragc1 = spu_pack_B8G8R8A8(frag_aos[1]);
|
||||
fragc2 = spu_pack_B8G8R8A8(frag_aos[2]);
|
||||
fragc3 = spu_pack_B8G8R8A8(frag_aos[3]);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "SPU: Bad pixel format in spu_default_fragment_ops\n");
|
||||
@@ -407,20 +425,57 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
|
||||
|
||||
/*
|
||||
* Color masking
|
||||
* Do color masking
|
||||
*/
|
||||
if (spu.blend.colormask != 0xf) {
|
||||
/* XXX to do */
|
||||
/* apply color mask to 32-bit packed colors */
|
||||
uint cmask = 0x0; /* each byte corresponds to a color channel */
|
||||
|
||||
/* Form bitmask depending on color buffer format and colormask bits */
|
||||
switch (spu.fb.color_format) {
|
||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||
if (spu.blend.colormask & (1<<0))
|
||||
cmask |= 0x00ff0000; /* red */
|
||||
if (spu.blend.colormask & (1<<1))
|
||||
cmask |= 0x0000ff00; /* green */
|
||||
if (spu.blend.colormask & (1<<2))
|
||||
cmask |= 0x000000ff; /* blue */
|
||||
if (spu.blend.colormask & (1<<3))
|
||||
cmask |= 0xff000000; /* alpha */
|
||||
break;
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||
if (spu.blend.colormask & (1<<0))
|
||||
cmask |= 0x0000ff00; /* red */
|
||||
if (spu.blend.colormask & (1<<1))
|
||||
cmask |= 0x00ff0000; /* green */
|
||||
if (spu.blend.colormask & (1<<2))
|
||||
cmask |= 0xff000000; /* blue */
|
||||
if (spu.blend.colormask & (1<<3))
|
||||
cmask |= 0x000000ff; /* alpha */
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Apply color mask to the 32-bit packed colors.
|
||||
* if (cmask[i])
|
||||
* frag color[i] = frag color[i];
|
||||
* else
|
||||
* frag color[i] = framebuffer color[i];
|
||||
*/
|
||||
fragc0 = (fragc0 & cmask) | (fbc0 & ~cmask);
|
||||
fragc1 = (fragc1 & cmask) | (fbc1 & ~cmask);
|
||||
fragc2 = (fragc2 & cmask) | (fbc2 & ~cmask);
|
||||
fragc3 = (fragc3 & cmask) | (fbc3 & ~cmask);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Logic Ops
|
||||
* Do logic ops
|
||||
*/
|
||||
if (spu.blend.logicop_enable) {
|
||||
/* XXX to do */
|
||||
/* apply logicop to 32-bit packed colors */
|
||||
/* apply logicop to 32-bit packed colors (fragcx and fbcx) */
|
||||
}
|
||||
|
||||
|
||||
@@ -431,45 +486,46 @@ spu_fallback_fragment_ops(uint x, uint y,
|
||||
spu.cur_ctile_status = TILE_STATUS_DIRTY;
|
||||
}
|
||||
else {
|
||||
/* write no fragments */
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Write new quad colors to the framebuffer/tile.
|
||||
* Write new fragment/quad colors to the framebuffer/tile.
|
||||
* Only write pixels where the corresponding mask word is set.
|
||||
*/
|
||||
#if LINEAR_QUAD_LAYOUT
|
||||
/*
|
||||
* Quad layout:
|
||||
* +--+--+--+--+
|
||||
* |p0|p1|p2|p3|
|
||||
* |p0|p1|p2|p3|...
|
||||
* +--+--+--+--+
|
||||
*/
|
||||
if (spu_extract(mask, 0))
|
||||
colorTile->ui[y][x*2] = c0;
|
||||
colorTile->ui[y][x*2] = fragc0;
|
||||
if (spu_extract(mask, 1))
|
||||
colorTile->ui[y][x*2+1] = c1;
|
||||
colorTile->ui[y][x*2+1] = fragc1;
|
||||
if (spu_extract(mask, 2))
|
||||
colorTile->ui[y][x*2+2] = c2;
|
||||
colorTile->ui[y][x*2+2] = fragc2;
|
||||
if (spu_extract(mask, 3))
|
||||
colorTile->ui[y][x*2+3] = c3;
|
||||
colorTile->ui[y][x*2+3] = fragc3;
|
||||
#else
|
||||
/*
|
||||
* Quad layout:
|
||||
* +--+--+
|
||||
* |p0|p1|
|
||||
* |p0|p1|...
|
||||
* +--+--+
|
||||
* |p2|p3|
|
||||
* |p2|p3|...
|
||||
* +--+--+
|
||||
*/
|
||||
if (spu_extract(mask, 0))
|
||||
colorTile->ui[y+0][x+0] = c0;
|
||||
colorTile->ui[y+0][x+0] = fragc0;
|
||||
if (spu_extract(mask, 1))
|
||||
colorTile->ui[y+0][x+1] = c1;
|
||||
colorTile->ui[y+0][x+1] = fragc1;
|
||||
if (spu_extract(mask, 2))
|
||||
colorTile->ui[y+1][x+0] = c2;
|
||||
colorTile->ui[y+1][x+0] = fragc2;
|
||||
if (spu_extract(mask, 3))
|
||||
colorTile->ui[y+1][x+1] = c3;
|
||||
colorTile->ui[y+1][x+1] = fragc3;
|
||||
#endif
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user