llvmpipe: Remove x/y from cmd_bin
authorAdam Jackson <ajax@redhat.com>
Tue, 28 May 2013 23:36:43 +0000 (01:36 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 31 May 2013 18:21:05 +0000 (20:21 +0200)
These were mostly just a waste of memory and cache pressure, and were
really only used for debugging.

This change reduces instruction count (as measured by callgrind's Ir
event) of gnome-shell-perf-tool on Ivybridge by 3.5% ± 0.015% (n=20).

Signed-off-by: Adam Jackson <ajax@redhat.com>
src/gallium/drivers/llvmpipe/lp_rast.c
src/gallium/drivers/llvmpipe/lp_rast_debug.c
src/gallium/drivers/llvmpipe/lp_rast_priv.h
src/gallium/drivers/llvmpipe/lp_scene.c
src/gallium/drivers/llvmpipe/lp_scene.h
src/gallium/drivers/llvmpipe/lp_setup.c

index 8a4b00f785d6e3734b0c019f3e38e04f2beedf48..5c837a043e0d134e6fcc92e918379e7ab378ed0b 100644 (file)
@@ -87,13 +87,14 @@ lp_rast_end( struct lp_rasterizer *rast )
  */
 static void
 lp_rast_tile_begin(struct lp_rasterizer_task *task,
-                   const struct cmd_bin *bin)
+                   const struct cmd_bin *bin,
+                   int x, int y)
 {
-   LP_DBG(DEBUG_RAST, "%s %d,%d\n", __FUNCTION__, bin->x, bin->y);
+   LP_DBG(DEBUG_RAST, "%s %d,%d\n", __FUNCTION__, x, y);
 
    task->bin = bin;
-   task->x = bin->x * TILE_SIZE;
-   task->y = bin->y * TILE_SIZE;
+   task->x = x * TILE_SIZE;
+   task->y = y * TILE_SIZE;
 
    /* reset pointers to color and depth tile(s) */
    memset(task->color_tiles, 0, sizeof(task->color_tiles));
@@ -575,13 +576,14 @@ static lp_rast_cmd_func dispatch[LP_RAST_OP_MAX] =
 
 static void
 do_rasterize_bin(struct lp_rasterizer_task *task,
-                 const struct cmd_bin *bin)
+                 const struct cmd_bin *bin,
+                 int x, int y)
 {
    const struct cmd_block *block;
    unsigned k;
 
    if (0)
-      lp_debug_bin(bin);
+      lp_debug_bin(bin, x, y);
 
    for (block = bin->head; block; block = block->next) {
       for (k = 0; k < block->count; k++) {
@@ -600,11 +602,11 @@ do_rasterize_bin(struct lp_rasterizer_task *task,
  */
 static void
 rasterize_bin(struct lp_rasterizer_task *task,
-              const struct cmd_bin *bin )
+              const struct cmd_bin *bin, int x, int y )
 {
-   lp_rast_tile_begin( task, bin );
+   lp_rast_tile_begin( task, bin, x, y );
 
-   do_rasterize_bin(task, bin);
+   do_rasterize_bin(task, bin, x, y);
 
    lp_rast_tile_end(task);
 
@@ -646,27 +648,16 @@ rasterize_scene(struct lp_rasterizer_task *task,
 
    if (!task->rast->no_rast && !scene->discard) {
       /* loop over scene bins, rasterize each */
-#if 0
-      {
-         unsigned i, j;
-         for (i = 0; i < scene->tiles_x; i++) {
-            for (j = 0; j < scene->tiles_y; j++) {
-               struct cmd_bin *bin = lp_scene_get_bin(scene, i, j);
-               rasterize_bin(task, bin, i, j);
-            }
-         }
-      }
-#else
       {
          struct cmd_bin *bin;
+         int i, j;
 
          assert(scene);
-         while ((bin = lp_scene_bin_iter_next(scene))) {
+         while ((bin = lp_scene_bin_iter_next(scene, &i, &j))) {
             if (!is_empty_bin( bin ))
-               rasterize_bin(task, bin);
+               rasterize_bin(task, bin, i, j);
          }
       }
-#endif
    }
 
 
index 40082511b3869ec8a0453329f851ad6c4078a8d7..3bc75aa5b45a311e2cd96555f749b05d8b7bf1e4 100644 (file)
@@ -90,13 +90,13 @@ is_blend( const struct lp_rast_state *state,
 
 
 static void
-debug_bin( const struct cmd_bin *bin )
+debug_bin( const struct cmd_bin *bin, int x, int y )
 {
    const struct lp_rast_state *state = NULL;
    const struct cmd_block *head = bin->head;
    int i, j = 0;
 
-   debug_printf("bin %d,%d:\n", bin->x, bin->y);
+   debug_printf("bin %d,%d:\n", x, y);
                 
    while (head) {
       for (i = 0; i < head->count; i++, j++) {
@@ -231,13 +231,14 @@ debug_triangle(int tilex, int tiley,
 static void
 do_debug_bin( struct tile *tile,
               const struct cmd_bin *bin,
+              int x, int y,
               boolean print_cmds)
 {
    unsigned k, j = 0;
    const struct cmd_block *block;
 
-   int tx = bin->x * TILE_SIZE;
-   int ty = bin->y * TILE_SIZE;
+   int tx = x * TILE_SIZE;
+   int ty = y * TILE_SIZE;
 
    memset(tile->data, ' ', sizeof tile->data);
    tile->coverage = 0;
@@ -286,13 +287,13 @@ do_debug_bin( struct tile *tile,
 }
 
 void
-lp_debug_bin( const struct cmd_bin *bin)
+lp_debug_bin( const struct cmd_bin *bin, int i, int j)
 {
    struct tile tile;
    int x,y;
 
    if (bin->head) {
-      do_debug_bin(&tile, bin, TRUE);
+      do_debug_bin(&tile, bin, i, j, TRUE);
 
       debug_printf("------------------------------------------------------------------\n");
       for (y = 0; y < TILE_SIZE; y++) {
@@ -349,9 +350,9 @@ lp_debug_draw_bins_by_coverage( struct lp_scene *scene )
          struct tile tile;
 
          if (bin->head) {
-            //lp_debug_bin(bin);
+            //lp_debug_bin(bin, x, y);
 
-            do_debug_bin(&tile, bin, FALSE);
+            do_debug_bin(&tile, bin, x, y, FALSE);
 
             total += tile.coverage;
             possible += 64*64;
@@ -419,7 +420,7 @@ lp_debug_bins( struct lp_scene *scene )
       for (x = 0; x < scene->tiles_x; x++) {
          struct cmd_bin *bin = lp_scene_get_bin(scene, x, y);
          if (bin->head) {
-            debug_bin(bin);
+            debug_bin(bin, x, y);
          }
       }
    }
index 85febff6ecd27f61be5fcdd6ee5f056c0462c209..e4b6e5b301fd9c259c5c35e93421b5577bbeb3b1 100644 (file)
@@ -341,6 +341,6 @@ lp_rast_set_state(struct lp_rasterizer_task *task,
                   const union lp_rast_cmd_arg arg);
  
 void
-lp_debug_bin( const struct cmd_bin *bin );
+lp_debug_bin( const struct cmd_bin *bin, int x, int y );
 
 #endif
index 3a3ba7502db22914f00bb541ead484cf0582806c..771ad085a120138a03b639dbd483cdb01ba3c2d8 100644 (file)
@@ -468,7 +468,7 @@ lp_scene_bin_iter_begin( struct lp_scene *scene )
  * of work (a bin) to work on.
  */
 struct cmd_bin *
-lp_scene_bin_iter_next( struct lp_scene *scene )
+lp_scene_bin_iter_next( struct lp_scene *scene , int *x, int *y)
 {
    struct cmd_bin *bin = NULL;
 
@@ -485,6 +485,8 @@ lp_scene_bin_iter_next( struct lp_scene *scene )
    }
 
    bin = lp_scene_get_bin(scene, scene->curr_x, scene->curr_y);
+   *x = scene->curr_x;
+   *y = scene->curr_y;
 
 end:
    /*printf("return bin %p at %d, %d\n", (void *) bin, *bin_x, *bin_y);*/
index 1d0cd0e0e6b90d7b75647a11fd454a86c6b01624..fa5bbcaf013a518b7c4a686524aa3bc9b3d8805d 100644 (file)
@@ -94,8 +94,6 @@ struct data_block {
  * For each screen tile we have one of these bins.
  */
 struct cmd_bin {
-   ushort x;
-   ushort y;
    const struct lp_rast_state *last_state;       /* most recent state set in bin */
    struct cmd_block *head;
    struct cmd_block *tail;
@@ -375,7 +373,7 @@ void
 lp_scene_bin_iter_begin( struct lp_scene *scene );
 
 struct cmd_bin *
-lp_scene_bin_iter_next( struct lp_scene *scene );
+lp_scene_bin_iter_next( struct lp_scene *scene, int *x, int *y );
 
 
 
index 0134b700096b1538b4a9235f6dc38c4b3e076bd5..a141fa337ab176d7d0067766252d4dd85e9e5d3e 100644 (file)
@@ -181,7 +181,7 @@ begin_binning( struct lp_setup_context *setup )
    struct lp_scene *scene = setup->scene;
    boolean need_zsload = FALSE;
    boolean ok;
-   unsigned i, j;
+   unsigned i;
 
    assert(scene);
    assert(scene->fence == NULL);
@@ -192,15 +192,6 @@ begin_binning( struct lp_setup_context *setup )
    if (!scene->fence)
       return FALSE;
 
-   /* Initialize the bin flags and x/y coords:
-    */
-   for (i = 0; i < scene->tiles_x; i++) {
-      for (j = 0; j < scene->tiles_y; j++) {
-         scene->tile[i][j].x = i;
-         scene->tile[i][j].y = j;
-      }
-   }
-
    ok = try_update_scene_state(setup);
    if (!ok)
       return FALSE;