diff options
| -rw-r--r-- | src/mesa/pipe/cell/spu/spu_main.c | 10 | ||||
| -rw-r--r-- | src/mesa/pipe/cell/spu/spu_main.h | 4 | ||||
| -rw-r--r-- | src/mesa/pipe/cell/spu/spu_texture.c | 17 | ||||
| -rw-r--r-- | src/mesa/pipe/cell/spu/spu_texture.h | 2 | ||||
| -rw-r--r-- | src/mesa/pipe/cell/spu/spu_tri.c | 8 | 
5 files changed, 33 insertions, 8 deletions
| diff --git a/src/mesa/pipe/cell/spu/spu_main.c b/src/mesa/pipe/cell/spu/spu_main.c index ba4d180cc0..412661061a 100644 --- a/src/mesa/pipe/cell/spu/spu_main.c +++ b/src/mesa/pipe/cell/spu/spu_main.c @@ -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);  } diff --git a/src/mesa/pipe/cell/spu/spu_main.h b/src/mesa/pipe/cell/spu/spu_main.h index 7a12715b0b..02b62ee5cd 100644 --- a/src/mesa/pipe/cell/spu/spu_main.h +++ b/src/mesa/pipe/cell/spu/spu_main.h @@ -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; diff --git a/src/mesa/pipe/cell/spu/spu_texture.c b/src/mesa/pipe/cell/spu/spu_texture.c index c1dc6bfe90..1cf958806f 100644 --- a/src/mesa/pipe/cell/spu/spu_texture.c +++ b/src/mesa/pipe/cell/spu/spu_texture.c @@ -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  } diff --git a/src/mesa/pipe/cell/spu/spu_texture.h b/src/mesa/pipe/cell/spu/spu_texture.h index 938a42b549..5bc8e71879 100644 --- a/src/mesa/pipe/cell/spu/spu_texture.h +++ b/src/mesa/pipe/cell/spu/spu_texture.h @@ -37,7 +37,7 @@ invalidate_tex_cache(void);  extern uint -sample_texture(float4 texcoord); +sample_texture(vector float texcoord);  #endif /* SPU_TEXTURE_H */ diff --git a/src/mesa/pipe/cell/spu/spu_tri.c b/src/mesa/pipe/cell/spu/spu_tri.c index 3f46e75d7c..c148c75dd6 100644 --- a/src/mesa/pipe/cell/spu/spu_tri.c +++ b/src/mesa/pipe/cell/spu/spu_tri.c @@ -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 */ | 
