From e8d12bc2b7d5e017a15a8517a3d335fa4a791032 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Sat, 9 Jul 2022 22:20:58 +0200 Subject: [PATCH] radv: Fix acceleration structure size queries From looking at the CTS, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR refers to the serialization size and not to the actual, current size. Fixes the following CTS: dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size Fixes: 5d56c2c ("radv: Add accel struct queries for maintenance1") Signed-off-by: Konstantin Seurer Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/ci/radv-navi21-aco-fails.txt | 4 -- src/amd/ci/radv-navi22-aco-fails.txt | 4 -- src/amd/ci/radv-vangogh-aco-fails.txt | 4 -- src/amd/vulkan/radv_acceleration_structure.c | 44 ++++++++++---------- 4 files changed, 21 insertions(+), 35 deletions(-) diff --git a/src/amd/ci/radv-navi21-aco-fails.txt b/src/amd/ci/radv-navi21-aco-fails.txt index fc577664064..ddf125936e8 100644 --- a/src/amd/ci/radv-navi21-aco-fails.txt +++ b/src/amd/ci/radv-navi21-aco-fails.txt @@ -17,7 +17,3 @@ dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.st dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.access_sbt_read,Crash dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.stage_all_transfer,Crash dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.stage_as_copy_bit,Crash -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size,Fail diff --git a/src/amd/ci/radv-navi22-aco-fails.txt b/src/amd/ci/radv-navi22-aco-fails.txt index 1104eb4a4fa..c4d1ce4f6ae 100644 --- a/src/amd/ci/radv-navi22-aco-fails.txt +++ b/src/amd/ci/radv-navi22-aco-fails.txt @@ -18,7 +18,3 @@ dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.st dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.access_sbt_read,Crash dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.stage_all_transfer,Crash dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.stage_as_copy_bit,Crash -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size,Fail diff --git a/src/amd/ci/radv-vangogh-aco-fails.txt b/src/amd/ci/radv-vangogh-aco-fails.txt index 6c10c89e3fe..deae8157626 100644 --- a/src/amd/ci/radv-vangogh-aco-fails.txt +++ b/src/amd/ci/radv-vangogh-aco-fails.txt @@ -21,7 +21,3 @@ dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.st dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.access_sbt_read,Crash dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.stage_all_transfer,Crash dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.gpu.stage_as_copy_bit,Crash -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size,Fail -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size,Fail diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index 0ab407ba289..6a6b8f95914 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -215,7 +215,7 @@ radv_WriteAccelerationStructuresPropertiesKHR( value = header->instance_count; break; case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: - value = accel->size; + value = header->size; break; default: unreachable("Unhandled acceleration structure query"); @@ -627,6 +627,24 @@ optimize_bvh(const char *base_ptr, uint32_t *node_ids, uint32_t node_count) free(entries); } +static void +fill_accel_struct_header(struct radv_accel_struct_header *header) +{ + /* 16 bytes per invocation, 64 invocations per workgroup */ + header->copy_dispatch_size[0] = DIV_ROUND_UP(header->compacted_size, 16 * 64); + header->copy_dispatch_size[1] = 1; + header->copy_dispatch_size[2] = 1; + + header->serialization_size = + header->compacted_size + align(sizeof(struct radv_accel_struct_serialization_header) + + sizeof(uint64_t) * header->instance_count, + 128); + + header->size = header->serialization_size - + sizeof(struct radv_accel_struct_serialization_header) - + sizeof(uint64_t) * header->instance_count; +} + static VkResult build_bvh(struct radv_device *device, const VkAccelerationStructureBuildGeometryInfoKHR *info, const VkAccelerationStructureBuildRangeInfoKHR *ranges) @@ -751,17 +769,7 @@ build_bvh(struct radv_device *device, const VkAccelerationStructureBuildGeometry header->instance_count = instance_count; header->compacted_size = (char *)ctx.curr_ptr - base_ptr; - /* 16 bytes per invocation, 64 invocations per workgroup */ - header->copy_dispatch_size[0] = DIV_ROUND_UP(header->compacted_size, 16 * 64); - header->copy_dispatch_size[1] = 1; - header->copy_dispatch_size[2] = 1; - - header->serialization_size = - header->compacted_size + align(sizeof(struct radv_accel_struct_serialization_header) + - sizeof(uint64_t) * header->instance_count, - 128); - - header->size = accel->size; + fill_accel_struct_header(header); fail: device->ws->buffer_unmap(accel->bo); @@ -2279,17 +2287,7 @@ radv_CmdBuildAccelerationStructuresKHR( header.instance_count = bvh_states[i].instance_count; header.compacted_size = bvh_states[i].node_offset; - /* 16 bytes per invocation, 64 invocations per workgroup */ - header.copy_dispatch_size[0] = DIV_ROUND_UP(header.compacted_size, 16 * 64); - header.copy_dispatch_size[1] = 1; - header.copy_dispatch_size[2] = 1; - - header.serialization_size = - header.compacted_size + align(sizeof(struct radv_accel_struct_serialization_header) + - sizeof(uint64_t) * header.instance_count, - 128); - - header.size = accel_struct->size; + fill_accel_struct_header(&header); radv_update_buffer_cp(cmd_buffer, radv_buffer_get_va(accel_struct->bo) + accel_struct->mem_offset + base,