v2: Drop VEC4 suport. --- src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 58 +++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 16 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 555987d..1443ef0 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -26,8 +26,11 @@ #include "glsl/nir/glsl_to_nir.h" #include "program/prog_to_nir.h" #include "brw_fs.h" +#include "brw_fs_surface_builder.h" #include "brw_nir.h" +using namespace brw; + void fs_visitor::emit_nir_code() { @@ -1288,25 +1291,48 @@ fs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr) case nir_intrinsic_atomic_counter_inc: case nir_intrinsic_atomic_counter_dec: case nir_intrinsic_atomic_counter_read: { - unsigned surf_index = prog_data->binding_table.abo_start + - (unsigned) instr->const_index[0]; - fs_reg offset = fs_reg(get_nir_src(instr->src[0])); + using namespace surface_access; + + const bool uses_kill = (stage == MESA_SHADER_FRAGMENT && + ((brw_wm_prog_data *)prog_data)->uses_kill); + fs_builder bld(devinfo, mem_ctx, alloc, instructions, + dispatch_width, stage, uses_kill); + + /* Get the arguments of the atomic intrinsic. */ + const fs_reg offset(get_nir_src(instr->src[0])); + const fs_reg surface(stage_prog_data->binding_table.abo_start + + instr->const_index[0]); + + /* Get some metadata from the atomic intrinsic. */ + const unsigned rsize = (nir_intrinsic_infos[instr->intrinsic].has_dest ? + 1 : 0); + fs_reg tmp; + /* Emit a surface read or atomic op. */ switch (instr->intrinsic) { - case nir_intrinsic_atomic_counter_inc: - emit_untyped_atomic(BRW_AOP_INC, surf_index, dest, offset, - fs_reg(), fs_reg()); - break; - case nir_intrinsic_atomic_counter_dec: - emit_untyped_atomic(BRW_AOP_PREDEC, surf_index, dest, offset, - fs_reg(), fs_reg()); - break; - case nir_intrinsic_atomic_counter_read: - emit_untyped_surface_read(surf_index, dest, offset); - break; - default: - unreachable("Unreachable"); + case nir_intrinsic_atomic_counter_read: + tmp = surface_access::emit_untyped_read(bld, surface, offset, 1, 1); + break; + + case nir_intrinsic_atomic_counter_inc: + tmp = surface_access::emit_untyped_atomic( + bld, surface, offset, fs_reg(), + fs_reg(), 1, rsize, BRW_AOP_INC); + break; + + case nir_intrinsic_atomic_counter_dec: + tmp = surface_access::emit_untyped_atomic( + bld, surface, offset, fs_reg(), + fs_reg(), 1, rsize, BRW_AOP_PREDEC); + break; + + default: + unreachable("Unreachable"); } + + /* Assign the result. */ + if (rsize) + bld.MOV(get_nir_dest(instr->dest), tmp); break; } -- 2.3.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev