i965: Generalize sampler state pointer mangling for non-const
authorChris Forbes <chrisf@ijw.co.nz>
Sat, 9 Aug 2014 23:39:44 +0000 (11:39 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Fri, 15 Aug 2014 07:10:29 +0000 (19:10 +1200)
For now, assume that the addressed sampler can be in any of the
16-sampler banks. If we preserved range information this far, we
could avoid emitting these instructions if the sampler were known
to be contained within one bank.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_eu_emit.c

index 3626bf4ad01fca70122355591dacdc011d286589..39f94e960592e26bdbcc5616bab0a075d616d2e3 100644 (file)
@@ -2386,7 +2386,19 @@ void brw_adjust_sampler_state_pointer(struct brw_compile *p,
                  brw_imm_ud(16 * (sampler / 16) * sampler_state_size));
       }
    } else {
-      /* XXX: Non-const sampler array indexing case */
+      /* Non-const sampler array indexing case */
+      if (brw->gen < 8 && !brw->is_haswell) {
+         return;
+      }
+
+      struct brw_reg temp = vec1(retype(scratch, BRW_REGISTER_TYPE_UD));
+
+      brw_AND(p, temp, sampler_index, brw_imm_ud(0x0f0));
+      brw_SHL(p, temp, temp, brw_imm_ud(4));
+      brw_ADD(p,
+              get_element_ud(header, 3),
+              get_element_ud(brw_vec8_grf(0, 0), 3),
+              temp);
    }
 }