radv: Make the number of internal nodes be written on the GPU.

Opens the door of algorithms with a variable number of nodes.

Reviewed-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19292>
This commit is contained in:
Bas Nieuwenhuizen 2022-09-29 02:15:39 +02:00 committed by Marge Bot
parent 0e23df959e
commit ccf0a69e05
4 changed files with 15 additions and 7 deletions

View file

@ -78,9 +78,9 @@ struct copy_args {
struct convert_internal_args {
VOID_REF intermediate_bvh;
VOID_REF output_bvh;
REF(radv_ir_header) header;
uint32_t output_bvh_offset;
uint32_t leaf_node_count;
uint32_t internal_node_count;
uint32_t geometry_type;
};

View file

@ -80,7 +80,6 @@ struct radv_accel_struct_header {
uint64_t instance_count;
uint64_t size;
uint32_t build_flags;
uint32_t internal_node_count;
};
struct radv_ir_node {
@ -123,6 +122,7 @@ struct radv_ir_instance_node {
struct radv_ir_header {
int32_t min_bounds[3];
int32_t max_bounds[3];
uint32_t ir_internal_node_count;
};
struct radv_bvh_triangle_node {

View file

@ -54,7 +54,7 @@ void
main()
{
/* Revert the order so we start at the root */
uint32_t global_id = args.internal_node_count - 1 - gl_GlobalInvocationID.x;
uint32_t global_id = DEREF(args.header).ir_internal_node_count - 1 - gl_GlobalInvocationID.x;
uint32_t intermediate_leaf_node_size;
uint32_t output_leaf_node_size;
@ -84,7 +84,7 @@ main()
radv_ir_box_node src = DEREF(src_node);
uint32_t dst_node_offset = dst_internal_offset + global_id * SIZEOF(radv_bvh_box32_node);
if (global_id == args.internal_node_count - 1)
if (global_id == DEREF(args.header).ir_internal_node_count - 1)
dst_node_offset = id_to_offset(RADV_BVH_ROOT_NODE);
REF(radv_bvh_box32_node) dst_node = REF(radv_bvh_box32_node)(OFFSET(args.output_bvh, dst_node_offset));
@ -196,7 +196,7 @@ main()
break;
}
if (global_id == args.internal_node_count - 1) {
if (global_id == DEREF(args.header).ir_internal_node_count - 1) {
REF(radv_accel_struct_header) header = REF(radv_accel_struct_header)(args.output_bvh - args.output_bvh_offset);
DEREF(header).aabb = src.base.aabb;
DEREF(header).bvh_offset = args.output_bvh_offset;

View file

@ -651,6 +651,15 @@ lbvh_build_internal(VkCommandBuffer commandBuffer, uint32_t infoCount,
bvh_states[i].scratch_offset = dst_scratch_offset;
}
}
for (uint32_t i = 0; i < infoCount; ++i) {
radv_update_buffer_cp(cmd_buffer,
pInfos[i].scratchData.deviceAddress +
bvh_states[i].scratch.header_offset +
offsetof(struct radv_ir_header, ir_internal_node_count),
&bvh_states[i].internal_node_count, 4);
}
cmd_buffer->state.flush_bits |= flush_bits;
}
@ -708,9 +717,9 @@ convert_internal_nodes(VkCommandBuffer commandBuffer, uint32_t infoCount,
const struct convert_internal_args args = {
.intermediate_bvh = pInfos[i].scratchData.deviceAddress + bvh_states[i].scratch.ir_offset,
.output_bvh = accel_struct->va + bvh_states[i].accel_struct.bvh_offset,
.header = pInfos[i].scratchData.deviceAddress + bvh_states[i].scratch.header_offset,
.output_bvh_offset = bvh_states[i].accel_struct.bvh_offset,
.leaf_node_count = bvh_states[i].leaf_node_count,
.internal_node_count = bvh_states[i].internal_node_count,
.geometry_type = geometry_type,
};
radv_CmdPushConstants(
@ -806,7 +815,6 @@ radv_CmdBuildAccelerationStructuresKHR(
header.build_flags = pInfos[i].flags;
header.geometry_count = pInfos[i].geometryCount;
header.internal_node_count = bvh_states[i].internal_node_count;
struct radv_accel_struct_geometry_info *geometry_infos = malloc(geometry_infos_size);
if (!geometry_infos)