Module: Mesa Branch: staging/22.1 Commit: dc5fcc2da0de7b2c7525c25e029bc0041d711439 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc5fcc2da0de7b2c7525c25e029bc0041d711439
Author: Mike Blumenkrantz <[email protected]> Date: Mon Jul 18 12:18:47 2022 -0400 zink: fix viewport count tracking the number of viewports in use is based on the outputs of the last vertex stage, not the viewports passed by the state tracker cc: mesa-stable Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17639> (cherry picked from commit 268011e8c6aae4a682a8bc39c77d3783b3fb25b1) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_context.c | 6 ------ src/gallium/drivers/zink/zink_program.c | 18 ++++++++++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 8694c1bcde2..20b8f747430 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3613,7 +3613,7 @@ "description": "zink: fix viewport count tracking", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index d7300ad146c..d86d39991ad 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1092,13 +1092,7 @@ zink_set_viewport_states(struct pipe_context *pctx, for (unsigned i = 0; i < num_viewports; ++i) ctx->vp_state.viewport_states[start_slot + i] = state[i]; - ctx->vp_state.num_viewports = start_slot + num_viewports; - if (!zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state) { - if (ctx->gfx_pipeline_state.dyn_state1.num_viewports != ctx->vp_state.num_viewports) - ctx->gfx_pipeline_state.dirty = true; - ctx->gfx_pipeline_state.dyn_state1.num_viewports = ctx->vp_state.num_viewports; - } ctx->vp_state_changed = true; } diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 5c1d0c40912..b75c4696418 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -960,6 +960,24 @@ bind_last_vertex_stage(struct zink_context *ctx) /* always unset vertex shader values when changing to a non-vs last stage */ memset(&ctx->gfx_pipeline_state.shader_keys.key[PIPE_SHADER_VERTEX].key.vs_base, 0, sizeof(struct zink_vs_key_base)); } + + unsigned num_viewports = ctx->vp_state.num_viewports; + struct zink_screen *screen = zink_screen(ctx->base.screen); + /* number of enabled viewports is based on whether last vertex stage writes viewport index */ + if (ctx->last_vertex_stage) { + if (ctx->last_vertex_stage->nir->info.outputs_written & (VARYING_BIT_VIEWPORT | VARYING_BIT_VIEWPORT_MASK)) + ctx->vp_state.num_viewports = MIN2(screen->info.props.limits.maxViewports, PIPE_MAX_VIEWPORTS); + else + ctx->vp_state.num_viewports = 1; + } else { + ctx->vp_state.num_viewports = 1; + } + ctx->vp_state_changed |= num_viewports != ctx->vp_state.num_viewports; + if (!screen->info.have_EXT_extended_dynamic_state) { + if (ctx->gfx_pipeline_state.dyn_state1.num_viewports != ctx->vp_state.num_viewports) + ctx->gfx_pipeline_state.dirty = true; + ctx->gfx_pipeline_state.dyn_state1.num_viewports = ctx->vp_state.num_viewports; + } ctx->last_vertex_stage_dirty = true; } }
