nir/lower_atomics: Multiply array offsets by ATOMIC_COUNTER_SIZE
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 16 Oct 2014 16:56:14 +0000 (09:56 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 15 Jan 2015 15:18:59 +0000 (07:18 -0800)
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/glsl/nir/nir_lower_atomics.c

index 06b14fc0b7197ab10f84cedc10f0c55a32564615..c2387cd81097c4309b655648e9548a8690465ec4 100644 (file)
@@ -87,11 +87,27 @@ lower_instr(nir_intrinsic_instr *instr, nir_function_impl *impl)
       offset_const->value.u[0] += deref_array->base_offset;
 
       if (deref_array->has_indirect) {
+         nir_load_const_instr *atomic_counter_size =
+               nir_load_const_instr_create(mem_ctx);
+         atomic_counter_size->num_components = 1;
+         atomic_counter_size->value.u[0] = ATOMIC_COUNTER_SIZE;
+         atomic_counter_size->dest.reg.reg = nir_local_reg_create(impl);
+         atomic_counter_size->dest.reg.reg->num_components = 1;
+         nir_instr_insert_before(&instr->instr, &atomic_counter_size->instr);
+
+         nir_alu_instr *mul = nir_alu_instr_create(mem_ctx, nir_op_imul);
+         mul->dest.dest.reg.reg = nir_local_reg_create(impl);
+         mul->dest.dest.reg.reg->num_components = 1;
+         mul->dest.write_mask = 0x1;
+         mul->src[0].src = nir_src_copy(deref_array->indirect, mem_ctx);
+         mul->src[1].src.reg.reg = atomic_counter_size->dest.reg.reg;
+         nir_instr_insert_before(&instr->instr, &mul->instr);
+
          nir_alu_instr *add = nir_alu_instr_create(mem_ctx, nir_op_iadd);
          add->dest.dest.reg.reg = nir_local_reg_create(impl);
          add->dest.dest.reg.reg->num_components = 1;
          add->dest.write_mask = 0x1;
-         add->src[0].src = nir_src_copy(deref_array->indirect, mem_ctx);
+         add->src[0].src.reg.reg = mul->dest.dest.reg.reg;
          add->src[1].src.reg.reg = offset_const->dest.reg.reg;
          nir_instr_insert_before(&instr->instr, &add->instr);