From 3d316dc4b2cffa08465c26adab3daacf30fbb673 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 25 Feb 2025 11:24:12 +0000 Subject: [PATCH] Serialise dummy AS query results and ensure resolves are nop'd --- renderdoc/driver/vulkan/vk_common.h | 1 + renderdoc/driver/vulkan/vk_core.cpp | 3 + renderdoc/driver/vulkan/vk_core.h | 8 +- renderdoc/driver/vulkan/vk_stringise.cpp | 3 +- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 78 ++++++++++++++++++- .../driver/vulkan/wrappers/vk_misc_funcs.cpp | 4 +- util/test/demos/vk/vk_ray_query.cpp | 37 ++++++++- 7 files changed, 125 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 5962c7e87..1331976ae 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1149,6 +1149,7 @@ enum class VulkanChunk : uint32_t vkCmdSetRenderingAttachmentLocationsKHR, vkCmdSetRenderingInputAttachmentIndicesKHR, vkCmdTraceRaysIndirect2KHR, + vkCmdWriteAccelerationStructuresPropertiesKHR, Max, }; diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index e62a0fb70..90e9329e2 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -4362,6 +4362,9 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) VK_NULL_HANDLE, 0, NULL, NULL, NULL); case VulkanChunk::vkCmdTraceRaysIndirect2KHR: return Serialise_vkCmdTraceRaysIndirect2KHR(ser, VK_NULL_HANDLE, 0); + case VulkanChunk::vkCmdWriteAccelerationStructuresPropertiesKHR: + return Serialise_vkCmdWriteAccelerationStructuresPropertiesKHR( + ser, VK_NULL_HANDLE, 0, NULL, VK_QUERY_TYPE_MAX_ENUM, VK_NULL_HANDLE, 0); // chunks that are reserved but not yet serialised case VulkanChunk::vkResetCommandPool: diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 7c60e6b82..53ecc9e7b 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -2941,10 +2941,10 @@ public: IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdCopyMemoryToAccelerationStructureKHR, VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo); - void vkCmdWriteAccelerationStructuresPropertiesKHR( - VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, - const VkAccelerationStructureKHR *pAccelerationStructures, VkQueryType queryType, - VkQueryPool queryPool, uint32_t firstQuery); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdWriteAccelerationStructuresPropertiesKHR, + VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, + const VkAccelerationStructureKHR *pAccelerationStructures, + VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); VkResult vkCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyAccelerationStructureInfoKHR *pInfo); VkResult vkCopyAccelerationStructureToMemoryKHR( diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index e690abe0e..55cb015ee 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -28,7 +28,7 @@ template <> rdcstr DoStringise(const VulkanChunk &el) { - RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1216, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1217, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -248,6 +248,7 @@ rdcstr DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkCmdSetRenderingAttachmentLocationsKHR) STRINGISE_ENUM_CLASS(vkCmdSetRenderingInputAttachmentIndicesKHR) STRINGISE_ENUM_CLASS(vkCmdTraceRaysIndirect2KHR) + STRINGISE_ENUM_CLASS(vkCmdWriteAccelerationStructuresPropertiesKHR) STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 4a13c5cfc..4f6e9392e 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -4520,6 +4520,33 @@ bool WrappedVulkan::Serialise_vkCmdCopyQueryPoolResults( commandBuffer = VK_NULL_HANDLE; } + VulkanCreationInfo::QueryPool &qpInfo = m_CreationInfo.m_QueryPool[GetResID(queryPool)]; + + // skip AS queries as we do not serialise them + if(qpInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR || + qpInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR || + qpInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR || + qpInfo.queryType == + VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR) + { + if(commandBuffer != VK_NULL_HANDLE) + { + const bool is64bit = (flags & VK_QUERY_RESULT_64_BIT) > 0; + const bool hasAvailability = (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) > 0; + const VkDeviceSize resultSize = is64bit ? sizeof(uint64_t) : sizeof(uint32_t); + VkDeviceSize size = (queryCount - 1) * destStride + resultSize; + if(hasAvailability) + { + size += resultSize; + } + + ObjDisp(commandBuffer) + ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, size, 0); + } + + return true; + } + if(commandBuffer != VK_NULL_HANDLE) { ObjDisp(commandBuffer) @@ -8256,6 +8283,31 @@ void WrappedVulkan::vkCmdCopyMemoryToAccelerationStructureKHR( } } +template +bool WrappedVulkan::Serialise_vkCmdWriteAccelerationStructuresPropertiesKHR( + SerialiserType &ser, VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, + const VkAccelerationStructureKHR *pAccelerationStructures, VkQueryType queryType, + VkQueryPool queryPool, uint32_t firstQuery) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(accelerationStructureCount); + SERIALISE_ELEMENT_ARRAY(pAccelerationStructures, accelerationStructureCount); + SERIALISE_ELEMENT(queryType).Important(); + SERIALISE_ELEMENT(queryPool).Important(); + SERIALISE_ELEMENT(firstQuery); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); + + // don't actually replay - this is purely for user information + } + + return true; +} + void WrappedVulkan::vkCmdWriteAccelerationStructuresPropertiesKHR( VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures, VkQueryType queryType, @@ -8292,6 +8344,24 @@ void WrappedVulkan::vkCmdWriteAccelerationStructuresPropertiesKHR( ->CmdWriteAccelerationStructuresPropertiesKHR(Unwrap(commandBuffer), accelerationStructureCount, unwrappedASes, queryType, Unwrap(queryPool), firstQuery); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdWriteAccelerationStructuresPropertiesKHR); + Serialise_vkCmdWriteAccelerationStructuresPropertiesKHR( + ser, commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, + queryPool, firstQuery); + + record->AddChunk(scope.Get(&record->cmdInfo->alloc)); + + GetResourceManager()->MarkResourceFrameReferenced(GetResID(queryPool), eFrameRef_Read); + for(uint32_t i = 0; i < accelerationStructureCount; i++) + GetResourceManager()->MarkResourceFrameReferenced(GetResID(pAccelerationStructures[i]), + eFrameRef_Read); + } } // CPU-side VK_KHR_acceleration_structure calls are not supported for now @@ -8622,10 +8692,14 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyAccelerationStructureKHR, const VkCopyAccelerationStructureInfoKHR *pInfo); INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyAccelerationStructureToMemoryKHR, VkCommandBuffer commandBuffer, - const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) + const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo); INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyMemoryToAccelerationStructureKHR, VkCommandBuffer commandBuffer, - const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) + const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo); +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdWriteAccelerationStructuresPropertiesKHR, + VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, + const VkAccelerationStructureKHR *pAccelerationStructures, + VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindShadersEXT, VkCommandBuffer commandBuffer, uint32_t stageCount, const VkShaderStageFlagBits *pStages, diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 931c127e7..675627206 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -1635,7 +1635,9 @@ bool WrappedVulkan::Serialise_vkCreateQueryPool(SerialiserType &ser, VkDevice de } else if(CreateInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR || CreateInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR || - CreateInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR) + CreateInfo.queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR || + CreateInfo.queryType == + VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR) { /* ObjDisp(cmd)->CmdWriteAccelerationStructuresPropertiesKHR( diff --git a/util/test/demos/vk/vk_ray_query.cpp b/util/test/demos/vk/vk_ray_query.cpp index 7395baeeb..fb697d0b5 100644 --- a/util/test/demos/vk/vk_ray_query.cpp +++ b/util/test/demos/vk/vk_ray_query.cpp @@ -200,7 +200,8 @@ void main(void) VkAccelerationStructureBuildGeometryInfoKHR blasBuildGeometryInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR}; blasBuildGeometryInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; - blasBuildGeometryInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR; + blasBuildGeometryInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR | + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR; blasBuildGeometryInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR; blasBuildGeometryInfo.geometryCount = (uint32_t)blasGeometries.size(); blasBuildGeometryInfo.pGeometries = blasGeometries.data(); @@ -422,6 +423,20 @@ void main(void) vkh::updateDescriptorSets(device, {asWriteDescriptorSet}, {}); + AllocatedBuffer queryBuffer(this, vkh::BufferCreateInfo(1024, VK_BUFFER_USAGE_TRANSFER_DST_BIT), + VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_TO_CPU})); + + VkQueryPool compactedPool; + VkQueryPool serialisedPool; + + VkQueryPoolCreateInfo poolInfo = {VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO}; + poolInfo.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR; + poolInfo.queryCount = 8; + vkCreateQueryPool(device, &poolInfo, NULL, &compactedPool); + poolInfo.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR; + poolInfo.queryCount = 8; + vkCreateQueryPool(device, &poolInfo, NULL, &serialisedPool); + while(Running()) { { @@ -436,6 +451,26 @@ void main(void) vkCmdCopyAccelerationStructureKHR(cmd, ©Info); popMarker(cmd); + + pushMarker(cmd, "Query AS"); + + vkCmdResetQueryPool(cmd, compactedPool, 0, 8); + vkCmdResetQueryPool(cmd, serialisedPool, 0, 8); + + vkCmdWriteAccelerationStructuresPropertiesKHR( + cmd, 1, &newBlas, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, + compactedPool, 5); + vkCmdCopyQueryPoolResults(cmd, compactedPool, 5, 1, queryBuffer.buffer, 0, 8, + VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); + + vkCmdWriteAccelerationStructuresPropertiesKHR( + cmd, 1, &newBlas, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, + serialisedPool, 3); + vkCmdCopyQueryPoolResults(cmd, serialisedPool, 3, 1, queryBuffer.buffer, 16, 8, + VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); + + popMarker(cmd); + CHECK_VKR(vkEndCommandBuffer(cmd)); Submit(0, 2, {cmd});