From ea6d587baffda6f9eb71008f289b29abee040301 Mon Sep 17 00:00:00 2001 From: Matthew Netsch Date: Wed, 17 Aug 2022 19:35:23 +0000 Subject: [PATCH] Reintroduce tests for acceleration structure size query VK-GL-CTS Issue: 3836 Components: Vulkan Affects: dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.*.*.*.structure_size Change-Id: Ie6d5bb49ef25f8066c83606d8307ebadb195f1a9 --- .../vk-master-2022-03-01/ray-tracing-pipeline.txt | 24 +- .../cts/main/vk-master/ray-tracing-pipeline.txt | 24 +- .../framework/vulkan/vkRayTracingUtil.cpp | 28 +- .../framework/vulkan/vkRayTracingUtil.hpp | 4 +- .../vktRayTracingAccelerationStructuresTests.cpp | 289 ++++++++++++++++----- .../vulkancts/mustpass/main/src/test-issues.txt | 7 - .../main/vk-default/ray-tracing-pipeline.txt | 20 +- 7 files changed, 301 insertions(+), 95 deletions(-) diff --git a/android/cts/main/vk-master-2022-03-01/ray-tracing-pipeline.txt b/android/cts/main/vk-master-2022-03-01/ray-tracing-pipeline.txt index e757c43..7410b0a 100644 --- a/android/cts/main/vk-master-2022-03-01/ray-tracing-pipeline.txt +++ b/android/cts/main/vk-master-2022-03-01/ray-tracing-pipeline.txt @@ -757,14 +757,22 @@ dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.cpu_b dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.the_same_instances dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.different_instances dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.mix_same_diff_instances -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.buffer.pointer_count dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.stage_as_copy_bit dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.stage_all_transfer dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.access_sbt_read diff --git a/android/cts/main/vk-master/ray-tracing-pipeline.txt b/android/cts/main/vk-master/ray-tracing-pipeline.txt index 24b22cf..a27e85d 100644 --- a/android/cts/main/vk-master/ray-tracing-pipeline.txt +++ b/android/cts/main/vk-master/ray-tracing-pipeline.txt @@ -9613,14 +9613,22 @@ dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.cpu_b dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.the_same_instances dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.different_instances dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.mix_same_diff_instances -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.buffer.pointer_count dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.stage_as_copy_bit dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.stage_all_transfer dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.access_sbt_read diff --git a/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp b/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp index 25339a0..80901ee 100644 --- a/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp +++ b/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp @@ -794,10 +794,17 @@ void BottomLevelAccelerationStructure::addGeometry (const std::vector addGeometry(geometry); } -VkDeviceSize BottomLevelAccelerationStructure::getStructureSize() const +VkAccelerationStructureBuildSizesInfoKHR BottomLevelAccelerationStructure::getStructureBuildSizes () const { - return m_structureSize; -} + return + { + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR, // VkStructureType sType; + DE_NULL, // const void* pNext; + m_structureSize, // VkDeviceSize accelerationStructureSize; + m_updateScratchSize, // VkDeviceSize updateScratchSize; + m_buildScratchSize // VkDeviceSize buildScratchSize; + }; +}; VkDeviceSize getVertexBufferSize (const std::vector>& geometriesData) { @@ -1545,7 +1552,7 @@ void BottomLevelAccelerationStructure::createAndCopyFrom (const DeviceInterface& VkDeviceAddress deviceAddress) { DE_ASSERT(accelerationStructure != NULL); - VkDeviceSize copiedSize = compactCopySize > 0u ? compactCopySize : accelerationStructure->getStructureSize(); + VkDeviceSize copiedSize = compactCopySize > 0u ? compactCopySize : accelerationStructure->getStructureBuildSizes().accelerationStructureSize; DE_ASSERT(copiedSize != 0u); create(vk, device, allocator, copiedSize, deviceAddress); @@ -2050,9 +2057,16 @@ void TopLevelAccelerationStructure::addInstance (de::SharedPtr 0u ? compactCopySize : accelerationStructure->getStructureSize(); + VkDeviceSize copiedSize = compactCopySize > 0u ? compactCopySize : accelerationStructure->getStructureBuildSizes().accelerationStructureSize; DE_ASSERT(copiedSize != 0u); create(vk, device, allocator, copiedSize, deviceAddress); diff --git a/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp b/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp index 3569d37..7f68a6f 100644 --- a/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp +++ b/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp @@ -594,7 +594,7 @@ public: const VkDeviceSize indirectBufferOffset, const deUint32 indirectBufferStride) = DE_NULL; virtual VkBuildAccelerationStructureFlagsKHR getBuildFlags () const = DE_NULL; - VkDeviceSize getStructureSize () const; + VkAccelerationStructureBuildSizesInfoKHR getStructureBuildSizes () const; // methods specific for each acceleration structure virtual void create (const DeviceInterface& vk, @@ -750,7 +750,7 @@ public: const deUint32 indirectBufferStride) = DE_NULL; virtual void setUsePPGeometries (const bool usePPGeometries) = 0; virtual VkBuildAccelerationStructureFlagsKHR getBuildFlags () const = DE_NULL; - VkDeviceSize getStructureSize () const; + VkAccelerationStructureBuildSizesInfoKHR getStructureBuildSizes () const; // methods specific for each acceleration structure virtual void create (const DeviceInterface& vk, diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp index 8a885b4..f03ebb5 100644 --- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp +++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp @@ -48,6 +48,7 @@ #include #include #include +#include namespace vkt { @@ -3009,16 +3010,20 @@ struct QueryPoolResultsParams { enum class Type { - Size, - Pointers + StructureSize, + PointerCount } queryType; VkAccelerationStructureBuildTypeKHR buildType; - bool inVkBuffer; deUint32 blasCount; + bool inVkBuffer; + bool compacted; }; typedef de::SharedPtr QueryPoolResultsParamsPtr; +struct ASInterface; +typedef de::SharedPtr ASInterfacePtr; + class QueryPoolResultsInstance : public TestInstance { public: @@ -3042,12 +3047,67 @@ protected: const QueryPoolResultsParamsPtr m_params; }; +struct ASInterface +{ + virtual VkAccelerationStructureKHR getPtr() const = 0; + virtual VkAccelerationStructureBuildSizesInfoKHR getStructureBuildSizes() const = 0; + virtual ASInterfacePtr clone (Context& ctx, VkAccelerationStructureBuildTypeKHR buildType, const VkCommandBuffer cmd, VkDeviceSize size) = 0; +}; + +template struct ASAllocator; +template<> struct ASAllocator +{ + typedef QueryPoolResultsInstance::TlasPtr TlasPtr; + static TlasPtr alloc() { return TlasPtr(makeTopLevelAccelerationStructure().release()); } +}; +template<> struct ASAllocator +{ + typedef QueryPoolResultsInstance::BlasPtr BlasPtr; + static BlasPtr alloc() { return BlasPtr(makeBottomLevelAccelerationStructure().release()); } +}; + +template struct ASInterfaceImpl : ASInterface +{ + SharedPtrType m_source; + ASInterfaceImpl (SharedPtrType src) : m_source(src) {} + virtual VkAccelerationStructureKHR getPtr() const override + { + return *m_source->getPtr(); + } + virtual VkAccelerationStructureBuildSizesInfoKHR getStructureBuildSizes() const override + { + return m_source->getStructureBuildSizes(); + } + virtual ASInterfacePtr clone (Context& ctx, VkAccelerationStructureBuildTypeKHR buildType, const VkCommandBuffer cmd, VkDeviceSize size) override + { + const DeviceInterface& vk = ctx.getDeviceInterface(); + const VkDevice device = ctx.getDevice(); + Allocator& allocator = ctx.getDefaultAllocator(); + + auto ptr = ASAllocator::alloc(); + ptr->setBuildType(buildType); + ptr->setBuildFlags(m_source->getBuildFlags()); + ptr->create(vk, device, allocator, size); + ptr->copyFrom(vk, device, cmd, m_source.get(), false); + return de::SharedPtr(new ASInterfaceImpl(ptr)); + } +}; + +template ASInterfacePtr makeASInterfacePtr (SharedPtrType asPtr) +{ + return ASInterfacePtr(new ASInterfaceImpl(asPtr)); +} + class QueryPoolResultsSizeInstance : public QueryPoolResultsInstance { public: - QueryPoolResultsSizeInstance (Context& context, QueryPoolResultsParamsPtr params) - : QueryPoolResultsInstance(context, params) {} - TestStatus iterate (void) override; + QueryPoolResultsSizeInstance (Context& context, + QueryPoolResultsParamsPtr params) + : QueryPoolResultsInstance (context, params) {} + TestStatus iterate (void) override; + auto makeCopyOfStructures (const std::vector& structs, + const std::vector sizes) -> std::vector; + auto getStructureSizes (const std::vector& handles) -> std::vector; }; class QueryPoolResultsPointersInstance : public QueryPoolResultsInstance @@ -3087,8 +3147,8 @@ TestInstance* QueryPoolResultsCase::createInstance (Context& context) const { switch (m_params->queryType) { - case QueryPoolResultsParams::Type::Size: return new QueryPoolResultsSizeInstance(context, m_params); - case QueryPoolResultsParams::Type::Pointers: return new QueryPoolResultsPointersInstance(context, m_params); + case QueryPoolResultsParams::Type::StructureSize: return new QueryPoolResultsSizeInstance(context, m_params); + case QueryPoolResultsParams::Type::PointerCount: return new QueryPoolResultsPointersInstance(context, m_params); } TCU_THROW(InternalError, "Unknown test type"); return nullptr; @@ -3142,6 +3202,10 @@ auto QueryPoolResultsInstance::prepareBottomAccStructures (const DeviceInterface BlasPtr blas(makeBottomLevelAccelerationStructure().release()); blas->setBuildType(m_params->buildType); + if (m_params->compacted) + { + blas->setBuildFlags(VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR); + } blas->addGeometry(triangle, true, VK_GEOMETRY_OPAQUE_BIT_KHR); for (deUint32 geom = b; geom < m_params->blasCount; ++geom) { @@ -3167,6 +3231,10 @@ auto QueryPoolResultsInstance::prepareTopAccStructure (const DeviceInterface& v de::MovePtr tlas = makeTopLevelAccelerationStructure(); tlas->setBuildType(m_params->buildType); + if (m_params->compacted) + { + tlas->setBuildFlags(VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR); + } tlas->setInstanceCount(instanceCount); for (std::size_t i = 0; i < instanceCount; ++i) @@ -3179,54 +3247,66 @@ auto QueryPoolResultsInstance::prepareTopAccStructure (const DeviceInterface& v return TlasPtr(tlas.release()); } -TestStatus QueryPoolResultsSizeInstance::iterate (void) +auto QueryPoolResultsSizeInstance::getStructureSizes (const std::vector& handles) -> std::vector { - const DeviceInterface& vk = m_context.getDeviceInterface(); - const VkDevice device = m_context.getDevice(); - const deUint32 familyIndex = m_context.getUniversalQueueFamilyIndex(); - const VkQueue queue = m_context.getUniversalQueue(); - Allocator& allocator = m_context.getDefaultAllocator(); + const DeviceInterface& vk = m_context.getDeviceInterface(); + const VkDevice device = m_context.getDevice(); + const deUint32 familyIndex = m_context.getUniversalQueueFamilyIndex(); + const VkQueue queue = m_context.getUniversalQueue(); + Allocator& allocator = m_context.getDefaultAllocator(); - const Move cmdPool = createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, familyIndex); - const Move cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); + const Move cmdPool = createCommandPool(vk, device, 0, familyIndex); + const Move cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); - beginCommandBuffer(vk, *cmdBuffer, 0); - const std::vector bottoms = prepareBottomAccStructures(vk, device, allocator, *cmdBuffer); - TlasPtr tlas = prepareTopAccStructure(vk, device, allocator, *cmdBuffer, bottoms); - endCommandBuffer(vk, *cmdBuffer); - submitCommandsAndWait(vk, device, queue, *cmdBuffer); + const deUint32 queryCount = static_cast(handles.size()); - const deUint32 queryCount = m_params->blasCount + 1; - std::vector handles (queryCount); - handles[0] = *tlas.get()->getPtr(); - std::transform(bottoms.begin(), bottoms.end(), std::next(handles.begin()), [](const BlasPtr& blas){ return *blas.get()->getPtr(); }); - - Move queryPoolSize = makeQueryPool(vk, device, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR, queryCount); - Move queryPoolSerial = makeQueryPool(vk, device, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, queryCount); + Move queryPoolSize = makeQueryPool(vk, device, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR, queryCount); + Move queryPoolSerial = makeQueryPool(vk, device, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, queryCount); + Move queryPoolCompact= m_params->compacted + ? makeQueryPool(vk, device, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, queryCount) + : Move(); - de::MovePtr buffer; - std::vector sizeSizes (queryCount); - std::vector serialSizes (queryCount); + de::MovePtr buffer; + std::vector sizeSizes (queryCount, 0); + std::vector serialSizes (queryCount, 0); + std::vector compactSizes (queryCount, 0); if (m_params->inVkBuffer) { - const auto vci = makeBufferCreateInfo(2 * queryCount * sizeof(VkDeviceSize), VK_BUFFER_USAGE_TRANSFER_DST_BIT); + const auto vci = makeBufferCreateInfo((m_params->compacted ? 3 : 2) * queryCount * sizeof(VkDeviceSize), VK_BUFFER_USAGE_TRANSFER_DST_BIT); buffer = makeMovePtr(vk, device, allocator, vci, MemoryRequirement::Coherent | MemoryRequirement::HostVisible); } if (m_params->buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR) { beginCommandBuffer(vk, *cmdBuffer, 0); + vk.cmdResetQueryPool(*cmdBuffer, *queryPoolSize, 0, queryCount); vk.cmdResetQueryPool(*cmdBuffer, *queryPoolSerial, 0, queryCount); + if (m_params->compacted) + { + vk.cmdResetQueryPool(*cmdBuffer, *queryPoolCompact, 0, queryCount); + } + vk.cmdWriteAccelerationStructuresPropertiesKHR(*cmdBuffer, queryCount, handles.data(), VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR, *queryPoolSize, 0); vk.cmdWriteAccelerationStructuresPropertiesKHR(*cmdBuffer, queryCount, handles.data(), VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, *queryPoolSerial, 0); + + if (m_params->compacted) + { + vk.cmdWriteAccelerationStructuresPropertiesKHR(*cmdBuffer, queryCount, handles.data(), VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, *queryPoolCompact, 0); + } + if (m_params->inVkBuffer) { vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPoolSize, 0, queryCount, **buffer, (0 * queryCount * sizeof(VkDeviceSize)), sizeof(VkDeviceSize), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPoolSerial, 0, queryCount, **buffer, (1 * queryCount * sizeof(VkDeviceSize)), sizeof(VkDeviceSize), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); + if (m_params->compacted) + { + vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPoolCompact, 0, queryCount, **buffer, (2 * queryCount * sizeof(VkDeviceSize)), + sizeof(VkDeviceSize), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); + } } endCommandBuffer(vk, *cmdBuffer); submitCommandsAndWait(vk, device, queue, *cmdBuffer); @@ -3244,6 +3324,13 @@ TestStatus QueryPoolResultsSizeInstance::iterate (void) std::copy_n(rangeSize.first, queryCount, sizeSizes.begin()); std::copy_n(rangeSerial.first, queryCount, serialSizes.begin()); + + if (m_params->compacted) + { + auto ptrCompact = ptrSize + 2 * queryCount * sizeof(VkDeviceSize); + auto rangeCompact= QueryPoolResultsCase::makeStdBeginEnd(ptrCompact, queryCount); + std::copy_n(rangeCompact.first, queryCount, compactSizes.begin()); + } } else { @@ -3251,6 +3338,11 @@ TestStatus QueryPoolResultsSizeInstance::iterate (void) sizeSizes.data(), sizeof(VkDeviceSize), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)); VK_CHECK(vk.getQueryPoolResults(device, *queryPoolSerial, 0u, queryCount, queryCount * sizeof(VkDeviceSize), serialSizes.data(), sizeof(VkDeviceSize), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)); + if (m_params->compacted) + { + VK_CHECK(vk.getQueryPoolResults(device, *queryPoolCompact, 0u, queryCount, queryCount * sizeof(VkDeviceSize), + compactSizes.data(), sizeof(VkDeviceSize), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)); + } } } else @@ -3259,25 +3351,92 @@ TestStatus QueryPoolResultsSizeInstance::iterate (void) queryCount * sizeof(VkDeviceSize), sizeSizes.data(), sizeof(VkDeviceSize)); vk.writeAccelerationStructuresPropertiesKHR(device, queryCount, handles.data(), VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, queryCount * sizeof(VkDeviceSize), serialSizes.data(), sizeof(VkDeviceSize)); + if (m_params->compacted) + { + vk.writeAccelerationStructuresPropertiesKHR(device, queryCount, handles.data(), VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, + queryCount * sizeof(VkDeviceSize), compactSizes.data(), sizeof(VkDeviceSize)); + } + } + + sizeSizes.insert(sizeSizes.end(), serialSizes.begin(), serialSizes.end()); + sizeSizes.insert(sizeSizes.end(), compactSizes.begin(), compactSizes.end()); + + return sizeSizes; +} + +auto QueryPoolResultsSizeInstance::makeCopyOfStructures (const std::vector& structs, + const std::vector sizes) -> std::vector +{ + const DeviceInterface& vk = m_context.getDeviceInterface(); + const VkDevice device = m_context.getDevice(); + const VkQueue queue = m_context.getUniversalQueue(); + + Move cmdPool; + Move cmdBuffer; + + std::vector copies; + + if (m_params->buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR) + { + const deUint32 familyIndex = m_context.getUniversalQueueFamilyIndex(); + cmdPool = createCommandPool(vk, device, 0, familyIndex); + cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); + beginCommandBuffer(vk, *cmdBuffer, 0u); + } + + for (auto begin = structs.begin(), i = begin; i != structs.end(); ++i) + { + copies.push_back((*i)->clone(m_context, m_params->buildType, *cmdBuffer, sizes.at(std::distance(begin, i)))); + } + + if (m_params->buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR) + { + endCommandBuffer(vk, *cmdBuffer); + submitCommandsAndWait(vk, device, queue, *cmdBuffer); } + return copies; +} + +TestStatus QueryPoolResultsSizeInstance::iterate (void) +{ + const DeviceInterface& vk = m_context.getDeviceInterface(); + const VkDevice device = m_context.getDevice(); + const deUint32 familyIndex = m_context.getUniversalQueueFamilyIndex(); + const VkQueue queue = m_context.getUniversalQueue(); + Allocator& allocator = m_context.getDefaultAllocator(); + + const Move cmdPool = createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, familyIndex); + const Move cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); + + beginCommandBuffer(vk, *cmdBuffer, 0); + const std::vector bottoms = prepareBottomAccStructures(vk, device, allocator, *cmdBuffer); + TlasPtr tlas = prepareTopAccStructure(vk, device, allocator, *cmdBuffer, bottoms); + endCommandBuffer(vk, *cmdBuffer); + submitCommandsAndWait(vk, device, queue, *cmdBuffer); + + const deUint32 queryCount = m_params->blasCount + 1; + std::vector handles (queryCount); + handles[0] = *tlas->getPtr(); + std::transform(bottoms.begin(), bottoms.end(), std::next(handles.begin()), [](const BlasPtr& blas){ return *blas->getPtr(); }); + + // only the first queryCount elements are results from ACCELERATION_STRUCTURE_SIZE queries. + const std::vector sourceSizes = getStructureSizes(handles); + + std::vector sourceStructures; + sourceStructures.push_back(makeASInterfacePtr(tlas)); + for (BlasPtr blas : bottoms) sourceStructures.push_back(makeASInterfacePtr(blas)); + + std::vector copies = makeCopyOfStructures(sourceStructures, sourceSizes); + std::transform(copies.begin(), copies.end(), handles.begin(), [](const ASInterfacePtr& intf) { return intf->getPtr(); }); + + const std::vector copySizes = getStructureSizes(handles); + // verification bool pass = true; - const VkDeviceSize payloadOffset = offsetof(SerialStorage::AccelerationStructureHeader, handleArray); - for (deUint32 i = 0; pass && i < queryCount; ++i) { - const VkDeviceSize accSize = sizeSizes[i]; - const VkDeviceSize serialSize = serialSizes[i]; - if (i) - { - pass = (payloadOffset + accSize) == serialSize; - } - else // process top accelleration structure size - { - const VkDeviceSize pointersSize = bottoms.size() * sizeof(VkDeviceSize); - pass = (payloadOffset + pointersSize + accSize) == serialSize; - } + pass = sourceSizes.at(i) == copySizes.at(i); } return pass ? TestStatus::pass("") : TestStatus::fail(""); @@ -5062,29 +5221,41 @@ void addQueryPoolResultsTests (TestCaseGroup* group) std::pair const queryTypes[] { - { QueryPoolResultsParams::Type::Size, "size" }, - { QueryPoolResultsParams::Type::Pointers, "pointer_count" } + { QueryPoolResultsParams::Type::StructureSize, "structure_size" }, + { QueryPoolResultsParams::Type::PointerCount, "pointer_count" } }; + std::pair + const buildWithCompacted[] + { + { false, "no_compacted" }, + { true, "enable_compacted" } + }; auto& testContext = group->getTestContext(); for (const auto& buildType : buildTypes) { - auto buildTypeGroup = makeMovePtr(testContext, buildType.second, ""); - for (const auto& storeType : storeTypes) + auto buildTypeGroup = makeMovePtr(testContext, buildType.second, ""); + for (const auto& compacted : buildWithCompacted) { - auto storeTypeGroup = makeMovePtr(testContext, storeType.second, ""); - for (const auto& queryType : queryTypes) + auto buildCompactedGroup = makeMovePtr(testContext, compacted.second, ""); + for (const auto& storeType : storeTypes) { - QueryPoolResultsParams p; - p.buildType = buildType.first; - p.inVkBuffer = storeType.first; - p.queryType = queryType.first; - p.blasCount = 5; - - storeTypeGroup->addChild(new QueryPoolResultsCase(testContext, queryType.second, makeSharedFrom(p))); + auto storeTypeGroup = makeMovePtr(testContext, storeType.second, ""); + for (const auto& queryType : queryTypes) + { + QueryPoolResultsParams p; + p.buildType = buildType.first; + p.inVkBuffer = storeType.first; + p.queryType = queryType.first; + p.blasCount = 5; + p.compacted = compacted.first; + + storeTypeGroup->addChild(new QueryPoolResultsCase(testContext, queryType.second, makeSharedFrom(p))); + } + buildCompactedGroup->addChild(storeTypeGroup.release()); } - buildTypeGroup->addChild(storeTypeGroup.release()); + buildTypeGroup->addChild(buildCompactedGroup.release()); } group->addChild(buildTypeGroup.release()); } diff --git a/external/vulkancts/mustpass/main/src/test-issues.txt b/external/vulkancts/mustpass/main/src/test-issues.txt index 79e3770..e9af307 100644 --- a/external/vulkancts/mustpass/main/src/test-issues.txt +++ b/external/vulkancts/mustpass/main/src/test-issues.txt @@ -3,10 +3,3 @@ dEQP-VK.glsl.texture_functions.textureoffset.isampler2darray_vertex dEQP-VK.glsl.texture_functions.textureoffset.usampler2darray_vertex dEQP-VK.glsl.texture_functions.textureoffset.usampler3d_vertex dEQP-VK.glsl.texture_functions.texturegradoffset.usampler2darray_vertex - - -# Issue 3836: RT maintenance1 test expects exact VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR value -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.size -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.size \ No newline at end of file diff --git a/external/vulkancts/mustpass/main/vk-default/ray-tracing-pipeline.txt b/external/vulkancts/mustpass/main/vk-default/ray-tracing-pipeline.txt index 6b62e9d..b5e7e53 100644 --- a/external/vulkancts/mustpass/main/vk-default/ray-tracing-pipeline.txt +++ b/external/vulkancts/mustpass/main/vk-default/ray-tracing-pipeline.txt @@ -9583,10 +9583,22 @@ dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.cpu_b dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.the_same_instances dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.different_instances dEQP-VK.ray_tracing_pipeline.acceleration_structures.header_bottom_address.gpu_built.mix_same_diff_instances -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.memory.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.buffer.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.memory.pointer_count -dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.no_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.cpu.enable_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.no_compacted.buffer.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.memory.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.memory.pointer_count +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.buffer.structure_size +dEQP-VK.ray_tracing_pipeline.acceleration_structures.query_pool_results.gpu.enable_compacted.buffer.pointer_count dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.stage_as_copy_bit dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.stage_all_transfer dEQP-VK.ray_tracing_pipeline.acceleration_structures.copy_within_pipeline.cpu.access_sbt_read -- 2.7.4