mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-19 04:56:32 +00:00
Serialise dummy AS query results and ensure resolves are nop'd
This commit is contained in:
@@ -1149,6 +1149,7 @@ enum class VulkanChunk : uint32_t
|
||||
vkCmdSetRenderingAttachmentLocationsKHR,
|
||||
vkCmdSetRenderingInputAttachmentIndicesKHR,
|
||||
vkCmdTraceRaysIndirect2KHR,
|
||||
vkCmdWriteAccelerationStructuresPropertiesKHR,
|
||||
Max,
|
||||
};
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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});
|
||||
|
||||
Reference in New Issue
Block a user