Use arrays of pointers with non-identity matrices
authorRicardo Garcia <rgarcia@igalia.com>
Tue, 20 Apr 2021 07:05:03 +0000 (09:05 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 27 May 2021 06:39:41 +0000 (06:39 +0000)
Ray tracing tests were lacking coverage for using non-identity matrices
while instanceData.arrayOfPointers is set to true. This commit modifies
ray direction tests, notable for using non-identity matrices, so every
other case uses arrays of pointers for both instance data and the
ppGeometries build geometry info structure when creating the top level
acceleration structure.

Affected tests:
dEQP-VK.ray_tracing_pipeline.direction_length.*
dEQP-VK.ray_query.direction_length.*

Components: Vulkan
VK-GL-CTS issue: 2881

Change-Id: I6464673a3d62f2b77ae3ad428de09d30be123ea7

external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp
external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp
external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.cpp
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.cpp

index e2b9f4b..688b809 100644 (file)
@@ -1565,6 +1565,7 @@ public:
        void                                                                                                    setIndirectBuildParameters                                                      (const VkBuffer                                                                 indirectBuffer,
                                                                                                                                                                                                                                 const VkDeviceSize                                                             indirectBufferOffset,
                                                                                                                                                                                                                                 const deUint32                                                                 indirectBufferStride) override;
+       void                                                                                                    setUsePPGeometries                                                                      (const bool                                                                             usePPGeometries) override;
        VkBuildAccelerationStructureFlagsKHR                                    getBuildFlags                                                                           () const override;
 
        void                                                                                                    create                                                                                          (const DeviceInterface&                                                 vk,
@@ -1609,6 +1610,7 @@ protected:
        VkBuffer                                                                                                m_indirectBuffer;
        VkDeviceSize                                                                                    m_indirectBufferOffset;
        deUint32                                                                                                m_indirectBufferStride;
+       bool                                                                                                    m_usePPGeometries;
 
        void                                                                                                    prepareInstances                                                                        (const DeviceInterface&                                                 vk,
                                                                                                                                                                                                                                 const VkDevice                                                                 device,
@@ -1645,6 +1647,7 @@ TopLevelAccelerationStructureKHR::TopLevelAccelerationStructureKHR ()
        , m_indirectBuffer                              (DE_NULL)
        , m_indirectBufferOffset                (0)
        , m_indirectBufferStride                (0)
+       , m_usePPGeometries                             (false)
 {
 }
 
@@ -1694,6 +1697,11 @@ void TopLevelAccelerationStructureKHR::setUseArrayOfPointers (const bool useArra
        m_useArrayOfPointers = useArrayOfPointers;
 }
 
+void TopLevelAccelerationStructureKHR::setUsePPGeometries (const bool usePPGeometries)
+{
+       m_usePPGeometries = usePPGeometries;
+}
+
 void TopLevelAccelerationStructureKHR::setIndirectBuildParameters (const VkBuffer              indirectBuffer,
                                                                                                                                   const VkDeviceSize   indirectBufferOffset,
                                                                                                                                   const deUint32               indirectBufferStride)
@@ -1721,6 +1729,7 @@ void TopLevelAccelerationStructureKHR::create (const DeviceInterface&                             vk,
        if (structureSize == 0)
        {
                VkAccelerationStructureGeometryKHR              accelerationStructureGeometryKHR;
+               const auto                                                              accelerationStructureGeometryKHRPtr = &accelerationStructureGeometryKHR;
                std::vector<deUint32>                                   maxPrimitiveCounts;
                prepareInstances(vk, device, accelerationStructureGeometryKHR, maxPrimitiveCounts);
 
@@ -1734,8 +1743,8 @@ void TopLevelAccelerationStructureKHR::create (const DeviceInterface&                             vk,
                        DE_NULL,                                                                                                                                                                //  VkAccelerationStructureKHR                                                  srcAccelerationStructure;
                        DE_NULL,                                                                                                                                                                //  VkAccelerationStructureKHR                                                  dstAccelerationStructure;
                        1u,                                                                                                                                                                             //  deUint32                                                                                    geometryCount;
-                       &accelerationStructureGeometryKHR,                                                                                                              //  const VkAccelerationStructureGeometryKHR*                   pGeometries;
-                       DE_NULL,                                                                                                                                                                //  const VkAccelerationStructureGeometryKHR* const*    ppGeometries;
+                       (m_usePPGeometries ? nullptr : &accelerationStructureGeometryKHR),                                              //  const VkAccelerationStructureGeometryKHR*                   pGeometries;
+                       (m_usePPGeometries ? &accelerationStructureGeometryKHRPtr : nullptr),                                   //  const VkAccelerationStructureGeometryKHR* const*    ppGeometries;
                        makeDeviceOrHostAddressKHR(DE_NULL)                                                                                                             //  VkDeviceOrHostAddressKHR                                                    scratchData;
                };
 
@@ -1812,6 +1821,7 @@ void TopLevelAccelerationStructureKHR::build (const DeviceInterface&      vk,
        updateInstanceBuffer(vk, device, m_bottomLevelInstances, m_instanceData, m_instanceBuffer.get(), m_buildType, m_inactiveInstances);
 
        VkAccelerationStructureGeometryKHR              accelerationStructureGeometryKHR;
+       const auto                                                              accelerationStructureGeometryKHRPtr = &accelerationStructureGeometryKHR;
        std::vector<deUint32>                                   maxPrimitiveCounts;
        prepareInstances(vk, device, accelerationStructureGeometryKHR, maxPrimitiveCounts);
 
@@ -1829,8 +1839,8 @@ void TopLevelAccelerationStructureKHR::build (const DeviceInterface&      vk,
                DE_NULL,                                                                                                                                                                //  VkAccelerationStructureKHR                                                  srcAccelerationStructure;
                m_accelerationStructureKHR.get(),                                                                                                               //  VkAccelerationStructureKHR                                                  dstAccelerationStructure;
                1u,                                                                                                                                                                             //  deUint32                                                                                    geometryCount;
-               &accelerationStructureGeometryKHR,                                                                                                              //  const VkAccelerationStructureGeometryKHR*                   pGeometries;
-               DE_NULL,                                                                                                                                                                //  const VkAccelerationStructureGeometryKHR* const*    ppGeometries;
+               (m_usePPGeometries ? nullptr : &accelerationStructureGeometryKHR),                                              //  const VkAccelerationStructureGeometryKHR*                   pGeometries;
+               (m_usePPGeometries ? &accelerationStructureGeometryKHRPtr : nullptr),                                   //  const VkAccelerationStructureGeometryKHR* const*    ppGeometries;
                scratchData                                                                                                                                                             //  VkDeviceOrHostAddressKHR                                                    scratchData;
        };
 
index f88f331..8bca3d8 100644 (file)
@@ -632,6 +632,7 @@ public:
        virtual void                                                                                                    setIndirectBuildParameters                      (const VkBuffer                                                                         indirectBuffer,
                                                                                                                                                                                                                 const VkDeviceSize                                                                     indirectBufferOffset,
                                                                                                                                                                                                                 const deUint32                                                                         indirectBufferStride) = DE_NULL;
+       virtual void                                                                                                    setUsePPGeometries                                      (const bool                                                                                     usePPGeometries) = 0;
        virtual VkBuildAccelerationStructureFlagsKHR                                    getBuildFlags                                           () const = DE_NULL;
        VkDeviceSize                                                                                                    getStructureSize                                        () const;
 
index 359510b..5550c35 100644 (file)
@@ -171,6 +171,7 @@ struct TestParams
        float                                   rotationX;
        float                                   rotationY;
        VkGeometryTypeKHR               geometryType;
+       bool                                    useArraysOfPointers;
 };
 
 class DirectionTestCase : public vkt::TestCase
@@ -311,6 +312,8 @@ tcu::TestStatus DirectionTestInstance::iterate (void)
        bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
 
        de::SharedPtr<BottomLevelAccelerationStructure> blasSharedPtr (bottomLevelAS.release());
+       topLevelAS->setUseArrayOfPointers(m_params.useArraysOfPointers);
+       topLevelAS->setUsePPGeometries(m_params.useArraysOfPointers);
        topLevelAS->setInstanceCount(1);
        topLevelAS->addInstance(blasSharedPtr, transformMatrix, 0, 0xFFu, 0u, instanceFlags);
        topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
@@ -450,7 +453,8 @@ tcu::TestCaseGroup* createDirectionTests(tcu::TestContext& testCtx)
        const int kNumRandomScalingFactors      = 5;
        const int kNumRandomRotations           = 4;
 
-       de::Random rnd(1614686501u);
+       de::Random      rnd(1614686501u);
+       deUint32        caseCounter = 0u;
 
        // Scaling factors: 1.0 and some randomly-generated ones.
        std::vector<float> scalingFactors;
@@ -492,11 +496,13 @@ tcu::TestCaseGroup*       createDirectionTests(tcu::TestContext& testCtx)
 
                                TestParams params =
                                {
-                                       spaceObjects,                   //              SpaceObjects                    spaceObjects;
-                                       scale,                                  //              float                                   directionScale;
-                                       angles.first,                   //              float                                   rotationX;
-                                       angles.second,                  //              float                                   rotationY;
-                                       geometryType,                   //              VkGeometryTypeKHR               geometryType;
+                                       spaceObjects,                           //              SpaceObjects                    spaceObjects;
+                                       scale,                                          //              float                                   directionScale;
+                                       angles.first,                           //              float                                   rotationX;
+                                       angles.second,                          //              float                                   rotationY;
+                                       geometryType,                           //              VkGeometryTypeKHR               geometryType;
+                                       // Use arrays of pointers when building the TLAS in every other test.
+                                       (caseCounter++ % 2u == 0u),     //              bool                                    useArraysOfPointers;
                                };
 
                                factorGroup->addChild(new DirectionTestCase(testCtx, angleName, "", params));
index ac7da38..250b2c1 100644 (file)
@@ -172,6 +172,7 @@ struct TestParams
        float                                   rotationY;
        VkShaderStageFlagBits   testStage;
        VkGeometryTypeKHR               geometryType;
+       bool                                    useArraysOfPointers;
 
        VkShaderStageFlags usedStages (void) const
        {
@@ -393,6 +394,8 @@ tcu::TestStatus DirectionTestInstance::iterate (void)
        bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
 
        de::SharedPtr<BottomLevelAccelerationStructure> blasSharedPtr (bottomLevelAS.release());
+       topLevelAS->setUseArrayOfPointers(m_params.useArraysOfPointers);
+       topLevelAS->setUsePPGeometries(m_params.useArraysOfPointers);
        topLevelAS->setInstanceCount(1);
        topLevelAS->addInstance(blasSharedPtr, transformMatrix, 0, 0xFFu, 0u, instanceFlags);
        topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
@@ -596,7 +599,8 @@ tcu::TestCaseGroup* createDirectionTests(tcu::TestContext& testCtx)
        const int kNumRandomScalingFactors      = 5;
        const int kNumRandomRotations           = 4;
 
-       de::Random rnd(1613648516u);
+       de::Random      rnd(1613648516u);
+       deUint32        caseCounter = 0u;
 
        // Scaling factors: 1.0 and some randomly-generated ones.
        std::vector<float> scalingFactors;
@@ -647,12 +651,14 @@ tcu::TestCaseGroup*       createDirectionTests(tcu::TestContext& testCtx)
 
                                        TestParams params =
                                        {
-                                               spaceObjects,                   //              SpaceObjects                    spaceObjects;
-                                               scale,                                  //              float                                   directionScale;
-                                               angles.first,                   //              float                                   rotationX;
-                                               angles.second,                  //              float                                   rotationY;
-                                               stageData.hitStage,             //              VkShaderStageFlagBits   hitStage;
-                                               geometryType,                   //              VkGeometryTypeKHR               geometryType;
+                                               spaceObjects,                           //              SpaceObjects                    spaceObjects;
+                                               scale,                                          //              float                                   directionScale;
+                                               angles.first,                           //              float                                   rotationX;
+                                               angles.second,                          //              float                                   rotationY;
+                                               stageData.hitStage,                     //              VkShaderStageFlagBits   hitStage;
+                                               geometryType,                           //              VkGeometryTypeKHR               geometryType;
+                                               // Use arrays of pointers when building the TLAS in every other test.
+                                               (caseCounter++ % 2u == 0u),     //              bool                                    useArraysOfPointers;
                                        };
 
                                        factorGroup->addChild(new DirectionTestCase(testCtx, angleName, "", params));