From 086a9b78698f6e1cacd601529e729d7aa1ea4b42 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 2 Feb 2022 17:39:38 +1000 Subject: [PATCH] llvmpipe: optimise triangle setup a bit. the bboxpos = bbox copy was visible overhead on perf traces, but we don't need to really do it. Extract all the things from bbox needed early, then don't copy it just overwrite it. use boolean to fix power build. Reviewed-by: Jose Fonseca Part-of: --- .../drivers/llvmpipe/lp_setup_context.h | 2 +- src/gallium/drivers/llvmpipe/lp_setup_line.c | 5 +++- src/gallium/drivers/llvmpipe/lp_setup_point.c | 6 ++++- src/gallium/drivers/llvmpipe/lp_setup_tri.c | 26 ++++++++++--------- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h index 656a64f4056..1f51f0bee10 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_context.h +++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h @@ -279,7 +279,7 @@ lp_setup_analyse_triangles(struct lp_setup_context *setup, boolean lp_setup_bin_triangle(struct lp_setup_context *setup, struct lp_rast_triangle *tri, - const struct u_rect *bboxorig, + boolean use_32bits, const struct u_rect *bbox, int nr_planes, unsigned scissor_index); diff --git a/src/gallium/drivers/llvmpipe/lp_setup_line.c b/src/gallium/drivers/llvmpipe/lp_setup_line.c index 1f812e8eacc..f08a16e57a3 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_line.c +++ b/src/gallium/drivers/llvmpipe/lp_setup_line.c @@ -600,6 +600,9 @@ try_setup_line( struct lp_setup_context *setup, return TRUE; } + int max_szorig = ((bbox.x1 - (bbox.x0 & ~3)) | + (bbox.y1 - (bbox.y0 & ~3))); + boolean use_32bits = max_szorig <= MAX_FIXED_LENGTH32; bboxpos = bbox; /* Can safely discard negative regions: @@ -715,7 +718,7 @@ try_setup_line( struct lp_setup_context *setup, lp_setup_add_scissor_planes(scissor, &plane[4], s_planes, setup->multisample); } - return lp_setup_bin_triangle(setup, line, &bbox, &bboxpos, nr_planes, viewport_index); + return lp_setup_bin_triangle(setup, line, use_32bits, &bboxpos, nr_planes, viewport_index); } diff --git a/src/gallium/drivers/llvmpipe/lp_setup_point.c b/src/gallium/drivers/llvmpipe/lp_setup_point.c index 6d4e4263419..22aa60be937 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_point.c +++ b/src/gallium/drivers/llvmpipe/lp_setup_point.c @@ -545,7 +545,11 @@ try_setup_point( struct lp_setup_context *setup, plane[3].c++; /* bottom-left */ } - return lp_setup_bin_triangle(setup, point, &bbox, &bbox, nr_planes, viewport_index); + int max_szorig = ((bbox.x1 - (bbox.x0 & ~3)) | + (bbox.y1 - (bbox.y0 & ~3))); + boolean use_32bits = max_szorig <= MAX_FIXED_LENGTH32; + + return lp_setup_bin_triangle(setup, point, use_32bits, &bbox, nr_planes, viewport_index); } else { struct lp_rast_rectangle *point; diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c index 347f0a61c10..3ef36702758 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c +++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c @@ -277,7 +277,7 @@ do_triangle_ccw(struct lp_setup_context *setup, struct lp_rast_triangle *tri; struct lp_rast_plane *plane; const struct u_rect *scissor = NULL; - struct u_rect bbox, bboxpos; + struct u_rect bbox; boolean s_planes[4]; unsigned tri_bytes; int nr_planes = 3; @@ -330,14 +330,20 @@ do_triangle_ccw(struct lp_setup_context *setup, return TRUE; } - bboxpos = bbox; + int max_szorig = ((bbox.x1 - (bbox.x0 & ~3)) | + (bbox.y1 - (bbox.y0 & ~3))); + boolean use_32bits = max_szorig <= MAX_FIXED_LENGTH32; +#if defined(_ARCH_PWR8) && UTIL_ARCH_LITTLE_ENDIAN + boolean pwr8_limit_check = (bbox.x1 - bbox.x0) <= MAX_FIXED_LENGTH32 && + (bbox.y1 - bbox.y0) <= MAX_FIXED_LENGTH32; +#endif /* Can safely discard negative regions, but need to keep hold of * information about when the triangle extends past screen * boundaries. See trimmed_box in lp_setup_bin_triangle(). */ - bboxpos.x0 = MAX2(bboxpos.x0, 0); - bboxpos.y0 = MAX2(bboxpos.y0, 0); + bbox.x0 = MAX2(bbox.x0, 0); + bbox.y0 = MAX2(bbox.y0, 0); nr_planes = 3; /* @@ -345,7 +351,7 @@ do_triangle_ccw(struct lp_setup_context *setup, * edges if the bounding box of the tri is fully inside that edge. */ scissor = &setup->draw_regions[viewport_index]; - scissor_planes_needed(s_planes, &bboxpos, scissor); + scissor_planes_needed(s_planes, &bbox, scissor); nr_planes += s_planes[0] + s_planes[1] + s_planes[2] + s_planes[3]; tri = lp_setup_alloc_triangle(scene, @@ -570,8 +576,7 @@ do_triangle_ccw(struct lp_setup_context *setup, */ if (setup->fb.width <= MAX_FIXED_LENGTH32 && setup->fb.height <= MAX_FIXED_LENGTH32 && - (bbox.x1 - bbox.x0) <= MAX_FIXED_LENGTH32 && - (bbox.y1 - bbox.y0) <= MAX_FIXED_LENGTH32) { + pwr8_limit_check) { unsigned int bottom_edge; __m128i vertx, verty; __m128i shufx, shufy; @@ -738,7 +743,7 @@ do_triangle_ccw(struct lp_setup_context *setup, lp_setup_add_scissor_planes(scissor, &plane[3], s_planes, setup->multisample); } - return lp_setup_bin_triangle(setup, tri, &bbox, &bboxpos, nr_planes, viewport_index); + return lp_setup_bin_triangle(setup, tri, use_32bits, &bbox, nr_planes, viewport_index); } /* @@ -772,7 +777,7 @@ floor_pot(uint32_t n) boolean lp_setup_bin_triangle(struct lp_setup_context *setup, struct lp_rast_triangle *tri, - const struct u_rect *bboxorig, + boolean use_32bits, const struct u_rect *bbox, int nr_planes, unsigned viewport_index) @@ -800,9 +805,6 @@ lp_setup_bin_triangle(struct lp_setup_context *setup, * plane math may overflow or not with the 32bit rasterization * functions depends on the original extent of the triangle. */ - int max_szorig = ((bboxorig->x1 - (bboxorig->x0 & ~3)) | - (bboxorig->y1 - (bboxorig->y0 & ~3))); - boolean use_32bits = max_szorig <= MAX_FIXED_LENGTH32; /* Now apply scissor, etc to the bounding box. Could do this * earlier, but it confuses the logic for tri-16 and would force