From f3b3ee6974d1b34b219f0d960a1424afe07a93f1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 30 May 2018 22:59:41 -0400 Subject: [PATCH] radeonsi: micro-optimize prim checking and fix guardband with lines+adjacency MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Tested-by: Dieter Nützel --- src/gallium/drivers/radeonsi/si_pipe.h | 17 +++++++++++++++++ src/gallium/drivers/radeonsi/si_state_draw.c | 11 +++-------- src/gallium/drivers/radeonsi/si_state_shaders.c | 6 ++---- .../drivers/radeonsi/si_state_viewport.c | 2 +- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index ea199d3924d..eb0c226ed79 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1505,6 +1505,23 @@ static inline unsigned si_get_total_colormask(struct si_context *sctx) return colormask; } +#define UTIL_ALL_PRIM_LINE_MODES ((1 << PIPE_PRIM_LINES) | \ + (1 << PIPE_PRIM_LINE_LOOP) | \ + (1 << PIPE_PRIM_LINE_STRIP) | \ + (1 << PIPE_PRIM_LINES_ADJACENCY) | \ + (1 << PIPE_PRIM_LINE_STRIP_ADJACENCY)) + +static inline bool util_prim_is_lines(unsigned prim) +{ + return ((1 << prim) & UTIL_ALL_PRIM_LINE_MODES) != 0; +} + +static inline bool util_prim_is_points_or_lines(unsigned prim) +{ + return ((1 << prim) & (UTIL_ALL_PRIM_LINE_MODES | + (1 << PIPE_PRIM_POINTS))) != 0; +} + /** * Return true if there is enough memory in VRAM and GTT for the buffers * added so far. diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index e33e235620a..5370587d747 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -521,11 +521,7 @@ static bool si_emit_rasterizer_prim_state(struct si_context *sctx) struct si_state_rasterizer *rs = sctx->queued.named.rasterizer; /* Skip this if not rendering lines. */ - if (rast_prim != PIPE_PRIM_LINES && - rast_prim != PIPE_PRIM_LINE_LOOP && - rast_prim != PIPE_PRIM_LINE_STRIP && - rast_prim != PIPE_PRIM_LINES_ADJACENCY && - rast_prim != PIPE_PRIM_LINE_STRIP_ADJACENCY) + if (!util_prim_is_lines(rast_prim)) return false; if (rast_prim == sctx->last_rast_prim && @@ -1275,9 +1271,8 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) rast_prim = info->mode; if (rast_prim != sctx->current_rast_prim) { - bool old_is_poly = sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES; - bool new_is_poly = rast_prim >= PIPE_PRIM_TRIANGLES; - if (old_is_poly != new_is_poly) + if (util_prim_is_points_or_lines(sctx->current_rast_prim) != + util_prim_is_points_or_lines(rast_prim)) si_mark_atom_dirty(sctx, &sctx->atoms.s.guardband); sctx->current_rast_prim = rast_prim; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 7f9f9c4cd4a..aa270ebcb4d 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1419,10 +1419,8 @@ static inline void si_shader_selector_key(struct pipe_context *ctx, } if (rs) { - bool is_poly = (sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES && - sctx->current_rast_prim <= PIPE_PRIM_POLYGON) || - sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES_ADJACENCY; - bool is_line = !is_poly && sctx->current_rast_prim != PIPE_PRIM_POINTS; + bool is_poly = !util_prim_is_points_or_lines(sctx->current_rast_prim); + bool is_line = util_prim_is_lines(sctx->current_rast_prim); key->part.ps.prolog.color_two_side = rs->two_side && sel->info.colors_read; key->part.ps.prolog.flatshade_colors = rs->flatshade && sel->info.colors_read; diff --git a/src/gallium/drivers/radeonsi/si_state_viewport.c b/src/gallium/drivers/radeonsi/si_state_viewport.c index 97b1b89b48b..d16c3e7e41b 100644 --- a/src/gallium/drivers/radeonsi/si_state_viewport.c +++ b/src/gallium/drivers/radeonsi/si_state_viewport.c @@ -193,7 +193,7 @@ static void si_emit_guardband(struct si_context *ctx) discard_x = 1.0; discard_y = 1.0; - if (unlikely(ctx->current_rast_prim < PIPE_PRIM_TRIANGLES) && + if (unlikely(util_prim_is_points_or_lines(ctx->current_rast_prim)) && ctx->queued.named.rasterizer) { /* When rendering wide points or lines, we need to be more * conservative about when to discard them entirely. */ -- 2.30.2