From 64c3d735354932c3b14397e9c292f5989a9da710 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Wed, 6 Jul 2016 15:08:27 -0700 Subject: [PATCH] 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 Reviewed-by: Ian Romanick --- src/mesa/drivers/dri/i965/brw_nir_intrinsics.c | 13 +++++++++++-- 1 file 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; -- 2.30.2