Serialise dummy AS query results and ensure resolves are nop'd

This commit is contained in:
baldurk
2025-02-25 11:24:12 +00:00
parent 339927e2b4
commit 3d316dc4b2
7 changed files with 125 additions and 9 deletions
+1
View File
@@ -1149,6 +1149,7 @@ enum class VulkanChunk : uint32_t
vkCmdSetRenderingAttachmentLocationsKHR,
vkCmdSetRenderingInputAttachmentIndicesKHR,
vkCmdTraceRaysIndirect2KHR,
vkCmdWriteAccelerationStructuresPropertiesKHR,
Max,
};
+3
View File
@@ -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:
+4 -4
View File
@@ -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(
+2 -1
View File
@@ -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()
@@ -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 <typename SerialiserType>
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,
@@ -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(
+36 -1
View File
@@ -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, &copyInfo);
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});