Mesa (main): zink: add a ctx flag for shader reading basevertex
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jul 20 00:37:34 UTC 2021
Module: Mesa
Branch: main
Commit: 9bafcde42f15fde030c20ddc81b5695a0bfd662b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9bafcde42f15fde030c20ddc81b5695a0bfd662b
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue May 11 16:40:06 2021 -0400
zink: add a ctx flag for shader reading basevertex
less rare than drawid, but still not great across repeated draw calls
with all the derefs
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11964>
---
src/gallium/drivers/zink/zink_context.h | 1 +
src/gallium/drivers/zink/zink_draw.cpp | 5 +++--
src/gallium/drivers/zink/zink_program.c | 3 ++-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index ded384a32dc..c348aeb8289 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -200,6 +200,7 @@ struct zink_context {
struct zink_shader *gfx_stages[ZINK_SHADER_COUNT];
struct zink_shader *last_vertex_stage;
bool shader_reads_drawid;
+ bool shader_reads_basevertex;
struct zink_gfx_pipeline_state gfx_pipeline_state;
enum pipe_prim_type gfx_prim_mode;
struct hash_table *program_cache;
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index 13da3a6ddfb..562672a6039 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -418,6 +418,7 @@ zink_draw_vbo(struct pipe_context *pctx,
bool need_index_buffer_unref = false;
bool mode_changed = ctx->gfx_pipeline_state.mode != dinfo->mode;
bool reads_drawid = ctx->shader_reads_drawid;
+ bool reads_basevertex = ctx->shader_reads_basevertex;
update_barriers(ctx, false);
@@ -647,7 +648,7 @@ zink_draw_vbo(struct pipe_context *pctx,
if (BATCH_CHANGED || ctx->vertex_buffers_dirty)
zink_bind_vertex_buffers<HAS_DYNAMIC_STATE>(batch, ctx);
- if (BITSET_TEST(ctx->gfx_stages[PIPE_SHADER_VERTEX]->nir->info.system_values_read, SYSTEM_VALUE_BASE_VERTEX)) {
+ if (reads_basevertex) {
unsigned draw_mode_is_indexed = index_size > 0;
vkCmdPushConstants(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_VERTEX_BIT,
offsetof(struct zink_gfx_push_constant, draw_mode_is_indexed), sizeof(unsigned),
@@ -682,7 +683,7 @@ zink_draw_vbo(struct pipe_context *pctx,
zink_select_draw_vbo(ctx);
}
- bool needs_drawid = ctx->drawid_broken;
+ bool needs_drawid = reads_drawid && ctx->drawid_broken;
batch->state->draw_count += num_draws;
if (index_size > 0) {
if (dindirect && dindirect->buffer) {
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index dcffbd761a5..eee98b493ca 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -893,10 +893,11 @@ zink_bind_vs_state(struct pipe_context *pctx,
if (cso) {
struct zink_shader *zs = cso;
ctx->shader_reads_drawid = BITSET_TEST(zs->nir->info.system_values_read, SYSTEM_VALUE_DRAW_ID);
+ ctx->shader_reads_basevertex = BITSET_TEST(zs->nir->info.system_values_read, SYSTEM_VALUE_BASE_VERTEX);
} else {
ctx->shader_reads_drawid = false;
+ ctx->shader_reads_basevertex = false;
}
-
}
static void
More information about the mesa-commit
mailing list