diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2016-06-30 10:38:16 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2016-10-04 16:53:32 -0700 |
commit | 40dd45d0c6aa4a9d727c09225967e9c3b1f45854 (patch) | |
tree | ece8613a58fc9dcb7d71fd41cf397ea2e64cc1b6 /src/mesa/drivers/dri/i965/brw_fs_nir.cpp | |
parent | 3d2011cb33317b0fe9b8fe989916efc1841c6ce0 (diff) | |
download | external_mesa3d-40dd45d0c6aa4a9d727c09225967e9c3b1f45854.zip external_mesa3d-40dd45d0c6aa4a9d727c09225967e9c3b1f45854.tar.gz external_mesa3d-40dd45d0c6aa4a9d727c09225967e9c3b1f45854.tar.bz2 |
i965: Enable ARB_shader_atomic_counter_ops
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_nir.cpp')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 2016cee..54b9398 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -3793,23 +3793,40 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr switch (instr->intrinsic) { case nir_intrinsic_atomic_counter_inc: case nir_intrinsic_atomic_counter_dec: - case nir_intrinsic_atomic_counter_read: { + case nir_intrinsic_atomic_counter_read: + case nir_intrinsic_atomic_counter_add: + case nir_intrinsic_atomic_counter_min: + case nir_intrinsic_atomic_counter_max: + case nir_intrinsic_atomic_counter_and: + case nir_intrinsic_atomic_counter_or: + case nir_intrinsic_atomic_counter_xor: + case nir_intrinsic_atomic_counter_exchange: + case nir_intrinsic_atomic_counter_comp_swap: { if (stage == MESA_SHADER_FRAGMENT && instr->intrinsic != nir_intrinsic_atomic_counter_read) ((struct brw_wm_prog_data *)prog_data)->has_side_effects = true; + /* Get some metadata from the image intrinsic. */ + const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; + /* Get the arguments of the atomic intrinsic. */ const fs_reg offset = get_nir_src(instr->src[0]); const unsigned surface = (stage_prog_data->binding_table.abo_start + instr->const_index[0]); + const fs_reg src0 = (info->num_srcs >= 2 + ? get_nir_src(instr->src[1]) : fs_reg()); + const fs_reg src1 = (info->num_srcs >= 3 + ? get_nir_src(instr->src[2]) : fs_reg()); fs_reg tmp; + assert(info->num_srcs <= 3); + /* Emit a surface read or atomic op. */ if (instr->intrinsic == nir_intrinsic_atomic_counter_read) { tmp = emit_untyped_read(bld, brw_imm_ud(surface), offset, 1, 1); } else { - tmp = emit_untyped_atomic(bld, brw_imm_ud(surface), offset, fs_reg(), - fs_reg(), 1, 1, + tmp = emit_untyped_atomic(bld, brw_imm_ud(surface), offset, src0, + src1, 1, 1, get_atomic_counter_op(instr->intrinsic)); } |