Mesa (main): dzn: Update the draw_id sysval when issuing indirect draws

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 22 07:38:03 UTC 2022


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

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Wed Apr  6 18:23:37 2022 +0200

dzn: Update the draw_id sysval when issuing indirect draws

Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15912>

---

 src/microsoft/vulkan/dzn_nir.c      | 32 +++++++++++++++++---------------
 src/microsoft/vulkan/dzn_nir.h      |  2 ++
 src/microsoft/vulkan/dzn_pipeline.c | 11 ++++++++++-
 3 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/microsoft/vulkan/dzn_nir.c b/src/microsoft/vulkan/dzn_nir.c
index f8f5ce056eb..146322756a1 100644
--- a/src/microsoft/vulkan/dzn_nir.c
+++ b/src/microsoft/vulkan/dzn_nir.c
@@ -151,20 +151,21 @@ dzn_nir_indirect_draw_shader(enum dzn_indirect_draw_type type)
    nir_ssa_def *base_instance =
       indexed ? draw_info2 : nir_channel(&b, draw_info1, 3);
 
-   nir_ssa_def *exec_vals[7] = {
+   nir_ssa_def *exec_vals[8] = {
       first_vertex,
       base_instance,
+      index,
    };
 
    if (triangle_fan) {
       /* Patch {vertex,index}_count and first_index */
       nir_ssa_def *triangle_count =
          nir_usub_sat(&b, nir_channel(&b, draw_info1, 0), nir_imm_int(&b, 2));
-      exec_vals[2] = nir_imul_imm(&b, triangle_count, 3);
-      exec_vals[3] = nir_channel(&b, draw_info1, 1);
-      exec_vals[4] = nir_imm_int(&b, 0);
-      exec_vals[5] = first_vertex;
-      exec_vals[6] = base_instance;
+      exec_vals[3] = nir_imul_imm(&b, triangle_count, 3);
+      exec_vals[4] = nir_channel(&b, draw_info1, 1);
+      exec_vals[5] = nir_imm_int(&b, 0);
+      exec_vals[6] = first_vertex;
+      exec_vals[7] = base_instance;
 
       nir_ssa_def *triangle_fan_exec_buf_desc =
          dzn_nir_create_bo_desc(&b, nir_var_mem_ssbo, 0, 3,
@@ -174,6 +175,7 @@ dzn_nir_indirect_draw_shader(enum dzn_indirect_draw_type type)
       nir_ssa_def *triangle_fan_index_buf_addr_lo =
          nir_iadd(&b, nir_channel(&b, params, 2),
                   nir_imul(&b, triangle_fan_index_buf_stride, index));
+
       nir_ssa_def *addr_lo_overflow =
          nir_ult(&b, triangle_fan_index_buf_addr_lo, nir_channel(&b, params, 2));
       nir_ssa_def *triangle_fan_index_buf_addr_hi =
@@ -213,22 +215,22 @@ dzn_nir_indirect_draw_shader(enum dzn_indirect_draw_type type)
 
       nir_store_ssbo(&b, nir_vec(&b, ibview_vals, ARRAY_SIZE(ibview_vals)),
                      exec_buf_desc, exec_offset,
-                     .write_mask = 0x3, .access = ACCESS_NON_READABLE, .align_mul = 4);
+                     .write_mask = 0xf, .access = ACCESS_NON_READABLE, .align_mul = 16);
       exec_offset = nir_iadd_imm(&b, exec_offset, ARRAY_SIZE(ibview_vals) * 4);
    } else {
-      exec_vals[2] = nir_channel(&b, draw_info1, 0);
-      exec_vals[3] = nir_channel(&b, draw_info1, 1);
-      exec_vals[4] = nir_channel(&b, draw_info1, 2);
-      exec_vals[5] = nir_channel(&b, draw_info1, 3);
-      exec_vals[6] = draw_info2;
+      exec_vals[3] = nir_channel(&b, draw_info1, 0);
+      exec_vals[4] = nir_channel(&b, draw_info1, 1);
+      exec_vals[5] = nir_channel(&b, draw_info1, 2);
+      exec_vals[6] = nir_channel(&b, draw_info1, 3);
+      exec_vals[7] = draw_info2;
    }
 
    nir_store_ssbo(&b, nir_vec(&b, exec_vals, 4),
                   exec_buf_desc, exec_offset,
-                  .write_mask = 0xf, .access = ACCESS_NON_READABLE, .align_mul = 4);
-   nir_store_ssbo(&b, nir_vec(&b, &exec_vals[4], 3),
+                  .write_mask = 0xf, .access = ACCESS_NON_READABLE, .align_mul = 16);
+   nir_store_ssbo(&b, nir_vec(&b, &exec_vals[4], 4),
                   exec_buf_desc, nir_iadd_imm(&b, exec_offset, 16),
-                  .write_mask = 7, .access = ACCESS_NON_READABLE, .align_mul = 4);
+                  .write_mask = 0xf, .access = ACCESS_NON_READABLE, .align_mul = 16);
 
 
    return b.shader;
diff --git a/src/microsoft/vulkan/dzn_nir.h b/src/microsoft/vulkan/dzn_nir.h
index 4b3fef49ff7..d05f1ba5030 100644
--- a/src/microsoft/vulkan/dzn_nir.h
+++ b/src/microsoft/vulkan/dzn_nir.h
@@ -59,6 +59,7 @@ struct dzn_indirect_draw_exec_params {
    struct {
       uint32_t first_vertex;
       uint32_t base_instance;
+      uint32_t draw_id;
    } sysvals;
    union {
       struct dzn_indirect_draw_params draw;
@@ -71,6 +72,7 @@ struct dzn_indirect_triangle_fan_draw_exec_params {
    struct {
       uint32_t first_vertex;
       uint32_t base_instance;
+      uint32_t draw_id;
    } sysvals;
    union {
       struct dzn_indirect_draw_params draw;
diff --git a/src/microsoft/vulkan/dzn_pipeline.c b/src/microsoft/vulkan/dzn_pipeline.c
index 9fc175e34f7..403f41971f5 100644
--- a/src/microsoft/vulkan/dzn_pipeline.c
+++ b/src/microsoft/vulkan/dzn_pipeline.c
@@ -948,7 +948,7 @@ out:
    return ret;
 }
 
-#define DZN_INDIRECT_CMD_SIG_MAX_ARGS 3
+#define DZN_INDIRECT_CMD_SIG_MAX_ARGS 4
 
 ID3D12CommandSignature *
 dzn_graphics_pipeline_get_indirect_cmd_sig(struct dzn_graphics_pipeline *pipeline,
@@ -984,6 +984,15 @@ dzn_graphics_pipeline_get_indirect_cmd_sig(struct dzn_graphics_pipeline *pipelin
       },
    };
 
+   cmd_args[cmd_arg_count++] = (D3D12_INDIRECT_ARGUMENT_DESC) {
+      .Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT,
+      .Constant = {
+         .RootParameterIndex = pipeline->base.root.sysval_cbv_param_idx,
+         .DestOffsetIn32BitValues = offsetof(struct dxil_spirv_vertex_runtime_data, draw_id) / 4,
+         .Num32BitValuesToSet = 1,
+      },
+   };
+
    cmd_args[cmd_arg_count++] = (D3D12_INDIRECT_ARGUMENT_DESC) {
       .Type = indexed ?
               D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED :



More information about the mesa-commit mailing list