Module: Mesa Branch: master Commit: 351b6c667edb9c4aaff269669b298e0bc1560ec0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=351b6c667edb9c4aaff269669b298e0bc1560ec0
Author: Mike Blumenkrantz <[email protected]> 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 <[email protected]> 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); _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
