From e881c9a5dc5457f0b096a3c583c5b1450beb89e9 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 29 May 2013 01:36:43 +0200 Subject: [PATCH] llvmpipe: Remove x/y from cmd_bin MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/gallium/drivers/llvmpipe/lp_rast.c | 37 +++++++++++----------------- src/gallium/drivers/llvmpipe/lp_rast_debug.c | 19 +++++++------- src/gallium/drivers/llvmpipe/lp_rast_priv.h | 2 +- src/gallium/drivers/llvmpipe/lp_scene.c | 4 ++- src/gallium/drivers/llvmpipe/lp_scene.h | 4 +-- src/gallium/drivers/llvmpipe/lp_setup.c | 11 +-------- 6 files changed, 30 insertions(+), 47 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index 8a4b00f..5c837a0 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -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 } diff --git a/src/gallium/drivers/llvmpipe/lp_rast_debug.c b/src/gallium/drivers/llvmpipe/lp_rast_debug.c index 4008251..3bc75aa 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast_debug.c +++ b/src/gallium/drivers/llvmpipe/lp_rast_debug.c @@ -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); } } } diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h index 85febff..e4b6e5b 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h @@ -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 diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index 3a3ba75..771ad08 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -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);*/ diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h index 1d0cd0e..fa5bbca 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.h +++ b/src/gallium/drivers/llvmpipe/lp_scene.h @@ -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 ); diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 0134b70..a141fa3 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -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; -- 2.7.4