From 217072d25f4e5fa2414f0c3f4203c2faf3c8a807 Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Fri, 8 Mar 2024 17:13:05 +0100 Subject: [PATCH] radv/rt: Force active leaves for every updateable accel struct We can't rely on games getting updates right. To avoid adding workarounds for tons of games, be more robust by default. Cc: mesa-stable Part-of: --- src/amd/vulkan/radv_acceleration_structure.c | 47 ++++++++++++++------ src/amd/vulkan/radv_private.h | 1 + 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index c9619310f93..f8970d07532 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -93,6 +93,7 @@ enum internal_build_type { struct build_config { enum internal_build_type internal_type; bool compact; + bool updateable; }; struct acceleration_structure_layout { @@ -144,6 +145,10 @@ build_config(uint32_t leaf_count, const VkAccelerationStructureBuildGeometryInfo build_info->type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR) config.internal_type = INTERNAL_BUILD_TYPE_UPDATE; + if ((build_info->flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR) && + build_info->type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR) + config.updateable = true; + if (build_info->flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR) config.compact = true; @@ -541,14 +546,16 @@ radv_device_init_accel_struct_build_state(struct radv_device *device) if (device->meta_state.accel_struct_build.radix_sort) goto exit; - if (device->instance->drirc.force_active_accel_struct_leaves) - result = create_build_pipeline_spv(device, leaf_always_active_spv, sizeof(leaf_always_active_spv), - sizeof(struct leaf_args), &device->meta_state.accel_struct_build.leaf_pipeline, - &device->meta_state.accel_struct_build.leaf_p_layout); - else - result = create_build_pipeline_spv(device, leaf_spv, sizeof(leaf_spv), sizeof(struct leaf_args), - &device->meta_state.accel_struct_build.leaf_pipeline, - &device->meta_state.accel_struct_build.leaf_p_layout); + result = create_build_pipeline_spv(device, leaf_always_active_spv, sizeof(leaf_always_active_spv), + sizeof(struct leaf_args), + &device->meta_state.accel_struct_build.leaf_updateable_pipeline, + &device->meta_state.accel_struct_build.leaf_p_layout); + if (result != VK_SUCCESS) + goto exit; + + result = create_build_pipeline_spv(device, leaf_spv, sizeof(leaf_spv), sizeof(struct leaf_args), + &device->meta_state.accel_struct_build.leaf_pipeline, + &device->meta_state.accel_struct_build.leaf_p_layout); if (result != VK_SUCCESS) goto exit; @@ -647,6 +654,8 @@ struct radv_bvh_batch_state { bool any_non_compact; bool any_ploc; bool any_lbvh; + bool any_updateable; + bool any_non_updateable; bool any_update; }; @@ -719,18 +728,22 @@ static void build_leaves(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos, const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, struct bvh_state *bvh_states, - enum radv_cmd_flush_bits flush_bits) + bool updateable) { RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); radv_write_user_event_marker(cmd_buffer, UserEventPush, "leaves"); cmd_buffer->device->vk.dispatch_table.CmdBindPipeline( - commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cmd_buffer->device->meta_state.accel_struct_build.leaf_pipeline); + commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, + updateable ? cmd_buffer->device->meta_state.accel_struct_build.leaf_updateable_pipeline + : cmd_buffer->device->meta_state.accel_struct_build.leaf_pipeline); for (uint32_t i = 0; i < infoCount; ++i) { if (bvh_states[i].config.internal_type == INTERNAL_BUILD_TYPE_UPDATE) continue; + if (bvh_states[i].config.updateable != updateable) + continue; RADV_FROM_HANDLE(vk_acceleration_structure, accel_struct, pInfos[i].dstAccelerationStructure); @@ -759,8 +772,6 @@ build_leaves(VkCommandBuffer commandBuffer, uint32_t infoCount, } radv_write_user_event_marker(cmd_buffer, UserEventPop, NULL); - - cmd_buffer->state.flush_bits |= flush_bits; } static void @@ -1382,6 +1393,11 @@ radv_CmdBuildAccelerationStructuresKHR(VkCommandBuffer commandBuffer, uint32_t i else batch_state.any_non_compact = true; + if (config.updateable) + batch_state.any_updateable = true; + else + batch_state.any_non_updateable = true; + if (config.internal_type == INTERNAL_BUILD_TYPE_PLOC) { batch_state.any_ploc = true; } else if (config.internal_type == INTERNAL_BUILD_TYPE_LBVH) { @@ -1431,7 +1447,12 @@ radv_CmdBuildAccelerationStructuresKHR(VkCommandBuffer commandBuffer, uint32_t i cmd_buffer->state.current_event_type = EventInternalUnknown; - build_leaves(commandBuffer, infoCount, pInfos, ppBuildRangeInfos, bvh_states, flush_bits); + if (batch_state.any_non_updateable) + build_leaves(commandBuffer, infoCount, pInfos, ppBuildRangeInfos, bvh_states, false); + if (batch_state.any_updateable) + build_leaves(commandBuffer, infoCount, pInfos, ppBuildRangeInfos, bvh_states, true); + + cmd_buffer->state.flush_bits |= flush_bits; morton_generate(commandBuffer, infoCount, pInfos, bvh_states, flush_bits); diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 95eb0cde593..874c996f0d4 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -702,6 +702,7 @@ struct radv_meta_state { struct { VkPipelineLayout leaf_p_layout; VkPipeline leaf_pipeline; + VkPipeline leaf_updateable_pipeline; VkPipelineLayout morton_p_layout; VkPipeline morton_pipeline; VkPipelineLayout lbvh_main_p_layout;