nir: lower INSTANCE_{ID,INDEX} to an offset load_instance_{index,id} respectively

If the hardware does not support INSTANCE_INDEX natively, it will be
lowered to load_instance_id + base_instance. Otherwise, INSTANCE_ID
will be lowered to load_instance_index - base_instance.

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-15 12:35:50 +01:00 committed by Marge Bot
parent b9be1f1f20
commit a5bcf566a9
3 changed files with 41 additions and 2 deletions

View file

@ -2240,6 +2240,8 @@ nir_intrinsic_from_system_value(gl_system_value val)
return nir_intrinsic_load_vertex_id;
case SYSTEM_VALUE_INSTANCE_ID:
return nir_intrinsic_load_instance_id;
case SYSTEM_VALUE_INSTANCE_INDEX:
return nir_intrinsic_load_instance_index;
case SYSTEM_VALUE_DRAW_ID:
return nir_intrinsic_load_draw_id;
case SYSTEM_VALUE_BASE_INSTANCE:
@ -2407,6 +2409,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
return SYSTEM_VALUE_VERTEX_ID;
case nir_intrinsic_load_instance_id:
return SYSTEM_VALUE_INSTANCE_ID;
case nir_intrinsic_load_instance_index:
return SYSTEM_VALUE_INSTANCE_INDEX;
case nir_intrinsic_load_draw_id:
return SYSTEM_VALUE_DRAW_ID;
case nir_intrinsic_load_base_instance:

View file

@ -4033,6 +4033,15 @@ typedef struct nir_shader_compiler_options {
*/
bool lower_base_vertex;
/**
* Whether the driver wants to work with instance_index instead of
* instance_id.
*
* When set, instance_id will be lowered to instance_index - base_instance.
* Otherwise, instance_index will be lowered to instance_id + base_instance.
*/
bool supports_instance_index;
/**
* If enabled, gl_HelperInvocation will be lowered as:
*

View file

@ -101,6 +101,22 @@ lower_system_value_instr(nir_builder *b, nir_instr *instr, void *_state)
return NULL;
}
case nir_intrinsic_load_instance_id:
if (b->shader->options->supports_instance_index) {
return nir_isub(b, nir_load_instance_index(b),
nir_load_base_instance(b));
} else {
return NULL;
}
case nir_intrinsic_load_instance_index:
if (!b->shader->options->supports_instance_index) {
return nir_iadd(b, nir_load_instance_id(b),
nir_load_base_instance(b));
} else {
return NULL;
}
case nir_intrinsic_load_helper_invocation:
if (b->shader->options->lower_helper_invocation) {
return nir_build_lowered_load_helper_invocation(b);
@ -199,9 +215,19 @@ lower_system_value_instr(nir_builder *b, nir_instr *instr, void *_state)
nir_variable *var = deref->var;
switch (var->data.location) {
case SYSTEM_VALUE_INSTANCE_ID:
if (b->shader->options->supports_instance_index) {
return nir_isub(b, nir_load_instance_index(b),
nir_load_base_instance(b));
}
break;
case SYSTEM_VALUE_INSTANCE_INDEX:
return nir_iadd(b, nir_load_instance_id(b),
nir_load_base_instance(b));
if (!b->shader->options->supports_instance_index) {
return nir_iadd(b, nir_load_instance_id(b),
nir_load_base_instance(b));
}
break;
case SYSTEM_VALUE_GLOBAL_INVOCATION_ID: {
return nir_iadd(b, nir_load_global_invocation_id(b, bit_size),