From 59dfa8c2f5e87ce158ee4bd9f32d8bfad4e9c649 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 17 Jun 2025 11:23:19 +0200 Subject: [PATCH] radv: switch to nir_intrinsic_load_input_attachment_coord Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/nir/radv_nir.h | 2 ++ .../vulkan/nir/radv_nir_lower_fs_intrinsics.c | 28 +++++++++++++++++++ src/amd/vulkan/radv_pipeline_graphics.c | 2 ++ src/amd/vulkan/radv_shader.c | 3 +- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir.h b/src/amd/vulkan/nir/radv_nir.h index dd96f38095a..0393694348e 100644 --- a/src/amd/vulkan/nir/radv_nir.h +++ b/src/amd/vulkan/nir/radv_nir.h @@ -48,6 +48,8 @@ bool radv_nir_lower_primitive_shading_rate(nir_shader *nir, enum amd_gfx_level g bool radv_nir_lower_fs_intrinsics(nir_shader *nir, const struct radv_shader_stage *fs_stage, const struct radv_graphics_state_key *gfx_state); +bool radv_nir_lower_fs_input_attachment(nir_shader *nir); + bool radv_nir_lower_fs_barycentric(nir_shader *shader, const struct radv_graphics_state_key *gfx_state, unsigned rast_prim); diff --git a/src/amd/vulkan/nir/radv_nir_lower_fs_intrinsics.c b/src/amd/vulkan/nir/radv_nir_lower_fs_intrinsics.c index 27ab24a1b74..2f498e2d159 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_fs_intrinsics.c +++ b/src/amd/vulkan/nir/radv_nir_lower_fs_intrinsics.c @@ -125,3 +125,31 @@ radv_nir_lower_fs_intrinsics(nir_shader *nir, const struct radv_shader_stage *fs struct ctx ctx = { .fs_stage = fs_stage, .gfx_state = gfx_state }; return nir_shader_intrinsics_pass(nir, pass, nir_metadata_none, &ctx); } + +static bool +lower_load_input_attachment(nir_builder *b, nir_intrinsic_instr *intrin, void *state) +{ + switch (intrin->intrinsic) { + case nir_intrinsic_load_input_attachment_coord: { + b->cursor = nir_before_instr(&intrin->instr); + + nir_def *pos = nir_f2i32(b, nir_load_frag_coord(b)); + nir_def *layer = nir_load_layer_id(b); + nir_def *coord = nir_vec3(b, nir_channel(b, pos, 0), nir_channel(b, pos, 1), layer); + + nir_def_replace(&intrin->def, coord); + return true; + } + default: + return false; + } +} + +bool +radv_nir_lower_fs_input_attachment(nir_shader *nir) +{ + if (!nir->info.fs.uses_fbfetch_output) + return false; + + return nir_shader_intrinsics_pass(nir, lower_load_input_attachment, nir_metadata_control_flow, NULL); +} diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index 07a5fa3c096..13e31ce1c6f 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -2763,6 +2763,8 @@ radv_graphics_shaders_compile(struct radv_device *device, struct vk_pipeline_cac if (!gfx_state->ps.has_epilog) radv_nir_remap_color_attachment(stages[MESA_SHADER_FRAGMENT].nir, gfx_state); + NIR_PASS(update_info, stages[MESA_SHADER_FRAGMENT].nir, radv_nir_lower_fs_input_attachment); + NIR_PASS(update_info, stages[MESA_SHADER_FRAGMENT].nir, nir_opt_frag_coord_to_pixel_coord); if (update_info) nir_shader_gather_info(stages[MESA_SHADER_FRAGMENT].nir, diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index bef0b32a4bf..17caa1f2f4c 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -454,8 +454,7 @@ radv_shader_spirv_to_nir(struct radv_device *device, const struct radv_shader_st if (nir->info.stage == MESA_SHADER_FRAGMENT) NIR_PASS(_, nir, nir_lower_input_attachments, &(nir_input_attachment_options){ - .use_fragcoord_sysval = true, - .use_layer_id_sysval = true, + .use_ia_coord_intrin = true, }); nir_remove_dead_variables_options dead_vars_opts = {