From 1ba9c262fd9ce81e1af7d8ef39f0ecd84aeec236 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 27 Aug 2020 13:11:54 -0500 Subject: [PATCH] nir: Add image atomic_fmin/fmax intrinsics Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/nir/nir.c | 2 ++ src/compiler/nir/nir_divergence_analysis.c | 6 ++++++ src/compiler/nir/nir_gather_info.c | 6 ++++++ src/compiler/nir/nir_intrinsics.py | 2 ++ src/compiler/nir/nir_lower_memory_model.c | 2 ++ src/compiler/nir/nir_lower_multiview.c | 2 ++ src/compiler/nir/nir_lower_non_uniform_access.c | 7 +++++++ src/compiler/nir/nir_opt_access.c | 4 ++++ src/compiler/nir/nir_validate.c | 16 ++++++++++++++++ 9 files changed, 47 insertions(+) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index d68547bfc02..d5a1d5b5ebd 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2242,6 +2242,8 @@ nir_rewrite_image_intrinsic(nir_intrinsic_instr *intrin, nir_ssa_def *src, CASE(atomic_exchange) CASE(atomic_comp_swap) CASE(atomic_fadd) + CASE(atomic_fmin) + CASE(atomic_fmax) CASE(atomic_inc_wrap) CASE(atomic_dec_wrap) CASE(size) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index a335654650e..e377a2c3697 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -401,6 +401,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_image_deref_atomic_exchange: case nir_intrinsic_image_deref_atomic_comp_swap: case nir_intrinsic_image_deref_atomic_fadd: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_atomic_add: case nir_intrinsic_image_atomic_imin: case nir_intrinsic_image_atomic_umin: @@ -412,6 +414,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_image_atomic_exchange: case nir_intrinsic_image_atomic_comp_swap: case nir_intrinsic_image_atomic_fadd: + case nir_intrinsic_image_atomic_fmin: + case nir_intrinsic_image_atomic_fmax: case nir_intrinsic_bindless_image_atomic_add: case nir_intrinsic_bindless_image_atomic_imin: case nir_intrinsic_bindless_image_atomic_umin: @@ -423,6 +427,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_bindless_image_atomic_exchange: case nir_intrinsic_bindless_image_atomic_comp_swap: case nir_intrinsic_bindless_image_atomic_fadd: + case nir_intrinsic_bindless_image_atomic_fmin: + case nir_intrinsic_bindless_image_atomic_fmax: case nir_intrinsic_shared_atomic_add: case nir_intrinsic_shared_atomic_imin: case nir_intrinsic_shared_atomic_umin: diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index 7cc0fb9e590..249718084b1 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -619,6 +619,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader, case nir_intrinsic_bindless_image_atomic_umax: case nir_intrinsic_bindless_image_atomic_umin: case nir_intrinsic_bindless_image_atomic_xor: + case nir_intrinsic_bindless_image_atomic_fmin: + case nir_intrinsic_bindless_image_atomic_fmax: case nir_intrinsic_bindless_image_store: case nir_intrinsic_bindless_image_store_raw_intel: case nir_intrinsic_global_atomic_add: @@ -648,6 +650,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader, case nir_intrinsic_image_atomic_umax: case nir_intrinsic_image_atomic_umin: case nir_intrinsic_image_atomic_xor: + case nir_intrinsic_image_atomic_fmin: + case nir_intrinsic_image_atomic_fmax: case nir_intrinsic_image_deref_atomic_add: case nir_intrinsic_image_deref_atomic_and: case nir_intrinsic_image_deref_atomic_comp_swap: @@ -661,6 +665,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader, case nir_intrinsic_image_deref_atomic_umax: case nir_intrinsic_image_deref_atomic_umin: case nir_intrinsic_image_deref_atomic_xor: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_store: case nir_intrinsic_image_deref_store_raw_intel: case nir_intrinsic_image_store: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 793d78f6f62..70e53d505a0 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -545,6 +545,8 @@ image("atomic_xor", src_comp=[4, 1, 1], dest_comp=1) image("atomic_exchange", src_comp=[4, 1, 1], dest_comp=1) image("atomic_comp_swap", src_comp=[4, 1, 1, 1], dest_comp=1) image("atomic_fadd", src_comp=[4, 1, 1], dest_comp=1) +image("atomic_fmin", src_comp=[4, 1, 1], dest_comp=1) +image("atomic_fmax", src_comp=[4, 1, 1], dest_comp=1) image("size", dest_comp=0, src_comp=[1], flags=[CAN_ELIMINATE, CAN_REORDER]) image("samples", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) image("atomic_inc_wrap", src_comp=[4, 1, 1], dest_comp=1) diff --git a/src/compiler/nir/nir_lower_memory_model.c b/src/compiler/nir/nir_lower_memory_model.c index 1b8791d7776..e2cd1891668 100644 --- a/src/compiler/nir/nir_lower_memory_model.c +++ b/src/compiler/nir/nir_lower_memory_model.c @@ -50,6 +50,8 @@ get_intrinsic_info(nir_intrinsic_instr *intrin, nir_variable_mode *modes, case nir_intrinsic_image_deref_atomic_imin: case nir_intrinsic_image_deref_atomic_umax: case nir_intrinsic_image_deref_atomic_imax: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_atomic_and: case nir_intrinsic_image_deref_atomic_or: case nir_intrinsic_image_deref_atomic_xor: diff --git a/src/compiler/nir/nir_lower_multiview.c b/src/compiler/nir/nir_lower_multiview.c index d1471bdd9a1..d54fff62579 100644 --- a/src/compiler/nir/nir_lower_multiview.c +++ b/src/compiler/nir/nir_lower_multiview.c @@ -94,6 +94,8 @@ shader_writes_to_memory(nir_shader *shader) case nir_intrinsic_image_deref_atomic_umax: case nir_intrinsic_image_deref_atomic_imin: case nir_intrinsic_image_deref_atomic_imax: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_atomic_and: case nir_intrinsic_image_deref_atomic_or: case nir_intrinsic_image_deref_atomic_xor: diff --git a/src/compiler/nir/nir_lower_non_uniform_access.c b/src/compiler/nir/nir_lower_non_uniform_access.c index 12082a24272..1ea1f7c7c4b 100644 --- a/src/compiler/nir/nir_lower_non_uniform_access.c +++ b/src/compiler/nir/nir_lower_non_uniform_access.c @@ -248,6 +248,8 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, case nir_intrinsic_image_atomic_exchange: case nir_intrinsic_image_atomic_comp_swap: case nir_intrinsic_image_atomic_fadd: + case nir_intrinsic_image_atomic_fmin: + case nir_intrinsic_image_atomic_fmax: case nir_intrinsic_image_size: case nir_intrinsic_image_samples: case nir_intrinsic_bindless_image_load: @@ -264,6 +266,8 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, case nir_intrinsic_bindless_image_atomic_exchange: case nir_intrinsic_bindless_image_atomic_comp_swap: case nir_intrinsic_bindless_image_atomic_fadd: + case nir_intrinsic_bindless_image_atomic_fmin: + case nir_intrinsic_bindless_image_atomic_fmax: case nir_intrinsic_bindless_image_size: case nir_intrinsic_bindless_image_samples: case nir_intrinsic_image_deref_load: @@ -279,6 +283,9 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, 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_fadd: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_samples: if ((types & nir_lower_non_uniform_image_access) && diff --git a/src/compiler/nir/nir_opt_access.c b/src/compiler/nir/nir_opt_access.c index 72664b5ec6a..cc0e8025b2b 100644 --- a/src/compiler/nir/nir_opt_access.c +++ b/src/compiler/nir/nir_opt_access.c @@ -95,6 +95,8 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr) case nir_intrinsic_image_deref_atomic_exchange: case nir_intrinsic_image_deref_atomic_comp_swap: case nir_intrinsic_image_deref_atomic_fadd: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: var = nir_intrinsic_get_var(instr, 0); read = instr->intrinsic != nir_intrinsic_image_deref_store; write = instr->intrinsic != nir_intrinsic_image_deref_load && @@ -133,6 +135,8 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr) case nir_intrinsic_bindless_image_atomic_exchange: case nir_intrinsic_bindless_image_atomic_comp_swap: case nir_intrinsic_bindless_image_atomic_fadd: + case nir_intrinsic_bindless_image_atomic_fmin: + case nir_intrinsic_bindless_image_atomic_fmax: read = instr->intrinsic != nir_intrinsic_bindless_image_store; write = instr->intrinsic != nir_intrinsic_bindless_image_load && instr->intrinsic != nir_intrinsic_bindless_image_sparse_load; diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index a01501d0c70..ee949c617c0 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -757,6 +757,22 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state) break; } + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: + case nir_intrinsic_image_atomic_fmin: + case nir_intrinsic_image_atomic_fmax: + case nir_intrinsic_bindless_image_atomic_fmin: + case nir_intrinsic_bindless_image_atomic_fmax: { + enum pipe_format format = image_intrin_format(instr); + validate_assert(state, format == PIPE_FORMAT_COUNT || + format == PIPE_FORMAT_R16_FLOAT || + format == PIPE_FORMAT_R32_FLOAT || + format == PIPE_FORMAT_R64_FLOAT); + validate_assert(state, nir_dest_bit_size(instr->dest) == + util_format_get_blocksizebits(format)); + break; + } + default: break; }