From: Alejandro PiƱeiro <[email protected]>
The implementation is based on its fs_nir counterpart.
---
src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
index c7f76e6..fc4ebbc 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
@@ -556,9 +556,30 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr
*instr)
case nir_intrinsic_atomic_counter_read:
case nir_intrinsic_atomic_counter_inc:
- case nir_intrinsic_atomic_counter_dec:
- /* @TODO: Not yet implemented */
+ case nir_intrinsic_atomic_counter_dec: {
+ unsigned surf_index = prog_data->base.binding_table.abo_start +
+ (unsigned) instr->const_index[0];
+ src_reg offset = get_nir_src(instr->src[0], nir_type_int,
+ instr->num_components);
+ dest = get_nir_dest(instr->dest);
+
+ switch (instr->intrinsic) {
+ case nir_intrinsic_atomic_counter_inc:
+ emit_untyped_atomic(BRW_AOP_INC, surf_index, dest, offset,
+ src_reg(), src_reg());
+ break;
+ case nir_intrinsic_atomic_counter_dec:
+ emit_untyped_atomic(BRW_AOP_PREDEC, surf_index, dest, offset,
+ src_reg(), src_reg());
+ break;
+ case nir_intrinsic_atomic_counter_read:
+ emit_untyped_surface_read(surf_index, dest, offset);
+ break;
+ default:
+ unreachable("Unreachable");
+ }
break;
+ }
case nir_intrinsic_load_ubo_indirect:
/* fallthrough */
--
2.1.4
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev