summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Justen <[email protected]>2016-07-06 15:08:27 -0700
committerJordan Justen <[email protected]>2016-10-19 16:51:45 -0700
commit64c3d735354932c3b14397e9c292f5989a9da710 (patch)
tree370638bbc37e6d6d046b90d2d6f8b7eb46e49e2d
parent1fa000a33b010436ac3bf4b3c8da2974d3788382 (diff)
i965/cs: Don't use a thread channel ID for small local sizes
When the local group size is 8 or less, we will execute the program at most 1 time. Therefore, the local channel ID will always be 0. By using a constant 0 in this case we can prevent using push constant data. This is not expected to be common a occurance in real applications, but it has been seen in tests. We could extend this optimization to 16 and 32 for SIMD16 and SIMD32, but it gets a bit more complicated, because this optimization is currently being done early on, before we have decided the SIMD size. Signed-off-by: Jordan Justen <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_nir_intrinsics.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_nir_intrinsics.c b/src/mesa/drivers/dri/i965/brw_nir_intrinsics.c
index 9ae161f53df..d63570fa2a7 100644
--- a/src/mesa/drivers/dri/i965/brw_nir_intrinsics.c
+++ b/src/mesa/drivers/dri/i965/brw_nir_intrinsics.c
@@ -39,12 +39,21 @@ struct lower_intrinsics_state {
static nir_ssa_def *
read_thread_local_id(struct lower_intrinsics_state *state)
{
+ nir_builder *b = &state->builder;
+ nir_shader *nir = state->nir;
+ const unsigned *sizes = nir->info.cs.local_size;
+ const unsigned group_size = sizes[0] * sizes[1] * sizes[2];
+
+ /* Some programs have local_size dimensions so small that the thread local
+ * ID will always be 0.
+ */
+ if (group_size <= 8)
+ return nir_imm_int(b, 0);
+
assert(state->cs_prog_data->thread_local_id_index >= 0);
state->cs_thread_id_used = true;
const int id_index = state->cs_prog_data->thread_local_id_index;
- nir_builder *b = &state->builder;
- nir_shader *nir = state->nir;
nir_intrinsic_instr *load =
nir_intrinsic_instr_create(nir, nir_intrinsic_load_uniform);
load->num_components = 1;