diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 898c59d0f64..1adbfce94ad 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -147,11 +147,6 @@ zink_bind_vertex_buffers(struct zink_context *ctx) elems->hw_state.num_bindings, buffers, buffer_offsets); - if (DYNAMIC_STATE == ZINK_DYNAMIC_VERTEX_INPUT2 || DYNAMIC_STATE == ZINK_DYNAMIC_VERTEX_INPUT) - VKCTX(CmdSetVertexInputEXT)(ctx->bs->cmdbuf, - elems->hw_state.num_bindings, elems->hw_state.dynbindings, - elems->hw_state.num_attribs, elems->hw_state.dynattribs); - ctx->vertex_buffers_dirty = false; } @@ -730,6 +725,10 @@ zink_draw(struct pipe_context *pctx, else zink_bind_vertex_buffers(ctx); } + if ((DYNAMIC_STATE == ZINK_DYNAMIC_VERTEX_INPUT2 || DYNAMIC_STATE == ZINK_DYNAMIC_VERTEX_INPUT) && (BATCH_CHANGED || ctx->vertex_state_changed)) + VKCTX(CmdSetVertexInputEXT)(ctx->bs->cmdbuf, + ctx->element_state->hw_state.num_bindings, ctx->element_state->hw_state.dynbindings, + ctx->element_state->hw_state.num_attribs, ctx->element_state->hw_state.dynattribs); } if (BATCH_CHANGED) { @@ -830,6 +829,7 @@ zink_draw(struct pipe_context *pctx, } VKCTX(CmdBeginTransformFeedbackEXT)(bs->cmdbuf, 0, ctx->num_so_targets, counter_buffers, counter_buffer_offsets); } + ctx->vertex_state_changed = false; bool marker = false; if (unlikely(zink_tracing)) { diff --git a/src/gallium/drivers/zink/zink_program_state.hpp b/src/gallium/drivers/zink/zink_program_state.hpp index b54e70e1e3e..17770d05cb5 100644 --- a/src/gallium/drivers/zink/zink_program_state.hpp +++ b/src/gallium/drivers/zink/zink_program_state.hpp @@ -166,7 +166,6 @@ zink_get_gfx_pipeline(struct zink_context *ctx, state->modules_changed = false; state->uses_dynamic_stride = uses_dynamic_stride; state->idx = idx; - ctx->vertex_state_changed = false; const int rp_idx = state->render_pass ? 1 : 0; /* shortcut for reusing previous pipeline across program changes */ diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 5705bb508c3..335cab0637c 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -186,7 +186,7 @@ zink_bind_vertex_elements_state(struct pipe_context *pctx, ctx->element_state = cso; if (cso) { if (state->element_state != &ctx->element_state->hw_state) { - ctx->vertex_state_changed = !zink_screen(pctx->screen)->info.have_EXT_vertex_input_dynamic_state; + ctx->vertex_state_changed = true; ctx->vertex_buffers_dirty = ctx->element_state->hw_state.num_bindings > 0; } state->element_state = &ctx->element_state->hw_state;