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

Reply via email to