Mesa (main): d3d12, microsoft/compiler: Switching semantic names to TEXCOORD

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 24 20:25:10 UTC 2021


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

Author: Enrico Galli <enrico.galli at intel.com>
Date:   Mon May 10 18:00:57 2021 -0700

d3d12, microsoft/compiler: Switching semantic names to TEXCOORD

Switching from GENERIC/VARYING to TEXCOORD. This change better aligns
with other dxil generators (SPIRV-Cross, Tint).

Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10989>

---

 src/gallium/drivers/d3d12/d3d12_context.cpp        |  4 +-
 src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp | 15 +-----
 src/microsoft/compiler/dxil_signature.c            | 56 ++++++++++++----------
 src/microsoft/compiler/dxil_signature.h            |  2 +-
 src/microsoft/compiler/nir_to_dxil.c               | 21 +-------
 src/microsoft/compiler/nir_to_dxil.h               |  3 --
 6 files changed, 38 insertions(+), 63 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp
index aa51a953f88..8661b280357 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_context.cpp
@@ -99,8 +99,8 @@ d3d12_create_vertex_elements_state(struct pipe_context *pctx,
       return NULL;
 
    for (unsigned i = 0; i < num_elements; ++i) {
-      cso->elements[i].SemanticName = dxil_vs_attr_index_to_name(i);
-      cso->elements[i].SemanticIndex = 0;
+      cso->elements[i].SemanticName = "TEXCOORD";
+      cso->elements[i].SemanticIndex = i;
 
       enum pipe_format format_helper = d3d12_emulated_vtx_format(elements[i].src_format);
       bool needs_emulation = format_helper != elements[i].src_format;
diff --git a/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp b/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp
index 10edfdcdf17..6933f105538 100644
--- a/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp
@@ -38,17 +38,6 @@ struct d3d12_pso_entry {
    ID3D12PipelineState *pso;
 };
 
-static const char *slot_to_varying[] = {
-   "VARYINGAA", "VARYINGAB", "VARYINGAC", "VARYINGAD", "VARYINGAE", "VARYINGAF", "VARYINGAG", "VARYINGAH",
-   "VARYINGAI", "VARYINGAJ", "VARYINGAK", "VARYINGAL", "VARYINGAM", "VARYINGAN", "VARYINGAO", "VARYINGAP",
-   "VARYINGBA", "VARYINGBB", "VARYINGBC", "VARYINGBD", "VARYINGBE", "VARYINGBF", "VARYINGBG", "VARYINGBH",
-   "VARYINGBI", "VARYINGBJ", "VARYINGBK", "VARYINGBL", "VARYINGBM", "VARYINGBN", "VARYINGBO", "VARYINGBP",
-   "VARYINGCA", "VARYINGCB", "VARYINGCC", "VARYINGCD", "VARYINGCE", "VARYINGCF", "VARYINGCG", "VARYINGCH",
-   "VARYINGCI", "VARYINGCJ", "VARYINGCK", "VARYINGCL", "VARYINGCM", "VARYINGCN", "VARYINGCO", "VARYINGCP",
-   "VARYINGDA", "VARYINGDB", "VARYINGDC", "VARYINGDD", "VARYINGDE", "VARYINGDF", "VARYINGDG", "VARYINGDH",
-   "VARYINGDI", "VARYINGDJ", "VARYINGDK", "VARYINGDL", "VARYINGDM", "VARYINGDN", "VARYINGDO", "VARYINGDP",
-};
-
 static const char *
 get_semantic_name(int slot, unsigned *index)
 {
@@ -72,8 +61,8 @@ get_semantic_name(int slot, unsigned *index)
       return "SV_PrimitiveID";
 
    default: {
-         int index = slot - VARYING_SLOT_POS;
-         return slot_to_varying[index];
+         *index = slot - VARYING_SLOT_POS;
+         return "TEXCOORD";
       }
    }
 }
diff --git a/src/microsoft/compiler/dxil_signature.c b/src/microsoft/compiler/dxil_signature.c
index e10d1c4eb68..ed6ebdf412a 100644
--- a/src/microsoft/compiler/dxil_signature.c
+++ b/src/microsoft/compiler/dxil_signature.c
@@ -153,19 +153,24 @@ get_additional_semantic_info(nir_shader *s, nir_variable *var, struct semantic_i
    return next_row;
 }
 
-typedef void (*semantic_info_proc)(nir_variable *var, struct semantic_info *info);
+typedef void (*semantic_info_proc)(nir_variable *var, struct semantic_info *info, bool vulkan);
 
 static void
-get_semantic_vs_in_name(nir_variable *var, struct semantic_info *info)
+get_semantic_vs_in_name(nir_variable *var, struct semantic_info *info, bool vulkan)
 {
-   const char *name = dxil_vs_attr_index_to_name(var->data.driver_location);
-   assert(strlen(name) < 63);
-   strcpy(info->name, name);
+   strcpy(info->name, "TEXCOORD");
+   if (vulkan) {
+      info->index = var->data.location >= VERT_ATTRIB_GENERIC0 ?
+         var->data.location - VERT_ATTRIB_GENERIC0 :
+         var->data.location;
+   } else {
+      info->index = var->data.driver_location;
+   }
    info->kind = DXIL_SEM_ARBITRARY;
 }
 
 static void
-get_semantic_sv_name(nir_variable *var, struct semantic_info *info)
+get_semantic_sv_name(nir_variable *var, struct semantic_info *info, bool _vulkan)
 {
    switch (var->data.location) {
    case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
@@ -231,7 +236,7 @@ get_semantic_ps_outname(nir_variable *var, struct semantic_info *info)
 
 static void
 get_semantic_name(nir_variable *var, struct semantic_info *info,
-                  const struct glsl_type *type)
+                  const struct glsl_type *type, bool vulkan)
 {
    info->kind = DXIL_SEM_INVALID;
    info->interpolation = get_interpolation(var);
@@ -265,31 +270,30 @@ get_semantic_name(nir_variable *var, struct semantic_info *info,
       break;
 
    default: {
-         int index = var->data.location - VARYING_SLOT_POS;
-         const char idx1 = 'A' + (char)(index >> 4);
-         const char idx2 = 'A' + (char)(index & 0xf);
-         snprintf(info->name, 64, "VARYING%c%c", idx1, idx2);
+         info->index = var->data.location -
+            (vulkan ? VARYING_SLOT_VAR0 : VARYING_SLOT_POS);
+         strcpy(info->name, "TEXCOORD");
          info->kind = DXIL_SEM_ARBITRARY;
       }
    }
 }
 
 static void
-get_semantic_in_name(nir_variable *var, struct semantic_info *info)
+get_semantic_in_name(nir_variable *var, struct semantic_info *info, bool vulkan)
 {
-   get_semantic_name(var, info, var->type);
+   get_semantic_name(var, info, var->type, vulkan);
    info->sysvalue_name = in_sysvalue_name(var);
 }
 
 static void
-get_semantic_gs_in_name(nir_variable *var, struct semantic_info *info)
+get_semantic_gs_in_name(nir_variable *var, struct semantic_info *info, bool vulkan)
 {
    /* geometry shader input varyings come as arrays, but we want to use
     * the element type */
    const struct glsl_type *type =
          glsl_type_is_array(var->type) ? glsl_without_array(var->type) : var->type;
 
-   get_semantic_name(var, info, type);
+   get_semantic_name(var, info, type, vulkan);
    info->sysvalue_name = in_sysvalue_name(var);
 }
 
@@ -460,11 +464,11 @@ get_input_signature_group(struct dxil_module *mod, const struct dxil_mdnode **in
                           unsigned num_inputs,
                           nir_shader *s, nir_variable_mode modes,
                           semantic_info_proc get_semantics, unsigned *row_iter,
-                          bool is_gs_shader)
+                          bool is_gs_shader, bool vulkan)
 {
    nir_foreach_variable_with_modes(var, s, modes) {
       struct semantic_info semantic = {0};
-      get_semantics(var, &semantic);
+      get_semantics(var, &semantic, vulkan);
       mod->inputs[num_inputs].sysvalue = semantic.sysvalue_name;
       *row_iter = get_additional_semantic_info(s, var, &semantic, *row_iter, is_gs_shader);
 
@@ -485,7 +489,7 @@ get_input_signature_group(struct dxil_module *mod, const struct dxil_mdnode **in
 }
 
 static const struct dxil_mdnode *
-get_input_signature(struct dxil_module *mod, nir_shader *s)
+get_input_signature(struct dxil_module *mod, nir_shader *s, bool vulkan)
 {
    if (s->info.stage == MESA_SHADER_KERNEL)
       return NULL;
@@ -500,12 +504,14 @@ get_input_signature(struct dxil_module *mod, nir_shader *s)
                                                       get_semantic_vs_in_name :
                                                       (s->info.stage == MESA_SHADER_GEOMETRY ?
                                                          get_semantic_gs_in_name : get_semantic_in_name),
-                                                   &next_row, is_gs_shader);
+                                                   &next_row, is_gs_shader,
+                                                   vulkan);
 
    mod->num_sig_inputs = get_input_signature_group(mod, inputs, mod->num_sig_inputs,
                                                    s, nir_var_system_value,
                                                    get_semantic_sv_name,
-                                                   &next_row, is_gs_shader);
+                                                   &next_row, is_gs_shader,
+                                                   vulkan);
 
    if (!mod->num_sig_inputs && !mod->num_sig_inputs)
       return NULL;
@@ -536,7 +542,7 @@ static const char *out_sysvalue_name(nir_variable *var)
 }
 
 static const struct dxil_mdnode *
-get_output_signature(struct dxil_module *mod, nir_shader *s)
+get_output_signature(struct dxil_module *mod, nir_shader *s, bool vulkan)
 {
    const struct dxil_mdnode *outputs[VARYING_SLOT_MAX];
    unsigned num_outputs = 0;
@@ -548,7 +554,7 @@ get_output_signature(struct dxil_module *mod, nir_shader *s)
          get_semantic_ps_outname(var, &semantic);
          mod->outputs[num_outputs].sysvalue = "TARGET";
       } else {
-         get_semantic_name(var, &semantic, var->type);
+         get_semantic_name(var, &semantic, var->type, vulkan);
          mod->outputs[num_outputs].sysvalue = out_sysvalue_name(var);
       }
       next_row = get_additional_semantic_info(s, var, &semantic, next_row, false);
@@ -588,14 +594,14 @@ get_output_signature(struct dxil_module *mod, nir_shader *s)
 }
 
 const struct dxil_mdnode *
-get_signatures(struct dxil_module *mod, nir_shader *s)
+get_signatures(struct dxil_module *mod, nir_shader *s, bool vulkan)
 {
    /* DXC does the same: Add an empty string before everything else */
    mod->sem_string_table = _mesa_string_buffer_create(mod->ralloc_ctx, 1024);
    copy_semantic_name_to_string(mod->sem_string_table, "");
 
-   const struct dxil_mdnode *input_signature = get_input_signature(mod, s);
-   const struct dxil_mdnode *output_signature = get_output_signature(mod, s);
+   const struct dxil_mdnode *input_signature = get_input_signature(mod, s, vulkan);
+   const struct dxil_mdnode *output_signature = get_output_signature(mod, s, vulkan);
 
    const struct dxil_mdnode *SV_nodes[3] = {
       input_signature,
diff --git a/src/microsoft/compiler/dxil_signature.h b/src/microsoft/compiler/dxil_signature.h
index e0c47f2aac8..df8199883c9 100644
--- a/src/microsoft/compiler/dxil_signature.h
+++ b/src/microsoft/compiler/dxil_signature.h
@@ -131,7 +131,7 @@ struct dxil_mdnode;
 struct dxil_module;
 
 const struct dxil_mdnode *
-get_signatures(struct dxil_module *mod, nir_shader *s);
+get_signatures(struct dxil_module *mod, nir_shader *s, bool vulkan);
 
 #ifdef __cplusplus
 }
diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c
index 1d6f64b63ac..20bf4e6cabc 100644
--- a/src/microsoft/compiler/nir_to_dxil.c
+++ b/src/microsoft/compiler/nir_to_dxil.c
@@ -1340,7 +1340,8 @@ emit_metadata(struct ntd_context *ctx)
          return false;
    }
 
-   const struct dxil_mdnode *signatures = get_signatures(&ctx->mod, ctx->shader);
+   const struct dxil_mdnode *signatures = get_signatures(&ctx->mod, ctx->shader,
+                                                         ctx->opts->vulkan_environment);
 
    const struct dxil_mdnode *dx_entry_point = emit_entrypoint(ctx, main_func,
        "main", signatures, resources_node, shader_properties);
@@ -4757,24 +4758,6 @@ out:
    return retval;
 }
 
-static const char *generics_semantics[] = {
-   "GENERICAA", "GENERICAB", "GENERICAC", "GENERICAD",
-   "GENERICAE", "GENERICAF", "GENERICAG", "GENERICAH",
-   "GENERICBA", "GENERICBB", "GENERICBC", "GENERICBD",
-   "GENERICBE", "GENERICBF", "GENERICBG", "GENERICBH",
-   "GENERICCA", "GENERICCB", "GENERICCC", "GENERICCD",
-   "GENERICCE", "GENERICCF", "GENERICCG", "GENERICCH",
-   "GENERICDA", "GENERICDB", "GENERICDC", "GENERICDD",
-   "GENERICDE", "GENERICDF", "GENERICDG", "GENERICDH"
-};
-
-const char *
-dxil_vs_attr_index_to_name(unsigned index)
-{
-   assert(index < 32);
-   return generics_semantics[index];
-}
-
 enum dxil_sysvalue_type
 nir_var_to_dxil_sysvalue_type(nir_variable *var, uint64_t other_stage_mask)
 {
diff --git a/src/microsoft/compiler/nir_to_dxil.h b/src/microsoft/compiler/nir_to_dxil.h
index f925719f08f..f661582c7d5 100644
--- a/src/microsoft/compiler/nir_to_dxil.h
+++ b/src/microsoft/compiler/nir_to_dxil.h
@@ -34,9 +34,6 @@ extern "C" {
 
 struct blob;
 
-const char *
-dxil_vs_attr_index_to_name(unsigned index);
-
 enum dxil_sysvalue_type {
    DXIL_NO_SYSVALUE = 0,
    DXIL_SYSVALUE,



More information about the mesa-commit mailing list