mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 00:49:04 +02:00
Cell: checkpoint: start to SIMD-ize texture sampling
This commit is contained in:
parent
e967a5c746
commit
18105195a8
5 changed files with 33 additions and 8 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ invalidate_tex_cache(void);
|
|||
|
||||
|
||||
extern uint
|
||||
sample_texture(float4 texcoord);
|
||||
sample_texture(vector float texcoord);
|
||||
|
||||
|
||||
#endif /* SPU_TEXTURE_H */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue