nir,spirv: allow non-uniform OpArrayLength
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7969>
This commit is contained in:
@@ -248,6 +248,11 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
|
|||||||
instr->src[1].ssa->divergent;
|
instr->src[1].ssa->divergent;
|
||||||
break;
|
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_load:
|
||||||
case nir_intrinsic_image_deref_load:
|
case nir_intrinsic_image_deref_load:
|
||||||
case nir_intrinsic_bindless_image_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_samples:
|
||||||
case nir_intrinsic_image_deref_samples:
|
case nir_intrinsic_image_deref_samples:
|
||||||
case nir_intrinsic_bindless_image_samples:
|
case nir_intrinsic_bindless_image_samples:
|
||||||
case nir_intrinsic_get_ssbo_size:
|
|
||||||
case nir_intrinsic_image_size:
|
case nir_intrinsic_image_size:
|
||||||
case nir_intrinsic_image_deref_size:
|
case nir_intrinsic_image_deref_size:
|
||||||
case nir_intrinsic_bindless_image_size:
|
case nir_intrinsic_bindless_image_size:
|
||||||
case nir_intrinsic_copy_deref:
|
case nir_intrinsic_copy_deref:
|
||||||
case nir_intrinsic_deref_buffer_array_length:
|
|
||||||
case nir_intrinsic_vulkan_resource_index:
|
case nir_intrinsic_vulkan_resource_index:
|
||||||
case nir_intrinsic_vulkan_resource_reindex:
|
case nir_intrinsic_vulkan_resource_reindex:
|
||||||
case nir_intrinsic_load_vulkan_descriptor:
|
case nir_intrinsic_load_vulkan_descriptor:
|
||||||
|
@@ -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
|
# Gets the length of an unsized array at the end of a buffer
|
||||||
intrinsic("deref_buffer_array_length", src_comp=[-1], dest_comp=1,
|
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
|
# Ask the driver for the size of a given SSBO. It takes the buffer index
|
||||||
# as source.
|
# as source.
|
||||||
intrinsic("get_ssbo_size", src_comp=[-1], dest_comp=1, bit_sizes=[32],
|
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,
|
intrinsic("get_ubo_size", src_comp=[-1], dest_comp=1,
|
||||||
flags=[CAN_ELIMINATE, CAN_REORDER])
|
flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||||
|
|
||||||
|
@@ -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 *addr = &deref->dest.ssa;
|
||||||
nir_ssa_def *index = addr_to_index(b, addr, addr_format);
|
nir_ssa_def *index = addr_to_index(b, addr, addr_format);
|
||||||
nir_ssa_def *offset = addr_to_offset(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_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));
|
arr_size = nir_idiv(b, arr_size, nir_imm_int(b, stride));
|
||||||
|
|
||||||
|
@@ -2465,7 +2465,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
|
|||||||
|
|
||||||
nir_ssa_def *array_length =
|
nir_ssa_def *array_length =
|
||||||
nir_build_deref_buffer_array_length(&b->nb, 32,
|
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);
|
vtn_push_nir_ssa(b, w[2], array_length);
|
||||||
} else {
|
} else {
|
||||||
@@ -2480,7 +2481,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
|
|||||||
vtn_assert(ptr->block_index);
|
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 */
|
/* array_length = max(buffer_size - offset, 0) / stride */
|
||||||
nir_ssa_def *array_length =
|
nir_ssa_def *array_length =
|
||||||
|
Reference in New Issue
Block a user