From aa92b464f353e4c1edc8c29bcb0bc785fe9e1644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 6 Feb 2026 14:11:49 -0500 Subject: [PATCH] nir/opt_non_uniform_access: use new query flags NFC for drivers Reviewed-by: Rhys Perry Part-of: --- src/compiler/nir/nir_opt_non_uniform_access.c | 63 +++++++++++++++---- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/compiler/nir/nir_opt_non_uniform_access.c b/src/compiler/nir/nir_opt_non_uniform_access.c index 34e83f70837..27fdc4daa04 100644 --- a/src/compiler/nir/nir_opt_non_uniform_access.c +++ b/src/compiler/nir/nir_opt_non_uniform_access.c @@ -46,7 +46,7 @@ is_ssbo_intrinsic(nir_intrinsic_instr *intrin) } static bool -is_image_intrinsic(nir_intrinsic_instr *intrin) +is_image_access_intrinsic(nir_intrinsic_instr *intrin) { switch (intrin->intrinsic) { case nir_intrinsic_image_load: @@ -54,25 +54,39 @@ is_image_intrinsic(nir_intrinsic_instr *intrin) case nir_intrinsic_image_store: case nir_intrinsic_image_atomic: case nir_intrinsic_image_atomic_swap: - case nir_intrinsic_image_size: - case nir_intrinsic_image_samples: case nir_intrinsic_image_fragment_mask_load_amd: case nir_intrinsic_bindless_image_load: case nir_intrinsic_bindless_image_sparse_load: case nir_intrinsic_bindless_image_store: case nir_intrinsic_bindless_image_atomic: case nir_intrinsic_bindless_image_atomic_swap: - case nir_intrinsic_bindless_image_size: - case nir_intrinsic_bindless_image_samples: case nir_intrinsic_bindless_image_fragment_mask_load_amd: case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_sparse_load: case nir_intrinsic_image_deref_store: case nir_intrinsic_image_deref_atomic: case nir_intrinsic_image_deref_atomic_swap: + case nir_intrinsic_image_deref_fragment_mask_load_amd: + return true; + + default: + return false; + } +} + +static bool +is_image_query_intrinsic(nir_intrinsic_instr *intrin) +{ + switch (intrin->intrinsic) { + case nir_intrinsic_image_size: + case nir_intrinsic_image_samples: + case nir_intrinsic_image_levels: + case nir_intrinsic_bindless_image_size: + case nir_intrinsic_bindless_image_samples: + case nir_intrinsic_bindless_image_levels: case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_samples: - case nir_intrinsic_image_deref_fragment_mask_load_amd: + case nir_intrinsic_image_deref_levels: return true; default: @@ -85,10 +99,29 @@ has_non_uniform_tex_access(nir_tex_instr *tex, enum nir_lower_non_uniform_access { bool ret = false; - if (types & nir_lower_non_uniform_texture_access) - ret |= tex->texture_non_uniform || tex->sampler_non_uniform; - if (types & nir_lower_non_uniform_texture_offset_access) - ret |= tex->offset_non_uniform; + switch (tex->op) { + case nir_texop_txs: + case nir_texop_query_levels: + case nir_texop_texture_samples: + case nir_texop_descriptor_amd: + if (types & nir_lower_non_uniform_texture_query) + ret |= tex->texture_non_uniform; + break; + + case nir_texop_lod_bias: + case nir_texop_sampler_descriptor_amd: + if (types & nir_lower_non_uniform_texture_query) + ret |= tex->sampler_non_uniform; + break; + + default: + if (types & nir_lower_non_uniform_texture_access) + ret |= tex->texture_non_uniform || tex->sampler_non_uniform; + if (types & nir_lower_non_uniform_texture_offset_access) + ret |= tex->offset_non_uniform; + break; + } + return ret; } @@ -121,10 +154,14 @@ nir_has_non_uniform_access_impl(nir_function_impl *impl, enum nir_lower_non_unif if ((types & nir_lower_non_uniform_ssbo_access) && has_non_uniform_access_intrin(intrin)) return true; - } else if (is_image_intrinsic(intrin)) { + } else if (is_image_access_intrinsic(intrin)) { if ((types & nir_lower_non_uniform_image_access) && has_non_uniform_access_intrin(intrin)) return true; + } else if (is_image_query_intrinsic(intrin)) { + if ((types & nir_lower_non_uniform_image_query) && + has_non_uniform_access_intrin(intrin)) + return true; } else if (intrin->intrinsic == nir_intrinsic_get_ssbo_size) { if ((types & nir_lower_non_uniform_get_ssbo_size) && has_non_uniform_access_intrin(intrin)) @@ -161,6 +198,7 @@ opt_non_uniform_tex_access(nir_tex_instr *tex) { if (!has_non_uniform_tex_access(tex, nir_lower_non_uniform_texture_access | + nir_lower_non_uniform_texture_query | nir_lower_non_uniform_texture_offset_access)) return false; @@ -224,7 +262,8 @@ nir_opt_non_uniform_access_instr(nir_builder *b, nir_instr *instr, UNUSED void * case nir_instr_type_intrinsic: { nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); - if (is_ubo_intrinsic(intrin) || is_ssbo_intrinsic(intrin) || is_image_intrinsic(intrin)) { + if (is_ubo_intrinsic(intrin) || is_ssbo_intrinsic(intrin) || + is_image_access_intrinsic(intrin) || is_image_query_intrinsic(intrin)) { unsigned handle_src = 0; /* SSBO Stores put the index in the second source */ if (intrin->intrinsic == nir_intrinsic_store_ssbo)