nir: add image fragment mask load intrinsic
Like nir_texop_fragment_mask_fetch_amd, this is used to load multi sample image fmask data for AMD GPU. We will lower multi sample image load and samples_identical intrinsics to use it latter for radeonsi. RADV does not need this because it always expand fmask images before dispatch compute shader. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18666>
This commit is contained in:
@@ -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");
|
||||
|
@@ -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) ||
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
#
|
||||
|
@@ -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;
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user