diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index c95589066a4..ab78aa4c0de 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -1104,6 +1104,40 @@ agx_emit_intrinsic(agx_builder *b, nir_intrinsic_instr *instr) return NULL; } + case nir_intrinsic_fence_pbe_to_tex_agx: { + agx_image_barrier_1(b); + agx_image_barrier_2(b); + agx_image_barrier_3(b); + agx_image_barrier_4(b); + return NULL; + } + + case nir_intrinsic_fence_mem_to_tex_agx: { + /* Flush out the atomic to main memory */ + agx_memory_barrier(b); + + /* Flush out the texture cache */ + agx_flush_memory_to_texture(b); + return NULL; + } + + case nir_intrinsic_fence_pbe_to_tex_pixel_agx: { + agx_image_barrier_1(b); + agx_image_barrier_2(b); + agx_flush_memory_to_texture(b); + agx_image_barrier_3(b); + return NULL; + } + + case nir_intrinsic_begin_invocation_interlock: { + if (!b->shader->did_writeout && + !b->shader->key->fs.ignore_tib_dependencies) + agx_wait_pix(b, 0x000C); + + b->shader->did_writeout = true; + return NULL; + } + case nir_intrinsic_load_barycentric_sample: case nir_intrinsic_load_sample_id: case nir_intrinsic_load_sample_pos: diff --git a/src/asahi/compiler/agx_opcodes.py b/src/asahi/compiler/agx_opcodes.py index 7bc6f7f8237..45db16774b9 100644 --- a/src/asahi/compiler/agx_opcodes.py +++ b/src/asahi/compiler/agx_opcodes.py @@ -380,6 +380,8 @@ memory_barrier("image_barrier_2", 3, 2, 10) memory_barrier("image_barrier_3", 2, 1, 10) memory_barrier("image_barrier_4", 3, 1, 10) +memory_barrier("flush_memory_to_texture", 0, 0, 4) + # Convenient aliases. op("mov", _, srcs = 1) op("not", _, srcs = 1)