From 6f316c9d8658e870b0140b0f601d35d1fcf133b9 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Sun, 22 May 2016 15:54:48 -0700 Subject: [PATCH] nir: Make lowering gl_LocalInvocationIndex optional Cc: "12.0" Signed-off-by: Jordan Justen Reviewed-by: Jason Ekstrand --- src/compiler/nir/nir.c | 4 ++++ src/compiler/nir/nir.h | 2 ++ src/compiler/nir/nir_gather_info.c | 1 + src/compiler/nir/nir_intrinsics.h | 1 + src/compiler/nir/nir_lower_system_values.c | 16 ++++++++++++---- src/mesa/drivers/dri/i965/brw_compiler.c | 3 ++- 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 2741eb6581b..3c8b4e0e5d2 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -1752,6 +1752,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: @@ -1801,6 +1803,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 2e1bdfb429e..20f65201890 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1682,6 +1682,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 7900fd1ef55..15a9a4f08b4 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 bd00fbbe6cc..aeb60382673 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 8310e3831f4..3ca8e082c46 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 a4855a09137..bb06733bb0a 100644 --- a/src/mesa/drivers/dri/i965/brw_compiler.c +++ b/src/mesa/drivers/dri/i965/brw_compiler.c @@ -40,7 +40,8 @@ .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, -- 2.30.2