nir: Make lowering gl_LocalInvocationIndex optional
Cc: "12.0" <mesa-stable@lists.freedesktop.org> Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -1752,6 +1752,8 @@ nir_intrinsic_from_system_value(gl_system_value val)
|
|||||||
return nir_intrinsic_load_sample_mask_in;
|
return nir_intrinsic_load_sample_mask_in;
|
||||||
case SYSTEM_VALUE_LOCAL_INVOCATION_ID:
|
case SYSTEM_VALUE_LOCAL_INVOCATION_ID:
|
||||||
return nir_intrinsic_load_local_invocation_id;
|
return nir_intrinsic_load_local_invocation_id;
|
||||||
|
case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX:
|
||||||
|
return nir_intrinsic_load_local_invocation_index;
|
||||||
case SYSTEM_VALUE_WORK_GROUP_ID:
|
case SYSTEM_VALUE_WORK_GROUP_ID:
|
||||||
return nir_intrinsic_load_work_group_id;
|
return nir_intrinsic_load_work_group_id;
|
||||||
case SYSTEM_VALUE_NUM_WORK_GROUPS:
|
case SYSTEM_VALUE_NUM_WORK_GROUPS:
|
||||||
@@ -1801,6 +1803,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
|
|||||||
return SYSTEM_VALUE_SAMPLE_MASK_IN;
|
return SYSTEM_VALUE_SAMPLE_MASK_IN;
|
||||||
case nir_intrinsic_load_local_invocation_id:
|
case nir_intrinsic_load_local_invocation_id:
|
||||||
return SYSTEM_VALUE_LOCAL_INVOCATION_ID;
|
return SYSTEM_VALUE_LOCAL_INVOCATION_ID;
|
||||||
|
case nir_intrinsic_load_local_invocation_index:
|
||||||
|
return SYSTEM_VALUE_LOCAL_INVOCATION_INDEX;
|
||||||
case nir_intrinsic_load_num_work_groups:
|
case nir_intrinsic_load_num_work_groups:
|
||||||
return SYSTEM_VALUE_NUM_WORK_GROUPS;
|
return SYSTEM_VALUE_NUM_WORK_GROUPS;
|
||||||
case nir_intrinsic_load_work_group_id:
|
case nir_intrinsic_load_work_group_id:
|
||||||
|
@@ -1682,6 +1682,8 @@ typedef struct nir_shader_compiler_options {
|
|||||||
|
|
||||||
/* Indicates that the driver only has zero-based vertex id */
|
/* Indicates that the driver only has zero-based vertex id */
|
||||||
bool vertex_id_zero_based;
|
bool vertex_id_zero_based;
|
||||||
|
|
||||||
|
bool lower_cs_local_index_from_id;
|
||||||
} nir_shader_compiler_options;
|
} nir_shader_compiler_options;
|
||||||
|
|
||||||
typedef struct nir_shader_info {
|
typedef struct nir_shader_info {
|
||||||
|
@@ -44,6 +44,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader)
|
|||||||
case nir_intrinsic_load_primitive_id:
|
case nir_intrinsic_load_primitive_id:
|
||||||
case nir_intrinsic_load_invocation_id:
|
case nir_intrinsic_load_invocation_id:
|
||||||
case nir_intrinsic_load_local_invocation_id:
|
case nir_intrinsic_load_local_invocation_id:
|
||||||
|
case nir_intrinsic_load_local_invocation_index:
|
||||||
case nir_intrinsic_load_work_group_id:
|
case nir_intrinsic_load_work_group_id:
|
||||||
case nir_intrinsic_load_num_work_groups:
|
case nir_intrinsic_load_num_work_groups:
|
||||||
shader->info.system_values_read |=
|
shader->info.system_values_read |=
|
||||||
|
@@ -299,6 +299,7 @@ SYSTEM_VALUE(tess_level_outer, 4, 0, xx, xx, xx)
|
|||||||
SYSTEM_VALUE(tess_level_inner, 2, 0, xx, xx, xx)
|
SYSTEM_VALUE(tess_level_inner, 2, 0, xx, xx, xx)
|
||||||
SYSTEM_VALUE(patch_vertices_in, 1, 0, xx, xx, xx)
|
SYSTEM_VALUE(patch_vertices_in, 1, 0, xx, xx, xx)
|
||||||
SYSTEM_VALUE(local_invocation_id, 3, 0, xx, xx, xx)
|
SYSTEM_VALUE(local_invocation_id, 3, 0, xx, xx, xx)
|
||||||
|
SYSTEM_VALUE(local_invocation_index, 1, 0, xx, xx, xx)
|
||||||
SYSTEM_VALUE(work_group_id, 3, 0, xx, xx, xx)
|
SYSTEM_VALUE(work_group_id, 3, 0, xx, xx, xx)
|
||||||
SYSTEM_VALUE(user_clip_plane, 4, 1, UCP_ID, xx, xx)
|
SYSTEM_VALUE(user_clip_plane, 4, 1, UCP_ID, xx, xx)
|
||||||
SYSTEM_VALUE(num_work_groups, 3, 0, xx, xx, xx)
|
SYSTEM_VALUE(num_work_groups, 3, 0, xx, xx, xx)
|
||||||
|
@@ -48,7 +48,7 @@ convert_block(nir_block *block, nir_builder *b)
|
|||||||
|
|
||||||
b->cursor = nir_after_instr(&load_var->instr);
|
b->cursor = nir_after_instr(&load_var->instr);
|
||||||
|
|
||||||
nir_ssa_def *sysval;
|
nir_ssa_def *sysval = NULL;
|
||||||
switch (var->data.location) {
|
switch (var->data.location) {
|
||||||
case SYSTEM_VALUE_GLOBAL_INVOCATION_ID: {
|
case SYSTEM_VALUE_GLOBAL_INVOCATION_ID: {
|
||||||
/* From the GLSL man page for gl_GlobalInvocationID:
|
/* From the GLSL man page for gl_GlobalInvocationID:
|
||||||
@@ -74,6 +74,12 @@ convert_block(nir_block *block, nir_builder *b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX: {
|
case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX: {
|
||||||
|
/* If lower_cs_local_index_from_id is true, then we derive the local
|
||||||
|
* index from the local id.
|
||||||
|
*/
|
||||||
|
if (!b->shader->options->lower_cs_local_index_from_id)
|
||||||
|
break;
|
||||||
|
|
||||||
/* From the GLSL man page for gl_LocalInvocationIndex:
|
/* From the GLSL man page for gl_LocalInvocationIndex:
|
||||||
*
|
*
|
||||||
* "The value of gl_LocalInvocationIndex is equal to
|
* "The value of gl_LocalInvocationIndex is equal to
|
||||||
@@ -111,12 +117,14 @@ convert_block(nir_block *block, nir_builder *b)
|
|||||||
nir_load_system_value(b, nir_intrinsic_load_base_instance, 0));
|
nir_load_system_value(b, nir_intrinsic_load_base_instance, 0));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: {
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sysval == NULL) {
|
||||||
nir_intrinsic_op sysval_op =
|
nir_intrinsic_op sysval_op =
|
||||||
nir_intrinsic_from_system_value(var->data.location);
|
nir_intrinsic_from_system_value(var->data.location);
|
||||||
sysval = nir_load_system_value(b, sysval_op, 0);
|
sysval = nir_load_system_value(b, sysval_op, 0);
|
||||||
break;
|
|
||||||
} /* default */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nir_ssa_def_rewrite_uses(&load_var->dest.ssa, nir_src_for_ssa(sysval));
|
nir_ssa_def_rewrite_uses(&load_var->dest.ssa, nir_src_for_ssa(sysval));
|
||||||
|
@@ -40,7 +40,8 @@
|
|||||||
.lower_fdiv = true, \
|
.lower_fdiv = true, \
|
||||||
.lower_flrp64 = true, \
|
.lower_flrp64 = true, \
|
||||||
.native_integers = true, \
|
.native_integers = true, \
|
||||||
.vertex_id_zero_based = true
|
.vertex_id_zero_based = true, \
|
||||||
|
.lower_cs_local_index_from_id = true
|
||||||
|
|
||||||
static const struct nir_shader_compiler_options scalar_nir_options = {
|
static const struct nir_shader_compiler_options scalar_nir_options = {
|
||||||
COMMON_OPTIONS,
|
COMMON_OPTIONS,
|
||||||
|
Reference in New Issue
Block a user