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@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8313>
This commit is contained in:
Mike Blumenkrantz
2020-08-03 15:34:38 -04:00
committed by Marge Bot
parent 4bb92d9145
commit 351b6c667e
2 changed files with 30 additions and 1 deletions
@@ -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;
+23
View File
@@ -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);