Mesa (master): zink: use pre-populated shader-locations

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Mar 29 15:26:42 UTC 2021


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

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Thu Feb  4 17:27:49 2021 +0100

zink: use pre-populated shader-locations

This is the final step of this little journey, which allows us to no
longer deal with the shader-slot mapping inside the NIR to SPIR-V
translation.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9836>

---

 .../drivers/zink/nir_to_spirv/nir_to_spirv.c       | 79 ++++------------------
 .../drivers/zink/nir_to_spirv/nir_to_spirv.h       |  3 +-
 src/gallium/drivers/zink/zink_compiler.c           | 19 +++---
 3 files changed, 22 insertions(+), 79 deletions(-)

diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 2fee513f150..99b6aa832fd 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -73,9 +73,6 @@ struct ntv_context {
    bool block_started;
    SpvId loop_break, loop_cont;
 
-   unsigned char *shader_slot_map;
-   unsigned char shader_slots_reserved;
-
    SpvId front_face_var, instance_id_var, vertex_id_var,
          primitive_id_var, invocation_id_var, // geometry
          sample_mask_type, sample_id_var, sample_pos_var, sample_mask_in_var,
@@ -384,50 +381,12 @@ create_shared_block(struct ntv_context *ctx, unsigned shared_size)
    ctx->shared_block_var = spirv_builder_emit_var(&ctx->builder, ptr_type, SpvStorageClassWorkgroup);
 }
 
-static inline unsigned char
-reserve_slot(struct ntv_context *ctx, unsigned num_slots)
-{
-   /* TODO: this should actually be clamped to the limits value as in the table
-    * in 14.1.4 of the vulkan spec, though there's not really any recourse
-    * other than aborting if we do hit it...
-    */
-   assert(ctx->shader_slots_reserved + num_slots <= MAX_VARYING);
-   unsigned ret = ctx->shader_slots_reserved;
-   ctx->shader_slots_reserved += num_slots;
-   return ret;
-}
-
-static inline unsigned
-handle_slot(struct ntv_context *ctx, unsigned slot, unsigned num_slots)
-{
-   assert(num_slots);
-   if (ctx->shader_slot_map[slot] == SLOT_UNSET)
-      ctx->shader_slot_map[slot] = reserve_slot(ctx, num_slots);
-   slot = ctx->shader_slot_map[slot];
-   assert(slot < MAX_VARYING);
-   return slot;
-}
-
 #define HANDLE_EMIT_BUILTIN(SLOT, BUILTIN) \
       case VARYING_SLOT_##SLOT: \
          spirv_builder_emit_builtin(&ctx->builder, var_id, SpvBuiltIn##BUILTIN); \
          break
 
 
-static inline unsigned
-handle_handle_slot(struct ntv_context *ctx, struct nir_variable *var, bool output)
-{
-   if (var->data.patch) {
-      assert(var->data.location >= VARYING_SLOT_PATCH0);
-      return var->data.location - VARYING_SLOT_PATCH0;
-   } else if (var->data.location >= VARYING_SLOT_VAR0 &&
-              ((output && ctx->stage == MESA_SHADER_TESS_CTRL) ||
-              (!output && ctx->stage == MESA_SHADER_TESS_EVAL))) {
-      return var->data.location - VARYING_SLOT_VAR0;
-   }
-   return handle_slot(ctx, var->data.location, glsl_count_vec4_slots(var->type, false, false));
-}
-
 static SpvId
 input_var_init(struct ntv_context *ctx, struct nir_variable *var)
 {
@@ -478,12 +437,11 @@ static void
 emit_input(struct ntv_context *ctx, struct nir_variable *var)
 {
    SpvId var_id = input_var_init(ctx, var);
-   unsigned slot = var->data.location;
    if (ctx->stage == MESA_SHADER_VERTEX)
       spirv_builder_emit_location(&ctx->builder, var_id,
                                   var->data.driver_location);
    else if (ctx->stage == MESA_SHADER_FRAGMENT) {
-      switch (slot) {
+      switch (var->data.location) {
       HANDLE_EMIT_BUILTIN(POS, FragCoord);
       HANDLE_EMIT_BUILTIN(PNTC, PointCoord);
       HANDLE_EMIT_BUILTIN(LAYER, Layer);
@@ -494,9 +452,8 @@ emit_input(struct ntv_context *ctx, struct nir_variable *var)
       HANDLE_EMIT_BUILTIN(FACE, FrontFacing);
 
       default:
-         slot = handle_slot(ctx, slot, glsl_count_vec4_slots(var->type, false, false));
-         assert(var->data.driver_location == slot);
-         spirv_builder_emit_location(&ctx->builder, var_id, slot);
+         spirv_builder_emit_location(&ctx->builder, var_id,
+                                     var->data.driver_location);
       }
       if (var->data.centroid)
          spirv_builder_emit_decoration(&ctx->builder, var_id, SpvDecorationCentroid);
@@ -505,7 +462,7 @@ emit_input(struct ntv_context *ctx, struct nir_variable *var)
          spirv_builder_emit_decoration(&ctx->builder, var_id, SpvDecorationSample);
       }
    } else if (ctx->stage < MESA_SHADER_FRAGMENT) {
-      switch (slot) {
+      switch (var->data.location) {
       HANDLE_EMIT_BUILTIN(POS, Position);
       HANDLE_EMIT_BUILTIN(PSIZ, PointSize);
       HANDLE_EMIT_BUILTIN(LAYER, Layer);
@@ -521,9 +478,8 @@ emit_input(struct ntv_context *ctx, struct nir_variable *var)
          break;
 
       default:
-         slot = handle_handle_slot(ctx, var, false);
-         assert(var->data.driver_location == slot);
-         spirv_builder_emit_location(&ctx->builder, var_id, slot);
+         spirv_builder_emit_location(&ctx->builder, var_id,
+                                     var->data.driver_location);
       }
    }
 
@@ -558,9 +514,8 @@ emit_output(struct ntv_context *ctx, struct nir_variable *var)
    if (var->name)
       spirv_builder_emit_name(&ctx->builder, var_id, var->name);
 
-   unsigned slot = var->data.location;
    if (ctx->stage != MESA_SHADER_FRAGMENT) {
-      switch (slot) {
+      switch (var->data.location) {
       HANDLE_EMIT_BUILTIN(POS, Position);
       HANDLE_EMIT_BUILTIN(PSIZ, PointSize);
       HANDLE_EMIT_BUILTIN(LAYER, Layer);
@@ -572,9 +527,8 @@ emit_output(struct ntv_context *ctx, struct nir_variable *var)
       HANDLE_EMIT_BUILTIN(TESS_LEVEL_INNER, TessLevelInner);
 
       default:
-         slot = handle_handle_slot(ctx, var, true);
-         assert(var->data.driver_location == slot);
-         spirv_builder_emit_location(&ctx->builder, var_id, slot);
+         spirv_builder_emit_location(&ctx->builder, var_id,
+                                     var->data.driver_location);
       }
       /* tcs can't do xfb */
       if (ctx->stage != MESA_SHADER_TESS_CTRL) {
@@ -606,7 +560,8 @@ emit_output(struct ntv_context *ctx, struct nir_variable *var)
             break;
 
          default:
-            spirv_builder_emit_location(&ctx->builder, var_id, slot);
+            spirv_builder_emit_location(&ctx->builder, var_id,
+                                        var->data.location);
             spirv_builder_emit_index(&ctx->builder, var_id, var->data.index);
          }
       }
@@ -1212,7 +1167,7 @@ emit_so_info(struct ntv_context *ctx, const struct zink_so_info *so_info,
        * outputs.
        */
       uint32_t location = first_so + i;
-      assert(location < VARYING_SLOT_VAR0 && ctx->shader_slot_map[location] == SLOT_UNSET);
+      assert(location < VARYING_SLOT_VAR0);
       spirv_builder_emit_location(&ctx->builder, var_id, location);
 
       /* note: gl_ClipDistance[4] can the 0-indexed member of VARYING_SLOT_CLIP_DIST1 here,
@@ -3465,8 +3420,7 @@ get_spacing(enum gl_tess_spacing spacing)
 }
 
 struct spirv_shader *
-nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info,
-             unsigned char *shader_slot_map, unsigned char *shader_slots_reserved)
+nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info)
 {
    struct spirv_shader *ret = NULL;
 
@@ -3540,11 +3494,6 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info,
 
    ctx.stage = s->info.stage;
    ctx.so_info = so_info;
-   if (shader_slot_map) {
-      /* COMPUTE doesn't have this */
-      ctx.shader_slot_map = shader_slot_map;
-      ctx.shader_slots_reserved = *shader_slots_reserved;
-   }
    ctx.GLSL_std_450 = spirv_builder_import(&ctx.builder, "GLSL.std.450");
    spirv_builder_emit_source(&ctx.builder, SpvSourceLanguageUnknown, 0);
 
@@ -3789,8 +3738,6 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info,
    assert(ret->num_words == num_words);
 
    ralloc_free(ctx.mem_ctx);
-   if (shader_slots_reserved)
-      *shader_slots_reserved = ctx.shader_slots_reserved;
 
    return ret;
 
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h
index c029c365bed..6d55711163f 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h
@@ -43,8 +43,7 @@ struct nir_shader;
 struct pipe_stream_output_info;
 
 struct spirv_shader *
-nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info,
-             unsigned char *shader_slot_map, unsigned char *shader_slots_reserved);
+nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info);
 
 void
 spirv_shader_delete(struct spirv_shader *s);
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 82c96036dcc..30ea6a11d47 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -458,13 +458,7 @@ static void
 assign_io_locations(nir_shader *nir, unsigned char *shader_slot_map,
                     unsigned char *shader_slots_reserved)
 {
-   unsigned reserved = 0;
-   unsigned char slot_map[VARYING_SLOT_MAX];
-   if (shader_slots_reserved) {
-      reserved = *shader_slots_reserved;
-      memcpy(slot_map, shader_slot_map, sizeof(slot_map));
-   }
-
+   unsigned reserved = shader_slots_reserved ? *shader_slots_reserved : 0;
    nir_foreach_variable_with_modes(var, nir, nir_var_shader_in | nir_var_shader_out) {
       if ((nir->info.stage == MESA_SHADER_VERTEX && var->data.mode == nir_var_shader_in) ||
           (nir->info.stage == MESA_SHADER_FRAGMENT && var->data.mode == nir_var_shader_out))
@@ -498,17 +492,20 @@ assign_io_locations(nir_shader *nir, unsigned char *shader_slot_map,
             assert(var->data.location >= VARYING_SLOT_VAR0);
             slot = var->data.location - VARYING_SLOT_VAR0;
          } else {
-            if (slot_map[var->data.location] == 0xff) {
+            if (shader_slot_map[var->data.location] == 0xff) {
                assert(reserved < MAX_VARYING);
-               slot_map[var->data.location] = reserved;
+               shader_slot_map[var->data.location] = reserved;
                reserved += glsl_count_vec4_slots(var->type, false, false);
             }
-            slot = slot_map[var->data.location];
+            slot = shader_slot_map[var->data.location];
             assert(slot < MAX_VARYING);
          }
          var->data.driver_location = slot;
       }
    }
+
+   if (shader_slots_reserved)
+      *shader_slots_reserved = reserved;
 }
 
 VkShaderModule
@@ -565,7 +562,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
 
    assign_io_locations(nir, shader_slot_map, shader_slots_reserved);
 
-   struct spirv_shader *spirv = nir_to_spirv(nir, streamout, shader_slot_map, shader_slots_reserved);
+   struct spirv_shader *spirv = nir_to_spirv(nir, streamout);
    if (!spirv)
       goto done;
 



More information about the mesa-commit mailing list