Mesa (master): radeonsi: micro-optimize prim checking and fix guardband with lines+adjacency

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 14 02:02:06 UTC 2018


Module: Mesa
Branch: master
Commit: f3b3ee6974d1b34b219f0d960a1424afe07a93f1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f3b3ee6974d1b34b219f0d960a1424afe07a93f1

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Wed May 30 22:59:41 2018 -0400

radeonsi: micro-optimize prim checking and fix guardband with lines+adjacency

Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>

---

 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 ++----
 src/gallium/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 ea199d3924..eb0c226ed7 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 e33e235620..5370587d74 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 7f9f9c4cd4..aa270ebcb4 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 97b1b89b48..d16c3e7e41 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. */




More information about the mesa-commit mailing list