From 4a3b905bb89b9ae9091586d1c090b548cf5451f7 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 9 Feb 2024 11:53:28 -0400 Subject: [PATCH] agx: move texture lowering into lib This is a bit annoying, but it gets rid of the libagx dep which is preventing precompiling helper programs. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_compile.c | 7 +-- src/asahi/compiler/agx_compile.h | 8 ---- src/asahi/compiler/agx_nir.h | 1 - src/asahi/compiler/agx_nir_fence_images.c | 46 ------------------- src/asahi/compiler/meson.build | 2 - src/asahi/lib/agx_meta.c | 4 +- .../{compiler => lib}/agx_nir_lower_texture.c | 43 +++++++++++++---- src/asahi/lib/agx_nir_passes.h | 19 ++++++++ src/asahi/lib/meson.build | 1 + src/gallium/drivers/asahi/agx_blit.c | 2 +- .../drivers/asahi/agx_nir_lower_bindings.c | 2 +- src/gallium/drivers/asahi/agx_state.c | 3 ++ 12 files changed, 64 insertions(+), 74 deletions(-) delete mode 100644 src/asahi/compiler/agx_nir_fence_images.c rename src/asahi/{compiler => lib}/agx_nir_lower_texture.c (95%) create mode 100644 src/asahi/lib/agx_nir_passes.h diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index b4e4dd11c2b..afdbfd36b36 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -3083,13 +3083,10 @@ agx_compile_shader_nir(nir_shader *nir, struct agx_shader_key *key, (nir->info.outputs_written & VARYING_BIT_CLIP_DIST0)) NIR_PASS(_, nir, agx_nir_lower_clip_distance); - bool needs_libagx = nir->info.stage == MESA_SHADER_GEOMETRY; - - /* Late tilebuffer lowering creates multisampled image stores */ - NIR_PASS(needs_libagx, nir, agx_nir_lower_multisampled_image_store); + bool needs_libagx = true /* TODO: Optimize */; if (nir->info.stage == MESA_SHADER_FRAGMENT) - NIR_PASS(needs_libagx, nir, agx_nir_lower_interpolation); + NIR_PASS(_, nir, agx_nir_lower_interpolation); NIR_PASS(_, nir, nir_lower_vars_to_ssa); diff --git a/src/asahi/compiler/agx_compile.h b/src/asahi/compiler/agx_compile.h index 8a9bc75d0a4..ccff88f9389 100644 --- a/src/asahi/compiler/agx_compile.h +++ b/src/asahi/compiler/agx_compile.h @@ -238,12 +238,6 @@ struct agx_shader_key { }; }; -/* Texture backend flags */ -#define AGX_TEXTURE_FLAG_NO_CLAMP (1 << 0) - -bool agx_nir_lower_texture_early(nir_shader *s, bool support_lod_bias); -bool agx_nir_lower_texture(nir_shader *s); - void agx_preprocess_nir(nir_shader *nir, const nir_shader *libagx, bool allow_mediump, struct agx_uncompiled_shader_info *out); @@ -254,8 +248,6 @@ bool agx_nir_lower_sample_mask(nir_shader *s); bool agx_nir_lower_cull_distance_fs(struct nir_shader *s, unsigned nr_distances); -bool agx_nir_needs_texture_crawl(nir_instr *instr); - void agx_compile_shader_nir(nir_shader *nir, struct agx_shader_key *key, struct util_debug_callback *debug, struct util_dynarray *binary, diff --git a/src/asahi/compiler/agx_nir.h b/src/asahi/compiler/agx_nir.h index bc3f3dbc4e3..c54b445c5c6 100644 --- a/src/asahi/compiler/agx_nir.h +++ b/src/asahi/compiler/agx_nir.h @@ -13,7 +13,6 @@ bool agx_nir_lower_interpolation(struct nir_shader *s); 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); -bool agx_nir_lower_multisampled_image_store(struct nir_shader *s); bool agx_nir_lower_layer(struct nir_shader *s); bool agx_nir_lower_clip_distance(struct nir_shader *s); bool agx_nir_lower_cull_distance_vs(struct nir_shader *s); diff --git a/src/asahi/compiler/agx_nir_fence_images.c b/src/asahi/compiler/agx_nir_fence_images.c deleted file mode 100644 index c726f4f8be9..00000000000 --- a/src/asahi/compiler/agx_nir_fence_images.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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_intrinsic_instr *intr, void *data) -{ - b->cursor = nir_after_instr(&intr->instr); - - /* If the image is write-only, there is no fencing needed */ - if (nir_intrinsic_has_access(intr) && - (nir_intrinsic_access(intr) & ACCESS_NON_READABLE)) { - return false; - } - - 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_intrinsics_pass( - s, pass, nir_metadata_block_index | nir_metadata_dominance, NULL); -} diff --git a/src/asahi/compiler/meson.build b/src/asahi/compiler/meson.build index d888054dc06..0a7165d9d33 100644 --- a/src/asahi/compiler/meson.build +++ b/src/asahi/compiler/meson.build @@ -7,14 +7,12 @@ 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_clip_distance.c', 'agx_nir_lower_cull_distance.c', 'agx_nir_lower_frag_sidefx.c', 'agx_nir_lower_sample_mask.c', 'agx_nir_lower_discard_zs_emit.c', - 'agx_nir_lower_texture.c', 'agx_nir_lower_interpolation.c', 'agx_nir_lower_layer.c', 'agx_nir_lower_load_mask.c', diff --git a/src/asahi/lib/agx_meta.c b/src/asahi/lib/agx_meta.c index 1c5f2d701fe..094b202b1bf 100644 --- a/src/asahi/lib/agx_meta.c +++ b/src/asahi/lib/agx_meta.c @@ -4,8 +4,8 @@ */ #include "agx_meta.h" -#include "agx_compile.h" #include "agx_device.h" /* for AGX_MEMORY_TYPE_SHADER */ +#include "agx_nir_passes.h" #include "agx_tilebuffer.h" #include "nir.h" #include "nir_builder.h" @@ -33,12 +33,14 @@ agx_compile_meta_shader(struct agx_meta_cache *cache, nir_shader *shader, struct util_dynarray binary; util_dynarray_init(&binary, NULL); + agx_nir_lower_texture(shader); agx_preprocess_nir(shader, cache->dev->libagx, false, NULL); if (tib) { unsigned bindless_base = 0; agx_nir_lower_tilebuffer(shader, tib, NULL, &bindless_base, NULL, true); agx_nir_lower_monolithic_msaa( shader, &(struct agx_msaa_state){.nr_samples = tib->nr_samples}); + agx_nir_lower_multisampled_image_store(shader); nir_shader_intrinsics_pass( shader, lower_tex_handle_to_u0, diff --git a/src/asahi/compiler/agx_nir_lower_texture.c b/src/asahi/lib/agx_nir_lower_texture.c similarity index 95% rename from src/asahi/compiler/agx_nir_lower_texture.c rename to src/asahi/lib/agx_nir_lower_texture.c index 604aeb1813c..99870426612 100644 --- a/src/asahi/compiler/agx_nir_lower_texture.c +++ b/src/asahi/lib/agx_nir_lower_texture.c @@ -1,4 +1,5 @@ /* + * Copyright 2023 Valve Corporation * Copyright 2021 Alyssa Rosenzweig * Copyright 2020 Collabora Ltd. * Copyright 2016 Broadcom @@ -7,16 +8,39 @@ #include "compiler/nir/nir.h" #include "compiler/nir/nir_builder.h" -#include "compiler/nir/nir_builtin_builder.h" -#include "agx_compile.h" -#include "agx_compiler.h" #include "agx_internal_formats.h" -#include "agx_nir.h" -#include "glsl_types.h" +#include "agx_nir_passes.h" #include "libagx_shaders.h" -#include "nir_builder_opcodes.h" -#include "nir_intrinsics.h" -#include "nir_intrinsics_indices.h" +#include "nir_builtin_builder.h" + +static bool +fence_image(struct nir_builder *b, nir_intrinsic_instr *intr, void *data) +{ + b->cursor = nir_after_instr(&intr->instr); + + /* If the image is write-only, there is no fencing needed */ + if (nir_intrinsic_has_access(intr) && + (nir_intrinsic_access(intr) & ACCESS_NON_READABLE)) { + return false; + } + + 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; + } +} static nir_def * texture_descriptor_ptr(nir_builder *b, nir_tex_instr *tex) @@ -588,7 +612,8 @@ agx_nir_lower_texture(nir_shader *s) /* 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_shader_intrinsics_pass, fence_image, + nir_metadata_block_index | nir_metadata_dominance, NULL); NIR_PASS(progress, s, nir_lower_image_atomics_to_global); diff --git a/src/asahi/lib/agx_nir_passes.h b/src/asahi/lib/agx_nir_passes.h new file mode 100644 index 00000000000..daa2a4929e8 --- /dev/null +++ b/src/asahi/lib/agx_nir_passes.h @@ -0,0 +1,19 @@ +/* + * Copyright 2024 Alyssa Rosenzweig + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +struct nir_shader; +struct nir_instr; + +/* Texture backend flags */ +#define AGX_TEXTURE_FLAG_NO_CLAMP (1 << 0) + +bool agx_nir_lower_texture_early(struct nir_shader *s, bool support_lod_bias); +bool agx_nir_lower_texture(struct nir_shader *s); +bool agx_nir_lower_multisampled_image_store(struct nir_shader *s); +bool agx_nir_needs_texture_crawl(struct nir_instr *instr); diff --git a/src/asahi/lib/meson.build b/src/asahi/lib/meson.build index 601feecd6ee..3bf9590e415 100644 --- a/src/asahi/lib/meson.build +++ b/src/asahi/lib/meson.build @@ -18,6 +18,7 @@ libasahi_lib_files = files( 'agx_nir_lower_msaa.c', 'agx_nir_lower_sample_intrinsics.c', 'agx_nir_lower_tess.c', + 'agx_nir_lower_texture.c', 'agx_nir_lower_tilebuffer.c', 'agx_nir_lower_vbo.c', 'agx_nir_predicate_layer_id.c', diff --git a/src/gallium/drivers/asahi/agx_blit.c b/src/gallium/drivers/asahi/agx_blit.c index 2b077b6e95d..3887544fa9e 100644 --- a/src/gallium/drivers/asahi/agx_blit.c +++ b/src/gallium/drivers/asahi/agx_blit.c @@ -8,8 +8,8 @@ */ #include -#include "asahi/compiler/agx_compile.h" #include "asahi/layout/layout.h" +#include "asahi/lib/agx_nir_passes.h" #include "compiler/nir/nir_builder.h" #include "compiler/nir/nir_format_convert.h" #include "gallium/auxiliary/util/u_blitter.h" diff --git a/src/gallium/drivers/asahi/agx_nir_lower_bindings.c b/src/gallium/drivers/asahi/agx_nir_lower_bindings.c index b8daeaa758a..b73448f9004 100644 --- a/src/gallium/drivers/asahi/agx_nir_lower_bindings.c +++ b/src/gallium/drivers/asahi/agx_nir_lower_bindings.c @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -#include "asahi/compiler/agx_compile.h" +#include "asahi/lib/agx_nir_passes.h" #include "compiler/glsl_types.h" #include "compiler/nir/nir_builder.h" #include "agx_state.h" diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 124ac42eaed..22274b494fb 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -13,6 +13,7 @@ #include "asahi/layout/layout.h" #include "asahi/lib/agx_formats.h" #include "asahi/lib/agx_helpers.h" +#include "asahi/lib/agx_nir_passes.h" #include "asahi/lib/agx_ppp.h" #include "asahi/lib/agx_usc.h" #include "compiler/nir/nir.h" @@ -2029,6 +2030,8 @@ agx_compile_variant(struct agx_device *dev, struct pipe_context *pctx, NIR_PASS(_, nir, agx_nir_predicate_layer_id); } + NIR_PASS(_, nir, agx_nir_lower_multisampled_image_store); + struct agx_shader_key base_key = {0}; if (nir->info.stage == MESA_SHADER_VERTEX) {