diff --git a/src/amd/vulkan/bvh/build_interface.h b/src/amd/vulkan/bvh/build_interface.h index dbb4d92506d..7b8aee8ba96 100644 --- a/src/amd/vulkan/bvh/build_interface.h +++ b/src/amd/vulkan/bvh/build_interface.h @@ -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; }; diff --git a/src/amd/vulkan/bvh/bvh.h b/src/amd/vulkan/bvh/bvh.h index 6f144b5e143..e4979154fe1 100644 --- a/src/amd/vulkan/bvh/bvh.h +++ b/src/amd/vulkan/bvh/bvh.h @@ -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 { diff --git a/src/amd/vulkan/bvh/converter_internal.comp b/src/amd/vulkan/bvh/converter_internal.comp index 9956602f235..12cb9f6fd19 100644 --- a/src/amd/vulkan/bvh/converter_internal.comp +++ b/src/amd/vulkan/bvh/converter_internal.comp @@ -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; diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index 765a85ee485..dca9a85fc9c 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -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)