#include <stdio.h>
#include <libmisc.h>
+#include <vec_literal.h>
#include "spu_main.h"
#include "spu_render.h"
spu.fb.zsize = 2;
else
spu.fb.zsize = 0;
+
+ if (spu.fb.color_format == PIPE_FORMAT_A8R8G8B8_UNORM)
+ spu.color_shuffle = VEC_LITERAL(vector unsigned char,
+ 12, 0, 4, 8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0);
+ else if (spu.fb.color_format == PIPE_FORMAT_B8G8R8A8_UNORM)
+ spu.color_shuffle = VEC_LITERAL(vector unsigned char,
+ 8, 4, 0, 12, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0);
+ else
+ ASSERT(0);
}
}
-static INLINE void
-pack_colors(uint uicolors[4], const float4 fcolors[4])
-{
- switch (spu.fb.color_format) {
- case PIPE_FORMAT_A8R8G8B8_UNORM:
- uicolors[0] = spu_pack_A8R8G8B8(fcolors[0].v);
- uicolors[1] = spu_pack_A8R8G8B8(fcolors[1].v);
- uicolors[2] = spu_pack_A8R8G8B8(fcolors[2].v);
- uicolors[3] = spu_pack_A8R8G8B8(fcolors[3].v);
- break;
- case PIPE_FORMAT_B8G8R8A8_UNORM:
- uicolors[0] = spu_pack_B8G8R8A8(fcolors[0].v);
- uicolors[1] = spu_pack_B8G8R8A8(fcolors[1].v);
- uicolors[2] = spu_pack_B8G8R8A8(fcolors[2].v);
- uicolors[3] = spu_pack_B8G8R8A8(fcolors[3].v);
- break;
- default:
- ASSERT(0);
- }
-}
-
-
static INLINE mask_t
do_depth_test(int x, int y, mask_t quadmask)
{
if (spu_extract(spu_orx(mask), 0)) {
const int ix = x - setup.cliprect_minx;
const int iy = y - setup.cliprect_miny;
- uint colors[4]; /* indexed by QUAD_x */
+
+ if (spu.cur_ctile_status == TILE_STATUS_CLEAR) {
+ /* now, _really_ clear the tile */
+ clear_c_tile(&spu.ctile);
+ }
+ spu.cur_ctile_status = TILE_STATUS_DIRTY;
if (spu.texture.start) {
+ /* texture mapping */
float4 texcoords[4];
- uint i;
eval_coeff(2, (float) x, (float) y, texcoords);
- for (i = 0; i < 4; i++) {
- colors[i] = sample_texture(texcoords[i]);
- }
+
+ if (spu_extract(mask, 0))
+ spu.ctile.ui[iy][ix] = sample_texture(texcoords[0]);
+ if (spu_extract(mask, 1))
+ spu.ctile.ui[iy][ix+1] = sample_texture(texcoords[1]);
+ if (spu_extract(mask, 2))
+ spu.ctile.ui[iy+1][ix] = sample_texture(texcoords[2]);
+ if (spu_extract(mask, 3))
+ spu.ctile.ui[iy+1][ix+1] = sample_texture(texcoords[3]);
}
else {
- float4 fcolors[4];
- eval_coeff(1, (float) x, (float) y, fcolors);
- pack_colors(colors, fcolors);
+ /* simple shading */
+ const vector unsigned char shuffle = spu.color_shuffle;
+ float4 colors[4];
+ eval_coeff(1, (float) x, (float) y, colors);
+
+ if (spu_extract(mask, 0))
+ spu.ctile.ui[iy][ix] = spu_pack_color_shuffle(colors[0].v, shuffle);
+ if (spu_extract(mask, 1))
+ spu.ctile.ui[iy][ix+1] = spu_pack_color_shuffle(colors[1].v, shuffle);
+ if (spu_extract(mask, 2))
+ spu.ctile.ui[iy+1][ix] = spu_pack_color_shuffle(colors[2].v, shuffle);
+ if (spu_extract(mask, 3))
+ spu.ctile.ui[iy+1][ix+1] = spu_pack_color_shuffle(colors[3].v, shuffle);
}
- if (spu.cur_ctile_status == TILE_STATUS_CLEAR) {
- /* now, _really_ clear the tile */
- clear_c_tile(&spu.ctile);
- }
- spu.cur_ctile_status = TILE_STATUS_DIRTY;
-
-#if 1
- if (spu_extract(mask, 0))
- spu.ctile.ui[iy][ix] = colors[QUAD_TOP_LEFT];
- if (spu_extract(mask, 1))
- spu.ctile.ui[iy][ix+1] = colors[QUAD_TOP_RIGHT];
- if (spu_extract(mask, 2))
- spu.ctile.ui[iy+1][ix] = colors[QUAD_BOTTOM_LEFT];
- if (spu_extract(mask, 3))
- spu.ctile.ui[iy+1][ix+1] = colors[QUAD_BOTTOM_RIGHT];
-#else
+#if 0
/* SIMD_Z with swizzled color buffer (someday) */
vector unsigned int uicolors = *((vector unsigned int *) &colors);
spu.ctile.ui4[iy/2][ix/2] = spu_sel(spu.ctile.ui4[iy/2][ix/2], uicolors, mask);