Mesa (main): d3d12: Hook up compute shader variations

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 11 01:48:38 UTC 2022


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

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Fri Dec 31 12:54:04 2021 -0800

d3d12: Hook up compute shader variations

Currently only variable workgroup size is implemented

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

---

 src/gallium/drivers/d3d12/d3d12_compiler.cpp | 36 ++++++++++++++++++++++++++++
 src/gallium/drivers/d3d12/d3d12_compiler.h   |  9 +++++++
 2 files changed, 45 insertions(+)

diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
index 6220199277b..c3dea8eb4f3 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
@@ -252,6 +252,7 @@ struct d3d12_selection_context {
    bool manual_depth_range;
    unsigned missing_dual_src_outputs;
    unsigned frag_result_color_lowering;
+   const unsigned *variable_workgroup_size;
 };
 
 static unsigned
@@ -619,6 +620,10 @@ d3d12_compare_shader_keys(const d3d12_shader_key *expect, const d3d12_shader_key
           expect->fs.cast_to_uint != have->fs.cast_to_uint ||
           expect->fs.cast_to_int != have->fs.cast_to_int)
          return false;
+   } else if (expect->stage == PIPE_SHADER_COMPUTE) {
+      if (memcmp(expect->cs.workgroup_size, have->cs.workgroup_size,
+                 sizeof(have->cs.workgroup_size)))
+         return false;
    }
 
    if (expect->tex_saturate_s != have->tex_saturate_s ||
@@ -811,6 +816,10 @@ d3d12_fill_shader_key(struct d3d12_selection_context *sel_ctx,
       key->fs.remap_front_facing = 1;
    }
 
+   if (stage == PIPE_SHADER_COMPUTE && sel_ctx->variable_workgroup_size) {
+      memcpy(key->cs.workgroup_size, sel_ctx->variable_workgroup_size, sizeof(key->cs.workgroup_size));
+   }
+
    key->n_images = sel_ctx->ctx->num_image_views[stage];
    for (int i = 0; i < key->n_images; ++i) {
       key->image_format_conversion[i].emulated_format = sel_ctx->ctx->image_view_emulation_formats[stage][i];
@@ -903,6 +912,12 @@ select_shader_variant(struct d3d12_selection_context *sel_ctx, d3d12_shader_sele
    if (key.n_images)
       NIR_PASS_V(new_nir_variant, d3d12_lower_image_casts, key.image_format_conversion);
 
+   if (sel->workgroup_size_variable) {
+      new_nir_variant->info.workgroup_size[0] = key.cs.workgroup_size[0];
+      new_nir_variant->info.workgroup_size[1] = key.cs.workgroup_size[1];
+      new_nir_variant->info.workgroup_size[2] = key.cs.workgroup_size[2];
+   }
+
    {
       struct nir_lower_tex_options tex_options = { };
       tex_options.lower_txp = ~0u; /* No equivalent for textureProj */
@@ -1057,6 +1072,7 @@ d3d12_create_shader_impl(struct d3d12_context *ctx,
    unsigned tex_scan_result = scan_texture_use(nir);
    sel->samples_int_textures = (tex_scan_result & TEX_SAMPLE_INTEGER_TEXTURE) != 0;
    sel->compare_with_lod_bias_grad = (tex_scan_result & TEX_CMP_WITH_LOD_BIAS_GRAD) != 0;
+   sel->workgroup_size_variable = nir->info.workgroup_size_variable;
    
    /* Integer cube maps are not supported in DirectX because sampling is not supported
     * on integer textures and TextureLoad is not supported for cube maps, so we have to
@@ -1200,6 +1216,26 @@ d3d12_select_shader_variants(struct d3d12_context *ctx, const struct pipe_draw_i
    }
 }
 
+static const unsigned *
+workgroup_size_variable(struct d3d12_context *ctx,
+                        const struct pipe_grid_info *info)
+{
+   if (ctx->compute_state->workgroup_size_variable)
+      return info->block;
+   return nullptr;
+}
+
+void
+d3d12_select_compute_shader_variants(struct d3d12_context *ctx, const struct pipe_grid_info *info)
+{
+   struct d3d12_selection_context sel_ctx = {};
+
+   sel_ctx.ctx = ctx;
+   sel_ctx.variable_workgroup_size = workgroup_size_variable(ctx, info);
+
+   select_shader_variant(&sel_ctx, ctx->compute_state, nullptr, nullptr);
+}
+
 void
 d3d12_shader_free(struct d3d12_shader_selector *sel)
 {
diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h b/src/gallium/drivers/d3d12/d3d12_compiler.h
index da706339bee..587bd9a039a 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.h
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.h
@@ -114,6 +114,10 @@ struct d3d12_shader_key {
       unsigned remap_front_facing : 1;
    } fs;
 
+   struct {
+      unsigned workgroup_size[3];
+   } cs;
+
    int n_texture_states;
    dxil_wrap_sampler_state tex_wrap_states[PIPE_MAX_SHADER_SAMPLER_VIEWS];
    dxil_texture_swizzle_state swizzle_state[PIPE_MAX_SHADER_SAMPLER_VIEWS];
@@ -185,6 +189,7 @@ struct d3d12_shader_selector {
 
    unsigned samples_int_textures:1;
    unsigned compare_with_lod_bias_grad:1;
+   unsigned workgroup_size_variable:1;
 
    bool is_gs_variant;
    struct d3d12_gs_variant_key gs_key;
@@ -208,6 +213,10 @@ void
 d3d12_select_shader_variants(struct d3d12_context *ctx,
                              const struct pipe_draw_info *dinfo);
 
+void
+d3d12_select_compute_shader_variants(struct d3d12_context *ctx,
+                                     const struct pipe_grid_info *info);
+
 void
 d3d12_gs_variant_cache_init(struct d3d12_context *ctx);
 



More information about the mesa-commit mailing list