Mesa (main): zink: fix viewport count tracking

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 20 13:38:07 UTC 2022


Module: Mesa
Branch: main
Commit: 268011e8c6aae4a682a8bc39c77d3783b3fb25b1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=268011e8c6aae4a682a8bc39c77d3783b3fb25b1

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
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 <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17639>

---

 src/gallium/drivers/zink/zink_context.c |  6 ------
 src/gallium/drivers/zink/zink_program.c | 18 ++++++++++++++++++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 52b27405085..bb8509ba0d7 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1160,13 +1160,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 dfee6ff1d95..53dcec1c8f1 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -997,6 +997,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;
    }
 }



More information about the mesa-commit mailing list