From 12b9b7edf9585503832f7ab41b0e23d51c5e1dab Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 26 Apr 2022 09:02:57 -0400 Subject: [PATCH] zink: fix non-dynamic vertex stride update flagging without dynamic vertex input, pipeline vertex state must be recalculated if buffer strides change or the enabled buffer mask changes in order to accurately handle dynamic state stride VUs cc: mesa-stable fixes: spec@!opengl 1.1@array-stride Reviewed-by: Dave Airlie Part-of: (cherry picked from commit b18448e7acfc765ee95505c7cd5e2ce6e6fc36cc) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_context.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) 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