mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
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>
(cherry picked from commit b18448e7ac)
This commit is contained in:
parent
c626362907
commit
12b9b7edf9
2 changed files with 9 additions and 6 deletions
|
|
@ -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
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue