Cell: start using DMA tags in a more sensible way, move waits() later when possible.

This commit is contained in:
Brian
2008-01-09 16:12:25 -07:00
parent c7a22c3979
commit 18b0f34521
3 changed files with 52 additions and 21 deletions
+34 -20
View File
@@ -45,7 +45,7 @@ helpful headers:
/opt/ibm/cell-sdk/prototype/sysroot/usr/include/libmisc.h
*/
static boolean Debug = TRUE;
static boolean Debug = FALSE;
volatile struct cell_init_info init;
@@ -59,9 +59,10 @@ int DefaultTag;
void
wait_on_mask(unsigned tag)
wait_on_mask(unsigned tagMask)
{
mfc_write_tag_mask( tag );
mfc_write_tag_mask( tagMask );
/* wait for completion of _any_ DMAs specified by tagMask */
mfc_read_tag_status_any();
}
@@ -125,7 +126,6 @@ clear_surface(const struct cell_command_clear_surface *clear)
{
uint num_tiles = fb.width_tiles * fb.height_tiles;
uint i, j;
int tag = init.id;
if (clear->surface == 0) {
for (i = 0; i < TILE_SIZE; i++)
@@ -147,13 +147,15 @@ clear_surface(const struct cell_command_clear_surface *clear)
uint tx = i % fb.width_tiles;
uint ty = i / fb.width_tiles;
if (clear->surface == 0)
put_tile(&fb, tx, ty, (uint *) ctile, tag, 0);
put_tile(&fb, tx, ty, (uint *) ctile, TAG_SURFACE_CLEAR, 0);
else
put_tile(&fb, tx, ty, (uint *) ztile, tag, 1);
put_tile(&fb, tx, ty, (uint *) ztile, TAG_SURFACE_CLEAR, 1);
/* XXX we don't want this here, but it fixes bad tile results */
wait_on_mask(1 << tag);
}
#if 0
wait_on_mask(1 << TAG_SURFACE_CLEAR);
#endif
}
@@ -198,7 +200,6 @@ static void
render(const struct cell_command_render *render)
{
struct cell_prim_buffer prim_buffer ALIGN16_ATTRIB;
int tag = init.id /**DefaultTag**/;
uint i, j, vertex_bytes;
/*
@@ -217,16 +218,18 @@ render(const struct cell_command_render *render)
mfc_get(&prim_buffer, /* dest */
(unsigned int) render->vertex_data, /* src */
vertex_bytes, /* size */
tag,
TAG_VERTEX_BUFFER,
0, /* tid */
0 /* rid */);
wait_on_mask( 1 << tag ); /* XXX temporary */
wait_on_mask(1 << TAG_VERTEX_BUFFER);
/* find tiles which intersect the prim bounding box */
uint txmin, tymin, box_width_tiles, box_num_tiles;
tile_bounding_box(render, &txmin, &tymin,
&box_num_tiles, &box_width_tiles);
/* make sure any pending clears have completed */
wait_on_mask(1 << TAG_SURFACE_CLEAR);
/* loop over tiles */
for (i = init.id; i < box_num_tiles; i += init.num_spus) {
@@ -236,12 +239,12 @@ render(const struct cell_command_render *render)
assert(tx < fb.width_tiles);
assert(ty < fb.height_tiles);
get_tile(&fb, tx, ty, (uint *) ctile, tag, 0);
wait_on_mask(1 << tag); /* XXX temporary */
/* Start fetching color/z tiles. We'll wait for completion when
* we need read/write to them later in triangle rasterization.
*/
get_tile(&fb, tx, ty, (uint *) ctile, TAG_READ_TILE_COLOR, 0);
if (fb.depth_format == PIPE_FORMAT_Z16_UNORM) {
get_tile(&fb, tx, ty, (uint *) ztile, tag+1, 1);
wait_on_mask(1 << (tag+1)); /* XXX temporary */
get_tile(&fb, tx, ty, (uint *) ztile, TAG_READ_TILE_Z, 1);
}
assert(render->prim_type == PIPE_PRIM_TRIANGLES);
@@ -274,12 +277,23 @@ render(const struct cell_command_render *render)
tri_draw(&prim, tx, ty);
}
put_tile(&fb, tx, ty, (uint *) ctile, tag, 0);
wait_on_mask(1 << tag); /* XXX temp */
/* in case nothing was drawn, wait now for completion */
/* XXX temporary */
wait_on_mask(1 << TAG_READ_TILE_COLOR);
if (fb.depth_format == PIPE_FORMAT_Z16_UNORM) {
put_tile(&fb, tx, ty, (uint *) ztile, tag+1, 1);
wait_on_mask(1 << (tag+1)); /* XXX temporary */
wait_on_mask(1 << TAG_READ_TILE_Z); /* XXX temporary */
}
/* XXX IF we wrote anything into the tile... */
put_tile(&fb, tx, ty, (uint *) ctile, TAG_WRITE_TILE_COLOR, 0);
if (fb.depth_format == PIPE_FORMAT_Z16_UNORM) {
put_tile(&fb, tx, ty, (uint *) ztile, TAG_WRITE_TILE_Z, 1);
}
wait_on_mask(1 << TAG_WRITE_TILE_COLOR); /* XXX temp */
if (fb.depth_format == PIPE_FORMAT_Z16_UNORM) {
wait_on_mask(1 << TAG_WRITE_TILE_Z); /* XXX temporary */
}
}
}
+12
View File
@@ -55,6 +55,18 @@ extern ushort ztile[TILE_SIZE][TILE_SIZE] ALIGN16_ATTRIB;
extern int DefaultTag;
/* DMA TAGS */
#define TAG_SURFACE_CLEAR 10
#define TAG_VERTEX_BUFFER 11
#define TAG_READ_TILE_COLOR 12
#define TAG_READ_TILE_Z 13
#define TAG_WRITE_TILE_COLOR 14
#define TAG_WRITE_TILE_Z 15
void
wait_on_mask(unsigned tag);
+6 -1
View File
@@ -283,11 +283,13 @@ emit_quad( struct setup_stage *setup, int x, int y, unsigned mask )
eval_coeff(setup, 1, (float) x, (float) y, colors);
if (fb.depth_format == PIPE_FORMAT_Z16_UNORM) {
float zvals[4];
eval_z(setup, (float) x, (float) y, zvals);
wait_on_mask(1 << TAG_READ_TILE_Z); /* XXX temporary */
if (mask & MASK_TOP_LEFT) {
z = (uint) (zvals[0] * 65535.0);
if (z < ztile[iy][ix])
@@ -321,6 +323,9 @@ emit_quad( struct setup_stage *setup, int x, int y, unsigned mask )
}
}
if (mask)
wait_on_mask(1 << TAG_READ_TILE_COLOR);
if (mask & MASK_TOP_LEFT)
ctile[iy][ix] = pack_color(colors[QUAD_TOP_LEFT]);
if (mask & MASK_TOP_RIGHT)