Mesa (master): freedreno: Drop u_trim_pipe_prim() from fast-paths

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Mar 20 20:42:51 UTC 2021


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

Author: Rob Clark <robdclark at chromium.org>
Date:   Sun Mar 14 10:52:53 2021 -0700

freedreno: Drop u_trim_pipe_prim() from fast-paths

Not sure if we need this for a2xx.  For a3xx and a4xx we need it for sw
xfb which needs to know the trimmed # of vertices in the VS.  We do not
need it on a6xx, and unlikely need it for anything a5xx+.

Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9581>

---

 src/gallium/drivers/freedreno/a2xx/fd2_draw.c  |  6 ++++++
 src/gallium/drivers/freedreno/a3xx/fd3_draw.c  |  6 ++++++
 src/gallium/drivers/freedreno/a4xx/fd4_draw.c  |  6 ++++++
 src/gallium/drivers/freedreno/a5xx/fd5_draw.c  | 12 ++++++++++++
 src/gallium/drivers/freedreno/freedreno_draw.c | 10 ++++------
 5 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c
index f937bc5c49e..2a953852cbb 100644
--- a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c
+++ b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c
@@ -163,6 +163,12 @@ fd2_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *pinfo,
 	if (!ctx->prog.fs || !ctx->prog.vs)
 		return false;
 
+	if (pinfo->mode != PIPE_PRIM_MAX &&
+			!indirect &&
+			!pinfo->primitive_restart &&
+			!u_trim_pipe_prim(pinfo->mode, (unsigned*)&pdraw->count))
+		return false;
+
 	if (ctx->dirty & FD_DIRTY_VTXBUF)
 		emit_vertexbufs(ctx);
 
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
index 1648081cab1..5a705c320aa 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
@@ -108,6 +108,12 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
 		.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode,
 	};
 
+	if (info->mode != PIPE_PRIM_MAX &&
+			!indirect &&
+			!info->primitive_restart &&
+			!u_trim_pipe_prim(info->mode, (unsigned*)&draw->count))
+		return false;
+
 	if (fd3_needs_manual_clipping(ir3_get_shader(ctx->prog.vs), ctx->rasterizer))
 		emit.key.ucp_enables = ctx->rasterizer->clip_plane_enable;
 
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
index 177859665b4..d4b03cc3970 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
@@ -99,6 +99,12 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
 		.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode,
 	};
 
+	if (info->mode != PIPE_PRIM_MAX &&
+			!indirect &&
+			!info->primitive_restart &&
+			!u_trim_pipe_prim(info->mode, (unsigned*)&draw->count))
+		return false;
+
 	ir3_fixup_shader_state(&ctx->base, &emit.key);
 
 	enum fd_dirty_3d_state dirty = ctx->dirty;
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
index e7789768703..620e2bf312f 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
@@ -94,6 +94,18 @@ fd5_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
 		.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode,
 	};
 
+	/* Technically a5xx should not require this, but it avoids a crash in
+	 * piglit 'spec@!opengl 1.1 at ppgtt_memory_alignment' due to a draw with
+	 * no VBO bound but a VS that expects an input.  The draw is a single
+	 * vertex with PIPE_PRIM_TRIANGLES so the u_trim_pipe_prim() causes it
+	 * to be skipped.
+	 */
+	if (info->mode != PIPE_PRIM_MAX &&
+			!indirect &&
+			!info->primitive_restart &&
+			!u_trim_pipe_prim(info->mode, (unsigned*)&draw->count))
+		return false;
+
 	ir3_fixup_shader_state(&ctx->base, &emit.key);
 
 	unsigned dirty = ctx->dirty;
diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c
index f7d30fbc8d0..ee36da81087 100644
--- a/src/gallium/drivers/freedreno/freedreno_draw.c
+++ b/src/gallium/drivers/freedreno/freedreno_draw.c
@@ -287,18 +287,16 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
 		return;
 	}
 
-	if (info->mode != PIPE_PRIM_MAX &&
-	    !indirect &&
-	    !info->primitive_restart &&
-	    !u_trim_pipe_prim(info->mode, (unsigned*)&draws[0].count))
-		return;
-
 	/* TODO: push down the region versions into the tiles */
 	if (!fd_render_condition_check(pctx))
 		return;
 
 	/* emulate unsupported primitives: */
 	if (!fd_supported_prim(ctx, info->mode)) {
+		if (!indirect && !info->primitive_restart &&
+				!u_trim_pipe_prim(info->mode, (unsigned*)&draws[0].count))
+			return;
+
 		if (ctx->streamout.num_targets > 0)
 			mesa_loge("stream-out with emulated prims");
 		util_primconvert_save_rasterizer_state(ctx->primconvert, ctx->rasterizer);



More information about the mesa-commit mailing list