make use of prim bounds box info
authorBrian <brian.paul@tungstengraphics.com>
Thu, 3 Jan 2008 02:31:36 +0000 (19:31 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 3 Jan 2008 02:31:36 +0000 (19:31 -0700)
src/mesa/pipe/cell/ppu/cell_context.c
src/mesa/pipe/cell/ppu/cell_render.c
src/mesa/pipe/cell/spu/main.c

index fb89837a7cd653a867eed008071115de903e2580..4fcf804d828f5f5a8e4b838a453fcb9de720a1c8 100644 (file)
@@ -241,6 +241,11 @@ cell_create_context(struct pipe_winsys *winsys, struct cell_winsys *cws)
    draw_set_rasterize_stage(cell->draw, cell->render_stage);
 
 
+   cell->prim_buffer.xmin = 1e100;
+   cell->prim_buffer.ymin = 1e100;
+   cell->prim_buffer.xmax = -1e100;
+   cell->prim_buffer.ymax = -1e100;
+
    /*
     * SPU stuff
     */
index b97f4ff53687effa808f49f4f0032493e5cec282..79aa37ea02110ba5ff4cf22b60c9be30f8f0406b 100644 (file)
@@ -166,6 +166,11 @@ cell_flush_prim_buffer(struct cell_context *cell)
    }
 
    cell->prim_buffer.num_verts = 0;
+
+   cell->prim_buffer.xmin = 1e100;
+   cell->prim_buffer.ymin = 1e100;
+   cell->prim_buffer.xmax = -1e100;
+   cell->prim_buffer.ymax = -1e100;
 }
 
 
index 5e29d4faaaaa61369ab33c1b8e3632d7d5a6b625..94f13029ffa77e25ee678ac5922c43dda5904f2d 100644 (file)
@@ -87,6 +87,7 @@ get_tile(const struct framebuffer *fb, uint tx, uint ty, uint *tile,
            0  /* rid */);
 }
 
+
 void
 put_tile(const struct framebuffer *fb, uint tx, uint ty, const uint *tile,
          int tag)
@@ -138,6 +139,33 @@ clear_tiles(const struct cell_command_clear_tiles *clear)
 }
 
 
+/**
+ * Given a rendering command's bounding box (in pixels) compute the
+ * location of the corresponding screen tile bounding box.
+ */
+static INLINE void
+tile_bounding_box(const struct cell_command_render *render,
+                  uint *txmin, uint *tymin,
+                  uint *box_num_tiles, uint *box_width_tiles)
+{
+   uint txmax, tymax, box_height_tiles;
+
+   *txmin = (uint) render->xmin / TILE_SIZE;
+   *tymin = (uint) render->ymin / TILE_SIZE;
+   txmax = (uint) render->xmax / TILE_SIZE;
+   tymax = (uint) render->ymax / TILE_SIZE;
+   *box_width_tiles = txmax - *txmin + 1;
+   box_height_tiles = tymax - *tymin + 1;
+   *box_num_tiles = *box_width_tiles * box_height_tiles;
+   /*
+   printf("Render bounds: %g, %g  ...  %g, %g\n",
+          render->xmin, render->ymin, render->xmax, render->ymax);
+   printf("Render tiles:  %u, %u .. %u, %u\n", *txmin, *tymin, txmax, tymax);
+   */
+}
+
+
+
 static void
 render(const struct cell_command_render *render)
 {
@@ -167,10 +195,16 @@ render(const struct cell_command_render *render)
            0  /* rid */);
    wait_on_mask( 1 << tag );  /* XXX temporary */
 
+   /* 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);
+
+
    /* loop over tiles */
-   for (i = init.id; i < num_tiles; i += init.num_spus) {
-      const uint tx = i % fb.width_tiles;
-      const uint ty = i / fb.width_tiles;
+   for (i = init.id; i < box_num_tiles; i += init.num_spus) {
+      const uint tx = txmin + i % box_width_tiles;
+      const uint ty = tymin + i / box_width_tiles;
 
       get_tile(&fb, tx, ty, (uint *) tile, DefaultTag);
       wait_on_mask(1 << DefaultTag);  /* XXX temporary */