diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index f3d71eac173..63dfa3c8585 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -294,7 +294,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_atomic_counter_read: case nir_intrinsic_atomic_counter_read_deref: case nir_intrinsic_quad_swizzle_amd: - case nir_intrinsic_masked_swizzle_amd: { + case nir_intrinsic_masked_swizzle_amd: + case nir_intrinsic_is_sparse_texels_resident: { unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs; for (unsigned i = 0; i < num_srcs; i++) { if (instr->src[i].ssa->divergent) { diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 4e66f4b8b60..0da1de09044 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -288,6 +288,9 @@ intrinsic("deref_mode_is", src_comp=[-1], dest_comp=1, intrinsic("addr_mode_is", src_comp=[-1], dest_comp=1, indices=[MEMORY_MODES], flags=[CAN_ELIMINATE, CAN_REORDER]) +intrinsic("is_sparse_texels_resident", dest_comp=1, src_comp=[1], bit_sizes=[1], + flags=[CAN_ELIMINATE, CAN_REORDER]) + # a barrier is an intrinsic with no inputs/outputs but which can't be moved # around/optimized in general def barrier(name): diff --git a/src/compiler/nir/nir_opt_peephole_select.c b/src/compiler/nir/nir_opt_peephole_select.c index 5d75b82f420..b2a0601c816 100644 --- a/src/compiler/nir/nir_opt_peephole_select.c +++ b/src/compiler/nir/nir_opt_peephole_select.c @@ -114,6 +114,7 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count, case nir_intrinsic_load_subgroup_invocation: case nir_intrinsic_load_num_subgroups: case nir_intrinsic_load_frag_shading_rate: + case nir_intrinsic_is_sparse_texels_resident: if (!alu_ok) return false; break; diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 37dd1ca3cb6..fbe9d44b2c7 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2553,6 +2553,10 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode, vtn_push_image(b, w[2], si.image, access & ACCESS_NON_UNIFORM); return; + } else if (opcode == SpvOpImageSparseTexelsResident) { + nir_ssa_def *code = vtn_get_nir_ssa(b, w[3]); + vtn_push_nir_ssa(b, w[2], nir_is_sparse_texels_resident(&b->nb, code)); + return; } nir_deref_instr *image = NULL, *sampler = NULL; @@ -5279,6 +5283,7 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode, case SpvOpSampledImage: case SpvOpImage: + case SpvOpImageSparseTexelsResident: case SpvOpImageSampleImplicitLod: case SpvOpImageSparseSampleImplicitLod: case SpvOpImageSampleExplicitLod: