diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 60f425cd1a1..ebbf85af847 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1017,18 +1017,19 @@ zink_set_vertex_buffers(struct pipe_context *pctx, const struct pipe_vertex_buffer *buffers) { struct zink_context *ctx = zink_context(pctx); + const bool have_input_state = zink_screen(pctx->screen)->info.have_EXT_vertex_input_dynamic_state; const bool need_state_change = !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state && - !zink_screen(pctx->screen)->info.have_EXT_vertex_input_dynamic_state; + !have_input_state; uint32_t enabled_buffers = ctx->gfx_pipeline_state.vertex_buffers_enabled_mask; enabled_buffers |= u_bit_consecutive(start_slot, num_buffers); enabled_buffers &= ~u_bit_consecutive(start_slot + num_buffers, unbind_num_trailing_slots); + bool stride_changed = false; if (buffers) { - if (need_state_change) - ctx->vertex_state_changed = true; for (unsigned i = 0; i < num_buffers; ++i) { const struct pipe_vertex_buffer *vb = buffers + i; struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[start_slot + i]; + stride_changed |= ctx_vb->stride != vb->stride; update_existing_vbo(ctx, start_slot + i); if (!take_ownership) pipe_resource_reference(&ctx_vb->buffer.resource, vb->buffer.resource); @@ -1051,8 +1052,6 @@ zink_set_vertex_buffers(struct pipe_context *pctx, } } } else { - if (need_state_change) - ctx->vertex_state_changed = true; for (unsigned i = 0; i < num_buffers; ++i) { update_existing_vbo(ctx, start_slot + i); pipe_resource_reference(&ctx->vertex_buffers[start_slot + i].buffer.resource, NULL); @@ -1062,6 +1061,10 @@ zink_set_vertex_buffers(struct pipe_context *pctx, update_existing_vbo(ctx, start_slot + i); pipe_resource_reference(&ctx->vertex_buffers[start_slot + i].buffer.resource, NULL); } + if (need_state_change) + ctx->vertex_state_changed = true; + else if (!have_input_state && (stride_changed || ctx->gfx_pipeline_state.vertex_buffers_enabled_mask != enabled_buffers)) + ctx->vertex_state_changed = true; ctx->gfx_pipeline_state.vertex_buffers_enabled_mask = enabled_buffers; ctx->vertex_buffers_dirty = num_buffers > 0; #ifndef NDEBUG