Module: Mesa Branch: main Commit: b06ef86020d35607010e5d032afd04069378009f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b06ef86020d35607010e5d032afd04069378009f
Author: Mike Blumenkrantz <[email protected]> Date: Fri Jun 11 09:32:35 2021 -0400 zink: reorder gfx program/pipeline/descriptor binds if dynamic state is present this enables deferring the heavy lifting until the rest of the state updates are done Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12572> --- src/gallium/drivers/zink/zink_draw.cpp | 56 ++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 7ea8c3dd395..15d2010af28 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -391,6 +391,19 @@ update_barriers(struct zink_context *ctx, bool is_compute) } } +template <bool BATCH_CHANGED> +static bool +update_gfx_pipeline(struct zink_context *ctx, struct zink_batch_state *bs, enum pipe_prim_type mode) +{ + VkPipeline prev_pipeline = ctx->gfx_pipeline_state.pipeline; + update_gfx_program(ctx); + VkPipeline pipeline = zink_get_gfx_pipeline(ctx, ctx->curr_program, &ctx->gfx_pipeline_state, mode); + bool pipeline_changed = prev_pipeline != pipeline; + if (BATCH_CHANGED || pipeline_changed) + vkCmdBindPipeline(bs->cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + return pipeline_changed; +} + template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state HAS_DYNAMIC_STATE, bool BATCH_CHANGED> void zink_draw_vbo(struct pipe_context *pctx, @@ -440,7 +453,6 @@ zink_draw_vbo(struct pipe_context *pctx, ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_FRAGMENT); } ctx->gfx_prim_mode = mode; - update_gfx_program(ctx); if (ctx->gfx_pipeline_state.primitive_restart != dinfo->primitive_restart) ctx->gfx_pipeline_state.dirty = true; @@ -471,9 +483,6 @@ zink_draw_vbo(struct pipe_context *pctx, vkCmdBindIndexBuffer(batch->state->cmdbuf, res->obj->buffer, index_offset, index_type[index_size >> 1]); } - if (zink_program_has_descriptors(&ctx->curr_program->base)) - screen->descriptors_update(ctx, false); - bool have_streamout = !!ctx->num_so_targets; if (have_streamout) { if (ctx->xfb_barrier) @@ -491,14 +500,9 @@ zink_draw_vbo(struct pipe_context *pctx, zink_update_descriptor_refs(ctx, false); batch = zink_batch_rp(ctx); - - VkPipeline prev_pipeline = ctx->gfx_pipeline_state.pipeline; - VkPipeline pipeline = zink_get_gfx_pipeline(ctx, ctx->curr_program, - &ctx->gfx_pipeline_state, - mode); - bool pipeline_changed = prev_pipeline != pipeline; - if (BATCH_CHANGED || pipeline_changed) - vkCmdBindPipeline(batch->state->cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + bool pipeline_changed = false; + if (!HAS_DYNAMIC_STATE) + pipeline_changed = update_gfx_pipeline<BATCH_CHANGED>(ctx, batch->state, mode); if (BATCH_CHANGED || ctx->vp_state_changed || (!HAS_DYNAMIC_STATE && pipeline_changed)) { VkViewport viewports[PIPE_MAX_VIEWPORTS]; @@ -649,17 +653,6 @@ zink_draw_vbo(struct pipe_context *pctx, if (BATCH_CHANGED || ctx->vertex_buffers_dirty) zink_bind_vertex_buffers<HAS_DYNAMIC_STATE>(batch, ctx); - if (reads_basevertex) { - unsigned draw_mode_is_indexed = index_size > 0; - vkCmdPushConstants(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_VERTEX_BIT, - offsetof(struct zink_gfx_push_constant, draw_mode_is_indexed), sizeof(unsigned), - &draw_mode_is_indexed); - } - if (ctx->curr_program->shaders[PIPE_SHADER_TESS_CTRL] && ctx->curr_program->shaders[PIPE_SHADER_TESS_CTRL]->is_generated) - vkCmdPushConstants(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, - offsetof(struct zink_gfx_push_constant, default_inner_level), sizeof(float) * 6, - &ctx->tess_levels[0]); - zink_query_update_gs_states(ctx); if (have_streamout) { @@ -684,6 +677,23 @@ zink_draw_vbo(struct pipe_context *pctx, zink_select_draw_vbo(ctx); } + if (HAS_DYNAMIC_STATE) + update_gfx_pipeline<BATCH_CHANGED>(ctx, batch->state, mode); + + if (zink_program_has_descriptors(&ctx->curr_program->base)) + screen->descriptors_update(ctx, false); + + if (reads_basevertex) { + unsigned draw_mode_is_indexed = index_size > 0; + vkCmdPushConstants(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_VERTEX_BIT, + offsetof(struct zink_gfx_push_constant, draw_mode_is_indexed), sizeof(unsigned), + &draw_mode_is_indexed); + } + if (ctx->curr_program->shaders[PIPE_SHADER_TESS_CTRL] && ctx->curr_program->shaders[PIPE_SHADER_TESS_CTRL]->is_generated) + vkCmdPushConstants(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, + offsetof(struct zink_gfx_push_constant, default_inner_level), sizeof(float) * 6, + &ctx->tess_levels[0]); + bool needs_drawid = reads_drawid && ctx->drawid_broken; work_count += num_draws; if (index_size > 0) {
