Module: Mesa Branch: main Commit: 777e6b43bcc418296eb136c21a4483127567d59c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=777e6b43bcc418296eb136c21a4483127567d59c
Author: Giancarlo Devich <[email protected]> Date: Tue Mar 14 11:52:16 2023 -0700 d3d12: Reduce gs variant key init cost; unnecessary validate gs calls Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21909> --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 33 ++++++++++++++-------------- src/gallium/drivers/d3d12/d3d12_compiler.h | 23 +++++++++++-------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index f6bcd0c68d0..339b4fc7e27 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -714,9 +714,9 @@ validate_geometry_shader_variant(struct d3d12_selection_context *sel_ctx) d3d12_shader_selector* vs = ctx->gfx_stages[PIPE_SHADER_VERTEX]; d3d12_shader_selector* fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT]; - struct d3d12_gs_variant_key key{0}; - - bool variant_needed = false; + struct d3d12_gs_variant_key key; + key.all = 0; + key.flat_varyings = 0; /* Fill the geometry shader variant key */ if (sel_ctx->fill_mode_lowered != PIPE_POLYGON_MODE_FILL) { @@ -729,27 +729,20 @@ validate_geometry_shader_variant(struct d3d12_selection_context *sel_ctx) fill_flat_varyings(&key, fs); if (key.flat_varyings != 0) key.flatshade_first = ctx->gfx_pipeline_state.rast->base.flatshade_first; - variant_needed = true; } else if (sel_ctx->needs_point_sprite_lowering) { key.passthrough = true; - variant_needed = true; } else if (sel_ctx->needs_vertex_reordering) { /* TODO support cases where flat shading (pv != 0) and xfb are enabled */ key.provoking_vertex = sel_ctx->provoking_vertex; key.alternate_tri = sel_ctx->alternate_tri; - variant_needed = true; } - if (variant_needed) { - if (vs->initial_output_vars == nullptr) { - vs->initial_output_vars = fill_varyings(sel_ctx->ctx, vs->initial, nir_var_shader_out, - vs->initial->info.outputs_written, false); - } - key.varyings = vs->initial_output_vars; + if (vs->initial_output_vars == nullptr) { + vs->initial_output_vars = fill_varyings(sel_ctx->ctx, vs->initial, nir_var_shader_out, + vs->initial->info.outputs_written, false); } - - /* Find/create the proper variant and bind it */ - gs = variant_needed ? d3d12_get_gs_variant(ctx, &key) : NULL; + key.varyings = vs->initial_output_vars; + gs = d3d12_get_gs_variant(ctx, &key); ctx->gfx_stages[PIPE_SHADER_GEOMETRY] = gs; } @@ -1639,7 +1632,15 @@ d3d12_select_shader_variants(struct d3d12_context *ctx, const struct pipe_draw_i sel_ctx.frag_result_color_lowering = frag_result_color_lowering(ctx); sel_ctx.manual_depth_range = ctx->manual_depth_range; - validate_geometry_shader_variant(&sel_ctx); + d3d12_shader_selector* gs = ctx->gfx_stages[PIPE_SHADER_GEOMETRY]; + if (gs == nullptr || gs->is_variant) { + if (sel_ctx.fill_mode_lowered != PIPE_POLYGON_MODE_FILL || sel_ctx.needs_point_sprite_lowering || sel_ctx.needs_vertex_reordering) + validate_geometry_shader_variant(&sel_ctx); + else if (gs != nullptr) { + ctx->gfx_stages[PIPE_SHADER_GEOMETRY] = NULL; + } + } + validate_tess_ctrl_shader_variant(&sel_ctx); for (unsigned i = 0; i < ARRAY_SIZE(order); ++i) { diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h b/src/gallium/drivers/d3d12/d3d12_compiler.h index aebe7a9e6b0..7b51ef76807 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.h +++ b/src/gallium/drivers/d3d12/d3d12_compiler.h @@ -238,15 +238,20 @@ struct d3d12_shader { struct d3d12_gs_variant_key { - unsigned passthrough:1; - unsigned provoking_vertex:3; - unsigned alternate_tri:1; - unsigned fill_mode:2; - unsigned cull_mode:2; - unsigned has_front_face:1; - unsigned front_ccw:1; - unsigned edge_flag_fix:1; - unsigned flatshade_first:1; + union { + struct { + unsigned passthrough:1; + unsigned provoking_vertex:3; + unsigned alternate_tri:1; + unsigned fill_mode:2; + unsigned cull_mode:2; + unsigned has_front_face:1; + unsigned front_ccw:1; + unsigned edge_flag_fix:1; + unsigned flatshade_first:1; + }; + uint64_t all; + }; uint64_t flat_varyings; struct d3d12_varying_info *varyings; };
