diff --git a/.pick_status.json b/.pick_status.json index 05107c43574..810602ba047 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -980,7 +980,7 @@ "description": "zink: fix non-dynamic vertex stride update flagging", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "because_sha": null }, { diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index e3264d1cc0b..6a792dee8e9 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -962,18 +962,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); @@ -995,8 +996,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); @@ -1006,6 +1005,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