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:
committed by
Marge Bot
parent
4bb92d9145
commit
351b6c667e
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user