Mesa (main): d3d12: Upgrade first vertex state var into all vertex draw params

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 14 16:12:31 UTC 2022


Module: Mesa
Branch: main
Commit: aaceb10b0f61cbaa1508fe291f7f9d97fc60802c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=aaceb10b0f61cbaa1508fe291f7f9d97fc60802c

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Mon Jan 10 14:09:30 2022 -0800

d3d12: Upgrade first vertex state var into all vertex draw params

Add in base instance, draw ID, and is-indexed-draw

Reviewed-by: Sil Vilerino <sivileri at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14486>

---

 src/gallium/drivers/d3d12/d3d12_compiler.cpp |  2 +-
 src/gallium/drivers/d3d12/d3d12_compiler.h   |  2 +-
 src/gallium/drivers/d3d12/d3d12_draw.cpp     | 12 ++++++---
 src/gallium/drivers/d3d12/d3d12_nir_passes.c | 40 +++++++++++-----------------
 src/gallium/drivers/d3d12/d3d12_nir_passes.h |  2 +-
 5 files changed, 27 insertions(+), 31 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
index 8d816d037b3..5780005d509 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
@@ -170,7 +170,7 @@ compile_nir(struct d3d12_context *ctx, struct d3d12_shader_selector *sel,
       NIR_PASS_V(nir, d3d12_lower_yflip);
    }
    NIR_PASS_V(nir, nir_lower_packed_ubo_loads);
-   NIR_PASS_V(nir, d3d12_lower_load_first_vertex);
+   NIR_PASS_V(nir, d3d12_lower_load_draw_params);
    NIR_PASS_V(nir, d3d12_lower_state_vars, shader);
    NIR_PASS_V(nir, dxil_nir_lower_bool_input);
    NIR_PASS_V(nir, dxil_nir_lower_loads_stores_to_dxil);
diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h b/src/gallium/drivers/d3d12/d3d12_compiler.h
index 703b058bb48..40cc4fba286 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.h
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.h
@@ -43,7 +43,7 @@ extern "C" {
 enum d3d12_state_var {
    D3D12_STATE_VAR_Y_FLIP = 0,
    D3D12_STATE_VAR_PT_SPRITE,
-   D3D12_STATE_VAR_FIRST_VERTEX,
+   D3D12_STATE_VAR_DRAW_PARAMS,
    D3D12_STATE_VAR_DEPTH_TRANSFORM,
    D3D12_MAX_GRAPHICS_STATE_VARS,
 
diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp b/src/gallium/drivers/d3d12/d3d12_draw.cpp
index 7bd739f9c72..72b263e4ace 100644
--- a/src/gallium/drivers/d3d12/d3d12_draw.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp
@@ -340,6 +340,7 @@ fill_image_descriptors(struct d3d12_context *ctx,
 static unsigned
 fill_graphics_state_vars(struct d3d12_context *ctx,
                          const struct pipe_draw_info *dinfo,
+                         unsigned drawid,
                          const struct pipe_draw_start_count_bias *draw,
                          struct d3d12_shader *shader,
                          uint32_t *values)
@@ -361,8 +362,11 @@ fill_graphics_state_vars(struct d3d12_context *ctx,
          ptr[3] = fui(D3D12_MAX_POINT_SIZE);
          size += 4;
          break;
-      case D3D12_STATE_VAR_FIRST_VERTEX:
+      case D3D12_STATE_VAR_DRAW_PARAMS:
          ptr[0] = dinfo->index_size ? draw->index_bias : draw->start;
+         ptr[1] = dinfo->start_instance;
+         ptr[2] = drawid;
+         ptr[3] = dinfo->index_size ? -1 : 0;
          size += 4;
          break;
       case D3D12_STATE_VAR_DEPTH_TRANSFORM:
@@ -500,6 +504,7 @@ update_shader_stage_root_parameters(struct d3d12_context *ctx,
 static unsigned
 update_graphics_root_parameters(struct d3d12_context *ctx,
                                 const struct pipe_draw_info *dinfo,
+                                unsigned drawid,
                                 const struct pipe_draw_start_count_bias *draw,
                                 D3D12_GPU_DESCRIPTOR_HANDLE root_desc_tables[MAX_DESCRIPTOR_TABLES],
                                 int root_desc_indices[MAX_DESCRIPTOR_TABLES])
@@ -516,7 +521,7 @@ update_graphics_root_parameters(struct d3d12_context *ctx,
       /* TODO Don't always update state vars */
       if (shader_sel->current->num_state_vars > 0) {
          uint32_t constants[D3D12_MAX_GRAPHICS_STATE_VARS * 4];
-         unsigned size = fill_graphics_state_vars(ctx, dinfo, draw, shader_sel->current, constants);
+         unsigned size = fill_graphics_state_vars(ctx, dinfo, drawid, draw, shader_sel->current, constants);
          ctx->cmdlist->SetGraphicsRoot32BitConstants(num_params, size, constants, 0);
          num_params++;
       }
@@ -847,7 +852,8 @@ d3d12_draw_vbo(struct pipe_context *pctx,
 
    D3D12_GPU_DESCRIPTOR_HANDLE root_desc_tables[MAX_DESCRIPTOR_TABLES];
    int root_desc_indices[MAX_DESCRIPTOR_TABLES];
-   unsigned num_root_descriptors = update_graphics_root_parameters(ctx, dinfo, &draws[0], root_desc_tables, root_desc_indices);
+   unsigned num_root_descriptors = update_graphics_root_parameters(ctx, dinfo, drawid_offset, &draws[0],
+      root_desc_tables, root_desc_indices);
 
    bool need_zero_one_depth_range = d3d12_need_zero_one_depth_range(ctx);
    if (need_zero_one_depth_range != ctx->need_zero_one_depth_range) {
diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.c b/src/gallium/drivers/d3d12/d3d12_nir_passes.c
index 85a79d14575..d0927f67c88 100644
--- a/src/gallium/drivers/d3d12/d3d12_nir_passes.c
+++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.c
@@ -318,51 +318,41 @@ d3d12_lower_uint_cast(nir_shader *nir, bool is_signed)
 }
 
 static bool
-lower_load_first_vertex(nir_builder *b, nir_instr *instr, nir_variable **first_vertex)
+lower_load_draw_params(nir_builder *b, nir_instr *instr, void *draw_params)
 {
    if (instr->type != nir_instr_type_intrinsic)
       return false;
 
    nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
 
-   if (intr->intrinsic != nir_intrinsic_load_first_vertex)
+   if (intr->intrinsic != nir_intrinsic_load_first_vertex &&
+       intr->intrinsic != nir_intrinsic_load_base_instance &&
+       intr->intrinsic != nir_intrinsic_load_draw_id &&
+       intr->intrinsic != nir_intrinsic_load_is_indexed_draw)
       return false;
 
    b->cursor = nir_before_instr(&intr->instr);
 
-   nir_ssa_def *load = d3d12_get_state_var(b, D3D12_STATE_VAR_FIRST_VERTEX, "d3d12_FirstVertex",
-                                           glsl_uint_type(), first_vertex);
-   nir_ssa_def_rewrite_uses(&intr->dest.ssa, load);
+   nir_ssa_def *load = d3d12_get_state_var(b, D3D12_STATE_VAR_DRAW_PARAMS, "d3d12_DrawParams",
+                                           glsl_uvec4_type(), draw_params);
+   unsigned channel = intr->intrinsic == nir_intrinsic_load_first_vertex ? 0 :
+      intr->intrinsic == nir_intrinsic_load_base_instance ? 1 :
+      intr->intrinsic == nir_intrinsic_load_draw_id ? 2 : 3;
+   nir_ssa_def_rewrite_uses(&intr->dest.ssa, nir_channel(b, load, channel));
    nir_instr_remove(instr);
 
    return true;
 }
 
 bool
-d3d12_lower_load_first_vertex(struct nir_shader *nir)
+d3d12_lower_load_draw_params(struct nir_shader *nir)
 {
-   nir_variable *first_vertex = NULL;
-   bool progress = false;
-
+   nir_variable *draw_params = NULL;
    if (nir->info.stage != MESA_SHADER_VERTEX)
       return false;
 
-   nir_foreach_function(function, nir) {
-      if (function->impl) {
-         nir_builder b;
-         nir_builder_init(&b, function->impl);
-
-         nir_foreach_block(block, function->impl) {
-            nir_foreach_instr_safe(instr, block) {
-               progress |= lower_load_first_vertex(&b, instr, &first_vertex);
-            }
-         }
-
-         nir_metadata_preserve(function->impl, nir_metadata_block_index |
-                                               nir_metadata_dominance);
-      }
-   }
-   return progress;
+   return nir_shader_instructions_pass(nir, lower_load_draw_params,
+      nir_metadata_block_index | nir_metadata_dominance, &draw_params);
 }
 
 static void
diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.h b/src/gallium/drivers/d3d12/d3d12_nir_passes.h
index 0c81d2e262b..f5aa93c03a6 100644
--- a/src/gallium/drivers/d3d12/d3d12_nir_passes.h
+++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.h
@@ -62,7 +62,7 @@ void
 d3d12_lower_depth_range(nir_shader *nir);
 
 bool
-d3d12_lower_load_first_vertex(nir_shader *nir);
+d3d12_lower_load_draw_params(nir_shader *nir);
 
 bool
 d3d12_lower_compute_state_vars(nir_shader *nir);



More information about the mesa-commit mailing list