Module: Mesa Branch: main Commit: 70af7fd5e8f433b937ca6516d4d00ca6bc500fe3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=70af7fd5e8f433b937ca6516d4d00ca6bc500fe3
Author: Giancarlo Devich <[email protected]> Date: Tue Mar 14 11:55:47 2023 -0700 d3d12: Unroll shader variant selection loop Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21909> --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 41 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index 339b4fc7e27..bf55d1177b7 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -1613,13 +1613,6 @@ d3d12_create_compute_shader(struct d3d12_context *ctx, void d3d12_select_shader_variants(struct d3d12_context *ctx, const struct pipe_draw_info *dinfo) { - static unsigned order[] = { - PIPE_SHADER_VERTEX, - PIPE_SHADER_TESS_CTRL, - PIPE_SHADER_TESS_EVAL, - PIPE_SHADER_GEOMETRY, - PIPE_SHADER_FRAGMENT - }; struct d3d12_selection_context sel_ctx; sel_ctx.ctx = ctx; @@ -1643,15 +1636,31 @@ d3d12_select_shader_variants(struct d3d12_context *ctx, const struct pipe_draw_i validate_tess_ctrl_shader_variant(&sel_ctx); - for (unsigned i = 0; i < ARRAY_SIZE(order); ++i) { - auto sel = ctx->gfx_stages[order[i]]; - if (!sel) - continue; - - d3d12_shader_selector *prev = get_prev_shader(ctx, sel->stage); - d3d12_shader_selector *next = get_next_shader(ctx, sel->stage); - - select_shader_variant(&sel_ctx, sel, prev, next); + auto* stages = ctx->gfx_stages; + d3d12_shader_selector* prev; + d3d12_shader_selector* next; + if (stages[PIPE_SHADER_VERTEX]) { + next = get_next_shader(ctx, PIPE_SHADER_VERTEX); + select_shader_variant(&sel_ctx, stages[PIPE_SHADER_VERTEX], nullptr, next); + } + if (stages[PIPE_SHADER_TESS_CTRL]) { + prev = get_prev_shader(ctx, PIPE_SHADER_TESS_CTRL); + next = get_next_shader(ctx, PIPE_SHADER_TESS_CTRL); + select_shader_variant(&sel_ctx, stages[PIPE_SHADER_TESS_CTRL], prev, next); + } + if (stages[PIPE_SHADER_TESS_EVAL]) { + prev = get_prev_shader(ctx, PIPE_SHADER_TESS_EVAL); + next = get_next_shader(ctx, PIPE_SHADER_TESS_EVAL); + select_shader_variant(&sel_ctx, stages[PIPE_SHADER_TESS_EVAL], prev, next); + } + if (stages[PIPE_SHADER_GEOMETRY]) { + prev = get_prev_shader(ctx, PIPE_SHADER_GEOMETRY); + next = get_next_shader(ctx, PIPE_SHADER_GEOMETRY); + select_shader_variant(&sel_ctx, stages[PIPE_SHADER_GEOMETRY], prev, next); + } + if (stages[PIPE_SHADER_FRAGMENT]) { + prev = get_prev_shader(ctx, PIPE_SHADER_FRAGMENT); + select_shader_variant(&sel_ctx, stages[PIPE_SHADER_FRAGMENT], prev, nullptr); } }
