zink: don't use dynamic vertex stride with dynamic vertex input

avoid spurious validation errors and potential driver fails from updating
stride twice

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12604>
This commit is contained in:
Mike Blumenkrantz 2021-08-17 10:25:59 -04:00 committed by Marge Bot
parent 34abd8761a
commit 07240424ca
4 changed files with 9 additions and 8 deletions

View file

@ -903,13 +903,14 @@ zink_set_vertex_buffers(struct pipe_context *pctx,
const struct pipe_vertex_buffer *buffers)
{
struct zink_context *ctx = zink_context(pctx);
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;
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);
if (buffers) {
if (!zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state)
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;
@ -935,7 +936,7 @@ zink_set_vertex_buffers(struct pipe_context *pctx,
}
}
} else {
if (!zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state)
if (need_state_change)
ctx->vertex_state_changed = true;
for (unsigned i = 0; i < num_buffers; ++i) {
update_existing_vbo(ctx, start_slot + i);

View file

@ -156,7 +156,7 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx)
}
}
if (HAS_DYNAMIC_STATE)
if (HAS_DYNAMIC_STATE && !HAS_VERTEX_INPUT)
screen->vk.CmdBindVertexBuffers2EXT(batch->state->cmdbuf, 0,
elems->hw_state.num_bindings,
buffers, buffer_offsets, NULL, buffer_strides);

View file

@ -189,7 +189,6 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_STENCIL_OP_EXT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_FRONT_FACE_EXT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT;
if (state->sample_locations_enabled)
@ -198,9 +197,10 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_VIEWPORT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_SCISSOR;
}
if (screen->info.have_EXT_vertex_input_dynamic_state) {
if (screen->info.have_EXT_vertex_input_dynamic_state)
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_VERTEX_INPUT_EXT;
}
else if (screen->info.have_EXT_extended_dynamic_state)
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT;
if (screen->info.have_EXT_extended_dynamic_state2)
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT;

View file

@ -119,7 +119,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 = true;
ctx->vertex_state_changed = !zink_screen(pctx->screen)->info.have_EXT_vertex_input_dynamic_state;
ctx->vertex_buffers_dirty = ctx->element_state->hw_state.num_bindings > 0;
}
state->element_state = &ctx->element_state->hw_state;