Fix recursion depth requirement in complexcontrolflow
Checks recursion depth required is supported
(i.e. is lower than maxRayRecursionDepth).
Also properly specifies maxPipelineRayRecursionDepth
in VkRayTracingPipelineCreateInfoKHR.
Updates tests:
* dEQP-VK.ray_tracing_pipeline.complexcontrolflow.*.trace_ray.chit
* dEQP-VK.ray_tracing_pipeline.complexcontrolflow.*.trace_ray.miss
Affects tests:
* dEQP-VK.ray_tracing_pipeline.complexcontrolflow.*
Components: Vulkan
VK-GL-CTS issue: 2836
Change-Id: Ieb2854e3980ac729344a780dc4efaaf7a33c64a0
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp
index 176e8af..f9130ad 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp
@@ -231,7 +231,6 @@
const VkShaderStageFlags shaderStageFlags,
deUint32& shaderGroup,
deUint32& shaderGroupCount) const;
- void checkSupportInInstance (void) const;
PushConstants getPushConstants (void) const;
std::vector<deUint32> getExpectedValues (void) const;
de::MovePtr<BufferWithMemory> runTest (void);
@@ -359,6 +358,9 @@
if (0 != (m_shaders2 & VK_SHADER_STAGE_MISS_BIT_KHR)) rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR , createShaderModule(vkd, device, collection.get("miss2"), 0), m_missShaderGroup + 1);
if (0 != (m_shaders2 & VK_SHADER_STAGE_INTERSECTION_BIT_KHR)) rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR , createShaderModule(vkd, device, collection.get("sect2"), 0), m_hitShaderGroup + 1);
+ if (m_data.testOp == TEST_OP_TRACE_RAY && m_data.stage != VK_SHADER_STAGE_RAYGEN_BIT_KHR)
+ rayTracingPipeline->setMaxRecursionDepth(2);
+
Move<VkPipeline> pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout);
return pipeline;
@@ -636,10 +638,6 @@
return buffer;
}
-void RayTracingComplexControlFlowInstance::checkSupportInInstance (void) const
-{
-}
-
std::vector<deUint32> RayTracingComplexControlFlowInstance::getExpectedValues (void) const
{
const deUint32 plainSize = m_data.width * m_data.height;
@@ -972,8 +970,6 @@
tcu::TestStatus RayTracingComplexControlFlowInstance::iterate (void)
{
- checkSupportInInstance();
-
const de::MovePtr<BufferWithMemory> buffer = runTest();
const deUint32* bufferPtr = (deUint32*)buffer->getAllocation().getHostPtr();
const vector<deUint32> expected = getExpectedValues();
@@ -1041,7 +1037,7 @@
static inline const std::string getMissPassthrough (void);
static inline const std::string getHitPassthrough (void);
- CaseDef m_data;
+ CaseDef m_data;
};
ComplexControlFlowTestCase::ComplexControlFlowTestCase (tcu::TestContext& context, const char* name, const char* desc, const CaseDef data)
@@ -1057,15 +1053,26 @@
void ComplexControlFlowTestCase::checkSupport (Context& context) const
{
context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+
const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
+
if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+
const VkPhysicalDeviceRayTracingPipelineFeaturesKHR& rayTracingPipelineFeaturesKHR = context.getRayTracingPipelineFeatures();
+
if (rayTracingPipelineFeaturesKHR.rayTracingPipeline == DE_FALSE)
TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
+ const VkPhysicalDeviceRayTracingPipelinePropertiesKHR& rayTracingPipelinePropertiesKHR = context.getRayTracingPipelineProperties();
+
+ if (m_data.testOp == TEST_OP_TRACE_RAY && m_data.stage != VK_SHADER_STAGE_RAYGEN_BIT_KHR)
+ {
+ if (rayTracingPipelinePropertiesKHR.maxRayRecursionDepth < 2)
+ TCU_THROW(NotSupportedError, "rayTracingPipelinePropertiesKHR.maxRayRecursionDepth is smaller than required");
+ }
}
@@ -1685,6 +1692,15 @@
tcu::TestCaseGroup* createComplexControlFlowTests (tcu::TestContext& testCtx)
{
+ const VkShaderStageFlagBits R = VK_SHADER_STAGE_RAYGEN_BIT_KHR;
+ const VkShaderStageFlagBits A = VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
+ const VkShaderStageFlagBits C = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
+ const VkShaderStageFlagBits M = VK_SHADER_STAGE_MISS_BIT_KHR;
+ const VkShaderStageFlagBits I = VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+ const VkShaderStageFlagBits L = VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+
+ DE_UNREF(A);
+
static const struct
{
const char* name;
@@ -1701,14 +1717,15 @@
};
static const struct
{
- const char* name;
- TestOp op;
+ const char* name;
+ TestOp op;
+ VkShaderStageFlags applicableInStages;
}
testOps[]
{
- { "execute_callable", TEST_OP_EXECUTE_CALLABLE },
- { "trace_ray", TEST_OP_TRACE_RAY },
- { "report_intersection", TEST_OP_REPORT_INTERSECTION },
+ { "execute_callable", TEST_OP_EXECUTE_CALLABLE, R | C | M | L },
+ { "trace_ray", TEST_OP_TRACE_RAY, R | C | M },
+ { "report_intersection", TEST_OP_REPORT_INTERSECTION, I },
};
static const struct
{
@@ -1756,36 +1773,9 @@
height, // deUint32 height;
};
- if (testOp == TEST_OP_REPORT_INTERSECTION && testStage != VK_SHADER_STAGE_INTERSECTION_BIT_KHR)
+ if ((testOps[testOpNdx].applicableInStages & static_cast<VkShaderStageFlags>(testStage)) == 0)
continue;
- if (testOp == TEST_OP_TRACE_RAY)
- {
- switch (testStage)
- {
- case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
- case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
- case VK_SHADER_STAGE_MISS_BIT_KHR:
- break;
- default:
- continue;
- }
- }
-
- if (testOp == TEST_OP_EXECUTE_CALLABLE)
- {
- switch (testStage)
- {
- case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
- case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
- case VK_SHADER_STAGE_MISS_BIT_KHR:
- case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
- break;
- default:
- continue;
- }
- }
-
testOpGroup->addChild(new ComplexControlFlowTestCase(testCtx, testName.c_str(), "", caseDef));
}