diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 21f528e794a..db1f944a5c7 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -299,6 +299,7 @@ struct zink_context { bool have_timelines; bool is_device_lost; + bool blend_state_changed : 1; bool rast_state_changed : 1; bool dsa_state_changed : 1; bool stencil_ref_changed : 1; diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 32c2e8eab35..1557f267bfb 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -642,8 +642,11 @@ zink_draw_vbo(struct pipe_context *pctx, ctx->sample_locations_changed = false; } - if (ctx->gfx_pipeline_state.blend_state->need_blend_constants) + if ((BATCH_CHANGED || ctx->blend_state_changed) && + ctx->gfx_pipeline_state.blend_state->need_blend_constants) { vkCmdSetBlendConstants(batch->state->cmdbuf, ctx->blend_constants); + } + ctx->blend_state_changed = false; if (BATCH_CHANGED || ctx->vertex_buffers_dirty) zink_bind_vertex_buffers(batch, ctx); diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 3fc7fde9b71..95453cb3c8a 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -293,6 +293,7 @@ zink_bind_blend_state(struct pipe_context *pctx, void *cso) if (state->blend_state != cso) { state->blend_state = cso; state->dirty = true; + zink_context(pctx)->blend_state_changed = true; } }