Mesa (master): zink: always load (gl_InstanceID - gl_BaseInstance) when loading gl_InstanceID

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 5 13:28:44 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon Aug  3 15:34:38 2020 -0400

zink: always load (gl_InstanceID - gl_BaseInstance) when loading gl_InstanceID

gl's values here always begin at 0, while vk begins with the firstInstance param
used in the current draw command

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

---

 .../drivers/zink/nir_to_spirv/nir_to_spirv.c       |  8 +++++++-
 src/gallium/drivers/zink/zink_compiler.c           | 23 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

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 075681bba06..9d709e38a35 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
@@ -70,7 +70,7 @@ struct ntv_context {
    unsigned char *shader_slot_map;
    unsigned char shader_slots_reserved;
 
-   SpvId front_face_var, instance_id_var, vertex_id_var,
+   SpvId front_face_var, instance_id_var, vertex_id_var, base_instance_var,
          primitive_id_var, invocation_id_var, // geometry
          sample_mask_type, sample_id_var, sample_pos_var, sample_mask_in_var,
          tess_patch_vertices_in, tess_coord_var, // tess
@@ -2016,7 +2016,13 @@ emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
       emit_load_front_face(ctx, intr);
       break;
 
+   case nir_intrinsic_load_base_instance:
+      emit_load_uint_input(ctx, intr, &ctx->base_instance_var, "gl_BaseInstance", SpvBuiltInBaseInstance);
+      break;
+
    case nir_intrinsic_load_instance_id:
+      spirv_builder_emit_extension(&ctx->builder, "SPV_KHR_shader_draw_parameters");
+      spirv_builder_emit_cap(&ctx->builder, SpvCapabilityDrawParameters);
       emit_load_uint_input(ctx, intr, &ctx->instance_id_var, "gl_InstanceId", SpvBuiltInInstanceIndex);
       break;
 
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 7e5c9532574..eb6068b317e 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -394,6 +394,28 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
    return mod;
 }
 
+static bool
+lower_baseinstance_instr(nir_builder *b, nir_instr *instr, void *data)
+{
+   if (instr->type != nir_instr_type_intrinsic)
+      return false;
+   nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
+   if (intr->intrinsic != nir_intrinsic_load_instance_id)
+      return false;
+   b->cursor = nir_after_instr(instr);
+   nir_ssa_def *def = nir_isub(b, &intr->dest.ssa, nir_load_base_instance(b));
+   nir_ssa_def_rewrite_uses_after(&intr->dest.ssa, nir_src_for_ssa(def), def->parent_instr);
+   return true;
+}
+
+static bool
+lower_baseinstance(nir_shader *shader)
+{
+   if (shader->info.stage != MESA_SHADER_VERTEX)
+      return false;
+   return nir_shader_instructions_pass(shader, lower_baseinstance_instr, nir_metadata_dominance, NULL);
+}
+
 struct zink_shader *
 zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
                    const struct pipe_stream_output_info *so_info)
@@ -421,6 +443,7 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
    if (nir->info.stage == MESA_SHADER_GEOMETRY)
       NIR_PASS_V(nir, nir_lower_gs_intrinsics, nir_lower_gs_intrinsics_per_stream);
    NIR_PASS_V(nir, nir_lower_regs_to_ssa);
+   NIR_PASS_V(nir, lower_baseinstance);
    optimize_nir(nir);
    NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_function_temp, NULL);
    NIR_PASS_V(nir, lower_discard_if);



More information about the mesa-commit mailing list