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