Cell: start using DMA tags in a more sensible way, move waits() later when possible.
authorBrian <brian.paul@tungstengraphics.com>
Wed, 9 Jan 2008 23:12:25 +0000 (16:12 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 10 Jan 2008 00:50:37 +0000 (17:50 -0700)
src/mesa/pipe/cell/spu/main.c
src/mesa/pipe/cell/spu/main.h
src/mesa/pipe/cell/spu/tri.c

index 8e7f8be1ebe3657a1b7789e60a565a39e66cd0da..7b63e85ae2e14b1eab9821f685bf1869c08b007b 100644 (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) {
+         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) {
-         put_tile(&fb, tx, ty, (uint *) ztile, tag+1, 1);
-         wait_on_mask(1 << (tag+1));  /* XXX temporary */
+         wait_on_mask(1 << TAG_WRITE_TILE_Z);  /* XXX temporary */
       }
    }
 }
index 5e0516d0c1555f5751be2489ed9971908cd6b274..656d28ea0e511994bba3eb7e7d1ec7d88cf6a2b4 100644 (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);
 
index 5d4790fe6c72a5ae7e5bdaf0cba55ec3d08ecbca..b7dfd6ab8cb89051050d1cc3d277f37b983cc75d 100644 (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)