Mesa (staging/22.1): zink: fix non-dynamic vertex stride update flagging
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 18 02:46:09 UTC 2022
Module: Mesa
Branch: staging/22.1
Commit: ea55add4059804095d5958d66e92641b9ca66daa
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ea55add4059804095d5958d66e92641b9ca66daa
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue Apr 26 09:02:57 2022 -0400
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 at array-stride
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16563>
---
src/gallium/drivers/zink/zink_context.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index e3c9485ce2e..f44de75d948 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1024,18 +1024,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);
@@ -1058,8 +1059,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);
@@ -1069,6 +1068,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
More information about the mesa-commit
mailing list