zink: only update viewport state when necessary

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10997>
This commit is contained in:
Mike Blumenkrantz 2021-01-26 10:31:24 -05:00 committed by Marge Bot
parent 59b6f5db36
commit dbc59aedb9
4 changed files with 26 additions and 18 deletions

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

View 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];

View 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);

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