Module: Mesa
Branch: master
Commit: 64c3d735354932c3b14397e9c292f5989a9da710
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=64c3d735354932c3b14397e9c292f5989a9da710

Author: Jordan Justen <jordan.l.jus...@intel.com>
Date:   Wed Jul  6 15:08:27 2016 -0700

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.jus...@intel.com>
Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>

---

 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 9ae161f..d63570f 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;

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to