summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2008-02-04 16:06:51 -0700
committerBen Skeggs <skeggsb@gmail.com>2008-02-15 13:50:30 +1100
commit790eec9666ae6cc37ce4ba54cceff97e9eeb5ce3 (patch)
tree098b848caa1289cc57d088114a2b1b64769e309f /src
parent71e6cd0b66be784aa3feb86101b7a62d17735f56 (diff)
Cell: texture sampler functions always return vector float now
Texture colors look the same now, regardless of X display/pixel format
Diffstat (limited to 'src')
-rw-r--r--src/mesa/pipe/cell/spu/spu_main.h2
-rw-r--r--src/mesa/pipe/cell/spu/spu_texture.c19
-rw-r--r--src/mesa/pipe/cell/spu/spu_texture.h4
-rw-r--r--src/mesa/pipe/cell/spu/spu_tri.c36
4 files changed, 29 insertions, 32 deletions
diff --git a/src/mesa/pipe/cell/spu/spu_main.h b/src/mesa/pipe/cell/spu/spu_main.h
index b22d563551..cfd4d72729 100644
--- a/src/mesa/pipe/cell/spu/spu_main.h
+++ b/src/mesa/pipe/cell/spu/spu_main.h
@@ -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;
diff --git a/src/mesa/pipe/cell/spu/spu_texture.c b/src/mesa/pipe/cell/spu/spu_texture.c
index ecacf2ec88..9ee2b45e24 100644
--- a/src/mesa/pipe/cell/spu/spu_texture.c
+++ b/src/mesa/pipe/cell/spu/spu_texture.c
@@ -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;
}
diff --git a/src/mesa/pipe/cell/spu/spu_texture.h b/src/mesa/pipe/cell/spu/spu_texture.h
index 0e000bfebf..95eb87080f 100644
--- a/src/mesa/pipe/cell/spu/spu_texture.h
+++ b/src/mesa/pipe/cell/spu/spu_texture.h
@@ -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);
diff --git a/src/mesa/pipe/cell/spu/spu_tri.c b/src/mesa/pipe/cell/spu/spu_tri.c
index 89aaca9a72..4c6de56eda 100644
--- a/src/mesa/pipe/cell/spu/spu_tri.c
+++ b/src/mesa/pipe/cell/spu/spu_tri.c
@@ -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) */