nir: introduce instance_index system value

The semantics of this newly introduced system value match
Vulkan's InstanceIndex exactly, and are equivalent to
instance_id + base_instance.

Some hardware, such as Mali Valhall or later, only provides
instance id offset by base_instance. Introducing a new system
value to represent this, rather than handling the mismatch
when lowering to BIR lets us use NIR to eliminate redundant
arithmetic that would follow from mismatched semantics, e.g.
instance_id could be lowered to instance_index - base_instance,
so expressions such as instance_id + base_instance would be
optimized to a simple instance_index.

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32158>
This commit is contained in:
Caterina Shablia 2024-11-14 22:46:18 +00:00 committed by Marge Bot
parent 2f13723c0a
commit b9be1f1f20
4 changed files with 4 additions and 0 deletions

View file

@ -452,6 +452,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
is_divergent |= !(options & nir_divergence_single_prim_per_subgroup);
break;
case nir_intrinsic_load_instance_id:
case nir_intrinsic_load_instance_index:
is_divergent = !state->vertex_divergence;
break;
case nir_intrinsic_load_primitive_id:

View file

@ -658,6 +658,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
case nir_intrinsic_load_subgroup_id:
case nir_intrinsic_load_vertex_id:
case nir_intrinsic_load_instance_id:
case nir_intrinsic_load_instance_index:
case nir_intrinsic_load_vertex_id_zero_base:
case nir_intrinsic_load_base_vertex:
case nir_intrinsic_load_first_vertex:

View file

@ -891,6 +891,7 @@ system_value("first_vertex", 1)
system_value("is_indexed_draw", 1)
system_value("base_vertex", 1)
system_value("instance_id", 1)
system_value("instance_index", 1)
system_value("base_instance", 1)
system_value("draw_id", 1)
system_value("sample_id", 1)

View file

@ -166,6 +166,7 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count,
case nir_intrinsic_load_first_vertex:
case nir_intrinsic_load_base_instance:
case nir_intrinsic_load_instance_id:
case nir_intrinsic_load_instance_index:
case nir_intrinsic_load_draw_id:
case nir_intrinsic_load_num_workgroups:
case nir_intrinsic_load_workgroup_id: