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