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);
}
/** 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;
* 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
}
extern uint
-sample_texture(float4 texcoord);
+sample_texture(vector float texcoord);
#endif /* SPU_TEXTURE_H */
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 */