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;
    }
 }

Reply via email to