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 <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16563>
This commit is contained in:
Mike Blumenkrantz 2022-04-26 09:02:57 -04:00 committed by Marge Bot
parent ca1d98df99
commit b18448e7ac

View file

@ -1017,18 +1017,19 @@ zink_set_vertex_buffers(struct pipe_context *pctx,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct zink_context *ctx = zink_context(pctx); 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 && 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; 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);
enabled_buffers &= ~u_bit_consecutive(start_slot + num_buffers, unbind_num_trailing_slots); enabled_buffers &= ~u_bit_consecutive(start_slot + num_buffers, unbind_num_trailing_slots);
bool stride_changed = false;
if (buffers) { if (buffers) {
if (need_state_change)
ctx->vertex_state_changed = true;
for (unsigned i = 0; i < num_buffers; ++i) { for (unsigned i = 0; i < num_buffers; ++i) {
const struct pipe_vertex_buffer *vb = buffers + i; const struct pipe_vertex_buffer *vb = buffers + i;
struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[start_slot + 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); update_existing_vbo(ctx, start_slot + i);
if (!take_ownership) if (!take_ownership)
pipe_resource_reference(&ctx_vb->buffer.resource, vb->buffer.resource); pipe_resource_reference(&ctx_vb->buffer.resource, vb->buffer.resource);
@ -1051,8 +1052,6 @@ zink_set_vertex_buffers(struct pipe_context *pctx,
} }
} }
} else { } else {
if (need_state_change)
ctx->vertex_state_changed = true;
for (unsigned i = 0; i < num_buffers; ++i) { for (unsigned i = 0; i < num_buffers; ++i) {
update_existing_vbo(ctx, start_slot + i); update_existing_vbo(ctx, start_slot + i);
pipe_resource_reference(&ctx->vertex_buffers[start_slot + i].buffer.resource, NULL); 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); update_existing_vbo(ctx, start_slot + i);
pipe_resource_reference(&ctx->vertex_buffers[start_slot + i].buffer.resource, NULL); 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->gfx_pipeline_state.vertex_buffers_enabled_mask = enabled_buffers;
ctx->vertex_buffers_dirty = num_buffers > 0; ctx->vertex_buffers_dirty = num_buffers > 0;
#ifndef NDEBUG #ifndef NDEBUG