Module: Mesa Branch: main Commit: 9a3820fe1168e44c9e9abfe6863ffc43897a200c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a3820fe1168e44c9e9abfe6863ffc43897a200c
Author: Giancarlo Devich <[email protected]> Date: Fri Feb 24 11:30:07 2023 -0800 d3d12: Don't recompute has_flat_varyings or missing_dual_src_outputs Per shader selection, these two flags can be expensive to compute. Instead, recompute their values as neccessary, and save them in the context. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21527> --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 15 +++++++++------ src/gallium/drivers/d3d12/d3d12_compiler.h | 6 ++++++ src/gallium/drivers/d3d12/d3d12_context.cpp | 13 ++++++++++++- src/gallium/drivers/d3d12/d3d12_context.h | 3 +++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index 99bfc78b3f7..b56b4986102 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -250,14 +250,17 @@ struct d3d12_selection_context { const unsigned *variable_workgroup_size; }; -static unsigned +unsigned missing_dual_src_outputs(struct d3d12_context *ctx) { - if (!ctx->gfx_pipeline_state.blend->is_dual_src) + if (!ctx->gfx_pipeline_state.blend || !ctx->gfx_pipeline_state.blend->is_dual_src) return 0; struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT]; - nir_shader *s = fs->initial; + if (!fs) + return 0; + + const nir_shader *s = fs->initial; unsigned indices_seen = 0; nir_foreach_function(function, s) { @@ -457,7 +460,7 @@ get_provoking_vertex(struct d3d12_selection_context *sel_ctx, bool *alternate, c return flatshade_first ? 0 : u_prim_vertex_count(mode)->min - 1; } -static bool +bool has_flat_varyings(struct d3d12_context *ctx) { struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT]; @@ -481,7 +484,7 @@ static bool needs_vertex_reordering(struct d3d12_selection_context *sel_ctx, const struct pipe_draw_info *dinfo) { struct d3d12_context *ctx = sel_ctx->ctx; - bool flat = has_flat_varyings(ctx); + bool flat = ctx->has_flat_varyings; bool xfb = ctx->gfx_pipeline_state.num_so_targets > 0; if (fill_mode_lowered(ctx, dinfo) != PIPE_POLYGON_MODE_FILL) @@ -1531,7 +1534,7 @@ d3d12_select_shader_variants(struct d3d12_context *ctx, const struct pipe_draw_i sel_ctx.cull_mode_lowered = cull_mode_lowered(ctx, sel_ctx.fill_mode_lowered); sel_ctx.provoking_vertex = get_provoking_vertex(&sel_ctx, &sel_ctx.alternate_tri, dinfo); sel_ctx.needs_vertex_reordering = needs_vertex_reordering(&sel_ctx, dinfo); - sel_ctx.missing_dual_src_outputs = missing_dual_src_outputs(ctx); + sel_ctx.missing_dual_src_outputs = ctx->missing_dual_src_outputs; sel_ctx.frag_result_color_lowering = frag_result_color_lowering(ctx); sel_ctx.manual_depth_range = manual_depth_range(ctx); diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h b/src/gallium/drivers/d3d12/d3d12_compiler.h index 389501622b1..0ebc8cc642e 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.h +++ b/src/gallium/drivers/d3d12/d3d12_compiler.h @@ -290,6 +290,12 @@ d3d12_tcs_variant_cache_destroy(struct d3d12_context *ctx); struct d3d12_shader_selector * d3d12_get_tcs_variant(struct d3d12_context *ctx, struct d3d12_tcs_variant_key *key); +unsigned +missing_dual_src_outputs(struct d3d12_context* ctx); + +bool +has_flat_varyings(struct d3d12_context* ctx); + #ifdef __cplusplus } #endif diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index d3a0330cb5f..69943bdddf0 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -396,6 +396,11 @@ d3d12_bind_blend_state(struct pipe_context *pctx, void *blend_state) if (new_state == NULL || old_state == NULL || new_state->blend_factor_flags != old_state->blend_factor_flags) ctx->state_dirty |= D3D12_DIRTY_BLEND_COLOR; + + if (new_state == NULL) + ctx->missing_dual_src_outputs = false; + else if (new_state != NULL && (old_state == NULL || old_state->is_dual_src != new_state->is_dual_src)) + ctx->missing_dual_src_outputs = missing_dual_src_outputs(ctx); } static void @@ -1124,8 +1129,11 @@ static void d3d12_bind_fs_state(struct pipe_context *pctx, void *fss) { - bind_stage(d3d12_context(pctx), PIPE_SHADER_FRAGMENT, + struct d3d12_context* ctx = d3d12_context(pctx); + bind_stage(ctx, PIPE_SHADER_FRAGMENT, (struct d3d12_shader_selector *) fss); + ctx->has_flat_varyings = has_flat_varyings(ctx); + ctx->missing_dual_src_outputs = missing_dual_src_outputs(ctx); } static void @@ -2505,6 +2513,9 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->gfx_pipeline_state.sample_mask = ~0; + ctx->has_flat_varyings = false; + ctx->missing_dual_src_outputs = false; + d3d12_context_surface_init(&ctx->base); d3d12_context_resource_init(&ctx->base); d3d12_context_query_init(&ctx->base); diff --git a/src/gallium/drivers/d3d12/d3d12_context.h b/src/gallium/drivers/d3d12/d3d12_context.h index 7258b0c4eaf..460abfa7940 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.h +++ b/src/gallium/drivers/d3d12/d3d12_context.h @@ -238,6 +238,9 @@ struct d3d12_context { struct d3d12_shader_selector *gfx_stages[D3D12_GFX_SHADER_STAGES]; struct d3d12_shader_selector *compute_state; + bool has_flat_varyings; + bool missing_dual_src_outputs; + struct d3d12_gfx_pipeline_state gfx_pipeline_state; struct d3d12_compute_pipeline_state compute_pipeline_state; unsigned shader_dirty[PIPE_SHADER_TYPES];
