From c4e338018714eaf50fb0a80dc52770e66ab043d1 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 30 Mar 2026 15:34:20 +0200 Subject: [PATCH] nir,treewide: add nir_image_intrinsic_type We have 4 image intrinsic variants now. This enum is useful for nir_rewrite_image_intrinsic() and it will be used by other NIR passes. Signed-off-by: Samuel Pitoiset Part-of: --- .../nir/radv_nir_apply_pipeline_layout.c | 2 +- src/asahi/compiler/agx_nir_opt_preamble.c | 2 +- src/asahi/vulkan/hk_nir_lower_descriptors.c | 5 ++-- src/broadcom/vulkan/v3dv_pipeline.c | 2 +- src/compiler/glsl/gl_nir_lower_images.c | 3 ++- src/compiler/nir/nir.c | 25 +++++++++++++------ src/compiler/nir/nir.h | 14 +++++++++-- src/compiler/nir/nir_lower_cl_images.c | 2 +- src/freedreno/vulkan/tu_shader.cc | 3 ++- .../drivers/asahi/agx_nir_lower_bindings.c | 2 +- src/gallium/drivers/crocus/crocus_program.c | 2 +- src/gallium/drivers/iris/iris_program.c | 2 +- .../drivers/radeonsi/si_nir_lower_resource.c | 2 +- .../nir/lvp_nir_lower_pipeline_layout.c | 2 +- .../vulkan/anv_nir_apply_pipeline_layout.c | 8 ++++-- .../anv_nir_apply_pipeline_layout.c | 2 +- .../vulkan/kk_nir_lower_descriptors.c | 2 +- src/microsoft/clc/clc_compiler.c | 6 +++-- .../dxil_spirv_nir_lower_bindless.c | 2 +- .../vulkan/nvk_nir_lower_descriptors.c | 4 +-- .../vulkan/panvk_vX_nir_lower_descriptors.c | 3 ++- .../runtime/vk_nir_lower_descriptor_heaps.c | 24 +----------------- 22 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c index 2b410af0d8f..3c0a29c3a9a 100644 --- a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c +++ b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c @@ -335,7 +335,7 @@ update_image_intrinsic(nir_builder *b, apply_layout_state *state, nir_intrinsic_ if (intrin->intrinsic == nir_intrinsic_image_deref_descriptor_amd) { nir_def_replace(&intrin->def, desc); } else { - nir_rewrite_image_intrinsic(intrin, desc, true); + nir_rewrite_image_intrinsic(intrin, desc, nir_image_intrinsic_type_bindless); } } diff --git a/src/asahi/compiler/agx_nir_opt_preamble.c b/src/asahi/compiler/agx_nir_opt_preamble.c index ae1eb60d392..21365e563d5 100644 --- a/src/asahi/compiler/agx_nir_opt_preamble.c +++ b/src/asahi/compiler/agx_nir_opt_preamble.c @@ -400,7 +400,7 @@ lower_preamble(nir_builder *b, nir_intrinsic_instr *intr, void *data) if (ts) { nir_rewrite_image_intrinsic(pintr, nir_imm_intN_t(b, base / 2, 16), - false); + nir_image_intrinsic_type_default); } else if (new_ != NULL && pintr->intrinsic != nir_intrinsic_bindless_image_agx) { nir_src_rewrite(use, new_); diff --git a/src/asahi/vulkan/hk_nir_lower_descriptors.c b/src/asahi/vulkan/hk_nir_lower_descriptors.c index 3a985b2eb34..7de70007f1c 100644 --- a/src/asahi/vulkan/hk_nir_lower_descriptors.c +++ b/src/asahi/vulkan/hk_nir_lower_descriptors.c @@ -347,8 +347,9 @@ lower_image_intrin(nir_builder *b, nir_intrinsic_instr *intr, offs = offsetof(struct hk_storage_image_descriptor, tex); } - nir_rewrite_image_intrinsic( - intr, load_image_handle(b, ctx, intr->src[0], offs), true); + nir_rewrite_image_intrinsic(intr, + load_image_handle(b, ctx, intr->src[0], offs), + nir_image_intrinsic_type_bindless); return true; } diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 6f5b4e8922f..2d1101450c0 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -831,7 +831,7 @@ lower_image_deref(nir_builder *b, index = nir_imm_int(b, desc_index); - nir_rewrite_image_intrinsic(instr, index, false); + nir_rewrite_image_intrinsic(instr, index, nir_image_intrinsic_type_default); } static bool diff --git a/src/compiler/glsl/gl_nir_lower_images.c b/src/compiler/glsl/gl_nir_lower_images.c index 7d8496aed67..d3a88f590d6 100644 --- a/src/compiler/glsl/gl_nir_lower_images.c +++ b/src/compiler/glsl/gl_nir_lower_images.c @@ -98,7 +98,8 @@ lower_instr(nir_builder *b, nir_instr *instr, void *cb_data) nir_build_deref_offset(b, deref, type_size_align_1), var->data.driver_location); } - nir_rewrite_image_intrinsic(intrinsic, src, bindless); + nir_rewrite_image_intrinsic(intrinsic, src, + bindless ? nir_image_intrinsic_type_bindless : nir_image_intrinsic_type_default); if (!bindless) nir_intrinsic_set_range_base(intrinsic, range_base); diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index c617998cd37..f3a3e3b54e1 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2773,7 +2773,7 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin) void nir_rewrite_image_intrinsic(nir_intrinsic_instr *intrin, nir_def *src, - bool bindless) + nir_image_intrinsic_type type) { enum gl_access_qualifier access = nir_intrinsic_access(intrin); @@ -2796,12 +2796,23 @@ nir_rewrite_image_intrinsic(nir_intrinsic_instr *intrin, nir_def *src, explicit_coord = nir_intrinsic_explicit_coord(intrin); switch (intrin->intrinsic) { -#define CASE(op) \ - case nir_intrinsic_image_deref_##op: \ - case nir_intrinsic_image_##op: \ - case nir_intrinsic_bindless_image_##op: \ - intrin->intrinsic = bindless ? nir_intrinsic_bindless_image_##op \ - : nir_intrinsic_image_##op; \ +#define CASE(op) \ + case nir_intrinsic_image_deref_##op: \ + case nir_intrinsic_image_##op: \ + case nir_intrinsic_bindless_image_##op: \ + switch (type) { \ + case nir_image_intrinsic_type_default: \ + intrin->intrinsic = nir_intrinsic_image_##op; \ + break; \ + case nir_image_intrinsic_type_bindless: \ + intrin->intrinsic = nir_intrinsic_bindless_image_##op; \ + break; \ + case nir_image_intrinsic_type_heap: \ + intrin->intrinsic = nir_intrinsic_image_heap_##op; \ + break; \ + default: \ + UNREACHABLE("Invalid nir_image_intrinsic."); \ + } \ break; CASE(load) CASE(sparse_load) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 35c4a06cce4..80d942f4ae6 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -205,6 +205,16 @@ typedef enum { nir_descriptor_type_acceleration_structure = 2, } nir_descriptor_type; +/** + * NIR image intrinsics variants. + */ +typedef enum { + nir_image_intrinsic_type_default = 0, + nir_image_intrinsic_type_deref = 1, + nir_image_intrinsic_type_bindless = 2, + nir_image_intrinsic_type_heap = 3, +} nir_image_intrinsic_type; + /** * Rounding modes. */ @@ -2212,9 +2222,9 @@ nir_intrinsic_has_align(const nir_intrinsic_instr *intrin) unsigned nir_image_intrinsic_coord_components(const nir_intrinsic_instr *instr); -/* Converts a image_deref_* intrinsic into a image_* one */ +/* Converts an image intrinsic into a different type. */ void nir_rewrite_image_intrinsic(nir_intrinsic_instr *instr, - nir_def *handle, bool bindless); + nir_def *handle, nir_image_intrinsic_type type); /* Determine if an intrinsic can be arbitrarily reordered and eliminated. */ bool nir_intrinsic_can_reorder(nir_intrinsic_instr *instr); diff --git a/src/compiler/nir/nir_lower_cl_images.c b/src/compiler/nir/nir_lower_cl_images.c index 0bc007149b8..8e21b4486f7 100644 --- a/src/compiler/nir/nir_lower_cl_images.c +++ b/src/compiler/nir/nir_lower_cl_images.c @@ -271,7 +271,7 @@ nir_lower_cl_images(nir_shader *shader, bool lower_image_derefs, bool lower_samp b.cursor = nir_before_instr(&intrin->instr); /* Back-ends expect a 32-bit thing, not 64-bit */ nir_def *offset = nir_u2u32(&b, intrin->src[0].ssa); - nir_rewrite_image_intrinsic(intrin, offset, false); + nir_rewrite_image_intrinsic(intrin, offset, nir_image_intrinsic_type_default); progress = true; break; } diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 3a83a8dc81a..161681ebd89 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -605,7 +605,8 @@ lower_image_deref(struct tu_device *dev, nir_builder *b, { nir_deref_instr *deref = nir_src_as_deref(instr->src[0]); nir_def *bindless = build_bindless(dev, b, deref, 0, shader, layout, 0, false); - nir_rewrite_image_intrinsic(instr, bindless, true); + nir_rewrite_image_intrinsic(instr, bindless, + nir_image_intrinsic_type_bindless); } static bool diff --git a/src/gallium/drivers/asahi/agx_nir_lower_bindings.c b/src/gallium/drivers/asahi/agx_nir_lower_bindings.c index c731ef6d226..77e4ca90e0d 100644 --- a/src/gallium/drivers/asahi/agx_nir_lower_bindings.c +++ b/src/gallium/drivers/asahi/agx_nir_lower_bindings.c @@ -101,7 +101,7 @@ lower(nir_builder *b, nir_instr *instr, void *data) index = nir_iadd_imm(b, nir_imul_imm(b, index, 2), offset); nir_rewrite_image_intrinsic(intr, nir_load_texture_handle_agx(b, index), - true); + nir_image_intrinsic_type_bindless); } else if (instr->type == nir_instr_type_tex) { nir_tex_instr *tex = nir_instr_as_tex(instr); diff --git a/src/gallium/drivers/crocus/crocus_program.c b/src/gallium/drivers/crocus/crocus_program.c index 36dcbad69f3..9c6f23400bb 100644 --- a/src/gallium/drivers/crocus/crocus_program.c +++ b/src/gallium/drivers/crocus/crocus_program.c @@ -298,7 +298,7 @@ crocus_lower_storage_image_derefs_instr(nir_builder *b, nir_def *index = nir_iadd_imm(b, get_aoa_deref_offset(b, deref, 1), var->data.driver_location); - nir_rewrite_image_intrinsic(intrin, index, false); + nir_rewrite_image_intrinsic(intrin, index, nir_image_intrinsic_type_default); return true; } diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index 85c120ca81a..220406065a3 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -757,7 +757,7 @@ iris_lower_storage_image_derefs_instr(nir_builder *b, nir_def *index = nir_iadd_imm(b, get_aoa_deref_offset(b, deref, 1), var->data.driver_location); - nir_rewrite_image_intrinsic(intrin, index, false); + nir_rewrite_image_intrinsic(intrin, index, nir_image_intrinsic_type_default); return true; } diff --git a/src/gallium/drivers/radeonsi/si_nir_lower_resource.c b/src/gallium/drivers/radeonsi/si_nir_lower_resource.c index f7c9ceda82f..a1b98f0beba 100644 --- a/src/gallium/drivers/radeonsi/si_nir_lower_resource.c +++ b/src/gallium/drivers/radeonsi/si_nir_lower_resource.c @@ -348,7 +348,7 @@ static bool lower_resource_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin } else { nir_intrinsic_set_image_dim(intrin, glsl_get_sampler_dim(deref->type)); nir_intrinsic_set_image_array(intrin, glsl_sampler_type_is_array(deref->type)); - nir_rewrite_image_intrinsic(intrin, desc, true); + nir_rewrite_image_intrinsic(intrin, desc, nir_image_intrinsic_type_bindless); } break; } diff --git a/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c b/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c index 72568b0b827..16ae3cea6d7 100644 --- a/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c +++ b/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c @@ -148,7 +148,7 @@ lower_image_intrinsic(nir_builder *b, nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); nir_def *resource = vulkan_resource_from_deref(b, deref, layout, 0); - nir_rewrite_image_intrinsic(intrin, resource, true); + nir_rewrite_image_intrinsic(intrin, resource, nir_image_intrinsic_type_bindless); } static bool diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index d3f5af7afc7..102e41fcbf0 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -1857,7 +1857,9 @@ lower_image_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin, nir_def *handle = build_load_var_deref_surface_handle(b, deref, non_uniform, &is_bindless, state); - nir_rewrite_image_intrinsic(intrin, handle, is_bindless); + nir_rewrite_image_intrinsic(intrin, handle, + is_bindless ? nir_image_intrinsic_type_bindless + : nir_image_intrinsic_type_default); return true; } @@ -1878,7 +1880,9 @@ lower_image_size_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin, nir_def *handle = build_load_var_deref_surface_handle(b, deref, non_uniform, &is_bindless, state); - nir_rewrite_image_intrinsic(intrin, handle, is_bindless); + nir_rewrite_image_intrinsic(intrin, handle, + is_bindless ? nir_image_intrinsic_type_bindless + : nir_image_intrinsic_type_default); nir_variable *var = nir_deref_instr_get_variable(deref); const uint32_t set = var->data.descriptor_set; diff --git a/src/intel/vulkan_hasvk/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan_hasvk/anv_nir_apply_pipeline_layout.c index 6cbbcb26fda..d1da8dfd235 100644 --- a/src/intel/vulkan_hasvk/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan_hasvk/anv_nir_apply_pipeline_layout.c @@ -890,7 +890,7 @@ lower_image_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin, } index = nir_iadd_imm(b, index, binding_offset); - nir_rewrite_image_intrinsic(intrin, index, false); + nir_rewrite_image_intrinsic(intrin, index, nir_image_intrinsic_type_default); } return true; diff --git a/src/kosmickrisp/vulkan/kk_nir_lower_descriptors.c b/src/kosmickrisp/vulkan/kk_nir_lower_descriptors.c index 736a0955bed..e02cc060349 100644 --- a/src/kosmickrisp/vulkan/kk_nir_lower_descriptors.c +++ b/src/kosmickrisp/vulkan/kk_nir_lower_descriptors.c @@ -382,7 +382,7 @@ lower_image_intrin(nir_builder *b, nir_intrinsic_instr *intr, .access = nir_intrinsic_access(intr) | var->data.access, .flags = msl_convert_access_flag(var->data.access)); - nir_rewrite_image_intrinsic(intr, handle, true); + nir_rewrite_image_intrinsic(intr, handle, nir_image_intrinsic_type_bindless); return true; } diff --git a/src/microsoft/clc/clc_compiler.c b/src/microsoft/clc/clc_compiler.c index c90ab921a0f..1043f7b9c92 100644 --- a/src/microsoft/clc/clc_compiler.c +++ b/src/microsoft/clc/clc_compiler.c @@ -182,7 +182,8 @@ clc_lower_input_image_deref(nir_builder *b, struct clc_image_lower_context *cont } assert((in_var->data.access & ACCESS_NON_WRITEABLE) == 0); - nir_rewrite_image_intrinsic(intrinsic, nir_imm_int(b, image_binding), false); + nir_rewrite_image_intrinsic(intrinsic, nir_imm_int(b, image_binding), + nir_image_intrinsic_type_default); break; } @@ -205,7 +206,8 @@ clc_lower_input_image_deref(nir_builder *b, struct clc_image_lower_context *cont } assert((in_var->data.access & ACCESS_NON_WRITEABLE) == 0); - nir_rewrite_image_intrinsic(intrinsic, nir_imm_int(b, image_binding), false); + nir_rewrite_image_intrinsic(intrinsic, nir_imm_int(b, image_binding), + nir_image_intrinsic_type_default); break; } diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir_lower_bindless.c b/src/microsoft/spirv_to_dxil/dxil_spirv_nir_lower_bindless.c index 8b9bcd4f9ef..31f8e47ea77 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir_lower_bindless.c +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir_lower_bindless.c @@ -152,7 +152,7 @@ lower_bindless_image_intr(nir_builder *b, nir_intrinsic_instr *intr, struct dxil if (!handle) return false; - nir_rewrite_image_intrinsic(intr, handle, true); + nir_rewrite_image_intrinsic(intr, handle, nir_image_intrinsic_type_bindless); return true; } diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index f5c0349c840..ec7836f83f4 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -998,7 +998,7 @@ lower_edb_buffer_image_intrin(nir_builder *b, nir_intrinsic_instr *intrin, nir_def_rewrite_uses_after(&intrin->def, res); } - nir_rewrite_image_intrinsic(intrin, index, true); + nir_rewrite_image_intrinsic(intrin, index, nir_image_intrinsic_type_bindless); break; } @@ -1027,7 +1027,7 @@ lower_image_intrin(nir_builder *b, nir_intrinsic_instr *intrin, b->cursor = nir_before_instr(&intrin->instr); nir_def *desc = load_resource_deref_desc(b, 1, 32, deref, 0, ctx); - nir_rewrite_image_intrinsic(intrin, desc, true); + nir_rewrite_image_intrinsic(intrin, desc, nir_image_intrinsic_type_bindless); /* On pre-Volta hardware, we don't have real null descriptors. Null * descriptors work well enough for sampling but they may not return the diff --git a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c index c4e5d1f8085..5888e67a164 100644 --- a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c +++ b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c @@ -918,7 +918,8 @@ lower_img_intrinsic(nir_builder *b, nir_intrinsic_instr *intr, nir_def_replace(&intr->def, res); } else { - nir_rewrite_image_intrinsic(intr, get_img_index(b, deref, ctx), false); + nir_rewrite_image_intrinsic(intr, get_img_index(b, deref, ctx), + nir_image_intrinsic_type_default); } return true; diff --git a/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c b/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c index a0eb3e18a18..bf26e53d65c 100644 --- a/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c +++ b/src/vulkan/runtime/vk_nir_lower_descriptor_heaps.c @@ -745,29 +745,7 @@ lower_heaps_image(nir_builder *b, nir_intrinsic_instr *intrin, if (heap_offset == NULL) return false; - nir_rewrite_image_intrinsic(intrin, heap_offset, false); - - /* TODO: Roll this into nir_rewrite_image_intrinsic? */ - switch (intrin->intrinsic) { -#define CASE(op) \ - case nir_intrinsic_image_##op: \ - intrin->intrinsic = nir_intrinsic_image_heap_##op; \ - break; - CASE(load) - CASE(sparse_load) - CASE(store) - CASE(atomic) - CASE(atomic_swap) - CASE(size) - CASE(samples) - CASE(load_raw_intel) - CASE(store_raw_intel) - CASE(fragment_mask_load_amd) - CASE(store_block_agx) -#undef CASE - default: - UNREACHABLE("Unhanded image intrinsic"); - } + nir_rewrite_image_intrinsic(intrin, heap_offset, nir_image_intrinsic_type_heap); return true; }