diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index e50086e3629..5bad5bc8817 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -248,6 +248,11 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) instr->src[1].ssa->divergent; break; + case nir_intrinsic_get_ssbo_size: + case nir_intrinsic_deref_buffer_array_length: + is_divergent = instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM); + break; + case nir_intrinsic_image_load: case nir_intrinsic_image_deref_load: case nir_intrinsic_bindless_image_load: @@ -282,12 +287,10 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_image_samples: case nir_intrinsic_image_deref_samples: case nir_intrinsic_bindless_image_samples: - case nir_intrinsic_get_ssbo_size: case nir_intrinsic_image_size: case nir_intrinsic_image_deref_size: case nir_intrinsic_bindless_image_size: case nir_intrinsic_copy_deref: - case nir_intrinsic_deref_buffer_array_length: case nir_intrinsic_vulkan_resource_index: case nir_intrinsic_vulkan_resource_reindex: case nir_intrinsic_load_vulkan_descriptor: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 70819dba2b4..8e5b0328fb0 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -272,12 +272,12 @@ intrinsic("interp_deref_at_vertex", src_comp=[1, 1], dest_comp=0, # Gets the length of an unsized array at the end of a buffer intrinsic("deref_buffer_array_length", src_comp=[-1], dest_comp=1, - flags=[CAN_ELIMINATE, CAN_REORDER]) + indices=[ACCESS], flags=[CAN_ELIMINATE, CAN_REORDER]) # Ask the driver for the size of a given SSBO. It takes the buffer index # as source. intrinsic("get_ssbo_size", src_comp=[-1], dest_comp=1, bit_sizes=[32], - flags=[CAN_ELIMINATE, CAN_REORDER]) + indices=[ACCESS], flags=[CAN_ELIMINATE, CAN_REORDER]) intrinsic("get_ubo_size", src_comp=[-1], dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 22d319f74c3..07be1b2998a 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -1985,8 +1985,9 @@ lower_explicit_io_array_length(nir_builder *b, nir_intrinsic_instr *intrin, nir_ssa_def *addr = &deref->dest.ssa; nir_ssa_def *index = addr_to_index(b, addr, addr_format); nir_ssa_def *offset = addr_to_offset(b, addr, addr_format); + unsigned access = nir_intrinsic_access(intrin); - nir_ssa_def *arr_size = nir_get_ssbo_size(b, index); + nir_ssa_def *arr_size = nir_get_ssbo_size(b, index, .access=access); arr_size = nir_imax(b, nir_isub(b, arr_size, offset), nir_imm_int(b, 0u)); arr_size = nir_idiv(b, arr_size, nir_imm_int(b, stride)); diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 1481e6b4e57..ac5af93bf7d 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -2465,7 +2465,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, nir_ssa_def *array_length = nir_build_deref_buffer_array_length(&b->nb, 32, - vtn_pointer_to_ssa(b, array)); + vtn_pointer_to_ssa(b, array), + .access=ptr->access | ptr->type->access); vtn_push_nir_ssa(b, w[2], array_length); } else { @@ -2480,7 +2481,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, vtn_assert(ptr->block_index); } - nir_ssa_def *buf_size = nir_get_ssbo_size(&b->nb, ptr->block_index); + nir_ssa_def *buf_size = nir_get_ssbo_size(&b->nb, ptr->block_index, + .access=ptr->access | ptr->type->access); /* array_length = max(buffer_size - offset, 0) / stride */ nir_ssa_def *array_length =