Cell: checkpoint: start to SIMD-ize texture sampling

This commit is contained in:
Brian 2008-02-04 09:54:21 -07:00
parent e967a5c746
commit 18105195a8
5 changed files with 33 additions and 8 deletions

View file

@ -263,6 +263,16 @@ cmd_state_texture(const struct cell_command_texture *texture)
spu.init.id, texture->start, texture->width, texture->height);
memcpy(&spu.texture, texture, sizeof(*texture));
spu.tex_size = VEC_LITERAL(vector float,
spu.texture.width,
spu.texture.height,
0.0,
0.0);
spu.tex_size_mask = VEC_LITERAL(vector unsigned int,
spu.texture.width - 1,
spu.texture.height - 1,
0,
0);
}

View file

@ -110,6 +110,10 @@ struct spu_global
/** for converting RGBA to PIPE_FORMAT_x colors */
vector unsigned char color_shuffle;
vector float tex_size;
vector unsigned int tex_size_mask; /**< == int(size - 1) */
} ALIGN16_ATTRIB;

View file

@ -128,12 +128,23 @@ get_tex_tile(uint i, uint j)
* XXX this is extremely primitive for now.
*/
uint
sample_texture(float4 texcoord)
sample_texture(vector float texcoord)
{
#if 0
/* wrap/repeat */
uint i = (uint) (texcoord.f[0] * spu.texture.width) % spu.texture.width;
uint j = (uint) (texcoord.f[1] * spu.texture.height) % spu.texture.height;
uint i = (uint) (spu_extract(texcoord, 0) * spu.texture.width) % spu.texture.width;
uint j = (uint) (spu_extract(texcoord, 1) * spu.texture.height) % spu.texture.height;
uint pos = get_tex_tile(i, j);
uint texel = tex_tiles[pos].ui[j % TILE_SIZE][i % TILE_SIZE];
return texel;
#else
vector float tc = spu_mul(texcoord, spu.tex_size);
vector unsigned int itc = spu_convtu(tc, 0);
itc = spu_and(itc, spu.tex_size_mask);
uint i = spu_extract(itc, 0);
uint j = spu_extract(itc, 1);
uint pos = get_tex_tile(i, j);
uint texel = tex_tiles[pos].ui[j % TILE_SIZE][i % TILE_SIZE];
return texel;
#endif
}

View file

@ -37,7 +37,7 @@ invalidate_tex_cache(void);
extern uint
sample_texture(float4 texcoord);
sample_texture(vector float texcoord);
#endif /* SPU_TEXTURE_H */

View file

@ -309,13 +309,13 @@ 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] = sample_texture(texcoords[0]);
spu.ctile.ui[iy][ix] = sample_texture(texcoords[0].v);
if (spu_extract(mask, 1))
spu.ctile.ui[iy][ix+1] = sample_texture(texcoords[1]);
spu.ctile.ui[iy][ix+1] = sample_texture(texcoords[1].v);
if (spu_extract(mask, 2))
spu.ctile.ui[iy+1][ix] = sample_texture(texcoords[2]);
spu.ctile.ui[iy+1][ix] = sample_texture(texcoords[2].v);
if (spu_extract(mask, 3))
spu.ctile.ui[iy+1][ix+1] = sample_texture(texcoords[3]);
spu.ctile.ui[iy+1][ix+1] = sample_texture(texcoords[3].v);
}
else {
/* simple shading */