zink: only update viewport state when necessary
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 26 Jan 2021 15:31:24 +0000 (10:31 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 31 May 2021 14:39:57 +0000 (14:39 +0000)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10997>

src/gallium/drivers/zink/zink_context.c
src/gallium/drivers/zink/zink_context.h
src/gallium/drivers/zink/zink_draw.c
src/gallium/drivers/zink/zink_state.c

index 68aab76..abad104 100644 (file)
@@ -880,6 +880,7 @@ zink_set_viewport_states(struct pipe_context *pctx,
          ctx->gfx_pipeline_state.dirty = true;
       ctx->gfx_pipeline_state.num_viewports = ctx->vp_state.num_viewports;
    }
+   ctx->vp_state_changed = true;
 }
 
 static void
@@ -1708,6 +1709,7 @@ flush_batch(struct zink_context *ctx, bool sync)
       ctx->descriptor_refs_dirty[0] = ctx->descriptor_refs_dirty[1] = true;
       ctx->pipeline_changed[0] = ctx->pipeline_changed[1] = true;
       ctx->vertex_buffers_dirty = true;
+      ctx->vp_state_changed = true;
    }
 }
 
index 0c656a8..0aa4848 100644 (file)
@@ -203,6 +203,7 @@ struct zink_context {
    struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
 
    struct zink_viewport_state vp_state;
+   bool vp_state_changed;
 
    float line_width;
    float blend_constants[4];
index eea4955..f9f1523 100644 (file)
@@ -542,24 +542,26 @@ zink_draw_vbo(struct pipe_context *pctx,
    if (pipeline_changed)
       vkCmdBindPipeline(batch->state->cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
 
-   VkViewport viewports[PIPE_MAX_VIEWPORTS];
-   for (unsigned i = 0; i < ctx->vp_state.num_viewports; i++) {
-      VkViewport viewport = {
-         ctx->vp_state.viewport_states[i].translate[0] - ctx->vp_state.viewport_states[i].scale[0],
-         ctx->vp_state.viewport_states[i].translate[1] - ctx->vp_state.viewport_states[i].scale[1],
-         ctx->vp_state.viewport_states[i].scale[0] * 2,
-         ctx->vp_state.viewport_states[i].scale[1] * 2,
-         ctx->rast_state->base.clip_halfz ?
-            ctx->vp_state.viewport_states[i].translate[2] :
-            ctx->vp_state.viewport_states[i].translate[2] - ctx->vp_state.viewport_states[i].scale[2],
-         ctx->vp_state.viewport_states[i].translate[2] + ctx->vp_state.viewport_states[i].scale[2]
-      };
-      viewports[i] = viewport;
+   if (ctx->vp_state_changed || pipeline_changed) {
+      VkViewport viewports[PIPE_MAX_VIEWPORTS];
+      for (unsigned i = 0; i < ctx->vp_state.num_viewports; i++) {
+         VkViewport viewport = {
+            ctx->vp_state.viewport_states[i].translate[0] - ctx->vp_state.viewport_states[i].scale[0],
+            ctx->vp_state.viewport_states[i].translate[1] - ctx->vp_state.viewport_states[i].scale[1],
+            ctx->vp_state.viewport_states[i].scale[0] * 2,
+            ctx->vp_state.viewport_states[i].scale[1] * 2,
+            ctx->rast_state->base.clip_halfz ?
+               ctx->vp_state.viewport_states[i].translate[2] :
+               ctx->vp_state.viewport_states[i].translate[2] - ctx->vp_state.viewport_states[i].scale[2],
+            ctx->vp_state.viewport_states[i].translate[2] + ctx->vp_state.viewport_states[i].scale[2]
+         };
+         viewports[i] = viewport;
+      }
+      if (screen->info.have_EXT_extended_dynamic_state)
+         screen->vk_CmdSetViewportWithCountEXT(batch->state->cmdbuf, ctx->vp_state.num_viewports, viewports);
+      else
+         vkCmdSetViewport(batch->state->cmdbuf, 0, ctx->vp_state.num_viewports, viewports);
    }
-   if (screen->info.have_EXT_extended_dynamic_state)
-      screen->vk_CmdSetViewportWithCountEXT(batch->state->cmdbuf, ctx->vp_state.num_viewports, viewports);
-   else
-      vkCmdSetViewport(batch->state->cmdbuf, 0, ctx->vp_state.num_viewports, viewports);
    VkRect2D scissors[PIPE_MAX_VIEWPORTS];
    if (ctx->rast_state->base.scissor) {
       for (unsigned i = 0; i < ctx->vp_state.num_viewports; i++) {
@@ -581,6 +583,7 @@ zink_draw_vbo(struct pipe_context *pctx,
    else
       vkCmdSetScissor(batch->state->cmdbuf, 0, ctx->vp_state.num_viewports, scissors);
 
+   ctx->vp_state_changed = false;
    if (line_width_needed(reduced_prim, rast_state->hw_state.polygon_mode)) {
       if (screen->info.feats.features.wideLines || ctx->line_width == 1.0f)
          vkCmdSetLineWidth(batch->state->cmdbuf, ctx->line_width);
index d2a4d72..b006d67 100644 (file)
@@ -488,8 +488,10 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso)
          ctx->gfx_pipeline_state.dirty = true;
       }
 
-      if (clip_halfz != ctx->rast_state->base.clip_halfz)
+      if (clip_halfz != ctx->rast_state->base.clip_halfz) {
          ctx->last_vertex_stage_dirty = true;
+         ctx->vp_state_changed = true;
+      }
 
       if (ctx->gfx_pipeline_state.front_face != ctx->rast_state->front_face) {
          ctx->gfx_pipeline_state.front_face = ctx->rast_state->front_face;