mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-29 00:50:23 +01:00
Cell: texture sampler functions always return vector float now
Texture colors look the same now, regardless of X display/pixel format
This commit is contained in:
parent
71e6cd0b66
commit
790eec9666
4 changed files with 29 additions and 32 deletions
|
|
@ -115,7 +115,7 @@ struct spu_global
|
|||
vector float tex_size;
|
||||
vector unsigned int tex_size_mask; /**< == int(size - 1) */
|
||||
|
||||
uint (*sample_texture)(vector float texcoord);
|
||||
vector float (*sample_texture)(vector float texcoord);
|
||||
|
||||
} ALIGN16_ATTRIB;
|
||||
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ get_tex_tile(vector unsigned int ij)
|
|||
* Get texture sample at texcoord.
|
||||
* XXX this is extremely primitive for now.
|
||||
*/
|
||||
uint
|
||||
vector float
|
||||
sample_texture_nearest(vector float texcoord)
|
||||
{
|
||||
vector float tc = spu_mul(texcoord, spu.tex_size);
|
||||
|
|
@ -139,11 +139,11 @@ sample_texture_nearest(vector float texcoord)
|
|||
vector unsigned int ij = spu_and(itc, TILE_SIZE-1); /* intra tile addr */
|
||||
uint pos = get_tex_tile(itc);
|
||||
uint texel = tex_tiles[pos].ui[spu_extract(ij, 1)][spu_extract(ij, 0)];
|
||||
return texel;
|
||||
return spu_unpack_A8R8G8B8(texel);
|
||||
}
|
||||
|
||||
|
||||
uint
|
||||
vector float
|
||||
sample_texture_bilinear(vector float texcoord)
|
||||
{
|
||||
static const vector unsigned int offset10 = {1, 0, 0, 0};
|
||||
|
|
@ -183,10 +183,10 @@ sample_texture_bilinear(vector float texcoord)
|
|||
}
|
||||
|
||||
/* get texels from tiles and convert to float[4] */
|
||||
vector float texel00 = spu_unpack_color(tex_tiles[pos00].ui[spu_extract(ij00, 1)][spu_extract(ij00, 0)]);
|
||||
vector float texel01 = spu_unpack_color(tex_tiles[pos01].ui[spu_extract(ij01, 1)][spu_extract(ij01, 0)]);
|
||||
vector float texel10 = spu_unpack_color(tex_tiles[pos10].ui[spu_extract(ij10, 1)][spu_extract(ij10, 0)]);
|
||||
vector float texel11 = spu_unpack_color(tex_tiles[pos11].ui[spu_extract(ij11, 1)][spu_extract(ij11, 0)]);
|
||||
vector float texel00 = spu_unpack_A8R8G8B8(tex_tiles[pos00].ui[spu_extract(ij00, 1)][spu_extract(ij00, 0)]);
|
||||
vector float texel01 = spu_unpack_A8R8G8B8(tex_tiles[pos01].ui[spu_extract(ij01, 1)][spu_extract(ij01, 0)]);
|
||||
vector float texel10 = spu_unpack_A8R8G8B8(tex_tiles[pos10].ui[spu_extract(ij10, 1)][spu_extract(ij10, 0)]);
|
||||
vector float texel11 = spu_unpack_A8R8G8B8(tex_tiles[pos11].ui[spu_extract(ij11, 1)][spu_extract(ij11, 0)]);
|
||||
|
||||
/* Compute weighting factors in [0,1]
|
||||
* Multiply texcoord by 1024, AND with 1023, convert back to float.
|
||||
|
|
@ -213,8 +213,5 @@ sample_texture_bilinear(vector float texcoord)
|
|||
texel_sum = spu_add(texel_sum, texel10);
|
||||
texel_sum = spu_add(texel_sum, texel11);
|
||||
|
||||
/* convert to uint color */
|
||||
uint texel = spu_pack_R8G8B8A8(texel_sum);
|
||||
|
||||
return texel;
|
||||
return texel_sum;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,11 +36,11 @@ extern void
|
|||
invalidate_tex_cache(void);
|
||||
|
||||
|
||||
extern uint
|
||||
extern vector float
|
||||
sample_texture_nearest(vector float texcoord);
|
||||
|
||||
|
||||
extern uint
|
||||
extern vector float
|
||||
sample_texture_bilinear(vector float texcoord);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -301,6 +301,8 @@ emit_quad( int x, int y, mask_t mask )
|
|||
if (spu_extract(spu_orx(mask), 0)) {
|
||||
const int ix = x - setup.cliprect_minx;
|
||||
const int iy = y - setup.cliprect_miny;
|
||||
const vector unsigned char shuffle = spu.color_shuffle;
|
||||
vector float colors[4];
|
||||
|
||||
spu.cur_ctile_status = TILE_STATUS_DIRTY;
|
||||
|
||||
|
|
@ -310,34 +312,32 @@ emit_quad( int x, int y, mask_t mask )
|
|||
eval_coeff(2, (float) x, (float) y, texcoords);
|
||||
|
||||
if (spu_extract(mask, 0))
|
||||
spu.ctile.ui[iy][ix] = spu.sample_texture(texcoords[0]);
|
||||
colors[0] = spu.sample_texture(texcoords[0]);
|
||||
if (spu_extract(mask, 1))
|
||||
spu.ctile.ui[iy][ix+1] = spu.sample_texture(texcoords[1]);
|
||||
colors[1] = spu.sample_texture(texcoords[1]);
|
||||
if (spu_extract(mask, 2))
|
||||
spu.ctile.ui[iy+1][ix] = spu.sample_texture(texcoords[2]);
|
||||
colors[2] = spu.sample_texture(texcoords[2]);
|
||||
if (spu_extract(mask, 3))
|
||||
spu.ctile.ui[iy+1][ix+1] = spu.sample_texture(texcoords[3]);
|
||||
colors[3] = spu.sample_texture(texcoords[3]);
|
||||
}
|
||||
else {
|
||||
/* simple shading */
|
||||
const vector unsigned char shuffle = spu.color_shuffle;
|
||||
vector float colors[4];
|
||||
eval_coeff(1, (float) x, (float) y, colors);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (spu.blend.blend_enable)
|
||||
blend_quad(ix % TILE_SIZE, iy % TILE_SIZE, colors);
|
||||
#if 1
|
||||
if (spu.blend.blend_enable)
|
||||
blend_quad(ix % TILE_SIZE, iy % TILE_SIZE, colors);
|
||||
#endif
|
||||
|
||||
if (spu_extract(mask, 0))
|
||||
spu.ctile.ui[iy][ix] = spu_pack_color_shuffle(colors[0], shuffle);
|
||||
if (spu_extract(mask, 1))
|
||||
spu.ctile.ui[iy][ix+1] = spu_pack_color_shuffle(colors[1], shuffle);
|
||||
if (spu_extract(mask, 2))
|
||||
spu.ctile.ui[iy+1][ix] = spu_pack_color_shuffle(colors[2], shuffle);
|
||||
if (spu_extract(mask, 3))
|
||||
spu.ctile.ui[iy+1][ix+1] = spu_pack_color_shuffle(colors[3], shuffle);
|
||||
}
|
||||
if (spu_extract(mask, 0))
|
||||
spu.ctile.ui[iy][ix] = spu_pack_color_shuffle(colors[0], shuffle);
|
||||
if (spu_extract(mask, 1))
|
||||
spu.ctile.ui[iy][ix+1] = spu_pack_color_shuffle(colors[1], shuffle);
|
||||
if (spu_extract(mask, 2))
|
||||
spu.ctile.ui[iy+1][ix] = spu_pack_color_shuffle(colors[2], shuffle);
|
||||
if (spu_extract(mask, 3))
|
||||
spu.ctile.ui[iy+1][ix+1] = spu_pack_color_shuffle(colors[3], shuffle);
|
||||
|
||||
#if 0
|
||||
/* SIMD_Z with swizzled color buffer (someday) */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue