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