summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Justen <jordan.l.justen@intel.com>2016-05-22 15:54:48 -0700
committerJordan Justen <jordan.l.justen@intel.com>2016-05-23 10:15:25 -0700
commit27c84fe751511122702edefe4f2a49d353ea87f5 (patch)
tree4d05fd95f3bb49fb38c8f190078f51934fd2a8c5
parent05329fe77a9bdefeae357391dfc32c09f52437b5 (diff)
nir: Make lowering gl_LocalInvocationIndex optional
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
-rw-r--r--src/compiler/nir/nir.c4
-rw-r--r--src/compiler/nir/nir.h2
-rw-r--r--src/compiler/nir/nir_gather_info.c1
-rw-r--r--src/compiler/nir/nir_intrinsics.h1
-rw-r--r--src/compiler/nir/nir_lower_system_values.c16
-rw-r--r--src/mesa/drivers/dri/i965/brw_compiler.c3
6 files changed, 22 insertions, 5 deletions
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
index c9db52ff23..f285c172aa 100644
--- a/src/compiler/nir/nir.c
+++ b/src/compiler/nir/nir.c
@@ -1749,6 +1749,8 @@ nir_intrinsic_from_system_value(gl_system_value val)
return nir_intrinsic_load_sample_mask_in;
case SYSTEM_VALUE_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:
return nir_intrinsic_load_work_group_id;
case SYSTEM_VALUE_NUM_WORK_GROUPS:
@@ -1798,6 +1800,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
return SYSTEM_VALUE_SAMPLE_MASK_IN;
case nir_intrinsic_load_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:
return SYSTEM_VALUE_NUM_WORK_GROUPS;
case nir_intrinsic_load_work_group_id:
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 78913d30de..3ca7c7fae7 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -1683,6 +1683,8 @@ typedef struct nir_shader_compiler_options {
/* Indicates that the driver only has zero-based vertex id */
bool vertex_id_zero_based;
+
+ bool lower_cs_local_index_from_id;
} nir_shader_compiler_options;
typedef struct nir_shader_info {
diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c
index 7900fd1ef5..15a9a4f08b 100644
--- a/src/compiler/nir/nir_gather_info.c
+++ b/src/compiler/nir/nir_gather_info.c
@@ -44,6 +44,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader)
case nir_intrinsic_load_primitive_id:
case nir_intrinsic_load_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_num_work_groups:
shader->info.system_values_read |=
diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h
index bd00fbbe6c..aeb6038267 100644
--- a/src/compiler/nir/nir_intrinsics.h
+++ b/src/compiler/nir/nir_intrinsics.h
@@ -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(patch_vertices_in, 1, 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(user_clip_plane, 4, 1, UCP_ID, xx, xx)
SYSTEM_VALUE(num_work_groups, 3, 0, xx, xx, xx)
diff --git a/src/compiler/nir/nir_lower_system_values.c b/src/compiler/nir/nir_lower_system_values.c
index 8310e3831f..3ca8e082c4 100644
--- a/src/compiler/nir/nir_lower_system_values.c
+++ b/src/compiler/nir/nir_lower_system_values.c
@@ -48,7 +48,7 @@ convert_block(nir_block *block, nir_builder *b)
b->cursor = nir_after_instr(&load_var->instr);
- nir_ssa_def *sysval;
+ nir_ssa_def *sysval = NULL;
switch (var->data.location) {
case SYSTEM_VALUE_GLOBAL_INVOCATION_ID: {
/* 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: {
+ /* 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:
*
* "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));
break;
- default: {
+ default:
+ break;
+ }
+
+ if (sysval == NULL) {
nir_intrinsic_op sysval_op =
nir_intrinsic_from_system_value(var->data.location);
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));
diff --git a/src/mesa/drivers/dri/i965/brw_compiler.c b/src/mesa/drivers/dri/i965/brw_compiler.c
index 82131db9a8..71242b477f 100644
--- a/src/mesa/drivers/dri/i965/brw_compiler.c
+++ b/src/mesa/drivers/dri/i965/brw_compiler.c
@@ -80,7 +80,8 @@ shader_perf_log_mesa(void *data, const char *fmt, ...)
.lower_fdiv = true, \
.lower_flrp64 = 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 = {
COMMON_OPTIONS,