From 02c94d38b0d9e56407af2452e7fcdc2a52dafccc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marcin=20Zaj=C4=85c?= Date: Fri, 18 Mar 2022 14:25:27 +0100 Subject: [PATCH] Modified ray tracing inactive triangle definition New definition of inactive triangle has been established so that any vertex of the triangle can now set it's x component to NaN making it inactive. Because of that test is now covering all possible configuration of vertices that can trigger this. Components: Vulkan VK-GL-CTS issue: 3568 Affects: dEQP-VK.ray_tracing_pipeline.acceleration_structures.empty* dEQP-VK.ray_query.acceleration_structures.empty* Change-Id: Ibbc4036d134b3b31590b6d2bd9d29896783aec6d --- .../vktRayQueryAccelerationStructuresTests.cpp | 121 +++++++++++++-------- .../vktRayTracingAccelerationStructuresTests.cpp | 71 +++++++++--- 2 files changed, 129 insertions(+), 63 deletions(-) diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp index a6e7c8e..0bc8c21 100644 --- a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp +++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp @@ -1196,14 +1196,16 @@ std::vector> CheckerboardSceneBu tcu::Vec3 v2(1.0, 1.0, 0.0); tcu::Vec3 v3(1.0, 0.0, 0.0); - if (testParams.emptyASCase == EmptyAccelerationStructureCase::INACTIVE_TRIANGLES) + // Different vertex configurations of a triangle whose parameter x is set to NaN during inactive_triangles tests + const bool nanConfig[4][4] = { - const auto nanValue = tcu::Float32::nan().asFloat(); - v0.x() = nanValue; - v1.x() = nanValue; - v2.x() = nanValue; - v3.x() = nanValue; - } + { true, true, true, true }, + { false, true, true, false }, + { false, false, true, false }, + { false, true, false, false }, + }; + + unsigned int geometryCount = testParams.emptyASCase == EmptyAccelerationStructureCase::INACTIVE_TRIANGLES ? 4U : 1U; if (testParams.topTestType == TTT_DIFFERENT_INSTANCES) { @@ -1309,62 +1311,84 @@ std::vector> CheckerboardSceneBu tcu::Vec3 xyz((float)x, (float)y, 0.0f); de::MovePtr bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure(); - bottomLevelAccelerationStructure->setGeometryCount(1u); + bottomLevelAccelerationStructure->setGeometryCount(geometryCount); - de::SharedPtr geometry; if (testParams.bottomTestType == BTT_TRIANGLES) { - geometry = makeRaytracedGeometry(VK_GEOMETRY_TYPE_TRIANGLES_KHR, testParams.vertexFormat, testParams.indexType, testParams.padVertices); - if (testParams.indexType == VK_INDEX_TYPE_NONE_KHR) + for (unsigned int i = 0; i < geometryCount; i++) { - if (instanceFlags == 0u) + de::SharedPtr geometry; + geometry = makeRaytracedGeometry(VK_GEOMETRY_TYPE_TRIANGLES_KHR, testParams.vertexFormat, testParams.indexType, testParams.padVertices); + + if (testParams.emptyASCase == EmptyAccelerationStructureCase::INACTIVE_TRIANGLES) { - geometry->addVertex(scale * (xyz + v0)); - geometry->addVertex(scale * (xyz + v1)); - geometry->addVertex(scale * (xyz + v2)); - geometry->addVertex(scale * (xyz + v2)); - geometry->addVertex(scale * (xyz + v1)); - geometry->addVertex(scale * (xyz + v3)); + const auto nanValue = tcu::Float32::nan().asFloat(); + + if (nanConfig[i][0]) + v0.x() = nanValue; + if (nanConfig[i][1]) + v1.x() = nanValue; + if (nanConfig[i][2]) + v2.x() = nanValue; + if (nanConfig[i][3]) + v3.x() = nanValue; } - else // Counterclockwise so the flags will be needed for the geometry to be visible. + + if (testParams.indexType == VK_INDEX_TYPE_NONE_KHR) + { + if (instanceFlags == 0u) + { + geometry->addVertex(scale * (xyz + v0)); + geometry->addVertex(scale * (xyz + v1)); + geometry->addVertex(scale * (xyz + v2)); + geometry->addVertex(scale * (xyz + v2)); + geometry->addVertex(scale * (xyz + v1)); + geometry->addVertex(scale * (xyz + v3)); + } + else // Counterclockwise so the flags will be needed for the geometry to be visible. + { + geometry->addVertex(scale * (xyz + v2)); + geometry->addVertex(scale * (xyz + v1)); + geometry->addVertex(scale * (xyz + v0)); + geometry->addVertex(scale * (xyz + v3)); + geometry->addVertex(scale * (xyz + v1)); + geometry->addVertex(scale * (xyz + v2)); + } + } + + else { - geometry->addVertex(scale * (xyz + v2)); - geometry->addVertex(scale * (xyz + v1)); geometry->addVertex(scale * (xyz + v0)); - geometry->addVertex(scale * (xyz + v3)); geometry->addVertex(scale * (xyz + v1)); geometry->addVertex(scale * (xyz + v2)); - } - } - else - { - geometry->addVertex(scale * (xyz + v0)); - geometry->addVertex(scale * (xyz + v1)); - geometry->addVertex(scale * (xyz + v2)); - geometry->addVertex(scale * (xyz + v3)); + geometry->addVertex(scale * (xyz + v3)); - if (instanceFlags == 0u) - { - geometry->addIndex(0); - geometry->addIndex(1); - geometry->addIndex(2); - geometry->addIndex(2); - geometry->addIndex(1); - geometry->addIndex(3); - } - else // Counterclockwise so the flags will be needed for the geometry to be visible. - { - geometry->addIndex(2); - geometry->addIndex(1); - geometry->addIndex(0); - geometry->addIndex(3); - geometry->addIndex(1); - geometry->addIndex(2); + if (instanceFlags == 0u) + { + geometry->addIndex(0); + geometry->addIndex(1); + geometry->addIndex(2); + geometry->addIndex(2); + geometry->addIndex(1); + geometry->addIndex(3); + } + else // Counterclockwise so the flags will be needed for the geometry to be visible. + { + geometry->addIndex(2); + geometry->addIndex(1); + geometry->addIndex(0); + geometry->addIndex(3); + geometry->addIndex(1); + geometry->addIndex(2); + } } + + bottomLevelAccelerationStructure->addGeometry(geometry); } } else // testParams.bottomTestType == BTT_AABBS { + de::SharedPtr geometry; geometry = makeRaytracedGeometry(VK_GEOMETRY_TYPE_AABBS_KHR, testParams.vertexFormat, testParams.indexType, testParams.padVertices); if (!testParams.padVertices) @@ -1388,9 +1412,10 @@ std::vector> CheckerboardSceneBu geometry->addVertex(scale * (xyz + tcu::Vec3(0.5f, 0.0f, -0.1f))); geometry->addVertex(scale * (xyz + tcu::Vec3(1.0f, 0.5f, 0.1f))); } + + bottomLevelAccelerationStructure->addGeometry(geometry); } - bottomLevelAccelerationStructure->addGeometry(geometry); result.push_back(de::SharedPtr(bottomLevelAccelerationStructure.release())); } } diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp index 99ee4bf..b6738e6 100644 --- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp +++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp @@ -672,6 +672,17 @@ public: 4, 5 }; + // Different vertex configurations of a triangle whose parameter x is set to NaN during inactive_triangles tests + const bool nanConfig[7][3] = + { + { true, true, true }, + { true, false, false }, + { false, true, false }, + { false, false, true }, + { true, true, false }, + { false, true, true }, + { true, false, true }, + }; }; std::vector > SingleTriangleConfiguration::initBottomAccelerationStructures (Context& context, @@ -685,29 +696,58 @@ std::vector > SingleTriangleConf std::vector > result; de::MovePtr bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure(); - bottomLevelAccelerationStructure->setGeometryCount(1u); - - de::SharedPtr geometry; - geometry = makeRaytracedGeometry(VK_GEOMETRY_TYPE_TRIANGLES_KHR, testParams.vertexFormat, testParams.indexType); - auto customVertices(vertices); + unsigned int geometryCount = testParams.emptyASCase == EmptyAccelerationStructureCase::INACTIVE_TRIANGLES ? 4U : 1U; if (testParams.emptyASCase == EmptyAccelerationStructureCase::INACTIVE_TRIANGLES) { - const auto nanValue = tcu::Float32::nan().asFloat(); - for (auto& vtx : customVertices) - vtx.x() = nanValue; - } + bottomLevelAccelerationStructure->setGeometryCount(geometryCount); + + de::SharedPtr geometry; + geometry = makeRaytracedGeometry(VK_GEOMETRY_TYPE_TRIANGLES_KHR, testParams.vertexFormat, testParams.indexType); + + for (unsigned int i = 0; i < geometryCount; i++) + { + auto customVertices(vertices); + + const auto nanValue = tcu::Float32::nan().asFloat(); + + if (nanConfig[i][0]) + customVertices[3].x() = nanValue; + if (nanConfig[i][1]) + customVertices[4].x() = nanValue; + if (nanConfig[i][2]) + customVertices[5].x() = nanValue; - for (auto it = begin(customVertices), eit = end(customVertices); it != eit; ++it) - geometry->addVertex(*it); + for (auto it = begin(customVertices), eit = end(customVertices); it != eit; ++it) + geometry->addVertex(*it); - if (testParams.indexType != VK_INDEX_TYPE_NONE_KHR) + if (testParams.indexType != VK_INDEX_TYPE_NONE_KHR) + { + for (auto it = begin(indices), eit = end(indices); it != eit; ++it) + geometry->addIndex(*it); + } + bottomLevelAccelerationStructure->addGeometry(geometry); + } + } + else { - for (auto it = begin(indices), eit = end(indices); it != eit; ++it) - geometry->addIndex(*it); + bottomLevelAccelerationStructure->setGeometryCount(geometryCount); + + de::SharedPtr geometry; + geometry = makeRaytracedGeometry(VK_GEOMETRY_TYPE_TRIANGLES_KHR, testParams.vertexFormat, testParams.indexType); + + for (auto it = begin(vertices), eit = end(vertices); it != eit; ++it) + geometry->addVertex(*it); + + if (testParams.indexType != VK_INDEX_TYPE_NONE_KHR) + { + for (auto it = begin(indices), eit = end(indices); it != eit; ++it) + geometry->addIndex(*it); + } + bottomLevelAccelerationStructure->addGeometry(geometry); } - bottomLevelAccelerationStructure->addGeometry(geometry); + result.push_back(de::SharedPtr(bottomLevelAccelerationStructure.release())); return result; @@ -3434,6 +3474,7 @@ void addEmptyAccelerationStructureTests (tcu::TestCaseGroup* group) for (int emptyCaseIdx = 0; emptyCaseIdx < DE_LENGTH_OF_ARRAY(emptyCases); ++emptyCaseIdx) { + TestParams testParams { buildTypes[buildTypeIdx].buildType, -- 2.7.4