summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2021-05-11 16:40:06 -0400
committerMarge Bot <eric+marge@anholt.net>2021-07-20 00:25:31 +0000
commit9bafcde42f15fde030c20ddc81b5695a0bfd662b (patch)
treec8437c7be658b99d32167b882f80d871b0abd603
parent37ee123063da2c679616248f0170d1dc38bc97f4 (diff)
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@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11964>
-rw-r--r--src/gallium/drivers/zink/zink_context.h1
-rw-r--r--src/gallium/drivers/zink/zink_draw.cpp5
-rw-r--r--src/gallium/drivers/zink/zink_program.c3
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