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 <jordan.l.justen@intel.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
1fa000a33b
commit
64c3d73535
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue