From dbc59aedb92e1bd60ca21d12e0e73de8f1e69132 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 26 Jan 2021 10:31:24 -0500 Subject: [PATCH] zink: only update viewport state when necessary Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.c | 2 ++ src/gallium/drivers/zink/zink_context.h | 1 + src/gallium/drivers/zink/zink_draw.c | 37 +++++++++++++------------ src/gallium/drivers/zink/zink_state.c | 4 ++- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 68aab762c5f..abad104d17b 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -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; } } diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 0c656a8fbea..0aa484882dc 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -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]; diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index eea4955c052..f9f1523021e 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -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); diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index d2a4d721a3c..b006d67c39e 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -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;