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:
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:
# 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])
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));
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 {
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 =