Module: Mesa Branch: main Commit: 6694c37ea0d259f261a7fec4d1bec5d87186f2e3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6694c37ea0d259f261a7fec4d1bec5d87186f2e3
Author: Samuel Pitoiset <[email protected]> Date: Thu Jun 10 14:04:17 2021 +0200 aco: implement VK_EXT_shader_atomic_float2 Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Rhys Perry <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12060> --- src/amd/compiler/aco_instruction_selection.cpp | 62 ++++++++++++++++++++-- .../compiler/aco_instruction_selection_setup.cpp | 8 +++ 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index c594ec93057..bfed664b09b 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -6368,6 +6368,16 @@ visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr) buf_op64 = aco_opcode::buffer_atomic_cmpswap_x2; image_op = aco_opcode::image_atomic_cmpswap; break; + case nir_intrinsic_image_deref_atomic_fmin: + buf_op = aco_opcode::buffer_atomic_fmin; + buf_op64 = aco_opcode::buffer_atomic_fmin_x2; + image_op = aco_opcode::image_atomic_fmin; + break; + case nir_intrinsic_image_deref_atomic_fmax: + buf_op = aco_opcode::buffer_atomic_fmax; + buf_op64 = aco_opcode::buffer_atomic_fmax_x2; + image_op = aco_opcode::image_atomic_fmax; + break; default: unreachable("visit_image_atomic should only be called with " "nir_intrinsic_image_deref_atomic_* instructions."); @@ -6658,6 +6668,14 @@ visit_atomic_ssbo(isel_context* ctx, nir_intrinsic_instr* instr) op32 = aco_opcode::buffer_atomic_cmpswap; op64 = aco_opcode::buffer_atomic_cmpswap_x2; break; + case nir_intrinsic_ssbo_atomic_fmin: + op32 = aco_opcode::buffer_atomic_fmin; + op64 = aco_opcode::buffer_atomic_fmin_x2; + break; + case nir_intrinsic_ssbo_atomic_fmax: + op32 = aco_opcode::buffer_atomic_fmax; + op64 = aco_opcode::buffer_atomic_fmax_x2; + break; default: unreachable( "visit_atomic_ssbo should only be called with nir_intrinsic_ssbo_atomic_* instructions."); @@ -6891,6 +6909,14 @@ visit_global_atomic(isel_context* ctx, nir_intrinsic_instr* instr) op32 = global ? aco_opcode::global_atomic_cmpswap : aco_opcode::flat_atomic_cmpswap; op64 = global ? aco_opcode::global_atomic_cmpswap_x2 : aco_opcode::flat_atomic_cmpswap_x2; break; + case nir_intrinsic_global_atomic_fmin: + op32 = global ? aco_opcode::global_atomic_fmin : aco_opcode::flat_atomic_fmin; + op64 = global ? aco_opcode::global_atomic_fmin_x2 : aco_opcode::flat_atomic_fmin_x2; + break; + case nir_intrinsic_global_atomic_fmax: + op32 = global ? aco_opcode::global_atomic_fmax : aco_opcode::flat_atomic_fmax; + op64 = global ? aco_opcode::global_atomic_fmax_x2 : aco_opcode::flat_atomic_fmax_x2; + break; default: unreachable("visit_atomic_global should only be called with nir_intrinsic_global_atomic_* " "instructions."); @@ -6955,6 +6981,14 @@ visit_global_atomic(isel_context* ctx, nir_intrinsic_instr* instr) op32 = aco_opcode::buffer_atomic_cmpswap; op64 = aco_opcode::buffer_atomic_cmpswap_x2; break; + case nir_intrinsic_global_atomic_fmin: + op32 = aco_opcode::buffer_atomic_fmin; + op64 = aco_opcode::buffer_atomic_fmin_x2; + break; + case nir_intrinsic_global_atomic_fmax: + op32 = aco_opcode::buffer_atomic_fmax; + op64 = aco_opcode::buffer_atomic_fmax_x2; + break; default: unreachable("visit_atomic_global should only be called with nir_intrinsic_global_atomic_* " "instructions."); @@ -7195,6 +7229,18 @@ visit_shared_atomic(isel_context* ctx, nir_intrinsic_instr* instr) op64 = aco_opcode::num_opcodes; op64_rtn = aco_opcode::num_opcodes; break; + case nir_intrinsic_shared_atomic_fmin: + op32 = aco_opcode::ds_min_f32; + op32_rtn = aco_opcode::ds_min_rtn_f32; + op64 = aco_opcode::ds_min_f64; + op64_rtn = aco_opcode::ds_min_rtn_f64; + break; + case nir_intrinsic_shared_atomic_fmax: + op32 = aco_opcode::ds_max_f32; + op32_rtn = aco_opcode::ds_max_rtn_f32; + op64 = aco_opcode::ds_max_f64; + op64_rtn = aco_opcode::ds_max_rtn_f64; + break; default: unreachable("Unhandled shared atomic intrinsic"); } @@ -8086,7 +8132,9 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_shared_atomic_xor: case nir_intrinsic_shared_atomic_exchange: case nir_intrinsic_shared_atomic_comp_swap: - case nir_intrinsic_shared_atomic_fadd: visit_shared_atomic(ctx, instr); break; + case nir_intrinsic_shared_atomic_fadd: + case nir_intrinsic_shared_atomic_fmin: + case nir_intrinsic_shared_atomic_fmax: visit_shared_atomic(ctx, instr); break; case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_sparse_load: visit_image_load(ctx, instr); break; case nir_intrinsic_image_deref_store: visit_image_store(ctx, instr); break; @@ -8099,7 +8147,9 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_image_deref_atomic_or: case nir_intrinsic_image_deref_atomic_xor: case nir_intrinsic_image_deref_atomic_exchange: - case nir_intrinsic_image_deref_atomic_comp_swap: visit_image_atomic(ctx, instr); break; + case nir_intrinsic_image_deref_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: visit_image_atomic(ctx, instr); break; case nir_intrinsic_image_deref_size: visit_image_size(ctx, instr); break; case nir_intrinsic_image_deref_samples: visit_image_samples(ctx, instr); break; case nir_intrinsic_load_ssbo: visit_load_ssbo(ctx, instr); break; @@ -8117,7 +8167,9 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_global_atomic_or: case nir_intrinsic_global_atomic_xor: case nir_intrinsic_global_atomic_exchange: - case nir_intrinsic_global_atomic_comp_swap: visit_global_atomic(ctx, instr); break; + case nir_intrinsic_global_atomic_comp_swap: + case nir_intrinsic_global_atomic_fmin: + case nir_intrinsic_global_atomic_fmax: visit_global_atomic(ctx, instr); break; case nir_intrinsic_ssbo_atomic_add: case nir_intrinsic_ssbo_atomic_imin: case nir_intrinsic_ssbo_atomic_umin: @@ -8127,7 +8179,9 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_ssbo_atomic_or: case nir_intrinsic_ssbo_atomic_xor: case nir_intrinsic_ssbo_atomic_exchange: - case nir_intrinsic_ssbo_atomic_comp_swap: visit_atomic_ssbo(ctx, instr); break; + case nir_intrinsic_ssbo_atomic_comp_swap: + case nir_intrinsic_ssbo_atomic_fmin: + case nir_intrinsic_ssbo_atomic_fmax: visit_atomic_ssbo(ctx, instr); break; case nir_intrinsic_load_scratch: visit_load_scratch(ctx, instr); break; case nir_intrinsic_store_scratch: visit_store_scratch(ctx, instr); break; case nir_intrinsic_get_ssbo_size: visit_get_ssbo_size(ctx, instr); break; diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp index 689c4bb8c04..af3508ea62c 100644 --- a/src/amd/compiler/aco_instruction_selection_setup.cpp +++ b/src/amd/compiler/aco_instruction_selection_setup.cpp @@ -720,6 +720,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_ssbo_atomic_xor: case nir_intrinsic_ssbo_atomic_exchange: case nir_intrinsic_ssbo_atomic_comp_swap: + case nir_intrinsic_ssbo_atomic_fmin: + case nir_intrinsic_ssbo_atomic_fmax: case nir_intrinsic_global_atomic_add: case nir_intrinsic_global_atomic_imin: case nir_intrinsic_global_atomic_umin: @@ -730,6 +732,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_global_atomic_xor: case nir_intrinsic_global_atomic_exchange: case nir_intrinsic_global_atomic_comp_swap: + case nir_intrinsic_global_atomic_fmin: + case nir_intrinsic_global_atomic_fmax: case nir_intrinsic_image_deref_atomic_add: case nir_intrinsic_image_deref_atomic_umin: case nir_intrinsic_image_deref_atomic_imin: @@ -740,6 +744,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_image_deref_atomic_xor: case nir_intrinsic_image_deref_atomic_exchange: case nir_intrinsic_image_deref_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_size: case nir_intrinsic_shared_atomic_add: case nir_intrinsic_shared_atomic_imin: @@ -752,6 +758,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_shared_atomic_exchange: case nir_intrinsic_shared_atomic_comp_swap: case nir_intrinsic_shared_atomic_fadd: + case nir_intrinsic_shared_atomic_fmin: + case nir_intrinsic_shared_atomic_fmax: case nir_intrinsic_load_scratch: case nir_intrinsic_load_invocation_id: case nir_intrinsic_load_primitive_id: _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
