From 67f2d07eff9c54540ca2ea769a38f31cc3c429c0 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 25 Jan 2023 09:24:16 -0500 Subject: [PATCH] zink: fix VK_DYNAMIC_STATE_LINE_WIDTH usage add a special tracker here to set the state only when necessary Fixes: 659c39fafbb ("zink: rework primitive rasterization type logic") Part-of: (cherry picked from commit 06a125942bef6a03a12b67f691ab4ad86e49c2df) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_draw.cpp | 6 ++++-- src/gallium/drivers/zink/zink_state.c | 4 ++++ src/gallium/drivers/zink/zink_types.h | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 03036e563ba..5a3d3d344ec 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -346,7 +346,7 @@ "description": "zink: fix VK_DYNAMIC_STATE_LINE_WIDTH usage", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "659c39fafbb53e27e6816fa872ac6eb78772e519" }, diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 035e20b4e78..21884073e3f 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -703,9 +703,11 @@ zink_draw(struct pipe_context *pctx, } } - if ((BATCH_CHANGED || rast_state_changed || rast_prim_changed) && - ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_LINES) { + if (BATCH_CHANGED || + /* only re-emit on non-batch change when actually drawing lines */ + ((ctx->line_width_changed || rast_prim_changed) && ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_LINES)) { VKCTX(CmdSetLineWidth)(batch->state->cmdbuf, rast_state->line_width); + ctx->line_width_changed = false; } if (BATCH_CHANGED || mode_changed || diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 1953d059077..c38a06e3032 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -623,6 +623,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) bool clip_halfz = ctx->rast_state ? ctx->rast_state->hw_state.clip_halfz : false; bool rasterizer_discard = ctx->rast_state ? ctx->rast_state->base.rasterizer_discard : false; bool half_pixel_center = ctx->rast_state ? ctx->rast_state->base.half_pixel_center : true; + float line_width = ctx->rast_state ? ctx->rast_state->base.line_width : 1.0; ctx->rast_state = cso; if (ctx->rast_state) { @@ -644,6 +645,9 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) ctx->vp_state_changed = true; } + if (fabs(ctx->rast_state->base.line_width - line_width) > FLT_EPSILON) + ctx->line_width_changed = true; + if (ctx->gfx_pipeline_state.dyn_state1.front_face != ctx->rast_state->front_face) { ctx->gfx_pipeline_state.dyn_state1.front_face = ctx->rast_state->front_face; ctx->gfx_pipeline_state.dirty |= !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 5aa593139ff..93ae9ac8cb0 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1680,6 +1680,7 @@ struct zink_context { bool blend_state_changed : 1; bool sample_mask_changed : 1; bool rast_state_changed : 1; + bool line_width_changed : 1; bool dsa_state_changed : 1; bool stencil_ref_changed : 1; bool rasterizer_discard_changed : 1;