1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * Vulkan Conformance Tests 3e5c31af7Sopenharmony_ci * ------------------------ 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright (c) 2015 Google Inc. 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci * 11e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci * limitations under the License. 18e5c31af7Sopenharmony_ci * 19e5c31af7Sopenharmony_ci *//*! 20e5c31af7Sopenharmony_ci * \file 21e5c31af7Sopenharmony_ci * \brief Vulkan Test Package 22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "vktTestPackage.hpp" 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "qpDebugOut.h" 27e5c31af7Sopenharmony_ci#include "qpInfo.h" 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_ci#include "tcuPlatform.hpp" 30e5c31af7Sopenharmony_ci#include "tcuTestCase.hpp" 31e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp" 32e5c31af7Sopenharmony_ci#include "tcuCommandLine.hpp" 33e5c31af7Sopenharmony_ci#include "tcuWaiverUtil.hpp" 34e5c31af7Sopenharmony_ci 35e5c31af7Sopenharmony_ci#include "vkPlatform.hpp" 36e5c31af7Sopenharmony_ci#include "vkPrograms.hpp" 37e5c31af7Sopenharmony_ci#include "vkBinaryRegistry.hpp" 38e5c31af7Sopenharmony_ci#include "vkShaderToSpirV.hpp" 39e5c31af7Sopenharmony_ci#include "vkDebugReportUtil.hpp" 40e5c31af7Sopenharmony_ci#include "vkQueryUtil.hpp" 41e5c31af7Sopenharmony_ci#include "vkApiVersion.hpp" 42e5c31af7Sopenharmony_ci#include "vkRenderDocUtil.hpp" 43e5c31af7Sopenharmony_ci#include "vkResourceInterface.hpp" 44e5c31af7Sopenharmony_ci 45e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp" 46e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp" 47e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 48e5c31af7Sopenharmony_ci #include "deProcess.h" 49e5c31af7Sopenharmony_ci #include "vksClient.hpp" 50e5c31af7Sopenharmony_ci #include "vksIPC.hpp" 51e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 52e5c31af7Sopenharmony_ci 53e5c31af7Sopenharmony_ci#include "vktTestGroupUtil.hpp" 54e5c31af7Sopenharmony_ci#include "vktApiTests.hpp" 55e5c31af7Sopenharmony_ci#include "vktPipelineTests.hpp" 56e5c31af7Sopenharmony_ci#include "vktBindingModelTests.hpp" 57e5c31af7Sopenharmony_ci#include "vktSpvAsmTests.hpp" 58e5c31af7Sopenharmony_ci#include "vktShaderLibrary.hpp" 59e5c31af7Sopenharmony_ci#include "vktRenderPassTests.hpp" 60e5c31af7Sopenharmony_ci#include "vktMemoryTests.hpp" 61e5c31af7Sopenharmony_ci#include "vktShaderRenderBuiltinVarTests.hpp" 62e5c31af7Sopenharmony_ci#include "vktShaderRenderDerivateTests.hpp" 63e5c31af7Sopenharmony_ci#include "vktShaderRenderDiscardTests.hpp" 64e5c31af7Sopenharmony_ci#include "vktShaderRenderIndexingTests.hpp" 65e5c31af7Sopenharmony_ci#include "vktShaderRenderInvarianceTests.hpp" 66e5c31af7Sopenharmony_ci#include "vktShaderRenderLimitTests.hpp" 67e5c31af7Sopenharmony_ci#include "vktShaderRenderLoopTests.hpp" 68e5c31af7Sopenharmony_ci#include "vktShaderRenderMatrixTests.hpp" 69e5c31af7Sopenharmony_ci#include "vktShaderRenderOperatorTests.hpp" 70e5c31af7Sopenharmony_ci#include "vktShaderRenderReturnTests.hpp" 71e5c31af7Sopenharmony_ci#include "vktShaderRenderStructTests.hpp" 72e5c31af7Sopenharmony_ci#include "vktShaderRenderSwitchTests.hpp" 73e5c31af7Sopenharmony_ci#include "vktShaderRenderTextureFunctionTests.hpp" 74e5c31af7Sopenharmony_ci#include "vktShaderRenderTextureGatherTests.hpp" 75e5c31af7Sopenharmony_ci#include "vktShaderBuiltinTests.hpp" 76e5c31af7Sopenharmony_ci#include "vktOpaqueTypeIndexingTests.hpp" 77e5c31af7Sopenharmony_ci#include "vktAtomicOperationTests.hpp" 78e5c31af7Sopenharmony_ci#include "vktUniformBlockTests.hpp" 79e5c31af7Sopenharmony_ci#include "vktDynamicStateTests.hpp" 80e5c31af7Sopenharmony_ci#include "vktSSBOLayoutTests.hpp" 81e5c31af7Sopenharmony_ci#include "vktQueryPoolTests.hpp" 82e5c31af7Sopenharmony_ci#include "vktDrawTests.hpp" 83e5c31af7Sopenharmony_ci#include "vktComputeTests.hpp" 84e5c31af7Sopenharmony_ci#include "vktConditionalTests.hpp" 85e5c31af7Sopenharmony_ci#include "vktImageTests.hpp" 86e5c31af7Sopenharmony_ci#include "vktInfoTests.hpp" 87e5c31af7Sopenharmony_ci#include "vktWsiTests.hpp" 88e5c31af7Sopenharmony_ci#include "vktSynchronizationTests.hpp" 89e5c31af7Sopenharmony_ci#include "vktSparseResourcesTests.hpp" 90e5c31af7Sopenharmony_ci#include "vktTessellationTests.hpp" 91e5c31af7Sopenharmony_ci#include "vktRasterizationTests.hpp" 92e5c31af7Sopenharmony_ci#include "vktClippingTests.hpp" 93e5c31af7Sopenharmony_ci#include "vktFragmentOperationsTests.hpp" 94e5c31af7Sopenharmony_ci#include "vktTextureTests.hpp" 95e5c31af7Sopenharmony_ci#include "vktGeometryTests.hpp" 96e5c31af7Sopenharmony_ci#include "vktRobustnessTests.hpp" 97e5c31af7Sopenharmony_ci#include "vktMultiViewTests.hpp" 98e5c31af7Sopenharmony_ci#include "vktSubgroupsTests.hpp" 99e5c31af7Sopenharmony_ci#include "vktYCbCrTests.hpp" 100e5c31af7Sopenharmony_ci#include "vktProtectedMemTests.hpp" 101e5c31af7Sopenharmony_ci#include "vktDeviceGroupTests.hpp" 102e5c31af7Sopenharmony_ci#include "vktMemoryModelTests.hpp" 103e5c31af7Sopenharmony_ci#include "vktAmberGraphicsFuzzTests.hpp" 104e5c31af7Sopenharmony_ci#include "vktAmberGlslTests.hpp" 105e5c31af7Sopenharmony_ci#include "vktAmberDepthTests.hpp" 106e5c31af7Sopenharmony_ci#include "vktImagelessFramebufferTests.hpp" 107e5c31af7Sopenharmony_ci#include "vktTransformFeedbackTests.hpp" 108e5c31af7Sopenharmony_ci#include "vktDescriptorIndexingTests.hpp" 109e5c31af7Sopenharmony_ci#include "vktImagelessFramebufferTests.hpp" 110e5c31af7Sopenharmony_ci#include "vktFragmentShaderInterlockTests.hpp" 111e5c31af7Sopenharmony_ci#include "vktShaderClockTests.hpp" 112e5c31af7Sopenharmony_ci#include "vktModifiersTests.hpp" 113e5c31af7Sopenharmony_ci#include "vktRayTracingTests.hpp" 114e5c31af7Sopenharmony_ci#include "vktRayQueryTests.hpp" 115e5c31af7Sopenharmony_ci#include "vktPostmortemTests.hpp" 116e5c31af7Sopenharmony_ci#include "vktFragmentShadingRateTests.hpp" 117e5c31af7Sopenharmony_ci#include "vktReconvergenceTests.hpp" 118e5c31af7Sopenharmony_ci#include "vktMeshShaderTests.hpp" 119e5c31af7Sopenharmony_ci#include "vktFragmentShadingBarycentricTests.hpp" 120e5c31af7Sopenharmony_ci#include "vktVideoTests.hpp" 121e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 122e5c31af7Sopenharmony_ci#include "vktSafetyCriticalTests.hpp" 123e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 124e5c31af7Sopenharmony_ci 125e5c31af7Sopenharmony_ci#include <vector> 126e5c31af7Sopenharmony_ci#include <sstream> 127e5c31af7Sopenharmony_ci#include <fstream> 128e5c31af7Sopenharmony_ci#include <thread> 129e5c31af7Sopenharmony_ci 130e5c31af7Sopenharmony_cinamespace vkt 131e5c31af7Sopenharmony_ci{ 132e5c31af7Sopenharmony_ci 133e5c31af7Sopenharmony_ciusing std::vector; 134e5c31af7Sopenharmony_ciusing de::UniquePtr; 135e5c31af7Sopenharmony_ciusing de::SharedPtr; 136e5c31af7Sopenharmony_ciusing de::MovePtr; 137e5c31af7Sopenharmony_ciusing tcu::TestLog; 138e5c31af7Sopenharmony_ci 139e5c31af7Sopenharmony_ci// TestCaseExecutor 140e5c31af7Sopenharmony_ci 141e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 142e5c31af7Sopenharmony_cistruct DetailedSubprocessTestCount 143e5c31af7Sopenharmony_ci{ 144e5c31af7Sopenharmony_ci std::string testPattern; 145e5c31af7Sopenharmony_ci int testCount; 146e5c31af7Sopenharmony_ci}; 147e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 148e5c31af7Sopenharmony_ci 149e5c31af7Sopenharmony_ciclass TestCaseExecutor : public tcu::TestCaseExecutor 150e5c31af7Sopenharmony_ci{ 151e5c31af7Sopenharmony_cipublic: 152e5c31af7Sopenharmony_ci TestCaseExecutor (tcu::TestContext& testCtx); 153e5c31af7Sopenharmony_ci ~TestCaseExecutor (void); 154e5c31af7Sopenharmony_ci 155e5c31af7Sopenharmony_ci void init (tcu::TestCase* testCase, const std::string& path) override; 156e5c31af7Sopenharmony_ci void deinit (tcu::TestCase* testCase) override; 157e5c31af7Sopenharmony_ci 158e5c31af7Sopenharmony_ci tcu::TestNode::IterateResult iterate (tcu::TestCase* testCase) override; 159e5c31af7Sopenharmony_ci 160e5c31af7Sopenharmony_ci void deinitTestPackage (tcu::TestContext& testCtx) override; 161e5c31af7Sopenharmony_ci bool usesLocalStatus () override; 162e5c31af7Sopenharmony_ci void updateGlobalStatus (tcu::TestRunStatus& status) override; 163e5c31af7Sopenharmony_ci void reportDurations (tcu::TestContext& testCtx, const std::string& packageName, const deInt64& duration, const std::map<std::string, deUint64>& groupsDurationTime) override; 164e5c31af7Sopenharmony_ci int getCurrentSubprocessCount (const std::string& casePath, int defaultSubprocessCount); 165e5c31af7Sopenharmony_ci 166e5c31af7Sopenharmony_ciprivate: 167e5c31af7Sopenharmony_ci void logUnusedShaders (tcu::TestCase* testCase); 168e5c31af7Sopenharmony_ci 169e5c31af7Sopenharmony_ci void runTestsInSubprocess (tcu::TestContext& testCtx); 170e5c31af7Sopenharmony_ci 171e5c31af7Sopenharmony_ci bool spirvVersionSupported (vk::SpirvVersion); 172e5c31af7Sopenharmony_ci 173e5c31af7Sopenharmony_ci vk::BinaryCollection m_progCollection; 174e5c31af7Sopenharmony_ci vk::BinaryRegistryReader m_prebuiltBinRegistry; 175e5c31af7Sopenharmony_ci 176e5c31af7Sopenharmony_ci const UniquePtr<vk::Library> m_library; 177e5c31af7Sopenharmony_ci MovePtr<Context> m_context; 178e5c31af7Sopenharmony_ci 179e5c31af7Sopenharmony_ci const UniquePtr<vk::RenderDocUtil> m_renderDoc; 180e5c31af7Sopenharmony_ci SharedPtr<vk::ResourceInterface> m_resourceInterface; 181e5c31af7Sopenharmony_ci vk::VkPhysicalDeviceProperties m_deviceProperties; 182e5c31af7Sopenharmony_ci tcu::WaiverUtil m_waiverMechanism; 183e5c31af7Sopenharmony_ci 184e5c31af7Sopenharmony_ci TestInstance* m_instance; //!< Current test case instance 185e5c31af7Sopenharmony_ci std::vector<std::string> m_testsForSubprocess; 186e5c31af7Sopenharmony_ci tcu::TestRunStatus m_status; 187e5c31af7Sopenharmony_ci 188e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 189e5c31af7Sopenharmony_ci int m_subprocessCount; 190e5c31af7Sopenharmony_ci 191e5c31af7Sopenharmony_ci std::unique_ptr<vksc_server::ipc::Parent> m_parentIPC; 192e5c31af7Sopenharmony_ci std::vector<DetailedSubprocessTestCount> m_detailedSubprocessTestCount; 193e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 194e5c31af7Sopenharmony_ci}; 195e5c31af7Sopenharmony_ci 196e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 197e5c31af7Sopenharmony_cistatic deBool supressedWrite (int, const char*) { return false; } 198e5c31af7Sopenharmony_cistatic deBool supressedWriteFtm (int, const char*, va_list) { return false; } 199e5c31af7Sopenharmony_cistatic deBool openWrite (int type, const char* message) { DE_UNREF(type); DE_UNREF(message); return true; } 200e5c31af7Sopenharmony_cistatic deBool openWriteFtm (int type, const char* format, va_list args) { DE_UNREF(type); DE_UNREF(format); DE_UNREF(args); return true; } 201e5c31af7Sopenharmony_cistatic void suppressStandardOutput () { qpRedirectOut(supressedWrite, supressedWriteFtm); } 202e5c31af7Sopenharmony_cistatic void restoreStandardOutput () { qpRedirectOut(openWrite, openWriteFtm); } 203e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 204e5c31af7Sopenharmony_ci 205e5c31af7Sopenharmony_cistatic MovePtr<vk::Library> createLibrary (tcu::TestContext& testCtx) 206e5c31af7Sopenharmony_ci{ 207e5c31af7Sopenharmony_ci#if (DE_OS == DE_OS_WIN32) || (DE_OS == DE_OS_UNIX) 208e5c31af7Sopenharmony_ci return MovePtr<vk::Library>(testCtx.getPlatform().getVulkanPlatform().createLibrary(vk::Platform::LIBRARY_TYPE_VULKAN, testCtx.getCommandLine().getVkLibraryPath())); 209e5c31af7Sopenharmony_ci#else 210e5c31af7Sopenharmony_ci return MovePtr<vk::Library>(testCtx.getPlatform().getVulkanPlatform().createLibrary(testCtx.getCommandLine().getVkLibraryPath())); 211e5c31af7Sopenharmony_ci#endif 212e5c31af7Sopenharmony_ci} 213e5c31af7Sopenharmony_ci 214e5c31af7Sopenharmony_cistatic vk::VkPhysicalDeviceProperties getPhysicalDeviceProperties(vkt::Context& context) 215e5c31af7Sopenharmony_ci{ 216e5c31af7Sopenharmony_ci const vk::InstanceInterface& vki = context.getInstanceInterface(); 217e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice = context.getPhysicalDevice(); 218e5c31af7Sopenharmony_ci 219e5c31af7Sopenharmony_ci vk::VkPhysicalDeviceProperties properties; 220e5c31af7Sopenharmony_ci vki.getPhysicalDeviceProperties(physicalDevice, &properties); 221e5c31af7Sopenharmony_ci return properties; 222e5c31af7Sopenharmony_ci} 223e5c31af7Sopenharmony_ci 224e5c31af7Sopenharmony_cistd::string trim (const std::string& original) 225e5c31af7Sopenharmony_ci{ 226e5c31af7Sopenharmony_ci static const std::string whiteSigns = " \t"; 227e5c31af7Sopenharmony_ci const auto beg = original.find_first_not_of(whiteSigns); 228e5c31af7Sopenharmony_ci if (beg == std::string::npos) 229e5c31af7Sopenharmony_ci return std::string(); 230e5c31af7Sopenharmony_ci const auto end = original.find_last_not_of(whiteSigns); 231e5c31af7Sopenharmony_ci return original.substr(beg, end - beg + 1); 232e5c31af7Sopenharmony_ci} 233e5c31af7Sopenharmony_ci 234e5c31af7Sopenharmony_ciTestCaseExecutor::TestCaseExecutor (tcu::TestContext& testCtx) 235e5c31af7Sopenharmony_ci : m_prebuiltBinRegistry (testCtx.getArchive(), "vulkan/prebuilt") 236e5c31af7Sopenharmony_ci , m_library (createLibrary(testCtx)) 237e5c31af7Sopenharmony_ci , m_renderDoc (testCtx.getCommandLine().isRenderDocEnabled() 238e5c31af7Sopenharmony_ci ? MovePtr<vk::RenderDocUtil>(new vk::RenderDocUtil()) 239e5c31af7Sopenharmony_ci : MovePtr<vk::RenderDocUtil>(DE_NULL)) 240e5c31af7Sopenharmony_ci#if defined CTS_USES_VULKANSC 241e5c31af7Sopenharmony_ci , m_resourceInterface (new vk::ResourceInterfaceVKSC(testCtx)) 242e5c31af7Sopenharmony_ci#else 243e5c31af7Sopenharmony_ci , m_resourceInterface (new vk::ResourceInterfaceStandard(testCtx)) 244e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 245e5c31af7Sopenharmony_ci , m_instance (DE_NULL) 246e5c31af7Sopenharmony_ci#if defined CTS_USES_VULKANSC 247e5c31af7Sopenharmony_ci , m_subprocessCount (0) 248e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 249e5c31af7Sopenharmony_ci{ 250e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 251e5c31af7Sopenharmony_ci std::vector<int> caseFraction = testCtx.getCommandLine().getCaseFraction(); 252e5c31af7Sopenharmony_ci std::string jsonFileName; 253e5c31af7Sopenharmony_ci int portOffset; 254e5c31af7Sopenharmony_ci if (caseFraction.empty()) 255e5c31af7Sopenharmony_ci { 256e5c31af7Sopenharmony_ci jsonFileName = "pipeline_data.txt"; 257e5c31af7Sopenharmony_ci portOffset = 0; 258e5c31af7Sopenharmony_ci } 259e5c31af7Sopenharmony_ci else 260e5c31af7Sopenharmony_ci { 261e5c31af7Sopenharmony_ci jsonFileName = "pipeline_data_" + std::to_string(caseFraction[0]) + ".txt"; 262e5c31af7Sopenharmony_ci portOffset = caseFraction[0]; 263e5c31af7Sopenharmony_ci } 264e5c31af7Sopenharmony_ci 265e5c31af7Sopenharmony_ci if (testCtx.getCommandLine().isSubProcess()) 266e5c31af7Sopenharmony_ci { 267e5c31af7Sopenharmony_ci std::vector<deUint8> input = vksc_server::ipc::Child{portOffset}.GetFile(jsonFileName); 268e5c31af7Sopenharmony_ci m_resourceInterface->importData(input); 269e5c31af7Sopenharmony_ci } 270e5c31af7Sopenharmony_ci else 271e5c31af7Sopenharmony_ci { 272e5c31af7Sopenharmony_ci m_parentIPC.reset( new vksc_server::ipc::Parent{portOffset} ); 273e5c31af7Sopenharmony_ci } 274e5c31af7Sopenharmony_ci 275e5c31af7Sopenharmony_ci // Load information about test tree branches that use subprocess test count other than default 276e5c31af7Sopenharmony_ci // Expected file format: 277e5c31af7Sopenharmony_ci if (!testCtx.getCommandLine().isSubProcess() && !std::string(testCtx.getCommandLine().getSubprocessConfigFile()).empty()) 278e5c31af7Sopenharmony_ci { 279e5c31af7Sopenharmony_ci std::ifstream iFile(testCtx.getCommandLine().getSubprocessConfigFile(), std::ios::in); 280e5c31af7Sopenharmony_ci if (!iFile) 281e5c31af7Sopenharmony_ci TCU_THROW(InternalError, (std::string("Missing config file defining number of tests: ") + testCtx.getCommandLine().getSubprocessConfigFile()).c_str()); 282e5c31af7Sopenharmony_ci std::string line; 283e5c31af7Sopenharmony_ci while (std::getline(iFile, line)) 284e5c31af7Sopenharmony_ci { 285e5c31af7Sopenharmony_ci if (line.empty()) 286e5c31af7Sopenharmony_ci continue; 287e5c31af7Sopenharmony_ci std::size_t pos = line.find_first_of(','); 288e5c31af7Sopenharmony_ci if (pos == std::string::npos) 289e5c31af7Sopenharmony_ci continue; 290e5c31af7Sopenharmony_ci std::string testPattern, testNumber; 291e5c31af7Sopenharmony_ci std::copy(line.begin(), line.begin() + pos, std::back_inserter(testPattern)); 292e5c31af7Sopenharmony_ci testPattern = trim(testPattern); 293e5c31af7Sopenharmony_ci std::copy(line.begin() + pos + 1, line.end(), std::back_inserter(testNumber)); 294e5c31af7Sopenharmony_ci testNumber = trim(testNumber); 295e5c31af7Sopenharmony_ci if (testPattern.empty() || testNumber.empty()) 296e5c31af7Sopenharmony_ci continue; 297e5c31af7Sopenharmony_ci std::istringstream is(testNumber); 298e5c31af7Sopenharmony_ci int testCount; 299e5c31af7Sopenharmony_ci if ((is >> testCount).fail()) 300e5c31af7Sopenharmony_ci continue; 301e5c31af7Sopenharmony_ci m_detailedSubprocessTestCount.push_back(DetailedSubprocessTestCount{ testPattern, testCount }); 302e5c31af7Sopenharmony_ci } 303e5c31af7Sopenharmony_ci // sort test patterns 304e5c31af7Sopenharmony_ci std::sort(m_detailedSubprocessTestCount.begin(), m_detailedSubprocessTestCount.end(), [](const DetailedSubprocessTestCount& lhs, const DetailedSubprocessTestCount& rhs) 305e5c31af7Sopenharmony_ci { 306e5c31af7Sopenharmony_ci return lhs.testCount < rhs.testCount; 307e5c31af7Sopenharmony_ci } ); 308e5c31af7Sopenharmony_ci } 309e5c31af7Sopenharmony_ci 310e5c31af7Sopenharmony_ci // If we are provided with remote location 311e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getServerAddress()).empty()) 312e5c31af7Sopenharmony_ci { 313e5c31af7Sopenharmony_ci // Open connection with the server dedicated for standard output 314e5c31af7Sopenharmony_ci vksc_server::OpenRemoteStandardOutput(testCtx.getCommandLine().getServerAddress()); 315e5c31af7Sopenharmony_ci restoreStandardOutput(); 316e5c31af7Sopenharmony_ci } 317e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 318e5c31af7Sopenharmony_ci 319e5c31af7Sopenharmony_ci m_context = MovePtr<Context>(new Context(testCtx, m_library->getPlatformInterface(), m_progCollection, m_resourceInterface)); 320e5c31af7Sopenharmony_ci m_deviceProperties = getPhysicalDeviceProperties(*m_context); 321e5c31af7Sopenharmony_ci 322e5c31af7Sopenharmony_ci tcu::SessionInfo sessionInfo(m_deviceProperties.vendorID, 323e5c31af7Sopenharmony_ci m_deviceProperties.deviceID, 324e5c31af7Sopenharmony_ci testCtx.getCommandLine().getInitialCmdLine()); 325e5c31af7Sopenharmony_ci m_waiverMechanism.setup(testCtx.getCommandLine().getWaiverFileName(), 326e5c31af7Sopenharmony_ci "dEQP-VK", 327e5c31af7Sopenharmony_ci m_deviceProperties.vendorID, 328e5c31af7Sopenharmony_ci m_deviceProperties.deviceID, 329e5c31af7Sopenharmony_ci sessionInfo); 330e5c31af7Sopenharmony_ci 331e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 332e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getServerAddress()).empty()) 333e5c31af7Sopenharmony_ci { 334e5c31af7Sopenharmony_ci vksc_server::AppendRequest request; 335e5c31af7Sopenharmony_ci request.fileName = testCtx.getCommandLine().getLogFileName(); 336e5c31af7Sopenharmony_ci 337e5c31af7Sopenharmony_ci std::ostringstream str; 338e5c31af7Sopenharmony_ci str << "#sessionInfo releaseName " << qpGetReleaseName() << std::endl; 339e5c31af7Sopenharmony_ci str << "#sessionInfo releaseId 0x" << std::hex << std::setw(8) << std::setfill('0') << qpGetReleaseId() << std::endl; 340e5c31af7Sopenharmony_ci str << "#sessionInfo targetName \"" << qpGetTargetName() << "\"" << std::endl; 341e5c31af7Sopenharmony_ci str << sessionInfo.get() << std::endl; 342e5c31af7Sopenharmony_ci str << "#beginSession" << std::endl; 343e5c31af7Sopenharmony_ci 344e5c31af7Sopenharmony_ci std::string output = str.str(); 345e5c31af7Sopenharmony_ci request.data.assign(output.begin(), output.end()); 346e5c31af7Sopenharmony_ci request.clear = true; 347e5c31af7Sopenharmony_ci vksc_server::StandardOutputServerSingleton()->SendRequest(request); 348e5c31af7Sopenharmony_ci } 349e5c31af7Sopenharmony_ci else 350e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 351e5c31af7Sopenharmony_ci { 352e5c31af7Sopenharmony_ci testCtx.getLog().writeSessionInfo(sessionInfo.get()); 353e5c31af7Sopenharmony_ci } 354e5c31af7Sopenharmony_ci 355e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 356e5c31af7Sopenharmony_ci m_resourceInterface->initApiVersion(m_context->getUsedApiVersion()); 357e5c31af7Sopenharmony_ci 358e5c31af7Sopenharmony_ci // Real Vulkan SC tests are performed in subprocess. 359e5c31af7Sopenharmony_ci // Tests run in main process are only used to collect data required by Vulkan SC. 360e5c31af7Sopenharmony_ci // That's why we turn off any output in main process and copy output from subprocess when subprocess tests are performed 361e5c31af7Sopenharmony_ci if (!testCtx.getCommandLine().isSubProcess()) 362e5c31af7Sopenharmony_ci { 363e5c31af7Sopenharmony_ci suppressStandardOutput(); 364e5c31af7Sopenharmony_ci m_context->getTestContext().getLog().supressLogging(true); 365e5c31af7Sopenharmony_ci } 366e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 367e5c31af7Sopenharmony_ci} 368e5c31af7Sopenharmony_ci 369e5c31af7Sopenharmony_ciTestCaseExecutor::~TestCaseExecutor (void) 370e5c31af7Sopenharmony_ci{ 371e5c31af7Sopenharmony_ci delete m_instance; 372e5c31af7Sopenharmony_ci} 373e5c31af7Sopenharmony_ci 374e5c31af7Sopenharmony_civoid TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePath) 375e5c31af7Sopenharmony_ci{ 376e5c31af7Sopenharmony_ci if (m_waiverMechanism.isOnWaiverList(casePath)) 377e5c31af7Sopenharmony_ci throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER); 378e5c31af7Sopenharmony_ci 379e5c31af7Sopenharmony_ci TestCase* vktCase = dynamic_cast<TestCase*>(testCase); 380e5c31af7Sopenharmony_ci tcu::TestLog& log = m_context->getTestContext().getLog(); 381e5c31af7Sopenharmony_ci const deUint32 usedVulkanVersion = m_context->getUsedApiVersion(); 382e5c31af7Sopenharmony_ci const vk::SpirvVersion baselineSpirvVersion = vk::getBaselineSpirvVersion(usedVulkanVersion); 383e5c31af7Sopenharmony_ci vk::ShaderBuildOptions defaultGlslBuildOptions (usedVulkanVersion, baselineSpirvVersion, 0u); 384e5c31af7Sopenharmony_ci vk::ShaderBuildOptions defaultHlslBuildOptions (usedVulkanVersion, baselineSpirvVersion, 0u); 385e5c31af7Sopenharmony_ci vk::SpirVAsmBuildOptions defaultSpirvAsmBuildOptions (usedVulkanVersion, baselineSpirvVersion); 386e5c31af7Sopenharmony_ci vk::SourceCollections sourceProgs (usedVulkanVersion, defaultGlslBuildOptions, defaultHlslBuildOptions, defaultSpirvAsmBuildOptions); 387e5c31af7Sopenharmony_ci const tcu::CommandLine& commandLine = m_context->getTestContext().getCommandLine(); 388e5c31af7Sopenharmony_ci const bool doShaderLog = commandLine.isLogDecompiledSpirvEnabled() && log.isShaderLoggingEnabled(); 389e5c31af7Sopenharmony_ci 390e5c31af7Sopenharmony_ci if (!vktCase) 391e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Test node not an instance of vkt::TestCase"); 392e5c31af7Sopenharmony_ci 393e5c31af7Sopenharmony_ci { 394e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 395e5c31af7Sopenharmony_ci int currentSubprocessCount = getCurrentSubprocessCount(casePath, m_context->getTestContext().getCommandLine().getSubprocessTestCount()); 396e5c31af7Sopenharmony_ci if (m_subprocessCount && currentSubprocessCount != m_subprocessCount) 397e5c31af7Sopenharmony_ci { 398e5c31af7Sopenharmony_ci runTestsInSubprocess(m_context->getTestContext()); 399e5c31af7Sopenharmony_ci 400e5c31af7Sopenharmony_ci // Clean up data after performing tests in subprocess and prepare system for another batch of tests 401e5c31af7Sopenharmony_ci m_testsForSubprocess.clear(); 402e5c31af7Sopenharmony_ci const vk::DeviceInterface& vkd = m_context->getDeviceInterface(); 403e5c31af7Sopenharmony_ci const vk::DeviceDriverSC* dds = dynamic_cast<const vk::DeviceDriverSC*>(&vkd); 404e5c31af7Sopenharmony_ci if (dds == DE_NULL) 405e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Undefined device driver for Vulkan SC"); 406e5c31af7Sopenharmony_ci dds->reset(); 407e5c31af7Sopenharmony_ci m_resourceInterface->resetObjects(); 408e5c31af7Sopenharmony_ci 409e5c31af7Sopenharmony_ci suppressStandardOutput(); 410e5c31af7Sopenharmony_ci m_context->getTestContext().getLog().supressLogging(true); 411e5c31af7Sopenharmony_ci } 412e5c31af7Sopenharmony_ci m_subprocessCount = currentSubprocessCount; 413e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 414e5c31af7Sopenharmony_ci m_testsForSubprocess.push_back(casePath); 415e5c31af7Sopenharmony_ci } 416e5c31af7Sopenharmony_ci 417e5c31af7Sopenharmony_ci m_resourceInterface->initTestCase(casePath); 418e5c31af7Sopenharmony_ci 419e5c31af7Sopenharmony_ci if (m_waiverMechanism.isOnWaiverList(casePath)) 420e5c31af7Sopenharmony_ci throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER); 421e5c31af7Sopenharmony_ci 422e5c31af7Sopenharmony_ci vktCase->checkSupport(*m_context); 423e5c31af7Sopenharmony_ci 424e5c31af7Sopenharmony_ci vktCase->delayedInit(); 425e5c31af7Sopenharmony_ci 426e5c31af7Sopenharmony_ci m_progCollection.clear(); 427e5c31af7Sopenharmony_ci vktCase->initPrograms(sourceProgs); 428e5c31af7Sopenharmony_ci 429e5c31af7Sopenharmony_ci for (vk::GlslSourceCollection::Iterator progIter = sourceProgs.glslSources.begin(); progIter != sourceProgs.glslSources.end(); ++progIter) 430e5c31af7Sopenharmony_ci { 431e5c31af7Sopenharmony_ci if (!spirvVersionSupported(progIter.getProgram().buildOptions.targetVersion)) 432e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available"); 433e5c31af7Sopenharmony_ci 434e5c31af7Sopenharmony_ci const vk::ProgramBinary* const binProg = m_resourceInterface->buildProgram<glu::ShaderProgramInfo, vk::GlslSourceCollection::Iterator>(casePath, progIter, m_prebuiltBinRegistry, &m_progCollection); 435e5c31af7Sopenharmony_ci 436e5c31af7Sopenharmony_ci if (doShaderLog) 437e5c31af7Sopenharmony_ci { 438e5c31af7Sopenharmony_ci try 439e5c31af7Sopenharmony_ci { 440e5c31af7Sopenharmony_ci std::ostringstream disasm; 441e5c31af7Sopenharmony_ci 442e5c31af7Sopenharmony_ci vk::disassembleProgram(*binProg, &disasm); 443e5c31af7Sopenharmony_ci 444e5c31af7Sopenharmony_ci log << vk::SpirVAsmSource(disasm.str()); 445e5c31af7Sopenharmony_ci } 446e5c31af7Sopenharmony_ci catch (const tcu::NotSupportedError& err) 447e5c31af7Sopenharmony_ci { 448e5c31af7Sopenharmony_ci log << err; 449e5c31af7Sopenharmony_ci } 450e5c31af7Sopenharmony_ci } 451e5c31af7Sopenharmony_ci } 452e5c31af7Sopenharmony_ci 453e5c31af7Sopenharmony_ci for (vk::HlslSourceCollection::Iterator progIter = sourceProgs.hlslSources.begin(); progIter != sourceProgs.hlslSources.end(); ++progIter) 454e5c31af7Sopenharmony_ci { 455e5c31af7Sopenharmony_ci if (!spirvVersionSupported(progIter.getProgram().buildOptions.targetVersion)) 456e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available"); 457e5c31af7Sopenharmony_ci 458e5c31af7Sopenharmony_ci const vk::ProgramBinary* const binProg = m_resourceInterface->buildProgram<glu::ShaderProgramInfo, vk::HlslSourceCollection::Iterator>(casePath, progIter, m_prebuiltBinRegistry, &m_progCollection); 459e5c31af7Sopenharmony_ci 460e5c31af7Sopenharmony_ci if (doShaderLog) 461e5c31af7Sopenharmony_ci { 462e5c31af7Sopenharmony_ci try 463e5c31af7Sopenharmony_ci { 464e5c31af7Sopenharmony_ci std::ostringstream disasm; 465e5c31af7Sopenharmony_ci 466e5c31af7Sopenharmony_ci vk::disassembleProgram(*binProg, &disasm); 467e5c31af7Sopenharmony_ci 468e5c31af7Sopenharmony_ci log << vk::SpirVAsmSource(disasm.str()); 469e5c31af7Sopenharmony_ci } 470e5c31af7Sopenharmony_ci catch (const tcu::NotSupportedError& err) 471e5c31af7Sopenharmony_ci { 472e5c31af7Sopenharmony_ci log << err; 473e5c31af7Sopenharmony_ci } 474e5c31af7Sopenharmony_ci } 475e5c31af7Sopenharmony_ci } 476e5c31af7Sopenharmony_ci 477e5c31af7Sopenharmony_ci for (vk::SpirVAsmCollection::Iterator asmIterator = sourceProgs.spirvAsmSources.begin(); asmIterator != sourceProgs.spirvAsmSources.end(); ++asmIterator) 478e5c31af7Sopenharmony_ci { 479e5c31af7Sopenharmony_ci if (!spirvVersionSupported(asmIterator.getProgram().buildOptions.targetVersion)) 480e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available"); 481e5c31af7Sopenharmony_ci 482e5c31af7Sopenharmony_ci m_resourceInterface->buildProgram<vk::SpirVProgramInfo, vk::SpirVAsmCollection::Iterator>(casePath, asmIterator, m_prebuiltBinRegistry, &m_progCollection); 483e5c31af7Sopenharmony_ci } 484e5c31af7Sopenharmony_ci 485e5c31af7Sopenharmony_ci if (m_renderDoc) m_renderDoc->startFrame(m_context->getInstance()); 486e5c31af7Sopenharmony_ci 487e5c31af7Sopenharmony_ci DE_ASSERT(!m_instance); 488e5c31af7Sopenharmony_ci m_instance = vktCase->createInstance(*m_context); 489e5c31af7Sopenharmony_ci m_context->resultSetOnValidation(false); 490e5c31af7Sopenharmony_ci} 491e5c31af7Sopenharmony_ci 492e5c31af7Sopenharmony_civoid TestCaseExecutor::deinit (tcu::TestCase* testCase) 493e5c31af7Sopenharmony_ci{ 494e5c31af7Sopenharmony_ci delete m_instance; 495e5c31af7Sopenharmony_ci m_instance = DE_NULL; 496e5c31af7Sopenharmony_ci 497e5c31af7Sopenharmony_ci if (m_renderDoc) m_renderDoc->endFrame(m_context->getInstance()); 498e5c31af7Sopenharmony_ci 499e5c31af7Sopenharmony_ci // Collect and report any debug messages 500e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 501e5c31af7Sopenharmony_ci if (m_context->hasDebugReportRecorder()) 502e5c31af7Sopenharmony_ci collectAndReportDebugMessages(m_context->getDebugReportRecorder(), *m_context); 503e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 504e5c31af7Sopenharmony_ci 505e5c31af7Sopenharmony_ci if (testCase != DE_NULL) 506e5c31af7Sopenharmony_ci logUnusedShaders(testCase); 507e5c31af7Sopenharmony_ci 508e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 509e5c31af7Sopenharmony_ci if (!m_context->getTestContext().getCommandLine().isSubProcess()) 510e5c31af7Sopenharmony_ci { 511e5c31af7Sopenharmony_ci int currentSubprocessCount = getCurrentSubprocessCount(m_context->getResourceInterface()->getCasePath(), m_context->getTestContext().getCommandLine().getSubprocessTestCount()); 512e5c31af7Sopenharmony_ci if (m_testsForSubprocess.size() >= std::size_t(currentSubprocessCount)) 513e5c31af7Sopenharmony_ci { 514e5c31af7Sopenharmony_ci runTestsInSubprocess(m_context->getTestContext()); 515e5c31af7Sopenharmony_ci 516e5c31af7Sopenharmony_ci // Clean up data after performing tests in subprocess and prepare system for another batch of tests 517e5c31af7Sopenharmony_ci m_testsForSubprocess.clear(); 518e5c31af7Sopenharmony_ci const vk::DeviceInterface& vkd = m_context->getDeviceInterface(); 519e5c31af7Sopenharmony_ci const vk::DeviceDriverSC* dds = dynamic_cast<const vk::DeviceDriverSC*>(&vkd); 520e5c31af7Sopenharmony_ci if (dds == DE_NULL) 521e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Undefined device driver for Vulkan SC"); 522e5c31af7Sopenharmony_ci dds->reset(); 523e5c31af7Sopenharmony_ci m_resourceInterface->resetObjects(); 524e5c31af7Sopenharmony_ci 525e5c31af7Sopenharmony_ci suppressStandardOutput(); 526e5c31af7Sopenharmony_ci m_context->getTestContext().getLog().supressLogging(true); 527e5c31af7Sopenharmony_ci } 528e5c31af7Sopenharmony_ci } 529e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 530e5c31af7Sopenharmony_ci} 531e5c31af7Sopenharmony_ci 532e5c31af7Sopenharmony_civoid TestCaseExecutor::logUnusedShaders (tcu::TestCase* testCase) 533e5c31af7Sopenharmony_ci{ 534e5c31af7Sopenharmony_ci const qpTestResult testResult = testCase->getTestContext().getTestResult(); 535e5c31af7Sopenharmony_ci 536e5c31af7Sopenharmony_ci if (testResult == QP_TEST_RESULT_PASS || testResult == QP_TEST_RESULT_QUALITY_WARNING || testResult == QP_TEST_RESULT_COMPATIBILITY_WARNING) 537e5c31af7Sopenharmony_ci { 538e5c31af7Sopenharmony_ci bool unusedShaders = false; 539e5c31af7Sopenharmony_ci 540e5c31af7Sopenharmony_ci for (vk::BinaryCollection::Iterator it = m_progCollection.begin(); it != m_progCollection.end(); ++it) 541e5c31af7Sopenharmony_ci { 542e5c31af7Sopenharmony_ci if (!it.getProgram().getUsed()) 543e5c31af7Sopenharmony_ci { 544e5c31af7Sopenharmony_ci unusedShaders = true; 545e5c31af7Sopenharmony_ci 546e5c31af7Sopenharmony_ci break; 547e5c31af7Sopenharmony_ci } 548e5c31af7Sopenharmony_ci } 549e5c31af7Sopenharmony_ci 550e5c31af7Sopenharmony_ci if (unusedShaders) 551e5c31af7Sopenharmony_ci { 552e5c31af7Sopenharmony_ci std::string message; 553e5c31af7Sopenharmony_ci 554e5c31af7Sopenharmony_ci for (vk::BinaryCollection::Iterator it = m_progCollection.begin(); it != m_progCollection.end(); ++it) 555e5c31af7Sopenharmony_ci { 556e5c31af7Sopenharmony_ci if (!it.getProgram().getUsed()) 557e5c31af7Sopenharmony_ci message += it.getName() + ","; 558e5c31af7Sopenharmony_ci } 559e5c31af7Sopenharmony_ci 560e5c31af7Sopenharmony_ci message.resize(message.size() - 1); 561e5c31af7Sopenharmony_ci 562e5c31af7Sopenharmony_ci message = std::string("Unused shaders: ") + message; 563e5c31af7Sopenharmony_ci 564e5c31af7Sopenharmony_ci m_context->getTestContext().getLog() << TestLog::Message << message << TestLog::EndMessage; 565e5c31af7Sopenharmony_ci } 566e5c31af7Sopenharmony_ci } 567e5c31af7Sopenharmony_ci} 568e5c31af7Sopenharmony_ci 569e5c31af7Sopenharmony_citcu::TestNode::IterateResult TestCaseExecutor::iterate (tcu::TestCase*) 570e5c31af7Sopenharmony_ci{ 571e5c31af7Sopenharmony_ci DE_ASSERT(m_instance); 572e5c31af7Sopenharmony_ci 573e5c31af7Sopenharmony_ci const tcu::TestStatus result = m_instance->iterate(); 574e5c31af7Sopenharmony_ci 575e5c31af7Sopenharmony_ci if (result.isComplete()) 576e5c31af7Sopenharmony_ci { 577e5c31af7Sopenharmony_ci // Vulkan tests shouldn't set result directly except when using a debug report messenger to catch validation errors. 578e5c31af7Sopenharmony_ci DE_ASSERT(m_context->getTestContext().getTestResult() == QP_TEST_RESULT_LAST || m_context->resultSetOnValidation()); 579e5c31af7Sopenharmony_ci 580e5c31af7Sopenharmony_ci // Override result if not set previously by a debug report messenger. 581e5c31af7Sopenharmony_ci if (!m_context->resultSetOnValidation()) 582e5c31af7Sopenharmony_ci m_context->getTestContext().setTestResult(result.getCode(), result.getDescription().c_str()); 583e5c31af7Sopenharmony_ci return tcu::TestNode::STOP; 584e5c31af7Sopenharmony_ci } 585e5c31af7Sopenharmony_ci else 586e5c31af7Sopenharmony_ci return tcu::TestNode::CONTINUE; 587e5c31af7Sopenharmony_ci} 588e5c31af7Sopenharmony_ci 589e5c31af7Sopenharmony_civoid TestCaseExecutor::deinitTestPackage (tcu::TestContext& testCtx) 590e5c31af7Sopenharmony_ci{ 591e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 592e5c31af7Sopenharmony_ci if (!testCtx.getCommandLine().isSubProcess()) 593e5c31af7Sopenharmony_ci { 594e5c31af7Sopenharmony_ci if (!m_testsForSubprocess.empty()) 595e5c31af7Sopenharmony_ci { 596e5c31af7Sopenharmony_ci runTestsInSubprocess(testCtx); 597e5c31af7Sopenharmony_ci 598e5c31af7Sopenharmony_ci // Clean up data after performing tests in subprocess and prepare system for another batch of tests 599e5c31af7Sopenharmony_ci m_testsForSubprocess.clear(); 600e5c31af7Sopenharmony_ci const vk::DeviceInterface& vkd = m_context->getDeviceInterface(); 601e5c31af7Sopenharmony_ci const vk::DeviceDriverSC* dds = dynamic_cast<const vk::DeviceDriverSC*>(&vkd); 602e5c31af7Sopenharmony_ci if (dds == DE_NULL) 603e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Undefined device driver for Vulkan SC"); 604e5c31af7Sopenharmony_ci dds->reset(); 605e5c31af7Sopenharmony_ci m_resourceInterface->resetObjects(); 606e5c31af7Sopenharmony_ci } 607e5c31af7Sopenharmony_ci 608e5c31af7Sopenharmony_ci // Tests are finished. Next tests ( if any ) will come from other test package and test executor 609e5c31af7Sopenharmony_ci restoreStandardOutput(); 610e5c31af7Sopenharmony_ci m_context->getTestContext().getLog().supressLogging(false); 611e5c31af7Sopenharmony_ci } 612e5c31af7Sopenharmony_ci m_resourceInterface->resetPipelineCaches(); 613e5c31af7Sopenharmony_ci#else 614e5c31af7Sopenharmony_ci DE_UNREF(testCtx); 615e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 616e5c31af7Sopenharmony_ci} 617e5c31af7Sopenharmony_ci 618e5c31af7Sopenharmony_cibool TestCaseExecutor::usesLocalStatus () 619e5c31af7Sopenharmony_ci{ 620e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 621e5c31af7Sopenharmony_ci return !m_context->getTestContext().getCommandLine().isSubProcess(); 622e5c31af7Sopenharmony_ci#else 623e5c31af7Sopenharmony_ci return false; 624e5c31af7Sopenharmony_ci#endif 625e5c31af7Sopenharmony_ci} 626e5c31af7Sopenharmony_ci 627e5c31af7Sopenharmony_civoid TestCaseExecutor::updateGlobalStatus (tcu::TestRunStatus& status) 628e5c31af7Sopenharmony_ci{ 629e5c31af7Sopenharmony_ci status.numExecuted += m_status.numExecuted; 630e5c31af7Sopenharmony_ci status.numPassed += m_status.numPassed; 631e5c31af7Sopenharmony_ci status.numNotSupported += m_status.numNotSupported; 632e5c31af7Sopenharmony_ci status.numWarnings += m_status.numWarnings; 633e5c31af7Sopenharmony_ci status.numWaived += m_status.numWaived; 634e5c31af7Sopenharmony_ci status.numFailed += m_status.numFailed; 635e5c31af7Sopenharmony_ci m_status.clear(); 636e5c31af7Sopenharmony_ci} 637e5c31af7Sopenharmony_ci 638e5c31af7Sopenharmony_civoid TestCaseExecutor::reportDurations(tcu::TestContext& testCtx, const std::string& packageName, const deInt64& duration, const std::map<std::string, deUint64>& groupsDurationTime) 639e5c31af7Sopenharmony_ci{ 640e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 641e5c31af7Sopenharmony_ci // Send it to server to append to its log 642e5c31af7Sopenharmony_ci vksc_server::AppendRequest request; 643e5c31af7Sopenharmony_ci request.fileName = testCtx.getCommandLine().getLogFileName(); 644e5c31af7Sopenharmony_ci 645e5c31af7Sopenharmony_ci std::ostringstream str; 646e5c31af7Sopenharmony_ci 647e5c31af7Sopenharmony_ci str << std::endl; 648e5c31af7Sopenharmony_ci str << "#beginTestsCasesTime" << std::endl; 649e5c31af7Sopenharmony_ci 650e5c31af7Sopenharmony_ci str << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; 651e5c31af7Sopenharmony_ci str << "<TestsCasesTime>" << std::endl; 652e5c31af7Sopenharmony_ci 653e5c31af7Sopenharmony_ci str << " <Number Name=\"" << packageName << "\" Description=\"Total tests case duration in microseconds\" Tag=\"Time\" Unit=\"us\">" << duration << "</Number>" << std::endl; 654e5c31af7Sopenharmony_ci for (std::map<std::string, deUint64>::const_iterator it = groupsDurationTime.begin(); it != groupsDurationTime.end(); ++it) 655e5c31af7Sopenharmony_ci str << " <Number Name=\"" << it->first << "\" Description=\"The test group case duration in microseconds\" Tag=\"Time\" Unit=\"us\">" << it->second << "</Number>" << std::endl; 656e5c31af7Sopenharmony_ci str << "</TestsCasesTime>" << std::endl; 657e5c31af7Sopenharmony_ci str << std::endl; 658e5c31af7Sopenharmony_ci str << "#endTestsCasesTime" << std::endl; 659e5c31af7Sopenharmony_ci str << std::endl; 660e5c31af7Sopenharmony_ci str << "#endSession" << std::endl; 661e5c31af7Sopenharmony_ci 662e5c31af7Sopenharmony_ci std::string output = str.str(); 663e5c31af7Sopenharmony_ci request.data.assign(output.begin(), output.end()); 664e5c31af7Sopenharmony_ci vksc_server::StandardOutputServerSingleton()->SendRequest(request); 665e5c31af7Sopenharmony_ci#else 666e5c31af7Sopenharmony_ci DE_UNREF(testCtx); 667e5c31af7Sopenharmony_ci DE_UNREF(packageName); 668e5c31af7Sopenharmony_ci DE_UNREF(duration); 669e5c31af7Sopenharmony_ci DE_UNREF(groupsDurationTime); 670e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 671e5c31af7Sopenharmony_ci 672e5c31af7Sopenharmony_ci} 673e5c31af7Sopenharmony_ci 674e5c31af7Sopenharmony_ciint TestCaseExecutor::getCurrentSubprocessCount(const std::string& casePath, int defaultSubprocessCount) 675e5c31af7Sopenharmony_ci{ 676e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 677e5c31af7Sopenharmony_ci for (const auto& detailed : m_detailedSubprocessTestCount) 678e5c31af7Sopenharmony_ci if (tcu::matchWildcards(detailed.testPattern.begin(), detailed.testPattern.end(), casePath.begin(), casePath.end(), false)) 679e5c31af7Sopenharmony_ci return detailed.testCount; 680e5c31af7Sopenharmony_ci#else 681e5c31af7Sopenharmony_ci DE_UNREF(casePath); 682e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 683e5c31af7Sopenharmony_ci return defaultSubprocessCount; 684e5c31af7Sopenharmony_ci} 685e5c31af7Sopenharmony_ci 686e5c31af7Sopenharmony_civoid TestCaseExecutor::runTestsInSubprocess (tcu::TestContext& testCtx) 687e5c31af7Sopenharmony_ci{ 688e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 689e5c31af7Sopenharmony_ci if (testCtx.getCommandLine().isSubProcess()) 690e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Cannot run subprocess inside subprocess : "); 691e5c31af7Sopenharmony_ci 692e5c31af7Sopenharmony_ci if (m_testsForSubprocess.empty()) 693e5c31af7Sopenharmony_ci return; 694e5c31af7Sopenharmony_ci 695e5c31af7Sopenharmony_ci std::vector<int> caseFraction = testCtx.getCommandLine().getCaseFraction(); 696e5c31af7Sopenharmony_ci std::ostringstream jsonFileName, qpaFileName, pipelineCompilerOutFileName, pipelineCompilerLogFileName, pipelineCompilerPrefix; 697e5c31af7Sopenharmony_ci if (caseFraction.empty()) 698e5c31af7Sopenharmony_ci { 699e5c31af7Sopenharmony_ci jsonFileName << "pipeline_data.txt"; 700e5c31af7Sopenharmony_ci qpaFileName << "sub.qpa"; 701e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getPipelineCompilerPath()).empty()) 702e5c31af7Sopenharmony_ci { 703e5c31af7Sopenharmony_ci pipelineCompilerOutFileName << "pipeline_cache.bin"; 704e5c31af7Sopenharmony_ci pipelineCompilerLogFileName << "compiler.log"; 705e5c31af7Sopenharmony_ci pipelineCompilerPrefix << ""; 706e5c31af7Sopenharmony_ci } 707e5c31af7Sopenharmony_ci } 708e5c31af7Sopenharmony_ci else 709e5c31af7Sopenharmony_ci { 710e5c31af7Sopenharmony_ci jsonFileName << "pipeline_data_" << caseFraction[0] << ".txt"; 711e5c31af7Sopenharmony_ci qpaFileName << "sub_" << caseFraction[0] << ".qpa"; 712e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getPipelineCompilerPath()).empty()) 713e5c31af7Sopenharmony_ci { 714e5c31af7Sopenharmony_ci pipelineCompilerOutFileName << "pipeline_cache_" << caseFraction[0] <<".bin"; 715e5c31af7Sopenharmony_ci pipelineCompilerLogFileName << "compiler_" << caseFraction[0] << ".log"; 716e5c31af7Sopenharmony_ci pipelineCompilerPrefix << "sub_" << caseFraction[0] << "_"; 717e5c31af7Sopenharmony_ci } 718e5c31af7Sopenharmony_ci } 719e5c31af7Sopenharmony_ci 720e5c31af7Sopenharmony_ci // export data collected during statistics gathering to JSON file ( VkDeviceObjectReservationCreateInfo, SPIR-V shaders, pipelines ) 721e5c31af7Sopenharmony_ci { 722e5c31af7Sopenharmony_ci m_resourceInterface->removeRedundantObjects(); 723e5c31af7Sopenharmony_ci m_resourceInterface->finalizeCommandBuffers(); 724e5c31af7Sopenharmony_ci std::vector<deUint8> data = m_resourceInterface->exportData(); 725e5c31af7Sopenharmony_ci m_parentIPC->SetFile(jsonFileName.str(), data); 726e5c31af7Sopenharmony_ci } 727e5c31af7Sopenharmony_ci 728e5c31af7Sopenharmony_ci // collect current application name, add it to new commandline with subprocess parameters 729e5c31af7Sopenharmony_ci std::string newCmdLine; 730e5c31af7Sopenharmony_ci { 731e5c31af7Sopenharmony_ci std::string appName = testCtx.getCommandLine().getApplicationName(); 732e5c31af7Sopenharmony_ci if (appName.empty()) 733e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Application name is not defined"); 734e5c31af7Sopenharmony_ci // add --deqp-subprocess option to inform deqp-vksc process that it works as slave process 735e5c31af7Sopenharmony_ci newCmdLine = appName + " --deqp-subprocess=enable --deqp-log-filename=" + qpaFileName.str(); 736e5c31af7Sopenharmony_ci 737e5c31af7Sopenharmony_ci // add offline pipeline compiler parameters if present 738e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getPipelineCompilerPath()).empty()) 739e5c31af7Sopenharmony_ci { 740e5c31af7Sopenharmony_ci newCmdLine += " --deqp-pipeline-compiler=" + std::string(testCtx.getCommandLine().getPipelineCompilerPath()); 741e5c31af7Sopenharmony_ci newCmdLine += " --deqp-pipeline-file=" + pipelineCompilerOutFileName.str(); 742e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getPipelineCompilerDataDir()).empty()) 743e5c31af7Sopenharmony_ci newCmdLine += " --deqp-pipeline-dir=" + std::string(testCtx.getCommandLine().getPipelineCompilerDataDir()); 744e5c31af7Sopenharmony_ci newCmdLine += " --deqp-pipeline-logfile=" + pipelineCompilerLogFileName.str(); 745e5c31af7Sopenharmony_ci if(!pipelineCompilerPrefix.str().empty()) 746e5c31af7Sopenharmony_ci newCmdLine += " --deqp-pipeline-prefix=" + pipelineCompilerPrefix.str(); 747e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getPipelineCompilerArgs()).empty()) 748e5c31af7Sopenharmony_ci newCmdLine += " --deqp-pipeline-args=\"" + std::string( testCtx.getCommandLine().getPipelineCompilerArgs() ) + "\""; 749e5c31af7Sopenharmony_ci } 750e5c31af7Sopenharmony_ci } 751e5c31af7Sopenharmony_ci 752e5c31af7Sopenharmony_ci // collect parameters, remove parameters associated with case filter and case fraction. We will provide our own case list 753e5c31af7Sopenharmony_ci { 754e5c31af7Sopenharmony_ci std::string originalCmdLine = testCtx.getCommandLine().getInitialCmdLine(); 755e5c31af7Sopenharmony_ci 756e5c31af7Sopenharmony_ci // brave ( but working ) assumption that each CTS parameter starts with "--deqp" 757e5c31af7Sopenharmony_ci 758e5c31af7Sopenharmony_ci std::string paramStr ("--deqp"); 759e5c31af7Sopenharmony_ci std::vector<std::string> skipElements = 760e5c31af7Sopenharmony_ci { 761e5c31af7Sopenharmony_ci "--deqp-case", 762e5c31af7Sopenharmony_ci "--deqp-stdin-caselist", 763e5c31af7Sopenharmony_ci "--deqp-log-filename", 764e5c31af7Sopenharmony_ci "--deqp-pipeline-compiler", 765e5c31af7Sopenharmony_ci "--deqp-pipeline-dir", 766e5c31af7Sopenharmony_ci "--deqp-pipeline-args", 767e5c31af7Sopenharmony_ci "--deqp-pipeline-file", 768e5c31af7Sopenharmony_ci "--deqp-pipeline-logfile", 769e5c31af7Sopenharmony_ci "--deqp-pipeline-prefix" 770e5c31af7Sopenharmony_ci }; 771e5c31af7Sopenharmony_ci 772e5c31af7Sopenharmony_ci std::size_t pos = 0; 773e5c31af7Sopenharmony_ci std::vector<std::size_t> argPos; 774e5c31af7Sopenharmony_ci while ((pos = originalCmdLine.find(paramStr, pos)) != std::string::npos) 775e5c31af7Sopenharmony_ci argPos.push_back(pos++); 776e5c31af7Sopenharmony_ci if (!argPos.empty()) 777e5c31af7Sopenharmony_ci argPos.push_back(originalCmdLine.size()); 778e5c31af7Sopenharmony_ci 779e5c31af7Sopenharmony_ci std::vector<std::string> args; 780e5c31af7Sopenharmony_ci for (std::size_t i = 0; i < argPos.size()-1; ++i) 781e5c31af7Sopenharmony_ci { 782e5c31af7Sopenharmony_ci std::string s = originalCmdLine.substr(argPos[i], argPos[i + 1] - argPos[i]); 783e5c31af7Sopenharmony_ci std::size_t found = s.find_last_not_of(' '); 784e5c31af7Sopenharmony_ci if (found != std::string::npos) 785e5c31af7Sopenharmony_ci { 786e5c31af7Sopenharmony_ci s.erase(found + 1); 787e5c31af7Sopenharmony_ci args.push_back(s); 788e5c31af7Sopenharmony_ci } 789e5c31af7Sopenharmony_ci } 790e5c31af7Sopenharmony_ci for (std::size_t i = 0; i < args.size(); ++i) 791e5c31af7Sopenharmony_ci { 792e5c31af7Sopenharmony_ci bool skipElement = false; 793e5c31af7Sopenharmony_ci for (const auto& elem : skipElements) 794e5c31af7Sopenharmony_ci if (args[i].find(elem) == 0) 795e5c31af7Sopenharmony_ci { 796e5c31af7Sopenharmony_ci skipElement = true; 797e5c31af7Sopenharmony_ci break; 798e5c31af7Sopenharmony_ci } 799e5c31af7Sopenharmony_ci if (skipElement) 800e5c31af7Sopenharmony_ci continue; 801e5c31af7Sopenharmony_ci newCmdLine = newCmdLine + " " + args[i]; 802e5c31af7Sopenharmony_ci } 803e5c31af7Sopenharmony_ci } 804e5c31af7Sopenharmony_ci 805e5c31af7Sopenharmony_ci // create --deqp-case list from tests collected in m_testsForSubprocess 806e5c31af7Sopenharmony_ci std::string subprocessTestList; 807e5c31af7Sopenharmony_ci for (auto it = begin(m_testsForSubprocess); it != end(m_testsForSubprocess); ++it) 808e5c31af7Sopenharmony_ci { 809e5c31af7Sopenharmony_ci auto nit = it; ++nit; 810e5c31af7Sopenharmony_ci 811e5c31af7Sopenharmony_ci subprocessTestList += *it; 812e5c31af7Sopenharmony_ci if (nit != end(m_testsForSubprocess)) 813e5c31af7Sopenharmony_ci subprocessTestList += "\n"; 814e5c31af7Sopenharmony_ci } 815e5c31af7Sopenharmony_ci 816e5c31af7Sopenharmony_ci std::string caseListName = "subcaselist" + (caseFraction.empty() ? std::string("") : de::toString(caseFraction[0])) + ".txt"; 817e5c31af7Sopenharmony_ci 818e5c31af7Sopenharmony_ci deFile* exportFile = deFile_create(caseListName.c_str(), DE_FILEMODE_CREATE | DE_FILEMODE_OPEN | DE_FILEMODE_WRITE | DE_FILEMODE_TRUNCATE); 819e5c31af7Sopenharmony_ci deInt64 numWritten = 0; 820e5c31af7Sopenharmony_ci deFile_write(exportFile, subprocessTestList.c_str(), subprocessTestList.size(), &numWritten); 821e5c31af7Sopenharmony_ci deFile_destroy(exportFile); 822e5c31af7Sopenharmony_ci newCmdLine = newCmdLine + " --deqp-caselist-file=" + caseListName; 823e5c31af7Sopenharmony_ci 824e5c31af7Sopenharmony_ci // restore cout and cerr 825e5c31af7Sopenharmony_ci restoreStandardOutput(); 826e5c31af7Sopenharmony_ci 827e5c31af7Sopenharmony_ci // create subprocess which will perform real tests 828e5c31af7Sopenharmony_ci std::string subProcessExitCodeInfo; 829e5c31af7Sopenharmony_ci { 830e5c31af7Sopenharmony_ci deProcess* process = deProcess_create(); 831e5c31af7Sopenharmony_ci if (deProcess_start(process, newCmdLine.c_str(), ".") != DE_TRUE) 832e5c31af7Sopenharmony_ci { 833e5c31af7Sopenharmony_ci std::string err = deProcess_getLastError(process); 834e5c31af7Sopenharmony_ci deProcess_destroy(process); 835e5c31af7Sopenharmony_ci process = DE_NULL; 836e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Error while running subprocess : " + err); 837e5c31af7Sopenharmony_ci } 838e5c31af7Sopenharmony_ci std::string whole; 839e5c31af7Sopenharmony_ci whole.reserve(1024 * 4); 840e5c31af7Sopenharmony_ci 841e5c31af7Sopenharmony_ci // create a separate thread that captures std::err output 842e5c31af7Sopenharmony_ci de::MovePtr<std::thread> errThread(new std::thread([&process] 843e5c31af7Sopenharmony_ci { 844e5c31af7Sopenharmony_ci deFile* subErr = deProcess_getStdErr(process); 845e5c31af7Sopenharmony_ci char errBuffer[128] = { 0 }; 846e5c31af7Sopenharmony_ci deInt64 errNumRead = 0; 847e5c31af7Sopenharmony_ci while (deFile_read(subErr, errBuffer, sizeof(errBuffer) - 1, &errNumRead) == DE_FILERESULT_SUCCESS) 848e5c31af7Sopenharmony_ci { 849e5c31af7Sopenharmony_ci errBuffer[errNumRead] = 0; 850e5c31af7Sopenharmony_ci } 851e5c31af7Sopenharmony_ci })); 852e5c31af7Sopenharmony_ci 853e5c31af7Sopenharmony_ci deFile* subOutput = deProcess_getStdOut(process); 854e5c31af7Sopenharmony_ci char outBuffer[128] = { 0 }; 855e5c31af7Sopenharmony_ci deInt64 numRead = 0; 856e5c31af7Sopenharmony_ci while (deFile_read(subOutput, outBuffer, sizeof(outBuffer) - 1, &numRead) == DE_FILERESULT_SUCCESS) 857e5c31af7Sopenharmony_ci { 858e5c31af7Sopenharmony_ci outBuffer[numRead] = 0; 859e5c31af7Sopenharmony_ci qpPrint(outBuffer); 860e5c31af7Sopenharmony_ci whole += outBuffer; 861e5c31af7Sopenharmony_ci } 862e5c31af7Sopenharmony_ci errThread->join(); 863e5c31af7Sopenharmony_ci if (deProcess_waitForFinish(process)) 864e5c31af7Sopenharmony_ci { 865e5c31af7Sopenharmony_ci const int exitCode = deProcess_getExitCode(process); 866e5c31af7Sopenharmony_ci std::stringstream s; 867e5c31af7Sopenharmony_ci 868e5c31af7Sopenharmony_ci s << " Subprocess failed with exit code " << exitCode << "(" << std::hex << exitCode << ")"; 869e5c31af7Sopenharmony_ci 870e5c31af7Sopenharmony_ci subProcessExitCodeInfo = s.str(); 871e5c31af7Sopenharmony_ci } 872e5c31af7Sopenharmony_ci deProcess_destroy(process); 873e5c31af7Sopenharmony_ci 874e5c31af7Sopenharmony_ci vksc_server::RemoteWrite(0, whole.c_str()); 875e5c31af7Sopenharmony_ci } 876e5c31af7Sopenharmony_ci 877e5c31af7Sopenharmony_ci // copy test information from sub.qpa to main log 878e5c31af7Sopenharmony_ci { 879e5c31af7Sopenharmony_ci std::ifstream subQpa(qpaFileName.str(), std::ios::binary); 880e5c31af7Sopenharmony_ci std::string subQpaText{std::istreambuf_iterator<char>(subQpa), 881e5c31af7Sopenharmony_ci std::istreambuf_iterator<char>()}; 882e5c31af7Sopenharmony_ci { 883e5c31af7Sopenharmony_ci std::string beginText ("#beginTestCaseResult"); 884e5c31af7Sopenharmony_ci std::string endText ("#endTestCaseResult"); 885e5c31af7Sopenharmony_ci std::size_t beginPos = subQpaText.find(beginText); 886e5c31af7Sopenharmony_ci std::size_t endPos = subQpaText.rfind(endText); 887e5c31af7Sopenharmony_ci if (beginPos == std::string::npos || endPos == std::string::npos) 888e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Couldn't match tags from " + qpaFileName.str() + subProcessExitCodeInfo); 889e5c31af7Sopenharmony_ci 890e5c31af7Sopenharmony_ci std::string subQpaCopy = "\n" + std::string(subQpaText.begin() + beginPos, subQpaText.begin() + endPos + endText.size()) + "\n"; 891e5c31af7Sopenharmony_ci 892e5c31af7Sopenharmony_ci if (!std::string(testCtx.getCommandLine().getServerAddress()).empty()) 893e5c31af7Sopenharmony_ci { 894e5c31af7Sopenharmony_ci // Send it to server to append to its log 895e5c31af7Sopenharmony_ci vksc_server::AppendRequest request; 896e5c31af7Sopenharmony_ci request.fileName = testCtx.getCommandLine().getLogFileName(); 897e5c31af7Sopenharmony_ci request.data.assign(subQpaCopy.begin(), subQpaCopy.end()); 898e5c31af7Sopenharmony_ci vksc_server::StandardOutputServerSingleton()->SendRequest(request); 899e5c31af7Sopenharmony_ci } 900e5c31af7Sopenharmony_ci else 901e5c31af7Sopenharmony_ci { 902e5c31af7Sopenharmony_ci // Write it to parent's log 903e5c31af7Sopenharmony_ci try 904e5c31af7Sopenharmony_ci { 905e5c31af7Sopenharmony_ci testCtx.getLog().supressLogging(false); 906e5c31af7Sopenharmony_ci testCtx.getLog().writeRaw(subQpaCopy.c_str()); 907e5c31af7Sopenharmony_ci } 908e5c31af7Sopenharmony_ci catch(...) 909e5c31af7Sopenharmony_ci { 910e5c31af7Sopenharmony_ci testCtx.getLog().supressLogging(true); 911e5c31af7Sopenharmony_ci throw; 912e5c31af7Sopenharmony_ci } 913e5c31af7Sopenharmony_ci testCtx.getLog().supressLogging(true); 914e5c31af7Sopenharmony_ci } 915e5c31af7Sopenharmony_ci } 916e5c31af7Sopenharmony_ci 917e5c31af7Sopenharmony_ci { 918e5c31af7Sopenharmony_ci std::string beginStat ("#SubProcessStatus"); 919e5c31af7Sopenharmony_ci std::size_t beginPos = subQpaText.find(beginStat); 920e5c31af7Sopenharmony_ci if (beginPos == std::string::npos) 921e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Couldn't match #SubProcessStatus tag from " + qpaFileName.str() + subProcessExitCodeInfo); 922e5c31af7Sopenharmony_ci 923e5c31af7Sopenharmony_ci std::string subQpaStat (subQpaText.begin() + beginPos + beginStat.size(), subQpaText.end()); 924e5c31af7Sopenharmony_ci 925e5c31af7Sopenharmony_ci std::istringstream str(subQpaStat); 926e5c31af7Sopenharmony_ci int numExecuted, numPassed, numFailed, numNotSupported, numWarnings, numWaived; 927e5c31af7Sopenharmony_ci str >> numExecuted >> numPassed >> numFailed >> numNotSupported >> numWarnings >> numWaived; 928e5c31af7Sopenharmony_ci 929e5c31af7Sopenharmony_ci m_status.numExecuted += numExecuted; 930e5c31af7Sopenharmony_ci m_status.numPassed += numPassed; 931e5c31af7Sopenharmony_ci m_status.numNotSupported += numNotSupported; 932e5c31af7Sopenharmony_ci m_status.numWarnings += numWarnings; 933e5c31af7Sopenharmony_ci m_status.numWaived += numWaived; 934e5c31af7Sopenharmony_ci m_status.numFailed += numFailed; 935e5c31af7Sopenharmony_ci } 936e5c31af7Sopenharmony_ci 937e5c31af7Sopenharmony_ci deDeleteFile(qpaFileName.str().c_str()); 938e5c31af7Sopenharmony_ci } 939e5c31af7Sopenharmony_ci#else 940e5c31af7Sopenharmony_ci DE_UNREF(testCtx); 941e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 942e5c31af7Sopenharmony_ci} 943e5c31af7Sopenharmony_ci 944e5c31af7Sopenharmony_cibool TestCaseExecutor::spirvVersionSupported (vk::SpirvVersion spirvVersion) 945e5c31af7Sopenharmony_ci{ 946e5c31af7Sopenharmony_ci if (spirvVersion <= vk::getMaxSpirvVersionForVulkan(m_context->getUsedApiVersion())) 947e5c31af7Sopenharmony_ci return true; 948e5c31af7Sopenharmony_ci 949e5c31af7Sopenharmony_ci if (spirvVersion <= vk::SPIRV_VERSION_1_4) 950e5c31af7Sopenharmony_ci return m_context->isDeviceFunctionalitySupported("VK_KHR_spirv_1_4"); 951e5c31af7Sopenharmony_ci 952e5c31af7Sopenharmony_ci return false; 953e5c31af7Sopenharmony_ci} 954e5c31af7Sopenharmony_ci 955e5c31af7Sopenharmony_ci// GLSL shader tests 956e5c31af7Sopenharmony_ci 957e5c31af7Sopenharmony_civoid createGlslTests (tcu::TestCaseGroup* glslTests) 958e5c31af7Sopenharmony_ci{ 959e5c31af7Sopenharmony_ci tcu::TestContext& testCtx = glslTests->getTestContext(); 960e5c31af7Sopenharmony_ci 961e5c31af7Sopenharmony_ci // ShaderLibrary-based tests 962e5c31af7Sopenharmony_ci static const struct 963e5c31af7Sopenharmony_ci { 964e5c31af7Sopenharmony_ci const char* name; 965e5c31af7Sopenharmony_ci const char* description; 966e5c31af7Sopenharmony_ci } s_es310Tests[] = 967e5c31af7Sopenharmony_ci { 968e5c31af7Sopenharmony_ci { "arrays", "Arrays" }, 969e5c31af7Sopenharmony_ci { "conditionals", "Conditional statements" }, 970e5c31af7Sopenharmony_ci { "constant_expressions", "Constant expressions" }, 971e5c31af7Sopenharmony_ci { "constants", "Constants" }, 972e5c31af7Sopenharmony_ci { "conversions", "Type conversions" }, 973e5c31af7Sopenharmony_ci { "functions", "Functions" }, 974e5c31af7Sopenharmony_ci { "linkage", "Linking" }, 975e5c31af7Sopenharmony_ci { "scoping", "Scoping" }, 976e5c31af7Sopenharmony_ci { "swizzles", "Swizzles" }, 977e5c31af7Sopenharmony_ci }; 978e5c31af7Sopenharmony_ci 979e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_es310Tests); ndx++) 980e5c31af7Sopenharmony_ci glslTests->addChild(createShaderLibraryGroup(testCtx, 981e5c31af7Sopenharmony_ci s_es310Tests[ndx].name, 982e5c31af7Sopenharmony_ci s_es310Tests[ndx].description, 983e5c31af7Sopenharmony_ci std::string("vulkan/glsl/es310/") + s_es310Tests[ndx].name + ".test").release()); 984e5c31af7Sopenharmony_ci 985e5c31af7Sopenharmony_ci static const struct 986e5c31af7Sopenharmony_ci { 987e5c31af7Sopenharmony_ci const char* name; 988e5c31af7Sopenharmony_ci const char* description; 989e5c31af7Sopenharmony_ci } s_440Tests[] = 990e5c31af7Sopenharmony_ci { 991e5c31af7Sopenharmony_ci { "linkage", "Linking" }, 992e5c31af7Sopenharmony_ci }; 993e5c31af7Sopenharmony_ci 994e5c31af7Sopenharmony_ci de::MovePtr<tcu::TestCaseGroup> glsl440Tests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "440", "")); 995e5c31af7Sopenharmony_ci 996e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_440Tests); ndx++) 997e5c31af7Sopenharmony_ci glsl440Tests->addChild(createShaderLibraryGroup(testCtx, 998e5c31af7Sopenharmony_ci s_440Tests[ndx].name, 999e5c31af7Sopenharmony_ci s_440Tests[ndx].description, 1000e5c31af7Sopenharmony_ci std::string("vulkan/glsl/440/") + s_440Tests[ndx].name + ".test").release()); 1001e5c31af7Sopenharmony_ci 1002e5c31af7Sopenharmony_ci glslTests->addChild(glsl440Tests.release()); 1003e5c31af7Sopenharmony_ci 1004e5c31af7Sopenharmony_ci // ShaderRenderCase-based tests 1005e5c31af7Sopenharmony_ci glslTests->addChild(sr::createDerivateTests (testCtx)); 1006e5c31af7Sopenharmony_ci glslTests->addChild(sr::createDiscardTests (testCtx)); 1007e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 1008e5c31af7Sopenharmony_ci glslTests->addChild(sr::createDemoteTests (testCtx)); 1009e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1010e5c31af7Sopenharmony_ci glslTests->addChild(sr::createIndexingTests (testCtx)); 1011e5c31af7Sopenharmony_ci glslTests->addChild(sr::createShaderInvarianceTests (testCtx)); 1012e5c31af7Sopenharmony_ci glslTests->addChild(sr::createLimitTests (testCtx)); 1013e5c31af7Sopenharmony_ci glslTests->addChild(sr::createLoopTests (testCtx)); 1014e5c31af7Sopenharmony_ci glslTests->addChild(sr::createMatrixTests (testCtx)); 1015e5c31af7Sopenharmony_ci glslTests->addChild(sr::createOperatorTests (testCtx)); 1016e5c31af7Sopenharmony_ci glslTests->addChild(sr::createReturnTests (testCtx)); 1017e5c31af7Sopenharmony_ci glslTests->addChild(sr::createStructTests (testCtx)); 1018e5c31af7Sopenharmony_ci glslTests->addChild(sr::createSwitchTests (testCtx)); 1019e5c31af7Sopenharmony_ci glslTests->addChild(sr::createTextureFunctionTests (testCtx)); 1020e5c31af7Sopenharmony_ci glslTests->addChild(sr::createTextureGatherTests (testCtx)); 1021e5c31af7Sopenharmony_ci glslTests->addChild(sr::createBuiltinVarTests (testCtx)); 1022e5c31af7Sopenharmony_ci 1023e5c31af7Sopenharmony_ci // ShaderExecutor-based tests 1024e5c31af7Sopenharmony_ci glslTests->addChild(shaderexecutor::createBuiltinTests (testCtx)); 1025e5c31af7Sopenharmony_ci glslTests->addChild(shaderexecutor::createOpaqueTypeIndexingTests (testCtx)); 1026e5c31af7Sopenharmony_ci glslTests->addChild(shaderexecutor::createAtomicOperationTests (testCtx)); 1027e5c31af7Sopenharmony_ci glslTests->addChild(shaderexecutor::createShaderClockTests (testCtx)); 1028e5c31af7Sopenharmony_ci 1029e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 1030e5c31af7Sopenharmony_ci // Amber GLSL tests. 1031e5c31af7Sopenharmony_ci glslTests->addChild(cts_amber::createCombinedOperationsGroup (testCtx)); 1032e5c31af7Sopenharmony_ci glslTests->addChild(cts_amber::createCrashTestGroup (testCtx)); 1033e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1034e5c31af7Sopenharmony_ci} 1035e5c31af7Sopenharmony_ci 1036e5c31af7Sopenharmony_ci// TestPackage 1037e5c31af7Sopenharmony_ci 1038e5c31af7Sopenharmony_ciBaseTestPackage::BaseTestPackage (tcu::TestContext& testCtx, const char* name, const char* desc) 1039e5c31af7Sopenharmony_ci : tcu::TestPackage(testCtx, name, desc) 1040e5c31af7Sopenharmony_ci{ 1041e5c31af7Sopenharmony_ci} 1042e5c31af7Sopenharmony_ci 1043e5c31af7Sopenharmony_ciBaseTestPackage::~BaseTestPackage (void) 1044e5c31af7Sopenharmony_ci{ 1045e5c31af7Sopenharmony_ci} 1046e5c31af7Sopenharmony_ci 1047e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKAN 1048e5c31af7Sopenharmony_ci 1049e5c31af7Sopenharmony_ciTestPackage::TestPackage (tcu::TestContext& testCtx) 1050e5c31af7Sopenharmony_ci : BaseTestPackage(testCtx, "dEQP-VK", "dEQP Vulkan Tests") 1051e5c31af7Sopenharmony_ci{ 1052e5c31af7Sopenharmony_ci} 1053e5c31af7Sopenharmony_ci 1054e5c31af7Sopenharmony_ciTestPackage::~TestPackage (void) 1055e5c31af7Sopenharmony_ci{ 1056e5c31af7Sopenharmony_ci} 1057e5c31af7Sopenharmony_ci 1058e5c31af7Sopenharmony_ciExperimentalTestPackage::ExperimentalTestPackage (tcu::TestContext& testCtx) 1059e5c31af7Sopenharmony_ci : BaseTestPackage(testCtx, "dEQP-VK-experimental", "dEQP Vulkan Experimental Tests") 1060e5c31af7Sopenharmony_ci{ 1061e5c31af7Sopenharmony_ci} 1062e5c31af7Sopenharmony_ci 1063e5c31af7Sopenharmony_ciExperimentalTestPackage::~ExperimentalTestPackage (void) 1064e5c31af7Sopenharmony_ci{ 1065e5c31af7Sopenharmony_ci} 1066e5c31af7Sopenharmony_ci 1067e5c31af7Sopenharmony_ci#endif 1068e5c31af7Sopenharmony_ci 1069e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 1070e5c31af7Sopenharmony_ci 1071e5c31af7Sopenharmony_ciTestPackageSC::TestPackageSC (tcu::TestContext& testCtx) 1072e5c31af7Sopenharmony_ci : BaseTestPackage(testCtx, "dEQP-VKSC", "dEQP Vulkan SC Tests") 1073e5c31af7Sopenharmony_ci{ 1074e5c31af7Sopenharmony_ci} 1075e5c31af7Sopenharmony_ci 1076e5c31af7Sopenharmony_ciTestPackageSC::~TestPackageSC (void) 1077e5c31af7Sopenharmony_ci{ 1078e5c31af7Sopenharmony_ci} 1079e5c31af7Sopenharmony_ci 1080e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1081e5c31af7Sopenharmony_ci 1082e5c31af7Sopenharmony_citcu::TestCaseExecutor* BaseTestPackage::createExecutor (void) const 1083e5c31af7Sopenharmony_ci{ 1084e5c31af7Sopenharmony_ci return new TestCaseExecutor(m_testCtx); 1085e5c31af7Sopenharmony_ci} 1086e5c31af7Sopenharmony_ci 1087e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKAN 1088e5c31af7Sopenharmony_ci 1089e5c31af7Sopenharmony_civoid TestPackage::init (void) 1090e5c31af7Sopenharmony_ci{ 1091e5c31af7Sopenharmony_ci addChild(createTestGroup (m_testCtx, "info", "Build and Device Info Tests", createInfoTests)); 1092e5c31af7Sopenharmony_ci addChild(api::createTests (m_testCtx)); 1093e5c31af7Sopenharmony_ci addChild(memory::createTests (m_testCtx)); 1094e5c31af7Sopenharmony_ci addChild(pipeline::createTests (m_testCtx)); 1095e5c31af7Sopenharmony_ci addChild(BindingModel::createTests (m_testCtx)); 1096e5c31af7Sopenharmony_ci addChild(SpirVAssembly::createTests (m_testCtx)); 1097e5c31af7Sopenharmony_ci addChild(createTestGroup (m_testCtx, "glsl", "GLSL shader execution tests", createGlslTests)); 1098e5c31af7Sopenharmony_ci addChild(createRenderPassTests (m_testCtx)); 1099e5c31af7Sopenharmony_ci addChild(createRenderPass2Tests (m_testCtx)); 1100e5c31af7Sopenharmony_ci addChild(createDynamicRenderingTests (m_testCtx)); 1101e5c31af7Sopenharmony_ci addChild(ubo::createTests (m_testCtx)); 1102e5c31af7Sopenharmony_ci addChild(DynamicState::createTests (m_testCtx)); 1103e5c31af7Sopenharmony_ci addChild(ssbo::createTests (m_testCtx)); 1104e5c31af7Sopenharmony_ci addChild(QueryPool::createTests (m_testCtx)); 1105e5c31af7Sopenharmony_ci addChild(Draw::createTests (m_testCtx)); 1106e5c31af7Sopenharmony_ci addChild(compute::createTests (m_testCtx)); 1107e5c31af7Sopenharmony_ci addChild(image::createTests (m_testCtx)); 1108e5c31af7Sopenharmony_ci addChild(wsi::createTests (m_testCtx)); 1109e5c31af7Sopenharmony_ci addChild(createSynchronizationTests (m_testCtx)); 1110e5c31af7Sopenharmony_ci addChild(createSynchronization2Tests (m_testCtx)); 1111e5c31af7Sopenharmony_ci addChild(sparse::createTests (m_testCtx)); 1112e5c31af7Sopenharmony_ci addChild(tessellation::createTests (m_testCtx)); 1113e5c31af7Sopenharmony_ci addChild(rasterization::createTests (m_testCtx)); 1114e5c31af7Sopenharmony_ci addChild(clipping::createTests (m_testCtx)); 1115e5c31af7Sopenharmony_ci addChild(FragmentOperations::createTests (m_testCtx)); 1116e5c31af7Sopenharmony_ci addChild(texture::createTests (m_testCtx)); 1117e5c31af7Sopenharmony_ci addChild(geometry::createTests (m_testCtx)); 1118e5c31af7Sopenharmony_ci addChild(robustness::createTests (m_testCtx)); 1119e5c31af7Sopenharmony_ci addChild(MultiView::createTests (m_testCtx)); 1120e5c31af7Sopenharmony_ci addChild(subgroups::createTests (m_testCtx)); 1121e5c31af7Sopenharmony_ci addChild(ycbcr::createTests (m_testCtx)); 1122e5c31af7Sopenharmony_ci addChild(ProtectedMem::createTests (m_testCtx)); 1123e5c31af7Sopenharmony_ci addChild(DeviceGroup::createTests (m_testCtx)); 1124e5c31af7Sopenharmony_ci addChild(MemoryModel::createTests (m_testCtx)); 1125e5c31af7Sopenharmony_ci addChild(conditional::createTests (m_testCtx)); 1126e5c31af7Sopenharmony_ci addChild(cts_amber::createGraphicsFuzzTests (m_testCtx)); 1127e5c31af7Sopenharmony_ci addChild(imageless::createTests (m_testCtx)); 1128e5c31af7Sopenharmony_ci addChild(TransformFeedback::createTests (m_testCtx)); 1129e5c31af7Sopenharmony_ci addChild(DescriptorIndexing::createTests (m_testCtx)); 1130e5c31af7Sopenharmony_ci addChild(FragmentShaderInterlock::createTests(m_testCtx)); 1131e5c31af7Sopenharmony_ci addChild(modifiers::createTests (m_testCtx)); 1132e5c31af7Sopenharmony_ci addChild(RayTracing::createTests (m_testCtx)); 1133e5c31af7Sopenharmony_ci addChild(RayQuery::createTests (m_testCtx)); 1134e5c31af7Sopenharmony_ci addChild(FragmentShadingRate::createTests (m_testCtx)); 1135e5c31af7Sopenharmony_ci addChild(Reconvergence::createTests (m_testCtx, false)); 1136e5c31af7Sopenharmony_ci addChild(MeshShader::createTests (m_testCtx)); 1137e5c31af7Sopenharmony_ci addChild(FragmentShadingBarycentric::createTests(m_testCtx)); 1138e5c31af7Sopenharmony_ci // Amber depth pipeline tests 1139e5c31af7Sopenharmony_ci addChild(cts_amber::createAmberDepthGroup (m_testCtx)); 1140e5c31af7Sopenharmony_ci addChild(video::createTests (m_testCtx)); 1141e5c31af7Sopenharmony_ci} 1142e5c31af7Sopenharmony_ci 1143e5c31af7Sopenharmony_civoid ExperimentalTestPackage::init (void) 1144e5c31af7Sopenharmony_ci{ 1145e5c31af7Sopenharmony_ci addChild(postmortem::createTests (m_testCtx)); 1146e5c31af7Sopenharmony_ci addChild(Reconvergence::createTests (m_testCtx, true)); 1147e5c31af7Sopenharmony_ci} 1148e5c31af7Sopenharmony_ci 1149e5c31af7Sopenharmony_ci#endif 1150e5c31af7Sopenharmony_ci 1151e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 1152e5c31af7Sopenharmony_ci 1153e5c31af7Sopenharmony_civoid TestPackageSC::init (void) 1154e5c31af7Sopenharmony_ci{ 1155e5c31af7Sopenharmony_ci addChild(createTestGroup (m_testCtx, "info", "Build and Device Info Tests", createInfoTests)); 1156e5c31af7Sopenharmony_ci addChild(api::createTests (m_testCtx)); 1157e5c31af7Sopenharmony_ci addChild(memory::createTests (m_testCtx)); 1158e5c31af7Sopenharmony_ci addChild(pipeline::createTests (m_testCtx)); 1159e5c31af7Sopenharmony_ci addChild(BindingModel::createTests (m_testCtx)); 1160e5c31af7Sopenharmony_ci addChild(SpirVAssembly::createTests (m_testCtx)); 1161e5c31af7Sopenharmony_ci addChild(createTestGroup (m_testCtx, "glsl", "GLSL shader execution tests", createGlslTests)); 1162e5c31af7Sopenharmony_ci addChild(createRenderPassTests (m_testCtx)); 1163e5c31af7Sopenharmony_ci addChild(createRenderPass2Tests (m_testCtx)); 1164e5c31af7Sopenharmony_ci addChild(ubo::createTests (m_testCtx)); 1165e5c31af7Sopenharmony_ci addChild(DynamicState::createTests (m_testCtx)); 1166e5c31af7Sopenharmony_ci addChild(ssbo::createTests (m_testCtx)); 1167e5c31af7Sopenharmony_ci addChild(QueryPool::createTests (m_testCtx)); 1168e5c31af7Sopenharmony_ci addChild(Draw::createTests (m_testCtx)); 1169e5c31af7Sopenharmony_ci addChild(compute::createTests (m_testCtx)); 1170e5c31af7Sopenharmony_ci addChild(image::createTests (m_testCtx)); 1171e5c31af7Sopenharmony_ci// addChild(wsi::createTests (m_testCtx)); 1172e5c31af7Sopenharmony_ci addChild(createSynchronizationTests (m_testCtx)); 1173e5c31af7Sopenharmony_ci addChild(createSynchronization2Tests (m_testCtx)); 1174e5c31af7Sopenharmony_ci// addChild(sparse::createTests (m_testCtx)); 1175e5c31af7Sopenharmony_ci addChild(tessellation::createTests (m_testCtx)); 1176e5c31af7Sopenharmony_ci addChild(rasterization::createTests (m_testCtx)); 1177e5c31af7Sopenharmony_ci addChild(clipping::createTests (m_testCtx)); 1178e5c31af7Sopenharmony_ci addChild(FragmentOperations::createTests (m_testCtx)); 1179e5c31af7Sopenharmony_ci addChild(texture::createTests (m_testCtx)); 1180e5c31af7Sopenharmony_ci addChild(geometry::createTests (m_testCtx)); 1181e5c31af7Sopenharmony_ci addChild(robustness::createTests (m_testCtx)); 1182e5c31af7Sopenharmony_ci addChild(MultiView::createTests (m_testCtx)); 1183e5c31af7Sopenharmony_ci addChild(subgroups::createTests (m_testCtx)); 1184e5c31af7Sopenharmony_ci addChild(ycbcr::createTests (m_testCtx)); 1185e5c31af7Sopenharmony_ci addChild(ProtectedMem::createTests (m_testCtx)); 1186e5c31af7Sopenharmony_ci addChild(DeviceGroup::createTests (m_testCtx)); 1187e5c31af7Sopenharmony_ci addChild(MemoryModel::createTests (m_testCtx)); 1188e5c31af7Sopenharmony_ci// addChild(conditional::createTests (m_testCtx)); 1189e5c31af7Sopenharmony_ci// addChild(cts_amber::createGraphicsFuzzTests (m_testCtx)); 1190e5c31af7Sopenharmony_ci addChild(imageless::createTests (m_testCtx)); 1191e5c31af7Sopenharmony_ci// addChild(TransformFeedback::createTests (m_testCtx)); 1192e5c31af7Sopenharmony_ci addChild(DescriptorIndexing::createTests (m_testCtx)); 1193e5c31af7Sopenharmony_ci addChild(FragmentShaderInterlock::createTests(m_testCtx)); 1194e5c31af7Sopenharmony_ci// addChild(modifiers::createTests (m_testCtx)); 1195e5c31af7Sopenharmony_ci// addChild(RayTracing::createTests (m_testCtx)); 1196e5c31af7Sopenharmony_ci// addChild(RayQuery::createTests (m_testCtx)); 1197e5c31af7Sopenharmony_ci addChild(FragmentShadingRate::createTests(m_testCtx)); 1198e5c31af7Sopenharmony_ci addChild(sc::createTests(m_testCtx)); 1199e5c31af7Sopenharmony_ci} 1200e5c31af7Sopenharmony_ci 1201e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1202e5c31af7Sopenharmony_ci 1203e5c31af7Sopenharmony_ci} // vkt 1204