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,
VkBuffer m_indirectBuffer;
VkDeviceSize m_indirectBufferOffset;
deUint32 m_indirectBufferStride;
+ bool m_usePPGeometries;
void prepareInstances (const DeviceInterface& vk,
const VkDevice device,
, m_indirectBuffer (DE_NULL)
, m_indirectBufferOffset (0)
, m_indirectBufferStride (0)
+ , m_usePPGeometries (false)
{
}
m_useArrayOfPointers = useArrayOfPointers;
}
+void TopLevelAccelerationStructureKHR::setUsePPGeometries (const bool usePPGeometries)
+{
+ m_usePPGeometries = usePPGeometries;
+}
+
void TopLevelAccelerationStructureKHR::setIndirectBuildParameters (const VkBuffer indirectBuffer,
const VkDeviceSize indirectBufferOffset,
const deUint32 indirectBufferStride)
if (structureSize == 0)
{
VkAccelerationStructureGeometryKHR accelerationStructureGeometryKHR;
+ const auto accelerationStructureGeometryKHRPtr = &accelerationStructureGeometryKHR;
std::vector<deUint32> maxPrimitiveCounts;
prepareInstances(vk, device, accelerationStructureGeometryKHR, maxPrimitiveCounts);
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;
};
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);
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;
};
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;
float rotationX;
float rotationY;
VkGeometryTypeKHR geometryType;
+ bool useArraysOfPointers;
};
class DirectionTestCase : public vkt::TestCase
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);
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;
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));
float rotationY;
VkShaderStageFlagBits testStage;
VkGeometryTypeKHR geometryType;
+ bool useArraysOfPointers;
VkShaderStageFlags usedStages (void) const
{
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);
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;
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));