diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2021-05-11 16:40:06 -0400 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-07-20 00:25:31 +0000 |
commit | 9bafcde42f15fde030c20ddc81b5695a0bfd662b (patch) | |
tree | c8437c7be658b99d32167b882f80d871b0abd603 | |
parent | 37ee123063da2c679616248f0170d1dc38bc97f4 (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.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_draw.cpp | 5 | ||||
-rw-r--r-- | 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 |