diff options
author | Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> | 2021-01-27 13:20:32 -0500 |
---|---|---|
committer | Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> | 2021-02-12 16:44:30 -0500 |
commit | 1079d7ccd6c3b4fe78c5b34f9beb323f163137d8 (patch) | |
tree | cf456aa94abcf2de7dbe15d9c3cacf1d90cef2fc /src/panfrost/midgard | |
parent | 3c44671df3a6f466b3f3a05864c1707b7d432d38 (diff) |
pan/mdg: Lower stores from helpers
Required for correct behaviour of SSBOs in fragment shaders on Midgard.
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8774>
Diffstat (limited to 'src/panfrost/midgard')
-rw-r--r-- | src/panfrost/midgard/meson.build | 1 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_compile.c | 1 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_nir.h | 1 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_nir_lower_helper_writes.c | 93 |
4 files changed, 96 insertions, 0 deletions
diff --git a/src/panfrost/midgard/meson.build b/src/panfrost/midgard/meson.build index 49c3034c87f..446ad527b8e 100644 --- a/src/panfrost/midgard/meson.build +++ b/src/panfrost/midgard/meson.build @@ -35,6 +35,7 @@ libpanfrost_midgard_files = files( 'mir_promote_uniforms.c', 'mir_squeeze.c', 'midgard_nir_lower_image_bitsize.c', + 'midgard_nir_lower_helper_writes.c', 'midgard_opt_copy_prop.c', 'midgard_opt_dce.c', 'midgard_opt_perspective.c', diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index d0d5ec74d6b..d706e9371d4 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -317,6 +317,7 @@ optimise_nir(nir_shader *nir, unsigned quirks, bool is_blend) /* Midgard image ops coordinates are 16-bit instead of 32-bit */ NIR_PASS(progress, nir, midgard_nir_lower_image_bitsize); + NIR_PASS(progress, nir, midgard_nir_lower_helper_writes); NIR_PASS(progress, nir, midgard_nir_lower_algebraic_early); diff --git a/src/panfrost/midgard/midgard_nir.h b/src/panfrost/midgard/midgard_nir.h index e8f692b4504..25f3668969b 100644 --- a/src/panfrost/midgard/midgard_nir.h +++ b/src/panfrost/midgard/midgard_nir.h @@ -6,3 +6,4 @@ bool midgard_nir_lower_algebraic_late(nir_shader *shader); bool midgard_nir_scale_trig(nir_shader *shader); bool midgard_nir_cancel_inot(nir_shader *shader); bool midgard_nir_lower_image_bitsize(nir_shader *shader); +bool midgard_nir_lower_helper_writes(nir_shader *shader); diff --git a/src/panfrost/midgard/midgard_nir_lower_helper_writes.c b/src/panfrost/midgard/midgard_nir_lower_helper_writes.c new file mode 100644 index 00000000000..51c4b7db5b6 --- /dev/null +++ b/src/panfrost/midgard/midgard_nir_lower_helper_writes.c @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2020-2021 Collabora, Ltd. + * Copyright © 2020 Valve Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "compiler/nir/nir.h" +#include "compiler/nir/nir_builder.h" +#include "midgard_nir.h" + +static bool +nir_lower_helper_writes(nir_builder *b, nir_instr *instr, UNUSED void *data) +{ + if (instr->type != nir_instr_type_intrinsic) + return false; + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + + switch (intr->intrinsic) { + case nir_intrinsic_global_atomic_add: + case nir_intrinsic_global_atomic_and: + case nir_intrinsic_global_atomic_comp_swap: + case nir_intrinsic_global_atomic_exchange: + case nir_intrinsic_global_atomic_fadd: + case nir_intrinsic_global_atomic_fcomp_swap: + case nir_intrinsic_global_atomic_fmax: + case nir_intrinsic_global_atomic_fmin: + case nir_intrinsic_global_atomic_imax: + case nir_intrinsic_global_atomic_imin: + case nir_intrinsic_global_atomic_or: + case nir_intrinsic_global_atomic_umax: + case nir_intrinsic_global_atomic_umin: + case nir_intrinsic_global_atomic_xor: + case nir_intrinsic_image_atomic_add: + case nir_intrinsic_image_atomic_and: + case nir_intrinsic_image_atomic_comp_swap: + case nir_intrinsic_image_atomic_dec_wrap: + case nir_intrinsic_image_atomic_exchange: + case nir_intrinsic_image_atomic_fadd: + case nir_intrinsic_image_atomic_imax: + case nir_intrinsic_image_atomic_imin: + case nir_intrinsic_image_atomic_inc_wrap: + case nir_intrinsic_image_atomic_or: + case nir_intrinsic_image_atomic_umax: + case nir_intrinsic_image_atomic_umin: + case nir_intrinsic_image_atomic_xor: + case nir_intrinsic_image_store: + case nir_intrinsic_store_global: + break; + default: + return false; + } + + b->cursor = nir_before_instr(instr); + + nir_ssa_def *helper = nir_load_helper_invocation(b, 1); + nir_push_if(b, nir_inot(b, helper)); + nir_instr_remove(instr); + nir_builder_instr_insert(b, instr); + nir_pop_if(b, NULL); + + return true; +} + +bool +midgard_nir_lower_helper_writes(nir_shader *shader) +{ + if (shader->info.stage != MESA_SHADER_FRAGMENT) + return false; + + return nir_shader_instructions_pass(shader, + nir_lower_helper_writes, + nir_metadata_none, + NULL); +} |