From 46bb0037ce47d80a8e72da1f5c966ea3e26520d0 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 8 Jun 2023 11:11:22 -0400 Subject: [PATCH] agx: Add simple image fencing pass Minimum needed to pass CTS. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_nir.h | 1 + src/asahi/compiler/agx_nir_fence_images.c | 44 ++++++++++++++++++++++++++++++ src/asahi/compiler/agx_nir_lower_texture.c | 7 +++++ src/asahi/compiler/meson.build | 1 + 4 files changed, 53 insertions(+) create mode 100644 src/asahi/compiler/agx_nir_fence_images.c diff --git a/src/asahi/compiler/agx_nir.h b/src/asahi/compiler/agx_nir.h index 293ab4a..5726806 100644 --- a/src/asahi/compiler/agx_nir.h +++ b/src/asahi/compiler/agx_nir.h @@ -12,5 +12,6 @@ struct nir_shader; bool agx_nir_opt_ixor_bcsel(struct nir_shader *shader); bool agx_nir_lower_algebraic_late(struct nir_shader *shader); bool agx_nir_fuse_algebraic_late(struct nir_shader *shader); +bool agx_nir_fence_images(struct nir_shader *shader); #endif diff --git a/src/asahi/compiler/agx_nir_fence_images.c b/src/asahi/compiler/agx_nir_fence_images.c new file mode 100644 index 0000000..f2b0bc5 --- /dev/null +++ b/src/asahi/compiler/agx_nir_fence_images.c @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Valve Corporation + * SPDX-License-Identifier: MIT + */ + +#include "compiler/nir/nir_builder.h" +#include "agx_nir.h" +#include "nir.h" +#include "nir_builder_opcodes.h" +#include "nir_intrinsics.h" + +static bool +pass(struct nir_builder *b, nir_instr *instr, void *data) +{ + if (instr->type != nir_instr_type_intrinsic) + return false; + + b->cursor = nir_after_instr(instr); + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + switch (intr->intrinsic) { + case nir_intrinsic_image_store: + case nir_intrinsic_bindless_image_store: + nir_fence_pbe_to_tex_agx(b); + return true; + + case nir_intrinsic_image_atomic: + case nir_intrinsic_bindless_image_atomic: + case nir_intrinsic_image_atomic_swap: + case nir_intrinsic_bindless_image_atomic_swap: + nir_fence_mem_to_tex_agx(b); + return true; + + default: + return false; + } +} + +bool +agx_nir_fence_images(nir_shader *s) +{ + return nir_shader_instructions_pass( + s, pass, nir_metadata_block_index | nir_metadata_dominance, NULL); +} diff --git a/src/asahi/compiler/agx_nir_lower_texture.c b/src/asahi/compiler/agx_nir_lower_texture.c index ed450bc..7cbc5d2 100644 --- a/src/asahi/compiler/agx_nir_lower_texture.c +++ b/src/asahi/compiler/agx_nir_lower_texture.c @@ -10,6 +10,7 @@ #include "compiler/nir/nir_builtin_builder.h" #include "agx_compiler.h" #include "agx_internal_formats.h" +#include "agx_nir.h" #include "nir_builder_opcodes.h" #include "nir_intrinsics.h" #include "nir_intrinsics_indices.h" @@ -772,6 +773,12 @@ agx_nir_lower_texture(nir_shader *s, bool support_lod_bias) }; NIR_PASS(progress, s, nir_lower_tex, &lower_tex_options); + + /* Insert fences before lowering image atomics, since image atomics need + * different fencing than other image operations. + */ + NIR_PASS(progress, s, agx_nir_fence_images); + NIR_PASS(progress, s, nir_lower_image_atomics_to_global); /* Lower bias after nir_lower_tex (to get rid of txd) but before diff --git a/src/asahi/compiler/meson.build b/src/asahi/compiler/meson.build index 437bb75..0c6ab53 100644 --- a/src/asahi/compiler/meson.build +++ b/src/asahi/compiler/meson.build @@ -7,6 +7,7 @@ libasahi_agx_files = files( 'agx_dce.c', 'agx_liveness.c', 'agx_insert_waits.c', + 'agx_nir_fence_images.c', 'agx_nir_lower_address.c', 'agx_nir_lower_frag_sidefx.c', 'agx_nir_lower_sample_mask.c', -- 2.7.4