diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 5db6becb361..71d7b48670f 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2725,6 +2725,7 @@ nir_rewrite_image_intrinsic(nir_intrinsic_instr *intrin, nir_ssa_def *src, CASE(samples) CASE(load_raw_intel) CASE(store_raw_intel) + CASE(fragment_mask_load_amd) #undef CASE default: unreachable("Unhanded image intrinsic"); diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 0a551ad12d3..75ec58100d0 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1995,6 +1995,7 @@ nir_intrinsic_can_reorder(nir_intrinsic_instr *instr) if (nir_intrinsic_has_access(instr) && nir_intrinsic_access(instr) & ACCESS_VOLATILE) return false; + if (instr->intrinsic == nir_intrinsic_load_deref) { nir_deref_instr *deref = nir_src_as_deref(instr->src[0]); return nir_deref_mode_is_in_set(deref, nir_var_read_only_modes) || diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 60097d3decb..d9794f0f487 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -356,6 +356,9 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_image_samples_identical: case nir_intrinsic_image_deref_samples_identical: case nir_intrinsic_bindless_image_samples_identical: + case nir_intrinsic_image_fragment_mask_load_amd: + case nir_intrinsic_image_deref_fragment_mask_load_amd: + case nir_intrinsic_bindless_image_fragment_mask_load_amd: is_divergent = (instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM)) || instr->src[1].ssa->divergent; break; diff --git a/src/compiler/nir/nir_group_loads.c b/src/compiler/nir/nir_group_loads.c index b45f9f320bb..cdaee266081 100644 --- a/src/compiler/nir/nir_group_loads.c +++ b/src/compiler/nir/nir_group_loads.c @@ -91,6 +91,9 @@ get_intrinsic_resource(nir_intrinsic_instr *intr) case nir_intrinsic_bindless_image_load: case nir_intrinsic_bindless_image_sparse_load: case nir_intrinsic_load_ssbo: + case nir_intrinsic_image_fragment_mask_load_amd: + case nir_intrinsic_image_deref_fragment_mask_load_amd: + case nir_intrinsic_bindless_image_fragment_mask_load_amd: return intr->src[0].ssa->parent_instr; default: return NULL; diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index bc98a7ac085..679a1d234d6 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -665,6 +665,9 @@ image("descriptor_amd", dest_comp=0, src_comp=[], flags=[CAN_ELIMINATE, CAN_REOR # CL-specific format queries image("format", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) image("order", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) +# Multisample fragment mask load +# src_comp[0] is same as image load src_comp[0] +image("fragment_mask_load_amd", src_comp=[4], dest_comp=1, bit_sizes=[32], flags=[CAN_ELIMINATE, CAN_REORDER]) # Vulkan descriptor set intrinsics # diff --git a/src/compiler/nir/nir_lower_non_uniform_access.c b/src/compiler/nir/nir_lower_non_uniform_access.c index 02ad2a6ade1..80a635f9ac6 100644 --- a/src/compiler/nir/nir_lower_non_uniform_access.c +++ b/src/compiler/nir/nir_lower_non_uniform_access.c @@ -273,6 +273,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, case nir_intrinsic_image_size: case nir_intrinsic_image_samples: case nir_intrinsic_image_samples_identical: + 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: @@ -292,6 +293,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, case nir_intrinsic_bindless_image_size: case nir_intrinsic_bindless_image_samples: case nir_intrinsic_bindless_image_samples_identical: + 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: @@ -311,6 +313,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_samples: case nir_intrinsic_image_deref_samples_identical: + case nir_intrinsic_image_deref_fragment_mask_load_amd: if ((options->types & nir_lower_non_uniform_image_access) && lower_non_uniform_access_intrin(options, &b, intrin, 0)) progress = true; diff --git a/src/compiler/nir/nir_opt_non_uniform_access.c b/src/compiler/nir/nir_opt_non_uniform_access.c index 72713306a53..f774ecd98aa 100644 --- a/src/compiler/nir/nir_opt_non_uniform_access.c +++ b/src/compiler/nir/nir_opt_non_uniform_access.c @@ -79,6 +79,7 @@ is_image_intrinsic(nir_intrinsic_instr *intrin) case nir_intrinsic_image_atomic_fmax: 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: @@ -97,6 +98,7 @@ is_image_intrinsic(nir_intrinsic_instr *intrin) case nir_intrinsic_bindless_image_atomic_fmax: 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: @@ -115,6 +117,7 @@ is_image_intrinsic(nir_intrinsic_instr *intrin) case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_samples: + case nir_intrinsic_image_deref_fragment_mask_load_amd: return true; default: