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 Object management tests
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "vktApiObjectManagementTests.hpp"
25e5c31af7Sopenharmony_ci#include "vktTestCaseUtil.hpp"
26e5c31af7Sopenharmony_ci#include "vktCustomInstancesDevices.hpp"
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_ci#include "vkDefs.hpp"
29e5c31af7Sopenharmony_ci#include "vkRef.hpp"
30e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp"
31e5c31af7Sopenharmony_ci#include "vkQueryUtil.hpp"
32e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp"
33e5c31af7Sopenharmony_ci#include "vkPrograms.hpp"
34e5c31af7Sopenharmony_ci#include "vkTypeUtil.hpp"
35e5c31af7Sopenharmony_ci#include "vkPlatform.hpp"
36e5c31af7Sopenharmony_ci#include "vkStrUtil.hpp"
37e5c31af7Sopenharmony_ci#include "vkAllocationCallbackUtil.hpp"
38e5c31af7Sopenharmony_ci#include "vkObjTypeImpl.inl"
39e5c31af7Sopenharmony_ci#include "vkObjUtil.hpp"
40e5c31af7Sopenharmony_ci#include "vkBuilderUtil.hpp"
41e5c31af7Sopenharmony_ci#include "vkSafetyCriticalUtil.hpp"
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ci#include "vktTestGroupUtil.hpp"
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ci#include "tcuVector.hpp"
46e5c31af7Sopenharmony_ci#include "tcuResultCollector.hpp"
47e5c31af7Sopenharmony_ci#include "tcuCommandLine.hpp"
48e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp"
49e5c31af7Sopenharmony_ci#include "tcuPlatform.hpp"
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
52e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp"
53e5c31af7Sopenharmony_ci#include "deArrayUtil.hpp"
54e5c31af7Sopenharmony_ci#include "deSpinBarrier.hpp"
55e5c31af7Sopenharmony_ci#include "deThread.hpp"
56e5c31af7Sopenharmony_ci#include "deInt32.h"
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci#include <limits>
59e5c31af7Sopenharmony_ci#include <algorithm>
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ci#define VK_DESCRIPTOR_TYPE_LAST (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1)
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_cinamespace vkt
64e5c31af7Sopenharmony_ci{
65e5c31af7Sopenharmony_cinamespace api
66e5c31af7Sopenharmony_ci{
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_cinamespace
69e5c31af7Sopenharmony_ci{
70e5c31af7Sopenharmony_ci
71e5c31af7Sopenharmony_ciusing namespace vk;
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ciusing de::UniquePtr;
74e5c31af7Sopenharmony_ciusing de::MovePtr;
75e5c31af7Sopenharmony_ciusing de::SharedPtr;
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_ciusing tcu::IVec3;
78e5c31af7Sopenharmony_ciusing tcu::UVec3;
79e5c31af7Sopenharmony_ciusing tcu::ResultCollector;
80e5c31af7Sopenharmony_ciusing tcu::TestStatus;
81e5c31af7Sopenharmony_ciusing tcu::TestLog;
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_ciusing std::string;
84e5c31af7Sopenharmony_ciusing std::vector;
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_citypedef SharedPtr<Move<VkPipeline> >			VkPipelineSp;		// Move so it's possible to disown the handle
87e5c31af7Sopenharmony_citypedef SharedPtr<Move<VkDescriptorSet> >		VkDescriptorSetSp;
88e5c31af7Sopenharmony_citypedef SharedPtr<Move<VkCommandBuffer> >		VkCommandBufferSp;
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ciclass ThreadGroupThread;
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci/*--------------------------------------------------------------------*//*!
93e5c31af7Sopenharmony_ci * \brief Thread group
94e5c31af7Sopenharmony_ci *
95e5c31af7Sopenharmony_ci * Thread group manages collection of threads that are expected to be
96e5c31af7Sopenharmony_ci * launched simultaneously as a group.
97e5c31af7Sopenharmony_ci *
98e5c31af7Sopenharmony_ci * Shared barrier is provided for synchronizing execution. Terminating thread
99e5c31af7Sopenharmony_ci * early either by returning from ThreadGroupThread::runThread() or throwing
100e5c31af7Sopenharmony_ci * an exception is safe, and other threads will continue execution. The
101e5c31af7Sopenharmony_ci * thread that has been terminated is simply removed from the synchronization
102e5c31af7Sopenharmony_ci * group.
103e5c31af7Sopenharmony_ci *
104e5c31af7Sopenharmony_ci * TestException-based exceptions are collected and translated into a
105e5c31af7Sopenharmony_ci * tcu::TestStatus by using tcu::ResultCollector.
106e5c31af7Sopenharmony_ci *
107e5c31af7Sopenharmony_ci * Use cases for ThreadGroup include for example testing thread-safety of
108e5c31af7Sopenharmony_ci * certain API operations by poking API simultaneously from multiple
109e5c31af7Sopenharmony_ci * threads.
110e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
111e5c31af7Sopenharmony_ci
112e5c31af7Sopenharmony_ciclass ThreadGroup
113e5c31af7Sopenharmony_ci{
114e5c31af7Sopenharmony_cipublic:
115e5c31af7Sopenharmony_ci							ThreadGroup			(void);
116e5c31af7Sopenharmony_ci							~ThreadGroup		(void);
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_ci	void					add					(de::MovePtr<ThreadGroupThread> thread);
119e5c31af7Sopenharmony_ci	TestStatus				run					(void);
120e5c31af7Sopenharmony_ci
121e5c31af7Sopenharmony_ciprivate:
122e5c31af7Sopenharmony_ci	typedef std::vector<de::SharedPtr<ThreadGroupThread> >	ThreadVector;
123e5c31af7Sopenharmony_ci
124e5c31af7Sopenharmony_ci	ThreadVector			m_threads;
125e5c31af7Sopenharmony_ci	de::SpinBarrier			m_barrier;
126e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE;
127e5c31af7Sopenharmony_ci
128e5c31af7Sopenharmony_ciclass ThreadGroupThread : private de::Thread
129e5c31af7Sopenharmony_ci{
130e5c31af7Sopenharmony_cipublic:
131e5c31af7Sopenharmony_ci							ThreadGroupThread	(void);
132e5c31af7Sopenharmony_ci	virtual					~ThreadGroupThread	(void);
133e5c31af7Sopenharmony_ci
134e5c31af7Sopenharmony_ci	void					start				(de::SpinBarrier* groupBarrier);
135e5c31af7Sopenharmony_ci
136e5c31af7Sopenharmony_ci	ResultCollector&		getResultCollector	(void) { return m_resultCollector; }
137e5c31af7Sopenharmony_ci
138e5c31af7Sopenharmony_ci	using de::Thread::join;
139e5c31af7Sopenharmony_ci
140e5c31af7Sopenharmony_ciprotected:
141e5c31af7Sopenharmony_ci	virtual void			runThread			(void) = 0;
142e5c31af7Sopenharmony_ci
143e5c31af7Sopenharmony_ci	void					barrier				(void);
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_ciprivate:
146e5c31af7Sopenharmony_ci							ThreadGroupThread	(const ThreadGroupThread&);
147e5c31af7Sopenharmony_ci	ThreadGroupThread&		operator=			(const ThreadGroupThread&);
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_ci	void					run					(void);
150e5c31af7Sopenharmony_ci
151e5c31af7Sopenharmony_ci	ResultCollector			m_resultCollector;
152e5c31af7Sopenharmony_ci	de::SpinBarrier*		m_barrier;
153e5c31af7Sopenharmony_ci};
154e5c31af7Sopenharmony_ci
155e5c31af7Sopenharmony_ci// ThreadGroup
156e5c31af7Sopenharmony_ci
157e5c31af7Sopenharmony_ciThreadGroup::ThreadGroup (void)
158e5c31af7Sopenharmony_ci	: m_barrier(1)
159e5c31af7Sopenharmony_ci{
160e5c31af7Sopenharmony_ci}
161e5c31af7Sopenharmony_ci
162e5c31af7Sopenharmony_ciThreadGroup::~ThreadGroup (void)
163e5c31af7Sopenharmony_ci{
164e5c31af7Sopenharmony_ci}
165e5c31af7Sopenharmony_ci
166e5c31af7Sopenharmony_civoid ThreadGroup::add (de::MovePtr<ThreadGroupThread> thread)
167e5c31af7Sopenharmony_ci{
168e5c31af7Sopenharmony_ci	m_threads.push_back(de::SharedPtr<ThreadGroupThread>(thread.release()));
169e5c31af7Sopenharmony_ci}
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_citcu::TestStatus ThreadGroup::run (void)
172e5c31af7Sopenharmony_ci{
173e5c31af7Sopenharmony_ci	tcu::ResultCollector	resultCollector;
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_ci	m_barrier.reset((int)m_threads.size());
176e5c31af7Sopenharmony_ci
177e5c31af7Sopenharmony_ci	for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter)
178e5c31af7Sopenharmony_ci		(*threadIter)->start(&m_barrier);
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ci	for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter)
181e5c31af7Sopenharmony_ci	{
182e5c31af7Sopenharmony_ci		tcu::ResultCollector&	threadResult	= (*threadIter)->getResultCollector();
183e5c31af7Sopenharmony_ci		(*threadIter)->join();
184e5c31af7Sopenharmony_ci		resultCollector.addResult(threadResult.getResult(), threadResult.getMessage());
185e5c31af7Sopenharmony_ci	}
186e5c31af7Sopenharmony_ci
187e5c31af7Sopenharmony_ci	return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
188e5c31af7Sopenharmony_ci}
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci// ThreadGroupThread
191e5c31af7Sopenharmony_ci
192e5c31af7Sopenharmony_ciThreadGroupThread::ThreadGroupThread (void)
193e5c31af7Sopenharmony_ci	: m_barrier(DE_NULL)
194e5c31af7Sopenharmony_ci{
195e5c31af7Sopenharmony_ci}
196e5c31af7Sopenharmony_ci
197e5c31af7Sopenharmony_ciThreadGroupThread::~ThreadGroupThread (void)
198e5c31af7Sopenharmony_ci{
199e5c31af7Sopenharmony_ci}
200e5c31af7Sopenharmony_ci
201e5c31af7Sopenharmony_civoid ThreadGroupThread::start (de::SpinBarrier* groupBarrier)
202e5c31af7Sopenharmony_ci{
203e5c31af7Sopenharmony_ci	m_barrier = groupBarrier;
204e5c31af7Sopenharmony_ci	de::Thread::start();
205e5c31af7Sopenharmony_ci}
206e5c31af7Sopenharmony_ci
207e5c31af7Sopenharmony_civoid ThreadGroupThread::run (void)
208e5c31af7Sopenharmony_ci{
209e5c31af7Sopenharmony_ci	try
210e5c31af7Sopenharmony_ci	{
211e5c31af7Sopenharmony_ci		runThread();
212e5c31af7Sopenharmony_ci	}
213e5c31af7Sopenharmony_ci	catch (const tcu::TestException& e)
214e5c31af7Sopenharmony_ci	{
215e5c31af7Sopenharmony_ci		getResultCollector().addResult(e.getTestResult(), e.getMessage());
216e5c31af7Sopenharmony_ci	}
217e5c31af7Sopenharmony_ci	catch (const std::exception& e)
218e5c31af7Sopenharmony_ci	{
219e5c31af7Sopenharmony_ci		getResultCollector().addResult(QP_TEST_RESULT_FAIL, e.what());
220e5c31af7Sopenharmony_ci	}
221e5c31af7Sopenharmony_ci	catch (...)
222e5c31af7Sopenharmony_ci	{
223e5c31af7Sopenharmony_ci		getResultCollector().addResult(QP_TEST_RESULT_FAIL, "Exception");
224e5c31af7Sopenharmony_ci	}
225e5c31af7Sopenharmony_ci
226e5c31af7Sopenharmony_ci	m_barrier->removeThread(de::SpinBarrier::WAIT_MODE_AUTO);
227e5c31af7Sopenharmony_ci}
228e5c31af7Sopenharmony_ci
229e5c31af7Sopenharmony_ciinline void ThreadGroupThread::barrier (void)
230e5c31af7Sopenharmony_ci{
231e5c31af7Sopenharmony_ci	m_barrier->sync(de::SpinBarrier::WAIT_MODE_AUTO);
232e5c31af7Sopenharmony_ci}
233e5c31af7Sopenharmony_ci
234e5c31af7Sopenharmony_cideUint32 getDefaultTestThreadCount (void)
235e5c31af7Sopenharmony_ci{
236e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
237e5c31af7Sopenharmony_ci	return de::clamp(deGetNumAvailableLogicalCores(), 2u, 8u);
238e5c31af7Sopenharmony_ci#else
239e5c31af7Sopenharmony_ci	return 2u;
240e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
241e5c31af7Sopenharmony_ci
242e5c31af7Sopenharmony_ci}
243e5c31af7Sopenharmony_ci
244e5c31af7Sopenharmony_ci// Utilities
245e5c31af7Sopenharmony_ci
246e5c31af7Sopenharmony_cistruct Environment
247e5c31af7Sopenharmony_ci{
248e5c31af7Sopenharmony_ci	const PlatformInterface&			vkp;
249e5c31af7Sopenharmony_ci	deUint32							apiVersion;
250e5c31af7Sopenharmony_ci	const InstanceInterface&			instanceInterface;
251e5c31af7Sopenharmony_ci	VkInstance							instance;
252e5c31af7Sopenharmony_ci	const DeviceInterface&				vkd;
253e5c31af7Sopenharmony_ci	VkDevice							device;
254e5c31af7Sopenharmony_ci	deUint32							queueFamilyIndex;
255e5c31af7Sopenharmony_ci	const BinaryCollection&				programBinaries;
256e5c31af7Sopenharmony_ci	const VkAllocationCallbacks*		allocationCallbacks;
257e5c31af7Sopenharmony_ci	deUint32							maxResourceConsumers;		// Maximum number of objects using same Object::Resources concurrently
258e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
259e5c31af7Sopenharmony_ci	de::SharedPtr<ResourceInterface>		resourceInterface;
260e5c31af7Sopenharmony_ci	VkPhysicalDeviceVulkanSC10Properties	vulkanSC10Properties;
261e5c31af7Sopenharmony_ci	VkPhysicalDeviceProperties				properties;
262e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
263e5c31af7Sopenharmony_ci	const tcu::CommandLine&			commandLine;
264e5c31af7Sopenharmony_ci
265e5c31af7Sopenharmony_ci	Environment (Context& context, deUint32 maxResourceConsumers_)
266e5c31af7Sopenharmony_ci		: vkp					(context.getPlatformInterface())
267e5c31af7Sopenharmony_ci		, apiVersion			(context.getUsedApiVersion())
268e5c31af7Sopenharmony_ci		, instanceInterface		(context.getInstanceInterface())
269e5c31af7Sopenharmony_ci		, instance				(context.getInstance())
270e5c31af7Sopenharmony_ci		, vkd					(context.getDeviceInterface())
271e5c31af7Sopenharmony_ci		, device				(context.getDevice())
272e5c31af7Sopenharmony_ci		, queueFamilyIndex		(context.getUniversalQueueFamilyIndex())
273e5c31af7Sopenharmony_ci		, programBinaries		(context.getBinaryCollection())
274e5c31af7Sopenharmony_ci		, allocationCallbacks	(DE_NULL)
275e5c31af7Sopenharmony_ci		, maxResourceConsumers	(maxResourceConsumers_)
276e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
277e5c31af7Sopenharmony_ci		, resourceInterface		(context.getResourceInterface())
278e5c31af7Sopenharmony_ci		, vulkanSC10Properties	(context.getDeviceVulkanSC10Properties())
279e5c31af7Sopenharmony_ci		, properties			(context.getDeviceProperties())
280e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
281e5c31af7Sopenharmony_ci		, commandLine			(context.getTestContext().getCommandLine())
282e5c31af7Sopenharmony_ci	{
283e5c31af7Sopenharmony_ci	}
284e5c31af7Sopenharmony_ci
285e5c31af7Sopenharmony_ci	Environment (const PlatformInterface&		vkp_,
286e5c31af7Sopenharmony_ci				 deUint32						apiVersion_,
287e5c31af7Sopenharmony_ci				 const InstanceInterface&		instanceInterface_,
288e5c31af7Sopenharmony_ci				 VkInstance						instance_,
289e5c31af7Sopenharmony_ci				 const DeviceInterface&			vkd_,
290e5c31af7Sopenharmony_ci				 VkDevice						device_,
291e5c31af7Sopenharmony_ci				 deUint32						queueFamilyIndex_,
292e5c31af7Sopenharmony_ci				 const BinaryCollection&		programBinaries_,
293e5c31af7Sopenharmony_ci				 const VkAllocationCallbacks*	allocationCallbacks_,
294e5c31af7Sopenharmony_ci				 deUint32						maxResourceConsumers_,
295e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
296e5c31af7Sopenharmony_ci				 de::SharedPtr<ResourceInterface>	resourceInterface_,
297e5c31af7Sopenharmony_ci				 const VkPhysicalDeviceVulkanSC10Properties& vulkanSC10Properties_,
298e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
299e5c31af7Sopenharmony_ci				 const tcu::CommandLine&		commandLine_)
300e5c31af7Sopenharmony_ci		: vkp					(vkp_)
301e5c31af7Sopenharmony_ci		, apiVersion			(apiVersion_)
302e5c31af7Sopenharmony_ci		, instanceInterface		(instanceInterface_)
303e5c31af7Sopenharmony_ci		, instance				(instance_)
304e5c31af7Sopenharmony_ci		, vkd					(vkd_)
305e5c31af7Sopenharmony_ci		, device				(device_)
306e5c31af7Sopenharmony_ci		, queueFamilyIndex		(queueFamilyIndex_)
307e5c31af7Sopenharmony_ci		, programBinaries		(programBinaries_)
308e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
309e5c31af7Sopenharmony_ci		, allocationCallbacks(DE_NULL)
310e5c31af7Sopenharmony_ci#else
311e5c31af7Sopenharmony_ci		, allocationCallbacks(allocationCallbacks_)
312e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
313e5c31af7Sopenharmony_ci		, maxResourceConsumers	(maxResourceConsumers_)
314e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
315e5c31af7Sopenharmony_ci		, resourceInterface		(resourceInterface_)
316e5c31af7Sopenharmony_ci		, vulkanSC10Properties	(vulkanSC10Properties_)
317e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
318e5c31af7Sopenharmony_ci		, commandLine			(commandLine_)
319e5c31af7Sopenharmony_ci	{
320e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
321e5c31af7Sopenharmony_ci		DE_UNREF(allocationCallbacks_);
322e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
323e5c31af7Sopenharmony_ci	}
324e5c31af7Sopenharmony_ci};
325e5c31af7Sopenharmony_ci
326e5c31af7Sopenharmony_citemplate<typename Case>
327e5c31af7Sopenharmony_cistruct Dependency
328e5c31af7Sopenharmony_ci{
329e5c31af7Sopenharmony_ci	typename Case::Resources		resources;
330e5c31af7Sopenharmony_ci	Unique<typename Case::Type>		object;
331e5c31af7Sopenharmony_ci
332e5c31af7Sopenharmony_ci	Dependency (const Environment& env, const typename Case::Parameters& params)
333e5c31af7Sopenharmony_ci		: resources	(env, params)
334e5c31af7Sopenharmony_ci		, object	(Case::create(env, resources, params))
335e5c31af7Sopenharmony_ci	{}
336e5c31af7Sopenharmony_ci};
337e5c31af7Sopenharmony_ci
338e5c31af7Sopenharmony_citemplate<typename T>
339e5c31af7Sopenharmony_ciT roundUpToNextMultiple (T value, T multiple)
340e5c31af7Sopenharmony_ci{
341e5c31af7Sopenharmony_ci	if (value % multiple == 0)
342e5c31af7Sopenharmony_ci		return value;
343e5c31af7Sopenharmony_ci	else
344e5c31af7Sopenharmony_ci		return value + multiple - (value % multiple);
345e5c31af7Sopenharmony_ci}
346e5c31af7Sopenharmony_ci
347e5c31af7Sopenharmony_ci#if defined(DE_DEBUG)
348e5c31af7Sopenharmony_citemplate<typename T>
349e5c31af7Sopenharmony_cibool isPowerOfTwo (T value)
350e5c31af7Sopenharmony_ci{
351e5c31af7Sopenharmony_ci	return ((value & (value - T(1))) == 0);
352e5c31af7Sopenharmony_ci}
353e5c31af7Sopenharmony_ci#endif
354e5c31af7Sopenharmony_ci
355e5c31af7Sopenharmony_citemplate<typename T>
356e5c31af7Sopenharmony_ciT alignToPowerOfTwo (T value, T align)
357e5c31af7Sopenharmony_ci{
358e5c31af7Sopenharmony_ci	DE_ASSERT(isPowerOfTwo(align));
359e5c31af7Sopenharmony_ci	return (value + align - T(1)) & ~(align - T(1));
360e5c31af7Sopenharmony_ci}
361e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
362e5c31af7Sopenharmony_ciinline bool hasDeviceExtension (Context& context, const string name)
363e5c31af7Sopenharmony_ci{
364e5c31af7Sopenharmony_ci	return context.isDeviceFunctionalitySupported(name);
365e5c31af7Sopenharmony_ci}
366e5c31af7Sopenharmony_ci#endif
367e5c31af7Sopenharmony_ci
368e5c31af7Sopenharmony_ciVkDeviceSize getPageTableSize (const tcu::PlatformMemoryLimits& limits, VkDeviceSize allocationSize)
369e5c31af7Sopenharmony_ci{
370e5c31af7Sopenharmony_ci	VkDeviceSize	totalSize	= 0;
371e5c31af7Sopenharmony_ci
372e5c31af7Sopenharmony_ci	for (size_t levelNdx = 0; levelNdx < limits.devicePageTableHierarchyLevels; ++levelNdx)
373e5c31af7Sopenharmony_ci	{
374e5c31af7Sopenharmony_ci		const VkDeviceSize	coveredAddressSpaceSize	= limits.devicePageSize<<levelNdx;
375e5c31af7Sopenharmony_ci		const VkDeviceSize	numPagesNeeded			= alignToPowerOfTwo(allocationSize, coveredAddressSpaceSize) / coveredAddressSpaceSize;
376e5c31af7Sopenharmony_ci
377e5c31af7Sopenharmony_ci		totalSize += numPagesNeeded*limits.devicePageTableEntrySize;
378e5c31af7Sopenharmony_ci	}
379e5c31af7Sopenharmony_ci
380e5c31af7Sopenharmony_ci	return totalSize;
381e5c31af7Sopenharmony_ci}
382e5c31af7Sopenharmony_ci
383e5c31af7Sopenharmony_cisize_t getCurrentSystemMemoryUsage (const AllocationCallbackRecorder& allocRecoder)
384e5c31af7Sopenharmony_ci{
385e5c31af7Sopenharmony_ci	const size_t						systemAllocationOverhead	= sizeof(void*)*2;
386e5c31af7Sopenharmony_ci	AllocationCallbackValidationResults	validationResults;
387e5c31af7Sopenharmony_ci
388e5c31af7Sopenharmony_ci	validateAllocationCallbacks(allocRecoder, &validationResults);
389e5c31af7Sopenharmony_ci	TCU_CHECK(validationResults.violations.empty());
390e5c31af7Sopenharmony_ci
391e5c31af7Sopenharmony_ci	return getLiveSystemAllocationTotal(validationResults) + systemAllocationOverhead*validationResults.liveAllocations.size();
392e5c31af7Sopenharmony_ci}
393e5c31af7Sopenharmony_ci
394e5c31af7Sopenharmony_citemplate<typename Object>
395e5c31af7Sopenharmony_cisize_t computeSystemMemoryUsage (Context& context, const typename Object::Parameters& params)
396e5c31af7Sopenharmony_ci{
397e5c31af7Sopenharmony_ci	AllocationCallbackRecorder			allocRecorder		(getSystemAllocator());
398e5c31af7Sopenharmony_ci	const Environment					env					(context.getPlatformInterface(),
399e5c31af7Sopenharmony_ci															 context.getUsedApiVersion(),
400e5c31af7Sopenharmony_ci															 context.getInstanceInterface(),
401e5c31af7Sopenharmony_ci															 context.getInstance(),
402e5c31af7Sopenharmony_ci															 context.getDeviceInterface(),
403e5c31af7Sopenharmony_ci															 context.getDevice(),
404e5c31af7Sopenharmony_ci															 context.getUniversalQueueFamilyIndex(),
405e5c31af7Sopenharmony_ci															 context.getBinaryCollection(),
406e5c31af7Sopenharmony_ci															 allocRecorder.getCallbacks(),
407e5c31af7Sopenharmony_ci															 1u,
408e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
409e5c31af7Sopenharmony_ci															context.getResourceInterface(),
410e5c31af7Sopenharmony_ci															context.getDeviceVulkanSC10Properties(),
411e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
412e5c31af7Sopenharmony_ci															 context.getTestContext().getCommandLine());
413e5c31af7Sopenharmony_ci	const typename Object::Resources	res					(env, params);
414e5c31af7Sopenharmony_ci	const size_t						resourceMemoryUsage	= getCurrentSystemMemoryUsage(allocRecorder);
415e5c31af7Sopenharmony_ci
416e5c31af7Sopenharmony_ci	{
417e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj					(Object::create(env, res, params));
418e5c31af7Sopenharmony_ci		const size_t					totalMemoryUsage	= getCurrentSystemMemoryUsage(allocRecorder);
419e5c31af7Sopenharmony_ci
420e5c31af7Sopenharmony_ci		return totalMemoryUsage - resourceMemoryUsage;
421e5c31af7Sopenharmony_ci	}
422e5c31af7Sopenharmony_ci}
423e5c31af7Sopenharmony_ci
424e5c31af7Sopenharmony_cisize_t getSafeObjectCount (const tcu::PlatformMemoryLimits&	memoryLimits,
425e5c31af7Sopenharmony_ci						   size_t							objectSystemMemoryUsage,
426e5c31af7Sopenharmony_ci						   VkDeviceSize						objectDeviceMemoryUsage = 0)
427e5c31af7Sopenharmony_ci{
428e5c31af7Sopenharmony_ci	const VkDeviceSize	roundedUpDeviceMemory	= roundUpToNextMultiple(objectDeviceMemoryUsage, memoryLimits.deviceMemoryAllocationGranularity);
429e5c31af7Sopenharmony_ci
430e5c31af7Sopenharmony_ci	if (memoryLimits.totalDeviceLocalMemory > 0 && roundedUpDeviceMemory > 0)
431e5c31af7Sopenharmony_ci	{
432e5c31af7Sopenharmony_ci		if (objectSystemMemoryUsage > 0)
433e5c31af7Sopenharmony_ci			return de::min(memoryLimits.totalSystemMemory / objectSystemMemoryUsage,
434e5c31af7Sopenharmony_ci						   (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory));
435e5c31af7Sopenharmony_ci		else
436e5c31af7Sopenharmony_ci			return (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory);
437e5c31af7Sopenharmony_ci	}
438e5c31af7Sopenharmony_ci	else if (objectSystemMemoryUsage + roundedUpDeviceMemory > 0)
439e5c31af7Sopenharmony_ci	{
440e5c31af7Sopenharmony_ci		DE_ASSERT(roundedUpDeviceMemory <= std::numeric_limits<size_t>::max() - objectSystemMemoryUsage);
441e5c31af7Sopenharmony_ci		return memoryLimits.totalSystemMemory / (objectSystemMemoryUsage + (size_t)roundedUpDeviceMemory);
442e5c31af7Sopenharmony_ci	}
443e5c31af7Sopenharmony_ci	else
444e5c31af7Sopenharmony_ci	{
445e5c31af7Sopenharmony_ci		// Warning: at this point driver has probably not implemented allocation callbacks correctly
446e5c31af7Sopenharmony_ci		return std::numeric_limits<size_t>::max();
447e5c31af7Sopenharmony_ci	}
448e5c31af7Sopenharmony_ci}
449e5c31af7Sopenharmony_ci
450e5c31af7Sopenharmony_citcu::PlatformMemoryLimits getPlatformMemoryLimits (Context& context)
451e5c31af7Sopenharmony_ci{
452e5c31af7Sopenharmony_ci	tcu::PlatformMemoryLimits	memoryLimits;
453e5c31af7Sopenharmony_ci
454e5c31af7Sopenharmony_ci	context.getTestContext().getPlatform().getMemoryLimits(memoryLimits);
455e5c31af7Sopenharmony_ci
456e5c31af7Sopenharmony_ci	return memoryLimits;
457e5c31af7Sopenharmony_ci}
458e5c31af7Sopenharmony_ci
459e5c31af7Sopenharmony_cisize_t getSafeObjectCount (Context& context, size_t objectSystemMemoryUsage, VkDeviceSize objectDeviceMemorySize = 0)
460e5c31af7Sopenharmony_ci{
461e5c31af7Sopenharmony_ci	return getSafeObjectCount(getPlatformMemoryLimits(context), objectSystemMemoryUsage, objectDeviceMemorySize);
462e5c31af7Sopenharmony_ci}
463e5c31af7Sopenharmony_ci
464e5c31af7Sopenharmony_ciVkDeviceSize getPageTableSize (Context& context, VkDeviceSize allocationSize)
465e5c31af7Sopenharmony_ci{
466e5c31af7Sopenharmony_ci	return getPageTableSize(getPlatformMemoryLimits(context), allocationSize);
467e5c31af7Sopenharmony_ci}
468e5c31af7Sopenharmony_ci
469e5c31af7Sopenharmony_citemplate<typename Object>
470e5c31af7Sopenharmony_cideUint32 getSafeObjectCount (Context&							context,
471e5c31af7Sopenharmony_ci							 const typename Object::Parameters&	params,
472e5c31af7Sopenharmony_ci							 deUint32							hardCountLimit,
473e5c31af7Sopenharmony_ci							 VkDeviceSize						deviceMemoryUsage = 0)
474e5c31af7Sopenharmony_ci{
475e5c31af7Sopenharmony_ci	return (deUint32)de::min((size_t)hardCountLimit,
476e5c31af7Sopenharmony_ci							 getSafeObjectCount(context,
477e5c31af7Sopenharmony_ci												computeSystemMemoryUsage<Object>(context, params),
478e5c31af7Sopenharmony_ci												deviceMemoryUsage));
479e5c31af7Sopenharmony_ci}
480e5c31af7Sopenharmony_ci
481e5c31af7Sopenharmony_ci// Object definitions
482e5c31af7Sopenharmony_ci
483e5c31af7Sopenharmony_cienum
484e5c31af7Sopenharmony_ci{
485e5c31af7Sopenharmony_ci	MAX_CONCURRENT_INSTANCES		= 32,
486e5c31af7Sopenharmony_ci	MAX_CONCURRENT_DEVICES			= 32,
487e5c31af7Sopenharmony_ci	MAX_CONCURRENT_SYNC_PRIMITIVES	= 100,
488e5c31af7Sopenharmony_ci	MAX_CONCURRENT_PIPELINE_CACHES	= 128,
489e5c31af7Sopenharmony_ci	MAX_CONCURRENT_QUERY_POOLS		= 8192,
490e5c31af7Sopenharmony_ci	DEFAULT_MAX_CONCURRENT_OBJECTS	= 16*1024,
491e5c31af7Sopenharmony_ci};
492e5c31af7Sopenharmony_ci
493e5c31af7Sopenharmony_cistruct Instance
494e5c31af7Sopenharmony_ci{
495e5c31af7Sopenharmony_ci	typedef VkInstance Type;
496e5c31af7Sopenharmony_ci
497e5c31af7Sopenharmony_ci	struct Parameters
498e5c31af7Sopenharmony_ci	{
499e5c31af7Sopenharmony_ci		const vector<string>	instanceExtensions;
500e5c31af7Sopenharmony_ci
501e5c31af7Sopenharmony_ci		Parameters (void) {}
502e5c31af7Sopenharmony_ci
503e5c31af7Sopenharmony_ci		Parameters (vector<string>& extensions)
504e5c31af7Sopenharmony_ci			: instanceExtensions	(extensions)
505e5c31af7Sopenharmony_ci		{}
506e5c31af7Sopenharmony_ci	};
507e5c31af7Sopenharmony_ci
508e5c31af7Sopenharmony_ci	struct Resources
509e5c31af7Sopenharmony_ci	{
510e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
511e5c31af7Sopenharmony_ci	};
512e5c31af7Sopenharmony_ci
513e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
514e5c31af7Sopenharmony_ci	{
515e5c31af7Sopenharmony_ci		return getSafeObjectCount<Instance>(context, params, MAX_CONCURRENT_INSTANCES);
516e5c31af7Sopenharmony_ci	}
517e5c31af7Sopenharmony_ci
518e5c31af7Sopenharmony_ci	static Move<VkInstance> create (const Environment& env, const Resources&, const Parameters& params)
519e5c31af7Sopenharmony_ci	{
520e5c31af7Sopenharmony_ci		vector<const char*>					extensionNamePtrs;
521e5c31af7Sopenharmony_ci		const vector<VkExtensionProperties>	instanceExts = enumerateInstanceExtensionProperties(env.vkp, DE_NULL);
522e5c31af7Sopenharmony_ci		for (const auto& extName : params.instanceExtensions)
523e5c31af7Sopenharmony_ci		{
524e5c31af7Sopenharmony_ci			bool extNotInCore = !isCoreInstanceExtension(env.apiVersion, extName);
525e5c31af7Sopenharmony_ci			if (extNotInCore && !isExtensionStructSupported(instanceExts.begin(), instanceExts.end(), RequiredExtension(extName)))
526e5c31af7Sopenharmony_ci				TCU_THROW(NotSupportedError, (extName + " is not supported").c_str());
527e5c31af7Sopenharmony_ci
528e5c31af7Sopenharmony_ci			if (extNotInCore)
529e5c31af7Sopenharmony_ci				extensionNamePtrs.push_back(extName.c_str());
530e5c31af7Sopenharmony_ci		}
531e5c31af7Sopenharmony_ci
532e5c31af7Sopenharmony_ci		const VkApplicationInfo		appInfo			=
533e5c31af7Sopenharmony_ci		{
534e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_APPLICATION_INFO,
535e5c31af7Sopenharmony_ci			DE_NULL,
536e5c31af7Sopenharmony_ci			DE_NULL,							// pApplicationName
537e5c31af7Sopenharmony_ci			0u,									// applicationVersion
538e5c31af7Sopenharmony_ci			DE_NULL,							// pEngineName
539e5c31af7Sopenharmony_ci			0u,									// engineVersion
540e5c31af7Sopenharmony_ci			env.apiVersion
541e5c31af7Sopenharmony_ci		};
542e5c31af7Sopenharmony_ci
543e5c31af7Sopenharmony_ci		const VkInstanceCreateInfo	instanceInfo	=
544e5c31af7Sopenharmony_ci		{
545e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
546e5c31af7Sopenharmony_ci			DE_NULL,
547e5c31af7Sopenharmony_ci			(VkInstanceCreateFlags)0,
548e5c31af7Sopenharmony_ci			&appInfo,
549e5c31af7Sopenharmony_ci			0u,																// enabledLayerNameCount
550e5c31af7Sopenharmony_ci			DE_NULL,														// ppEnabledLayerNames
551e5c31af7Sopenharmony_ci			(deUint32)extensionNamePtrs.size(),								// enabledExtensionNameCount
552e5c31af7Sopenharmony_ci			extensionNamePtrs.empty() ? DE_NULL : &extensionNamePtrs[0],	// ppEnabledExtensionNames
553e5c31af7Sopenharmony_ci		};
554e5c31af7Sopenharmony_ci
555e5c31af7Sopenharmony_ci		return createInstance(env.vkp, &instanceInfo, env.allocationCallbacks);
556e5c31af7Sopenharmony_ci	}
557e5c31af7Sopenharmony_ci};
558e5c31af7Sopenharmony_ci
559e5c31af7Sopenharmony_cistruct Device
560e5c31af7Sopenharmony_ci{
561e5c31af7Sopenharmony_ci	typedef VkDevice Type;
562e5c31af7Sopenharmony_ci
563e5c31af7Sopenharmony_ci	struct Parameters
564e5c31af7Sopenharmony_ci	{
565e5c31af7Sopenharmony_ci		deUint32		deviceIndex;
566e5c31af7Sopenharmony_ci		VkQueueFlags	queueFlags;
567e5c31af7Sopenharmony_ci
568e5c31af7Sopenharmony_ci		Parameters (deUint32 deviceIndex_, VkQueueFlags queueFlags_)
569e5c31af7Sopenharmony_ci			: deviceIndex	(deviceIndex_)
570e5c31af7Sopenharmony_ci			, queueFlags	(queueFlags_)
571e5c31af7Sopenharmony_ci		{}
572e5c31af7Sopenharmony_ci	};
573e5c31af7Sopenharmony_ci
574e5c31af7Sopenharmony_ci	struct Resources
575e5c31af7Sopenharmony_ci	{
576e5c31af7Sopenharmony_ci		Dependency<Instance>	instance;
577e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
578e5c31af7Sopenharmony_ci		InstanceDriver			vki;
579e5c31af7Sopenharmony_ci#else
580e5c31af7Sopenharmony_ci		InstanceDriverSC		vki;
581e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
582e5c31af7Sopenharmony_ci
583e5c31af7Sopenharmony_ci		VkPhysicalDevice		physicalDevice;
584e5c31af7Sopenharmony_ci		deUint32				queueFamilyIndex;
585e5c31af7Sopenharmony_ci
586e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
587e5c31af7Sopenharmony_ci			: instance			(env, Instance::Parameters())
588e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
589e5c31af7Sopenharmony_ci			, vki(env.vkp, *instance.object)
590e5c31af7Sopenharmony_ci#else
591e5c31af7Sopenharmony_ci			, vki(env.vkp, *instance.object, env.commandLine, env.resourceInterface)
592e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
593e5c31af7Sopenharmony_ci			, physicalDevice	(0)
594e5c31af7Sopenharmony_ci			, queueFamilyIndex	(~0u)
595e5c31af7Sopenharmony_ci		{
596e5c31af7Sopenharmony_ci			{
597e5c31af7Sopenharmony_ci				const vector<VkPhysicalDevice>	physicalDevices	= enumeratePhysicalDevices(vki, *instance.object);
598e5c31af7Sopenharmony_ci
599e5c31af7Sopenharmony_ci				if (physicalDevices.size() <= (size_t)params.deviceIndex)
600e5c31af7Sopenharmony_ci					TCU_THROW(NotSupportedError, "Device not found");
601e5c31af7Sopenharmony_ci
602e5c31af7Sopenharmony_ci				physicalDevice = physicalDevices[params.deviceIndex];
603e5c31af7Sopenharmony_ci			}
604e5c31af7Sopenharmony_ci
605e5c31af7Sopenharmony_ci			{
606e5c31af7Sopenharmony_ci				const vector<VkQueueFamilyProperties>	queueProps		= getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
607e5c31af7Sopenharmony_ci				bool									foundMatching	= false;
608e5c31af7Sopenharmony_ci
609e5c31af7Sopenharmony_ci				for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++)
610e5c31af7Sopenharmony_ci				{
611e5c31af7Sopenharmony_ci					if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags)
612e5c31af7Sopenharmony_ci					{
613e5c31af7Sopenharmony_ci						queueFamilyIndex	= (deUint32)curQueueNdx;
614e5c31af7Sopenharmony_ci						foundMatching		= true;
615e5c31af7Sopenharmony_ci					}
616e5c31af7Sopenharmony_ci				}
617e5c31af7Sopenharmony_ci
618e5c31af7Sopenharmony_ci				if (!foundMatching)
619e5c31af7Sopenharmony_ci					TCU_THROW(NotSupportedError, "Matching queue not found");
620e5c31af7Sopenharmony_ci			}
621e5c31af7Sopenharmony_ci		}
622e5c31af7Sopenharmony_ci	};
623e5c31af7Sopenharmony_ci
624e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
625e5c31af7Sopenharmony_ci	{
626e5c31af7Sopenharmony_ci		return getSafeObjectCount<Device>(context, params, MAX_CONCURRENT_DEVICES);
627e5c31af7Sopenharmony_ci	}
628e5c31af7Sopenharmony_ci
629e5c31af7Sopenharmony_ci	static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters&)
630e5c31af7Sopenharmony_ci	{
631e5c31af7Sopenharmony_ci		const float	queuePriority	= 1.0;
632e5c31af7Sopenharmony_ci
633e5c31af7Sopenharmony_ci		const VkDeviceQueueCreateInfo	queues[]	=
634e5c31af7Sopenharmony_ci		{
635e5c31af7Sopenharmony_ci			{
636e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
637e5c31af7Sopenharmony_ci				DE_NULL,
638e5c31af7Sopenharmony_ci				(VkDeviceQueueCreateFlags)0,
639e5c31af7Sopenharmony_ci				res.queueFamilyIndex,
640e5c31af7Sopenharmony_ci				1u,									// queueCount
641e5c31af7Sopenharmony_ci				&queuePriority,						// pQueuePriorities
642e5c31af7Sopenharmony_ci			}
643e5c31af7Sopenharmony_ci		};
644e5c31af7Sopenharmony_ci
645e5c31af7Sopenharmony_ci		void* pNext									= DE_NULL;
646e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
647e5c31af7Sopenharmony_ci		VkDeviceObjectReservationCreateInfo memReservationInfo	= env.commandLine.isSubProcess() ? env.resourceInterface->getStatMax() : resetDeviceObjectReservationCreateInfo();
648e5c31af7Sopenharmony_ci		memReservationInfo.pNext								= pNext;
649e5c31af7Sopenharmony_ci		pNext													= &memReservationInfo;
650e5c31af7Sopenharmony_ci
651e5c31af7Sopenharmony_ci		VkPhysicalDeviceVulkanSC10Features sc10Features			= createDefaultSC10Features();
652e5c31af7Sopenharmony_ci		sc10Features.pNext										= pNext;
653e5c31af7Sopenharmony_ci		pNext													= &sc10Features;
654e5c31af7Sopenharmony_ci
655e5c31af7Sopenharmony_ci		VkPipelineCacheCreateInfo			pcCI;
656e5c31af7Sopenharmony_ci		std::vector<VkPipelinePoolSize>		poolSizes;
657e5c31af7Sopenharmony_ci		if (env.commandLine.isSubProcess())
658e5c31af7Sopenharmony_ci		{
659e5c31af7Sopenharmony_ci			if (env.resourceInterface->getCacheDataSize() > 0)
660e5c31af7Sopenharmony_ci			{
661e5c31af7Sopenharmony_ci				pcCI =
662e5c31af7Sopenharmony_ci				{
663e5c31af7Sopenharmony_ci					VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,		// VkStructureType				sType;
664e5c31af7Sopenharmony_ci					DE_NULL,											// const void*					pNext;
665e5c31af7Sopenharmony_ci					VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT |
666e5c31af7Sopenharmony_ci						VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT,	// VkPipelineCacheCreateFlags	flags;
667e5c31af7Sopenharmony_ci					env.resourceInterface->getCacheDataSize(),			// deUintptr					initialDataSize;
668e5c31af7Sopenharmony_ci					env.resourceInterface->getCacheData()				// const void*					pInitialData;
669e5c31af7Sopenharmony_ci				};
670e5c31af7Sopenharmony_ci				memReservationInfo.pipelineCacheCreateInfoCount		= 1;
671e5c31af7Sopenharmony_ci				memReservationInfo.pPipelineCacheCreateInfos		= &pcCI;
672e5c31af7Sopenharmony_ci			}
673e5c31af7Sopenharmony_ci
674e5c31af7Sopenharmony_ci			poolSizes							= env.resourceInterface->getPipelinePoolSizes();
675e5c31af7Sopenharmony_ci			if (!poolSizes.empty())
676e5c31af7Sopenharmony_ci			{
677e5c31af7Sopenharmony_ci				memReservationInfo.pipelinePoolSizeCount			= deUint32(poolSizes.size());
678e5c31af7Sopenharmony_ci				memReservationInfo.pPipelinePoolSizes				= poolSizes.data();
679e5c31af7Sopenharmony_ci			}
680e5c31af7Sopenharmony_ci		}
681e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
682e5c31af7Sopenharmony_ci
683e5c31af7Sopenharmony_ci		VkPhysicalDeviceFeatures enabledFeatures = getPhysicalDeviceFeatures(res.vki, res.physicalDevice);
684e5c31af7Sopenharmony_ci
685e5c31af7Sopenharmony_ci		const VkDeviceCreateInfo		deviceInfo	=
686e5c31af7Sopenharmony_ci		{
687e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
688e5c31af7Sopenharmony_ci			pNext,
689e5c31af7Sopenharmony_ci			(VkDeviceCreateFlags)0,
690e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(queues),
691e5c31af7Sopenharmony_ci			queues,
692e5c31af7Sopenharmony_ci			0u,										// enabledLayerNameCount
693e5c31af7Sopenharmony_ci			DE_NULL,								// ppEnabledLayerNames
694e5c31af7Sopenharmony_ci			0u,										// enabledExtensionNameCount
695e5c31af7Sopenharmony_ci			DE_NULL,								// ppEnabledExtensionNames
696e5c31af7Sopenharmony_ci			&enabledFeatures,						// pEnabledFeatures
697e5c31af7Sopenharmony_ci		};
698e5c31af7Sopenharmony_ci
699e5c31af7Sopenharmony_ci		return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
700e5c31af7Sopenharmony_ci	}
701e5c31af7Sopenharmony_ci};
702e5c31af7Sopenharmony_ci
703e5c31af7Sopenharmony_ci
704e5c31af7Sopenharmony_cistruct DeviceGroup
705e5c31af7Sopenharmony_ci{
706e5c31af7Sopenharmony_ci	typedef VkDevice Type;
707e5c31af7Sopenharmony_ci
708e5c31af7Sopenharmony_ci	struct Parameters
709e5c31af7Sopenharmony_ci	{
710e5c31af7Sopenharmony_ci		deUint32		deviceGroupIndex;
711e5c31af7Sopenharmony_ci		deUint32		deviceIndex;
712e5c31af7Sopenharmony_ci		VkQueueFlags	queueFlags;
713e5c31af7Sopenharmony_ci
714e5c31af7Sopenharmony_ci		Parameters (deUint32 deviceGroupIndex_, deUint32 deviceIndex_, VkQueueFlags queueFlags_)
715e5c31af7Sopenharmony_ci			: deviceGroupIndex	(deviceGroupIndex_)
716e5c31af7Sopenharmony_ci			, deviceIndex		(deviceIndex_)
717e5c31af7Sopenharmony_ci			, queueFlags		(queueFlags_)
718e5c31af7Sopenharmony_ci		{}
719e5c31af7Sopenharmony_ci	};
720e5c31af7Sopenharmony_ci
721e5c31af7Sopenharmony_ci	struct Resources
722e5c31af7Sopenharmony_ci	{
723e5c31af7Sopenharmony_ci		vector<string>				extensions;
724e5c31af7Sopenharmony_ci		Dependency<Instance>		instance;
725e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
726e5c31af7Sopenharmony_ci		InstanceDriver				vki;
727e5c31af7Sopenharmony_ci#else
728e5c31af7Sopenharmony_ci		InstanceDriverSC			vki;
729e5c31af7Sopenharmony_ci#endif
730e5c31af7Sopenharmony_ci		vector<VkPhysicalDevice>	physicalDevices;
731e5c31af7Sopenharmony_ci		deUint32					physicalDeviceCount;
732e5c31af7Sopenharmony_ci		deUint32					queueFamilyIndex;
733e5c31af7Sopenharmony_ci
734e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
735e5c31af7Sopenharmony_ci			: extensions			(1, "VK_KHR_device_group_creation")
736e5c31af7Sopenharmony_ci			, instance				(env, Instance::Parameters(extensions))
737e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
738e5c31af7Sopenharmony_ci			, vki					(env.vkp, *instance.object)
739e5c31af7Sopenharmony_ci#else
740e5c31af7Sopenharmony_ci			, vki					(env.vkp, *instance.object, env.commandLine, env.resourceInterface)
741e5c31af7Sopenharmony_ci#endif
742e5c31af7Sopenharmony_ci			, physicalDeviceCount	(0)
743e5c31af7Sopenharmony_ci			, queueFamilyIndex		(~0u)
744e5c31af7Sopenharmony_ci		{
745e5c31af7Sopenharmony_ci			{
746e5c31af7Sopenharmony_ci				const vector<VkPhysicalDeviceGroupProperties> devGroupProperties = enumeratePhysicalDeviceGroups(vki, *instance.object);
747e5c31af7Sopenharmony_ci
748e5c31af7Sopenharmony_ci				if (devGroupProperties.size() <= (size_t)params.deviceGroupIndex)
749e5c31af7Sopenharmony_ci					TCU_THROW(NotSupportedError, "Device Group not found");
750e5c31af7Sopenharmony_ci
751e5c31af7Sopenharmony_ci				physicalDeviceCount	= devGroupProperties[params.deviceGroupIndex].physicalDeviceCount;
752e5c31af7Sopenharmony_ci				physicalDevices.resize(physicalDeviceCount);
753e5c31af7Sopenharmony_ci
754e5c31af7Sopenharmony_ci				for (deUint32 physicalDeviceIdx = 0; physicalDeviceIdx < physicalDeviceCount; physicalDeviceIdx++)
755e5c31af7Sopenharmony_ci					physicalDevices[physicalDeviceIdx] = devGroupProperties[params.deviceGroupIndex].physicalDevices[physicalDeviceIdx];
756e5c31af7Sopenharmony_ci			}
757e5c31af7Sopenharmony_ci
758e5c31af7Sopenharmony_ci			{
759e5c31af7Sopenharmony_ci				const vector<VkQueueFamilyProperties>	queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevices[params.deviceIndex]);
760e5c31af7Sopenharmony_ci				bool									foundMatching = false;
761e5c31af7Sopenharmony_ci
762e5c31af7Sopenharmony_ci				for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++)
763e5c31af7Sopenharmony_ci				{
764e5c31af7Sopenharmony_ci					if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags)
765e5c31af7Sopenharmony_ci					{
766e5c31af7Sopenharmony_ci						queueFamilyIndex = (deUint32)curQueueNdx;
767e5c31af7Sopenharmony_ci						foundMatching = true;
768e5c31af7Sopenharmony_ci					}
769e5c31af7Sopenharmony_ci				}
770e5c31af7Sopenharmony_ci
771e5c31af7Sopenharmony_ci				if (!foundMatching)
772e5c31af7Sopenharmony_ci					TCU_THROW(NotSupportedError, "Matching queue not found");
773e5c31af7Sopenharmony_ci			}
774e5c31af7Sopenharmony_ci		}
775e5c31af7Sopenharmony_ci	};
776e5c31af7Sopenharmony_ci
777e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
778e5c31af7Sopenharmony_ci	{
779e5c31af7Sopenharmony_ci		return getSafeObjectCount<DeviceGroup>(context, params, MAX_CONCURRENT_DEVICES);
780e5c31af7Sopenharmony_ci	}
781e5c31af7Sopenharmony_ci
782e5c31af7Sopenharmony_ci	static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters& params)
783e5c31af7Sopenharmony_ci	{
784e5c31af7Sopenharmony_ci		const float	queuePriority = 1.0;
785e5c31af7Sopenharmony_ci
786e5c31af7Sopenharmony_ci		const VkDeviceQueueCreateInfo	queues[] =
787e5c31af7Sopenharmony_ci		{
788e5c31af7Sopenharmony_ci			{
789e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
790e5c31af7Sopenharmony_ci				DE_NULL,							// pNext
791e5c31af7Sopenharmony_ci				(VkDeviceQueueCreateFlags)0,		// flags
792e5c31af7Sopenharmony_ci				res.queueFamilyIndex,				// queueFamilyIndex
793e5c31af7Sopenharmony_ci				1u,									// queueCount
794e5c31af7Sopenharmony_ci				&queuePriority,						// pQueuePriorities
795e5c31af7Sopenharmony_ci			}
796e5c31af7Sopenharmony_ci		};
797e5c31af7Sopenharmony_ci
798e5c31af7Sopenharmony_ci		VkDeviceGroupDeviceCreateInfo deviceGroupInfo =
799e5c31af7Sopenharmony_ci		{
800e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO,	//stype
801e5c31af7Sopenharmony_ci			DE_NULL,											//pNext
802e5c31af7Sopenharmony_ci			res.physicalDeviceCount,							//physicalDeviceCount
803e5c31af7Sopenharmony_ci			res.physicalDevices.data()							//physicalDevices
804e5c31af7Sopenharmony_ci		};
805e5c31af7Sopenharmony_ci
806e5c31af7Sopenharmony_ci		void* pNext									= &deviceGroupInfo;
807e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
808e5c31af7Sopenharmony_ci		VkDeviceObjectReservationCreateInfo memReservationInfo	= env.commandLine.isSubProcess() ? env.resourceInterface->getStatMax() : resetDeviceObjectReservationCreateInfo();
809e5c31af7Sopenharmony_ci		memReservationInfo.pNext								= pNext;
810e5c31af7Sopenharmony_ci		pNext													= &memReservationInfo;
811e5c31af7Sopenharmony_ci
812e5c31af7Sopenharmony_ci		VkPhysicalDeviceVulkanSC10Features sc10Features			= createDefaultSC10Features();
813e5c31af7Sopenharmony_ci		sc10Features.pNext										= pNext;
814e5c31af7Sopenharmony_ci		pNext													= &sc10Features;
815e5c31af7Sopenharmony_ci
816e5c31af7Sopenharmony_ci		VkPipelineCacheCreateInfo			pcCI;
817e5c31af7Sopenharmony_ci		std::vector<VkPipelinePoolSize>		poolSizes;
818e5c31af7Sopenharmony_ci		if (env.commandLine.isSubProcess())
819e5c31af7Sopenharmony_ci		{
820e5c31af7Sopenharmony_ci			if (env.resourceInterface->getCacheDataSize() > 0)
821e5c31af7Sopenharmony_ci			{
822e5c31af7Sopenharmony_ci				pcCI =
823e5c31af7Sopenharmony_ci				{
824e5c31af7Sopenharmony_ci					VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,		// VkStructureType				sType;
825e5c31af7Sopenharmony_ci					DE_NULL,											// const void*					pNext;
826e5c31af7Sopenharmony_ci					VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT |
827e5c31af7Sopenharmony_ci						VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT,	// VkPipelineCacheCreateFlags	flags;
828e5c31af7Sopenharmony_ci					env.resourceInterface->getCacheDataSize(),			// deUintptr					initialDataSize;
829e5c31af7Sopenharmony_ci					env.resourceInterface->getCacheData()				// const void*					pInitialData;
830e5c31af7Sopenharmony_ci				};
831e5c31af7Sopenharmony_ci				memReservationInfo.pipelineCacheCreateInfoCount		= 1;
832e5c31af7Sopenharmony_ci				memReservationInfo.pPipelineCacheCreateInfos		= &pcCI;
833e5c31af7Sopenharmony_ci			}
834e5c31af7Sopenharmony_ci
835e5c31af7Sopenharmony_ci			poolSizes							= env.resourceInterface->getPipelinePoolSizes();
836e5c31af7Sopenharmony_ci			if (!poolSizes.empty())
837e5c31af7Sopenharmony_ci			{
838e5c31af7Sopenharmony_ci				memReservationInfo.pipelinePoolSizeCount			= deUint32(poolSizes.size());
839e5c31af7Sopenharmony_ci				memReservationInfo.pPipelinePoolSizes				= poolSizes.data();
840e5c31af7Sopenharmony_ci			}
841e5c31af7Sopenharmony_ci		}
842e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
843e5c31af7Sopenharmony_ci
844e5c31af7Sopenharmony_ci		VkPhysicalDeviceFeatures enabledFeatures = getPhysicalDeviceFeatures(res.vki, res.physicalDevices[params.deviceIndex]);
845e5c31af7Sopenharmony_ci
846e5c31af7Sopenharmony_ci		const VkDeviceCreateInfo			deviceGroupCreateInfo =
847e5c31af7Sopenharmony_ci		{
848e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
849e5c31af7Sopenharmony_ci			pNext,
850e5c31af7Sopenharmony_ci			(VkDeviceCreateFlags)0,
851e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(queues),
852e5c31af7Sopenharmony_ci			queues,
853e5c31af7Sopenharmony_ci			0u,													// enabledLayerNameCount
854e5c31af7Sopenharmony_ci			DE_NULL,											// ppEnabledLayerNames
855e5c31af7Sopenharmony_ci			0u,													// enabledExtensionNameCount
856e5c31af7Sopenharmony_ci			DE_NULL,											// ppEnabledExtensionNames
857e5c31af7Sopenharmony_ci			&enabledFeatures,									// pEnabledFeatures
858e5c31af7Sopenharmony_ci		};
859e5c31af7Sopenharmony_ci
860e5c31af7Sopenharmony_ci		return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks);
861e5c31af7Sopenharmony_ci	}
862e5c31af7Sopenharmony_ci};
863e5c31af7Sopenharmony_ci
864e5c31af7Sopenharmony_cistruct DeviceMemory
865e5c31af7Sopenharmony_ci{
866e5c31af7Sopenharmony_ci	typedef VkDeviceMemory Type;
867e5c31af7Sopenharmony_ci
868e5c31af7Sopenharmony_ci	struct Parameters
869e5c31af7Sopenharmony_ci	{
870e5c31af7Sopenharmony_ci		VkDeviceSize	size;
871e5c31af7Sopenharmony_ci		deUint32		memoryTypeIndex;
872e5c31af7Sopenharmony_ci
873e5c31af7Sopenharmony_ci		Parameters (VkDeviceSize size_, deUint32 memoryTypeIndex_)
874e5c31af7Sopenharmony_ci			: size				(size_)
875e5c31af7Sopenharmony_ci			, memoryTypeIndex	(memoryTypeIndex_)
876e5c31af7Sopenharmony_ci		{
877e5c31af7Sopenharmony_ci			DE_ASSERT(memoryTypeIndex < VK_MAX_MEMORY_TYPES);
878e5c31af7Sopenharmony_ci		}
879e5c31af7Sopenharmony_ci	};
880e5c31af7Sopenharmony_ci
881e5c31af7Sopenharmony_ci	struct Resources
882e5c31af7Sopenharmony_ci	{
883e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
884e5c31af7Sopenharmony_ci	};
885e5c31af7Sopenharmony_ci
886e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
887e5c31af7Sopenharmony_ci	{
888e5c31af7Sopenharmony_ci		const VkDeviceSize	deviceMemoryUsage	= params.size + getPageTableSize(context, params.size);
889e5c31af7Sopenharmony_ci
890e5c31af7Sopenharmony_ci		return getSafeObjectCount<DeviceMemory>(context,
891e5c31af7Sopenharmony_ci												params,
892e5c31af7Sopenharmony_ci												de::min(context.getDeviceProperties().limits.maxMemoryAllocationCount,
893e5c31af7Sopenharmony_ci														(deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS),
894e5c31af7Sopenharmony_ci												deviceMemoryUsage);
895e5c31af7Sopenharmony_ci	}
896e5c31af7Sopenharmony_ci
897e5c31af7Sopenharmony_ci	static Move<VkDeviceMemory> create (const Environment& env, const Resources&, const Parameters& params)
898e5c31af7Sopenharmony_ci	{
899e5c31af7Sopenharmony_ci		const VkMemoryAllocateInfo	allocInfo	=
900e5c31af7Sopenharmony_ci		{
901e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
902e5c31af7Sopenharmony_ci			DE_NULL,
903e5c31af7Sopenharmony_ci			params.size,
904e5c31af7Sopenharmony_ci			params.memoryTypeIndex
905e5c31af7Sopenharmony_ci		};
906e5c31af7Sopenharmony_ci
907e5c31af7Sopenharmony_ci		return allocateMemory(env.vkd, env.device, &allocInfo, env.allocationCallbacks);
908e5c31af7Sopenharmony_ci	}
909e5c31af7Sopenharmony_ci};
910e5c31af7Sopenharmony_ci
911e5c31af7Sopenharmony_ciDeviceMemory::Parameters getDeviceMemoryParameters (const VkMemoryRequirements& memReqs)
912e5c31af7Sopenharmony_ci{
913e5c31af7Sopenharmony_ci	return DeviceMemory::Parameters(memReqs.size, deCtz32(memReqs.memoryTypeBits));
914e5c31af7Sopenharmony_ci}
915e5c31af7Sopenharmony_ci
916e5c31af7Sopenharmony_ciDeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkImage image)
917e5c31af7Sopenharmony_ci{
918e5c31af7Sopenharmony_ci	return getDeviceMemoryParameters(getImageMemoryRequirements(env.vkd, env.device, image));
919e5c31af7Sopenharmony_ci}
920e5c31af7Sopenharmony_ci
921e5c31af7Sopenharmony_ciDeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkBuffer image)
922e5c31af7Sopenharmony_ci{
923e5c31af7Sopenharmony_ci	return getDeviceMemoryParameters(getBufferMemoryRequirements(env.vkd, env.device, image));
924e5c31af7Sopenharmony_ci}
925e5c31af7Sopenharmony_ci
926e5c31af7Sopenharmony_cistruct Buffer
927e5c31af7Sopenharmony_ci{
928e5c31af7Sopenharmony_ci	typedef VkBuffer Type;
929e5c31af7Sopenharmony_ci
930e5c31af7Sopenharmony_ci	struct Parameters
931e5c31af7Sopenharmony_ci	{
932e5c31af7Sopenharmony_ci		VkDeviceSize		size;
933e5c31af7Sopenharmony_ci		VkBufferUsageFlags	usage;
934e5c31af7Sopenharmony_ci
935e5c31af7Sopenharmony_ci		Parameters (VkDeviceSize		size_,
936e5c31af7Sopenharmony_ci					VkBufferUsageFlags	usage_)
937e5c31af7Sopenharmony_ci			: size	(size_)
938e5c31af7Sopenharmony_ci			, usage	(usage_)
939e5c31af7Sopenharmony_ci		{}
940e5c31af7Sopenharmony_ci	};
941e5c31af7Sopenharmony_ci
942e5c31af7Sopenharmony_ci	struct Resources
943e5c31af7Sopenharmony_ci	{
944e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
945e5c31af7Sopenharmony_ci	};
946e5c31af7Sopenharmony_ci
947e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
948e5c31af7Sopenharmony_ci	{
949e5c31af7Sopenharmony_ci		const Environment			env		(context, 1u);
950e5c31af7Sopenharmony_ci		const Resources				res		(env, params);
951e5c31af7Sopenharmony_ci		const Unique<VkBuffer>		buffer	(create(env, res, params));
952e5c31af7Sopenharmony_ci		const VkMemoryRequirements	memReqs	= getBufferMemoryRequirements(env.vkd, env.device, *buffer);
953e5c31af7Sopenharmony_ci
954e5c31af7Sopenharmony_ci		return getSafeObjectCount<Buffer>(context,
955e5c31af7Sopenharmony_ci										  params,
956e5c31af7Sopenharmony_ci										  DEFAULT_MAX_CONCURRENT_OBJECTS,
957e5c31af7Sopenharmony_ci										  getPageTableSize(context, memReqs.size));
958e5c31af7Sopenharmony_ci	}
959e5c31af7Sopenharmony_ci
960e5c31af7Sopenharmony_ci	static Move<VkBuffer> create (const Environment& env, const Resources&, const Parameters& params)
961e5c31af7Sopenharmony_ci	{
962e5c31af7Sopenharmony_ci		const VkBufferCreateInfo	bufferInfo	=
963e5c31af7Sopenharmony_ci		{
964e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
965e5c31af7Sopenharmony_ci			DE_NULL,
966e5c31af7Sopenharmony_ci			(VkBufferCreateFlags)0,
967e5c31af7Sopenharmony_ci			params.size,
968e5c31af7Sopenharmony_ci			params.usage,
969e5c31af7Sopenharmony_ci			VK_SHARING_MODE_EXCLUSIVE,
970e5c31af7Sopenharmony_ci			1u,
971e5c31af7Sopenharmony_ci			&env.queueFamilyIndex
972e5c31af7Sopenharmony_ci		};
973e5c31af7Sopenharmony_ci
974e5c31af7Sopenharmony_ci		return createBuffer(env.vkd, env.device, &bufferInfo, env.allocationCallbacks);
975e5c31af7Sopenharmony_ci	}
976e5c31af7Sopenharmony_ci};
977e5c31af7Sopenharmony_ci
978e5c31af7Sopenharmony_cistruct BufferView
979e5c31af7Sopenharmony_ci{
980e5c31af7Sopenharmony_ci	typedef VkBufferView Type;
981e5c31af7Sopenharmony_ci
982e5c31af7Sopenharmony_ci	struct Parameters
983e5c31af7Sopenharmony_ci	{
984e5c31af7Sopenharmony_ci		Buffer::Parameters	buffer;
985e5c31af7Sopenharmony_ci		VkFormat			format;
986e5c31af7Sopenharmony_ci		VkDeviceSize		offset;
987e5c31af7Sopenharmony_ci		VkDeviceSize		range;
988e5c31af7Sopenharmony_ci
989e5c31af7Sopenharmony_ci		Parameters (const Buffer::Parameters&	buffer_,
990e5c31af7Sopenharmony_ci					VkFormat					format_,
991e5c31af7Sopenharmony_ci					VkDeviceSize				offset_,
992e5c31af7Sopenharmony_ci					VkDeviceSize				range_)
993e5c31af7Sopenharmony_ci			: buffer	(buffer_)
994e5c31af7Sopenharmony_ci			, format	(format_)
995e5c31af7Sopenharmony_ci			, offset	(offset_)
996e5c31af7Sopenharmony_ci			, range		(range_)
997e5c31af7Sopenharmony_ci		{}
998e5c31af7Sopenharmony_ci	};
999e5c31af7Sopenharmony_ci
1000e5c31af7Sopenharmony_ci	struct Resources
1001e5c31af7Sopenharmony_ci	{
1002e5c31af7Sopenharmony_ci		Dependency<Buffer>			buffer;
1003e5c31af7Sopenharmony_ci		Dependency<DeviceMemory>	memory;
1004e5c31af7Sopenharmony_ci
1005e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
1006e5c31af7Sopenharmony_ci			: buffer(env, params.buffer)
1007e5c31af7Sopenharmony_ci			, memory(env, getDeviceMemoryParameters(env, *buffer.object))
1008e5c31af7Sopenharmony_ci		{
1009e5c31af7Sopenharmony_ci			VK_CHECK(env.vkd.bindBufferMemory(env.device, *buffer.object, *memory.object, 0));
1010e5c31af7Sopenharmony_ci		}
1011e5c31af7Sopenharmony_ci	};
1012e5c31af7Sopenharmony_ci
1013e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1014e5c31af7Sopenharmony_ci	{
1015e5c31af7Sopenharmony_ci		return getSafeObjectCount<BufferView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1016e5c31af7Sopenharmony_ci	}
1017e5c31af7Sopenharmony_ci
1018e5c31af7Sopenharmony_ci	static Move<VkBufferView> create (const Environment& env, const Resources& res, const Parameters& params)
1019e5c31af7Sopenharmony_ci	{
1020e5c31af7Sopenharmony_ci		const VkBufferViewCreateInfo	bufferViewInfo	=
1021e5c31af7Sopenharmony_ci		{
1022e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,
1023e5c31af7Sopenharmony_ci			DE_NULL,
1024e5c31af7Sopenharmony_ci			(VkBufferViewCreateFlags)0,
1025e5c31af7Sopenharmony_ci			*res.buffer.object,
1026e5c31af7Sopenharmony_ci			params.format,
1027e5c31af7Sopenharmony_ci			params.offset,
1028e5c31af7Sopenharmony_ci			params.range
1029e5c31af7Sopenharmony_ci		};
1030e5c31af7Sopenharmony_ci
1031e5c31af7Sopenharmony_ci		return createBufferView(env.vkd, env.device, &bufferViewInfo, env.allocationCallbacks);
1032e5c31af7Sopenharmony_ci	}
1033e5c31af7Sopenharmony_ci};
1034e5c31af7Sopenharmony_ci
1035e5c31af7Sopenharmony_cistruct Image
1036e5c31af7Sopenharmony_ci{
1037e5c31af7Sopenharmony_ci	typedef VkImage Type;
1038e5c31af7Sopenharmony_ci
1039e5c31af7Sopenharmony_ci	struct Parameters
1040e5c31af7Sopenharmony_ci	{
1041e5c31af7Sopenharmony_ci		VkImageCreateFlags		flags;
1042e5c31af7Sopenharmony_ci		VkImageType				imageType;
1043e5c31af7Sopenharmony_ci		VkFormat				format;
1044e5c31af7Sopenharmony_ci		VkExtent3D				extent;
1045e5c31af7Sopenharmony_ci		deUint32				mipLevels;
1046e5c31af7Sopenharmony_ci		deUint32				arraySize;
1047e5c31af7Sopenharmony_ci		VkSampleCountFlagBits	samples;
1048e5c31af7Sopenharmony_ci		VkImageTiling			tiling;
1049e5c31af7Sopenharmony_ci		VkImageUsageFlags		usage;
1050e5c31af7Sopenharmony_ci		VkImageLayout			initialLayout;
1051e5c31af7Sopenharmony_ci
1052e5c31af7Sopenharmony_ci		Parameters (VkImageCreateFlags		flags_,
1053e5c31af7Sopenharmony_ci					VkImageType				imageType_,
1054e5c31af7Sopenharmony_ci					VkFormat				format_,
1055e5c31af7Sopenharmony_ci					VkExtent3D				extent_,
1056e5c31af7Sopenharmony_ci					deUint32				mipLevels_,
1057e5c31af7Sopenharmony_ci					deUint32				arraySize_,
1058e5c31af7Sopenharmony_ci					VkSampleCountFlagBits	samples_,
1059e5c31af7Sopenharmony_ci					VkImageTiling			tiling_,
1060e5c31af7Sopenharmony_ci					VkImageUsageFlags		usage_,
1061e5c31af7Sopenharmony_ci					VkImageLayout			initialLayout_)
1062e5c31af7Sopenharmony_ci			: flags			(flags_)
1063e5c31af7Sopenharmony_ci			, imageType		(imageType_)
1064e5c31af7Sopenharmony_ci			, format		(format_)
1065e5c31af7Sopenharmony_ci			, extent		(extent_)
1066e5c31af7Sopenharmony_ci			, mipLevels		(mipLevels_)
1067e5c31af7Sopenharmony_ci			, arraySize		(arraySize_)
1068e5c31af7Sopenharmony_ci			, samples		(samples_)
1069e5c31af7Sopenharmony_ci			, tiling		(tiling_)
1070e5c31af7Sopenharmony_ci			, usage			(usage_)
1071e5c31af7Sopenharmony_ci			, initialLayout	(initialLayout_)
1072e5c31af7Sopenharmony_ci		{}
1073e5c31af7Sopenharmony_ci	};
1074e5c31af7Sopenharmony_ci
1075e5c31af7Sopenharmony_ci	struct Resources
1076e5c31af7Sopenharmony_ci	{
1077e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1078e5c31af7Sopenharmony_ci	};
1079e5c31af7Sopenharmony_ci
1080e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1081e5c31af7Sopenharmony_ci	{
1082e5c31af7Sopenharmony_ci		const Environment			env		(context, 1u);
1083e5c31af7Sopenharmony_ci		const Resources				res		(env, params);
1084e5c31af7Sopenharmony_ci		const Unique<VkImage>		image	(create(env, res, params));
1085e5c31af7Sopenharmony_ci		const VkMemoryRequirements	memReqs	= getImageMemoryRequirements(env.vkd, env.device, *image);
1086e5c31af7Sopenharmony_ci
1087e5c31af7Sopenharmony_ci		return getSafeObjectCount<Image>(context,
1088e5c31af7Sopenharmony_ci										 params,
1089e5c31af7Sopenharmony_ci										 DEFAULT_MAX_CONCURRENT_OBJECTS,
1090e5c31af7Sopenharmony_ci										 getPageTableSize(context, memReqs.size));
1091e5c31af7Sopenharmony_ci	}
1092e5c31af7Sopenharmony_ci
1093e5c31af7Sopenharmony_ci	static Move<VkImage> create (const Environment& env, const Resources&, const Parameters& params)
1094e5c31af7Sopenharmony_ci	{
1095e5c31af7Sopenharmony_ci		const VkImageCreateInfo		imageInfo	=
1096e5c31af7Sopenharmony_ci		{
1097e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1098e5c31af7Sopenharmony_ci			DE_NULL,
1099e5c31af7Sopenharmony_ci			params.flags,
1100e5c31af7Sopenharmony_ci			params.imageType,
1101e5c31af7Sopenharmony_ci			params.format,
1102e5c31af7Sopenharmony_ci			params.extent,
1103e5c31af7Sopenharmony_ci			params.mipLevels,
1104e5c31af7Sopenharmony_ci			params.arraySize,
1105e5c31af7Sopenharmony_ci			params.samples,
1106e5c31af7Sopenharmony_ci			params.tiling,
1107e5c31af7Sopenharmony_ci			params.usage,
1108e5c31af7Sopenharmony_ci			VK_SHARING_MODE_EXCLUSIVE,		// sharingMode
1109e5c31af7Sopenharmony_ci			1u,								// queueFamilyIndexCount
1110e5c31af7Sopenharmony_ci			&env.queueFamilyIndex,			// pQueueFamilyIndices
1111e5c31af7Sopenharmony_ci			params.initialLayout
1112e5c31af7Sopenharmony_ci		};
1113e5c31af7Sopenharmony_ci
1114e5c31af7Sopenharmony_ci		return createImage(env.vkd, env.device, &imageInfo, env.allocationCallbacks);
1115e5c31af7Sopenharmony_ci	}
1116e5c31af7Sopenharmony_ci};
1117e5c31af7Sopenharmony_ci
1118e5c31af7Sopenharmony_cistruct ImageView
1119e5c31af7Sopenharmony_ci{
1120e5c31af7Sopenharmony_ci	typedef VkImageView Type;
1121e5c31af7Sopenharmony_ci
1122e5c31af7Sopenharmony_ci	struct Parameters
1123e5c31af7Sopenharmony_ci	{
1124e5c31af7Sopenharmony_ci		Image::Parameters		image;
1125e5c31af7Sopenharmony_ci		VkImageViewType			viewType;
1126e5c31af7Sopenharmony_ci		VkFormat				format;
1127e5c31af7Sopenharmony_ci		VkComponentMapping		components;
1128e5c31af7Sopenharmony_ci		VkImageSubresourceRange	subresourceRange;
1129e5c31af7Sopenharmony_ci
1130e5c31af7Sopenharmony_ci		Parameters (const Image::Parameters&	image_,
1131e5c31af7Sopenharmony_ci					VkImageViewType				viewType_,
1132e5c31af7Sopenharmony_ci					VkFormat					format_,
1133e5c31af7Sopenharmony_ci					VkComponentMapping			components_,
1134e5c31af7Sopenharmony_ci					VkImageSubresourceRange		subresourceRange_)
1135e5c31af7Sopenharmony_ci			: image				(image_)
1136e5c31af7Sopenharmony_ci			, viewType			(viewType_)
1137e5c31af7Sopenharmony_ci			, format			(format_)
1138e5c31af7Sopenharmony_ci			, components		(components_)
1139e5c31af7Sopenharmony_ci			, subresourceRange	(subresourceRange_)
1140e5c31af7Sopenharmony_ci		{}
1141e5c31af7Sopenharmony_ci	};
1142e5c31af7Sopenharmony_ci
1143e5c31af7Sopenharmony_ci	struct Resources
1144e5c31af7Sopenharmony_ci	{
1145e5c31af7Sopenharmony_ci		Dependency<Image>			image;
1146e5c31af7Sopenharmony_ci		Dependency<DeviceMemory>	memory;
1147e5c31af7Sopenharmony_ci
1148e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
1149e5c31af7Sopenharmony_ci			: image	(env, params.image)
1150e5c31af7Sopenharmony_ci			, memory(env, getDeviceMemoryParameters(env, *image.object))
1151e5c31af7Sopenharmony_ci		{
1152e5c31af7Sopenharmony_ci			VK_CHECK(env.vkd.bindImageMemory(env.device, *image.object, *memory.object, 0));
1153e5c31af7Sopenharmony_ci		}
1154e5c31af7Sopenharmony_ci	};
1155e5c31af7Sopenharmony_ci
1156e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1157e5c31af7Sopenharmony_ci	{
1158e5c31af7Sopenharmony_ci		return getSafeObjectCount<ImageView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1159e5c31af7Sopenharmony_ci	}
1160e5c31af7Sopenharmony_ci
1161e5c31af7Sopenharmony_ci	static Move<VkImageView> create (const Environment& env, const Resources& res, const Parameters& params)
1162e5c31af7Sopenharmony_ci	{
1163e5c31af7Sopenharmony_ci		const VkImageViewCreateInfo	imageViewInfo	=
1164e5c31af7Sopenharmony_ci		{
1165e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1166e5c31af7Sopenharmony_ci			DE_NULL,
1167e5c31af7Sopenharmony_ci			(VkImageViewCreateFlags)0,
1168e5c31af7Sopenharmony_ci			*res.image.object,
1169e5c31af7Sopenharmony_ci			params.viewType,
1170e5c31af7Sopenharmony_ci			params.format,
1171e5c31af7Sopenharmony_ci			params.components,
1172e5c31af7Sopenharmony_ci			params.subresourceRange,
1173e5c31af7Sopenharmony_ci		};
1174e5c31af7Sopenharmony_ci
1175e5c31af7Sopenharmony_ci		return createImageView(env.vkd, env.device, &imageViewInfo, env.allocationCallbacks);
1176e5c31af7Sopenharmony_ci	}
1177e5c31af7Sopenharmony_ci};
1178e5c31af7Sopenharmony_ci
1179e5c31af7Sopenharmony_cistruct Semaphore
1180e5c31af7Sopenharmony_ci{
1181e5c31af7Sopenharmony_ci	typedef VkSemaphore Type;
1182e5c31af7Sopenharmony_ci
1183e5c31af7Sopenharmony_ci	struct Parameters
1184e5c31af7Sopenharmony_ci	{
1185e5c31af7Sopenharmony_ci		VkSemaphoreCreateFlags	flags;
1186e5c31af7Sopenharmony_ci
1187e5c31af7Sopenharmony_ci		Parameters (VkSemaphoreCreateFlags flags_)
1188e5c31af7Sopenharmony_ci			: flags(flags_)
1189e5c31af7Sopenharmony_ci		{}
1190e5c31af7Sopenharmony_ci	};
1191e5c31af7Sopenharmony_ci
1192e5c31af7Sopenharmony_ci	struct Resources
1193e5c31af7Sopenharmony_ci	{
1194e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1195e5c31af7Sopenharmony_ci	};
1196e5c31af7Sopenharmony_ci
1197e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1198e5c31af7Sopenharmony_ci	{
1199e5c31af7Sopenharmony_ci		return getSafeObjectCount<Semaphore>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
1200e5c31af7Sopenharmony_ci	}
1201e5c31af7Sopenharmony_ci
1202e5c31af7Sopenharmony_ci	static Move<VkSemaphore> create (const Environment& env, const Resources&, const Parameters& params)
1203e5c31af7Sopenharmony_ci	{
1204e5c31af7Sopenharmony_ci		const VkSemaphoreCreateInfo	semaphoreInfo	=
1205e5c31af7Sopenharmony_ci		{
1206e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
1207e5c31af7Sopenharmony_ci			DE_NULL,
1208e5c31af7Sopenharmony_ci			params.flags
1209e5c31af7Sopenharmony_ci		};
1210e5c31af7Sopenharmony_ci
1211e5c31af7Sopenharmony_ci		return createSemaphore(env.vkd, env.device, &semaphoreInfo, env.allocationCallbacks);
1212e5c31af7Sopenharmony_ci	}
1213e5c31af7Sopenharmony_ci};
1214e5c31af7Sopenharmony_ci
1215e5c31af7Sopenharmony_cistruct Fence
1216e5c31af7Sopenharmony_ci{
1217e5c31af7Sopenharmony_ci	typedef VkFence Type;
1218e5c31af7Sopenharmony_ci
1219e5c31af7Sopenharmony_ci	struct Parameters
1220e5c31af7Sopenharmony_ci	{
1221e5c31af7Sopenharmony_ci		VkFenceCreateFlags	flags;
1222e5c31af7Sopenharmony_ci
1223e5c31af7Sopenharmony_ci		Parameters (VkFenceCreateFlags flags_)
1224e5c31af7Sopenharmony_ci			: flags(flags_)
1225e5c31af7Sopenharmony_ci		{}
1226e5c31af7Sopenharmony_ci	};
1227e5c31af7Sopenharmony_ci
1228e5c31af7Sopenharmony_ci	struct Resources
1229e5c31af7Sopenharmony_ci	{
1230e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1231e5c31af7Sopenharmony_ci	};
1232e5c31af7Sopenharmony_ci
1233e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1234e5c31af7Sopenharmony_ci	{
1235e5c31af7Sopenharmony_ci		return getSafeObjectCount<Fence>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
1236e5c31af7Sopenharmony_ci	}
1237e5c31af7Sopenharmony_ci
1238e5c31af7Sopenharmony_ci	static Move<VkFence> create (const Environment& env, const Resources&, const Parameters& params)
1239e5c31af7Sopenharmony_ci	{
1240e5c31af7Sopenharmony_ci		const VkFenceCreateInfo	fenceInfo	=
1241e5c31af7Sopenharmony_ci		{
1242e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
1243e5c31af7Sopenharmony_ci			DE_NULL,
1244e5c31af7Sopenharmony_ci			params.flags
1245e5c31af7Sopenharmony_ci		};
1246e5c31af7Sopenharmony_ci
1247e5c31af7Sopenharmony_ci		return createFence(env.vkd, env.device, &fenceInfo, env.allocationCallbacks);
1248e5c31af7Sopenharmony_ci	}
1249e5c31af7Sopenharmony_ci};
1250e5c31af7Sopenharmony_ci
1251e5c31af7Sopenharmony_cistruct Event
1252e5c31af7Sopenharmony_ci{
1253e5c31af7Sopenharmony_ci	typedef VkEvent Type;
1254e5c31af7Sopenharmony_ci
1255e5c31af7Sopenharmony_ci	struct Parameters
1256e5c31af7Sopenharmony_ci	{
1257e5c31af7Sopenharmony_ci		VkEventCreateFlags	flags;
1258e5c31af7Sopenharmony_ci
1259e5c31af7Sopenharmony_ci		Parameters (VkEventCreateFlags flags_)
1260e5c31af7Sopenharmony_ci			: flags(flags_)
1261e5c31af7Sopenharmony_ci		{}
1262e5c31af7Sopenharmony_ci	};
1263e5c31af7Sopenharmony_ci
1264e5c31af7Sopenharmony_ci	struct Resources
1265e5c31af7Sopenharmony_ci	{
1266e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1267e5c31af7Sopenharmony_ci	};
1268e5c31af7Sopenharmony_ci
1269e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1270e5c31af7Sopenharmony_ci	{
1271e5c31af7Sopenharmony_ci		return getSafeObjectCount<Event>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
1272e5c31af7Sopenharmony_ci	}
1273e5c31af7Sopenharmony_ci
1274e5c31af7Sopenharmony_ci	static Move<VkEvent> create (const Environment& env, const Resources&, const Parameters& params)
1275e5c31af7Sopenharmony_ci	{
1276e5c31af7Sopenharmony_ci		const VkEventCreateInfo	eventInfo	=
1277e5c31af7Sopenharmony_ci		{
1278e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1279e5c31af7Sopenharmony_ci			DE_NULL,
1280e5c31af7Sopenharmony_ci			params.flags
1281e5c31af7Sopenharmony_ci		};
1282e5c31af7Sopenharmony_ci
1283e5c31af7Sopenharmony_ci		return createEvent(env.vkd, env.device, &eventInfo, env.allocationCallbacks);
1284e5c31af7Sopenharmony_ci	}
1285e5c31af7Sopenharmony_ci};
1286e5c31af7Sopenharmony_ci
1287e5c31af7Sopenharmony_cistruct QueryPool
1288e5c31af7Sopenharmony_ci{
1289e5c31af7Sopenharmony_ci	typedef VkQueryPool Type;
1290e5c31af7Sopenharmony_ci
1291e5c31af7Sopenharmony_ci	struct Parameters
1292e5c31af7Sopenharmony_ci	{
1293e5c31af7Sopenharmony_ci		VkQueryType						queryType;
1294e5c31af7Sopenharmony_ci		deUint32						entryCount;
1295e5c31af7Sopenharmony_ci		VkQueryPipelineStatisticFlags	pipelineStatistics;
1296e5c31af7Sopenharmony_ci
1297e5c31af7Sopenharmony_ci		Parameters (VkQueryType						queryType_,
1298e5c31af7Sopenharmony_ci					deUint32						entryCount_,
1299e5c31af7Sopenharmony_ci					VkQueryPipelineStatisticFlags	pipelineStatistics_)
1300e5c31af7Sopenharmony_ci			: queryType				(queryType_)
1301e5c31af7Sopenharmony_ci			, entryCount			(entryCount_)
1302e5c31af7Sopenharmony_ci			, pipelineStatistics	(pipelineStatistics_)
1303e5c31af7Sopenharmony_ci		{}
1304e5c31af7Sopenharmony_ci	};
1305e5c31af7Sopenharmony_ci
1306e5c31af7Sopenharmony_ci	struct Resources
1307e5c31af7Sopenharmony_ci	{
1308e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1309e5c31af7Sopenharmony_ci	};
1310e5c31af7Sopenharmony_ci
1311e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1312e5c31af7Sopenharmony_ci	{
1313e5c31af7Sopenharmony_ci		return getSafeObjectCount<QueryPool>(context, params, MAX_CONCURRENT_QUERY_POOLS);
1314e5c31af7Sopenharmony_ci	}
1315e5c31af7Sopenharmony_ci
1316e5c31af7Sopenharmony_ci	static Move<VkQueryPool> create (const Environment& env, const Resources&, const Parameters& params)
1317e5c31af7Sopenharmony_ci	{
1318e5c31af7Sopenharmony_ci		const VkQueryPoolCreateInfo	queryPoolInfo	=
1319e5c31af7Sopenharmony_ci		{
1320e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
1321e5c31af7Sopenharmony_ci			DE_NULL,
1322e5c31af7Sopenharmony_ci			(VkQueryPoolCreateFlags)0,
1323e5c31af7Sopenharmony_ci			params.queryType,
1324e5c31af7Sopenharmony_ci			params.entryCount,
1325e5c31af7Sopenharmony_ci			params.pipelineStatistics
1326e5c31af7Sopenharmony_ci		};
1327e5c31af7Sopenharmony_ci
1328e5c31af7Sopenharmony_ci		return createQueryPool(env.vkd, env.device, &queryPoolInfo, env.allocationCallbacks);
1329e5c31af7Sopenharmony_ci	}
1330e5c31af7Sopenharmony_ci};
1331e5c31af7Sopenharmony_ci
1332e5c31af7Sopenharmony_cistruct ShaderModule
1333e5c31af7Sopenharmony_ci{
1334e5c31af7Sopenharmony_ci	typedef VkShaderModule Type;
1335e5c31af7Sopenharmony_ci
1336e5c31af7Sopenharmony_ci	struct Parameters
1337e5c31af7Sopenharmony_ci	{
1338e5c31af7Sopenharmony_ci		VkShaderStageFlagBits	shaderStage;
1339e5c31af7Sopenharmony_ci		string					binaryName;
1340e5c31af7Sopenharmony_ci
1341e5c31af7Sopenharmony_ci		Parameters (VkShaderStageFlagBits	shaderStage_,
1342e5c31af7Sopenharmony_ci					const std::string&		binaryName_)
1343e5c31af7Sopenharmony_ci			: shaderStage	(shaderStage_)
1344e5c31af7Sopenharmony_ci			, binaryName	(binaryName_)
1345e5c31af7Sopenharmony_ci		{}
1346e5c31af7Sopenharmony_ci	};
1347e5c31af7Sopenharmony_ci
1348e5c31af7Sopenharmony_ci	struct Resources
1349e5c31af7Sopenharmony_ci	{
1350e5c31af7Sopenharmony_ci		const ProgramBinary&	binary;
1351e5c31af7Sopenharmony_ci
1352e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
1353e5c31af7Sopenharmony_ci			: binary(env.programBinaries.get(params.binaryName))
1354e5c31af7Sopenharmony_ci		{}
1355e5c31af7Sopenharmony_ci	};
1356e5c31af7Sopenharmony_ci
1357e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1358e5c31af7Sopenharmony_ci	{
1359e5c31af7Sopenharmony_ci		return getSafeObjectCount<ShaderModule>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1360e5c31af7Sopenharmony_ci	}
1361e5c31af7Sopenharmony_ci
1362e5c31af7Sopenharmony_ci	static const char* getSource (VkShaderStageFlagBits stage)
1363e5c31af7Sopenharmony_ci	{
1364e5c31af7Sopenharmony_ci		switch (stage)
1365e5c31af7Sopenharmony_ci		{
1366e5c31af7Sopenharmony_ci			case VK_SHADER_STAGE_VERTEX_BIT:
1367e5c31af7Sopenharmony_ci				return "#version 310 es\n"
1368e5c31af7Sopenharmony_ci					   "layout(location = 0) in highp vec4 a_position;\n"
1369e5c31af7Sopenharmony_ci					   "void main () { gl_Position = a_position; }\n";
1370e5c31af7Sopenharmony_ci
1371e5c31af7Sopenharmony_ci			case VK_SHADER_STAGE_FRAGMENT_BIT:
1372e5c31af7Sopenharmony_ci				return "#version 310 es\n"
1373e5c31af7Sopenharmony_ci					   "layout(location = 0) out mediump vec4 o_color;\n"
1374e5c31af7Sopenharmony_ci					   "void main () { o_color = vec4(1.0, 0.5, 0.25, 1.0); }";
1375e5c31af7Sopenharmony_ci
1376e5c31af7Sopenharmony_ci			case VK_SHADER_STAGE_COMPUTE_BIT:
1377e5c31af7Sopenharmony_ci				return "#version 310 es\n"
1378e5c31af7Sopenharmony_ci					   "layout(binding = 0) buffer Input { highp uint dataIn[]; };\n"
1379e5c31af7Sopenharmony_ci					   "layout(binding = 1) buffer Output { highp uint dataOut[]; };\n"
1380e5c31af7Sopenharmony_ci					   "void main (void)\n"
1381e5c31af7Sopenharmony_ci					   "{\n"
1382e5c31af7Sopenharmony_ci					   "	dataOut[gl_GlobalInvocationID.x] = ~dataIn[gl_GlobalInvocationID.x];\n"
1383e5c31af7Sopenharmony_ci					   "}\n";
1384e5c31af7Sopenharmony_ci
1385e5c31af7Sopenharmony_ci			default:
1386e5c31af7Sopenharmony_ci				DE_FATAL("Not implemented");
1387e5c31af7Sopenharmony_ci				return DE_NULL;
1388e5c31af7Sopenharmony_ci		}
1389e5c31af7Sopenharmony_ci	}
1390e5c31af7Sopenharmony_ci
1391e5c31af7Sopenharmony_ci	static void initPrograms (SourceCollections& dst, Parameters params)
1392e5c31af7Sopenharmony_ci	{
1393e5c31af7Sopenharmony_ci		const char* const	source	= getSource(params.shaderStage);
1394e5c31af7Sopenharmony_ci
1395e5c31af7Sopenharmony_ci		DE_ASSERT(source);
1396e5c31af7Sopenharmony_ci
1397e5c31af7Sopenharmony_ci		dst.glslSources.add(params.binaryName)
1398e5c31af7Sopenharmony_ci			<< glu::ShaderSource(getGluShaderType(params.shaderStage), source);
1399e5c31af7Sopenharmony_ci	}
1400e5c31af7Sopenharmony_ci
1401e5c31af7Sopenharmony_ci	static Move<VkShaderModule> create (const Environment& env, const Resources& res, const Parameters&)
1402e5c31af7Sopenharmony_ci	{
1403e5c31af7Sopenharmony_ci		const VkShaderModuleCreateInfo	shaderModuleInfo	=
1404e5c31af7Sopenharmony_ci		{
1405e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
1406e5c31af7Sopenharmony_ci			DE_NULL,
1407e5c31af7Sopenharmony_ci			(VkShaderModuleCreateFlags)0,
1408e5c31af7Sopenharmony_ci			res.binary.getSize(),
1409e5c31af7Sopenharmony_ci			(const deUint32*)res.binary.getBinary(),
1410e5c31af7Sopenharmony_ci		};
1411e5c31af7Sopenharmony_ci
1412e5c31af7Sopenharmony_ci		return createShaderModule(env.vkd, env.device, &shaderModuleInfo, env.allocationCallbacks);
1413e5c31af7Sopenharmony_ci	}
1414e5c31af7Sopenharmony_ci};
1415e5c31af7Sopenharmony_ci
1416e5c31af7Sopenharmony_cistruct PipelineCache
1417e5c31af7Sopenharmony_ci{
1418e5c31af7Sopenharmony_ci	typedef VkPipelineCache Type;
1419e5c31af7Sopenharmony_ci
1420e5c31af7Sopenharmony_ci	struct Parameters
1421e5c31af7Sopenharmony_ci	{
1422e5c31af7Sopenharmony_ci		Parameters (void) {}
1423e5c31af7Sopenharmony_ci	};
1424e5c31af7Sopenharmony_ci
1425e5c31af7Sopenharmony_ci	struct Resources
1426e5c31af7Sopenharmony_ci	{
1427e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1428e5c31af7Sopenharmony_ci	};
1429e5c31af7Sopenharmony_ci
1430e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1431e5c31af7Sopenharmony_ci	{
1432e5c31af7Sopenharmony_ci		return getSafeObjectCount<PipelineCache>(context, params, MAX_CONCURRENT_PIPELINE_CACHES);
1433e5c31af7Sopenharmony_ci	}
1434e5c31af7Sopenharmony_ci
1435e5c31af7Sopenharmony_ci	static void initPrograms(SourceCollections& dst, Parameters)
1436e5c31af7Sopenharmony_ci	{
1437e5c31af7Sopenharmony_ci		ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"));
1438e5c31af7Sopenharmony_ci	}
1439e5c31af7Sopenharmony_ci
1440e5c31af7Sopenharmony_ci	static Move<VkPipelineCache> create (const Environment& env, const Resources&, const Parameters&)
1441e5c31af7Sopenharmony_ci	{
1442e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
1443e5c31af7Sopenharmony_ci		// creating dummy compute pipeline to ensure pipeline cache is not empty
1444e5c31af7Sopenharmony_ci		if (!env.commandLine.isSubProcess())
1445e5c31af7Sopenharmony_ci		{
1446e5c31af7Sopenharmony_ci			const Unique<VkShaderModule>			shaderModule				(createShaderModule(env.vkd, env.device, env.programBinaries.get("comp"), 0u));
1447e5c31af7Sopenharmony_ci
1448e5c31af7Sopenharmony_ci			const Move<VkDescriptorSetLayout>		descriptorSetLayout			(DescriptorSetLayoutBuilder()
1449e5c31af7Sopenharmony_ci																					.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT)
1450e5c31af7Sopenharmony_ci																					.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT)
1451e5c31af7Sopenharmony_ci																					.build(env.vkd, env.device));
1452e5c31af7Sopenharmony_ci
1453e5c31af7Sopenharmony_ci			const Move<VkPipelineLayout>			pipelineLayout				(makePipelineLayout(env.vkd, env.device, *descriptorSetLayout));
1454e5c31af7Sopenharmony_ci
1455e5c31af7Sopenharmony_ci			const VkPipelineShaderStageCreateInfo	stageCreateInfo				=
1456e5c31af7Sopenharmony_ci			{
1457e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType                     sType;
1458e5c31af7Sopenharmony_ci				DE_NULL,														// const void*                         pNext;
1459e5c31af7Sopenharmony_ci				0u,																// VkPipelineShaderStageCreateFlags    flags;
1460e5c31af7Sopenharmony_ci				VK_SHADER_STAGE_COMPUTE_BIT,									// VkShaderStageFlagBits               stage;
1461e5c31af7Sopenharmony_ci				*shaderModule,													// VkShaderModule                      module;
1462e5c31af7Sopenharmony_ci				"main",															// const char*                         pName;
1463e5c31af7Sopenharmony_ci				DE_NULL,														// const VkSpecializationInfo*         pSpecializationInfo;
1464e5c31af7Sopenharmony_ci			};
1465e5c31af7Sopenharmony_ci
1466e5c31af7Sopenharmony_ci			const VkComputePipelineCreateInfo		pipelineInfo				=
1467e5c31af7Sopenharmony_ci			{
1468e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,					// VkStructureType					sType
1469e5c31af7Sopenharmony_ci				DE_NULL,														// const void*						pNext
1470e5c31af7Sopenharmony_ci				(VkPipelineCreateFlags)0,										// VkPipelineCreateFlags			flags
1471e5c31af7Sopenharmony_ci				stageCreateInfo,												// VkPipelineShaderStageCreateInfo	stage
1472e5c31af7Sopenharmony_ci				*pipelineLayout,												// VkPipelineLayout					layout
1473e5c31af7Sopenharmony_ci				DE_NULL,														// VkPipeline						basePipelineHandle
1474e5c31af7Sopenharmony_ci				0u																// deInt32							basePipelineIndex
1475e5c31af7Sopenharmony_ci			};
1476e5c31af7Sopenharmony_ci
1477e5c31af7Sopenharmony_ci			Move<VkPipeline>						pipeline					= createComputePipeline(env.vkd, env.device, DE_NULL, &pipelineInfo);
1478e5c31af7Sopenharmony_ci		}
1479e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
1480e5c31af7Sopenharmony_ci		const VkPipelineCacheCreateInfo	pipelineCacheInfo	=
1481e5c31af7Sopenharmony_ci		{
1482e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,				// VkStructureType				sType;
1483e5c31af7Sopenharmony_ci			DE_NULL,													// const void*					pNext;
1484e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
1485e5c31af7Sopenharmony_ci			(VkPipelineCacheCreateFlags)0u,								// VkPipelineCacheCreateFlags	flags;
1486e5c31af7Sopenharmony_ci			0u,															// size_t						initialDataSize;
1487e5c31af7Sopenharmony_ci			DE_NULL,													// const void*					pInitialData;
1488e5c31af7Sopenharmony_ci#else
1489e5c31af7Sopenharmony_ci			VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT |
1490e5c31af7Sopenharmony_ci				VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT,	// VkPipelineCacheCreateFlags	flags;
1491e5c31af7Sopenharmony_ci			env.resourceInterface->getCacheDataSize(),					// deUintptr					initialDataSize;
1492e5c31af7Sopenharmony_ci			env.resourceInterface->getCacheData()						// const void*					pInitialData;
1493e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
1494e5c31af7Sopenharmony_ci		};
1495e5c31af7Sopenharmony_ci
1496e5c31af7Sopenharmony_ci		return createPipelineCache(env.vkd, env.device, &pipelineCacheInfo, env.allocationCallbacks);
1497e5c31af7Sopenharmony_ci	}
1498e5c31af7Sopenharmony_ci};
1499e5c31af7Sopenharmony_ci
1500e5c31af7Sopenharmony_cistruct Sampler
1501e5c31af7Sopenharmony_ci{
1502e5c31af7Sopenharmony_ci	typedef VkSampler Type;
1503e5c31af7Sopenharmony_ci
1504e5c31af7Sopenharmony_ci	struct Parameters
1505e5c31af7Sopenharmony_ci	{
1506e5c31af7Sopenharmony_ci		VkFilter				magFilter;
1507e5c31af7Sopenharmony_ci		VkFilter				minFilter;
1508e5c31af7Sopenharmony_ci		VkSamplerMipmapMode		mipmapMode;
1509e5c31af7Sopenharmony_ci		VkSamplerAddressMode	addressModeU;
1510e5c31af7Sopenharmony_ci		VkSamplerAddressMode	addressModeV;
1511e5c31af7Sopenharmony_ci		VkSamplerAddressMode	addressModeW;
1512e5c31af7Sopenharmony_ci		float					mipLodBias;
1513e5c31af7Sopenharmony_ci		VkBool32				anisotropyEnable;
1514e5c31af7Sopenharmony_ci		float					maxAnisotropy;
1515e5c31af7Sopenharmony_ci		VkBool32				compareEnable;
1516e5c31af7Sopenharmony_ci		VkCompareOp				compareOp;
1517e5c31af7Sopenharmony_ci		float					minLod;
1518e5c31af7Sopenharmony_ci		float					maxLod;
1519e5c31af7Sopenharmony_ci		VkBorderColor			borderColor;
1520e5c31af7Sopenharmony_ci		VkBool32				unnormalizedCoordinates;
1521e5c31af7Sopenharmony_ci
1522e5c31af7Sopenharmony_ci		// \todo [2015-09-17 pyry] Other configurations
1523e5c31af7Sopenharmony_ci		Parameters (void)
1524e5c31af7Sopenharmony_ci			: magFilter					(VK_FILTER_NEAREST)
1525e5c31af7Sopenharmony_ci			, minFilter					(VK_FILTER_NEAREST)
1526e5c31af7Sopenharmony_ci			, mipmapMode				(VK_SAMPLER_MIPMAP_MODE_NEAREST)
1527e5c31af7Sopenharmony_ci			, addressModeU				(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1528e5c31af7Sopenharmony_ci			, addressModeV				(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1529e5c31af7Sopenharmony_ci			, addressModeW				(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1530e5c31af7Sopenharmony_ci			, mipLodBias				(0.0f)
1531e5c31af7Sopenharmony_ci			, anisotropyEnable			(VK_FALSE)
1532e5c31af7Sopenharmony_ci			, maxAnisotropy				(1.0f)
1533e5c31af7Sopenharmony_ci			, compareEnable				(VK_FALSE)
1534e5c31af7Sopenharmony_ci			, compareOp					(VK_COMPARE_OP_ALWAYS)
1535e5c31af7Sopenharmony_ci			, minLod					(-1000.f)
1536e5c31af7Sopenharmony_ci			, maxLod					(+1000.f)
1537e5c31af7Sopenharmony_ci			, borderColor				(VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK)
1538e5c31af7Sopenharmony_ci			, unnormalizedCoordinates	(VK_FALSE)
1539e5c31af7Sopenharmony_ci		{}
1540e5c31af7Sopenharmony_ci	};
1541e5c31af7Sopenharmony_ci
1542e5c31af7Sopenharmony_ci	struct Resources
1543e5c31af7Sopenharmony_ci	{
1544e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1545e5c31af7Sopenharmony_ci	};
1546e5c31af7Sopenharmony_ci
1547e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1548e5c31af7Sopenharmony_ci	{
1549e5c31af7Sopenharmony_ci		return getSafeObjectCount<Sampler>(context,
1550e5c31af7Sopenharmony_ci										   params,
1551e5c31af7Sopenharmony_ci										   de::min(context.getDeviceProperties().limits.maxSamplerAllocationCount,
1552e5c31af7Sopenharmony_ci												   (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS));
1553e5c31af7Sopenharmony_ci	}
1554e5c31af7Sopenharmony_ci
1555e5c31af7Sopenharmony_ci	static Move<VkSampler> create (const Environment& env, const Resources&, const Parameters& params)
1556e5c31af7Sopenharmony_ci	{
1557e5c31af7Sopenharmony_ci		const VkSamplerCreateInfo	samplerInfo	=
1558e5c31af7Sopenharmony_ci		{
1559e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1560e5c31af7Sopenharmony_ci			DE_NULL,
1561e5c31af7Sopenharmony_ci			(VkSamplerCreateFlags)0,
1562e5c31af7Sopenharmony_ci			params.magFilter,
1563e5c31af7Sopenharmony_ci			params.minFilter,
1564e5c31af7Sopenharmony_ci			params.mipmapMode,
1565e5c31af7Sopenharmony_ci			params.addressModeU,
1566e5c31af7Sopenharmony_ci			params.addressModeV,
1567e5c31af7Sopenharmony_ci			params.addressModeW,
1568e5c31af7Sopenharmony_ci			params.mipLodBias,
1569e5c31af7Sopenharmony_ci			params.anisotropyEnable,
1570e5c31af7Sopenharmony_ci			params.maxAnisotropy,
1571e5c31af7Sopenharmony_ci			params.compareEnable,
1572e5c31af7Sopenharmony_ci			params.compareOp,
1573e5c31af7Sopenharmony_ci			params.minLod,
1574e5c31af7Sopenharmony_ci			params.maxLod,
1575e5c31af7Sopenharmony_ci			params.borderColor,
1576e5c31af7Sopenharmony_ci			params.unnormalizedCoordinates
1577e5c31af7Sopenharmony_ci		};
1578e5c31af7Sopenharmony_ci
1579e5c31af7Sopenharmony_ci		return createSampler(env.vkd, env.device, &samplerInfo, env.allocationCallbacks);
1580e5c31af7Sopenharmony_ci	}
1581e5c31af7Sopenharmony_ci};
1582e5c31af7Sopenharmony_ci
1583e5c31af7Sopenharmony_cistruct DescriptorSetLayout
1584e5c31af7Sopenharmony_ci{
1585e5c31af7Sopenharmony_ci	typedef VkDescriptorSetLayout Type;
1586e5c31af7Sopenharmony_ci
1587e5c31af7Sopenharmony_ci	struct Parameters
1588e5c31af7Sopenharmony_ci	{
1589e5c31af7Sopenharmony_ci		struct Binding
1590e5c31af7Sopenharmony_ci		{
1591e5c31af7Sopenharmony_ci			deUint32			binding;
1592e5c31af7Sopenharmony_ci			VkDescriptorType	descriptorType;
1593e5c31af7Sopenharmony_ci			deUint32			descriptorCount;
1594e5c31af7Sopenharmony_ci			VkShaderStageFlags	stageFlags;
1595e5c31af7Sopenharmony_ci			bool				useImmutableSampler;
1596e5c31af7Sopenharmony_ci
1597e5c31af7Sopenharmony_ci			Binding (deUint32			binding_,
1598e5c31af7Sopenharmony_ci					 VkDescriptorType	descriptorType_,
1599e5c31af7Sopenharmony_ci					 deUint32			descriptorCount_,
1600e5c31af7Sopenharmony_ci					 VkShaderStageFlags	stageFlags_,
1601e5c31af7Sopenharmony_ci					 bool				useImmutableSampler_)
1602e5c31af7Sopenharmony_ci				: binding				(binding_)
1603e5c31af7Sopenharmony_ci				, descriptorType		(descriptorType_)
1604e5c31af7Sopenharmony_ci				, descriptorCount		(descriptorCount_)
1605e5c31af7Sopenharmony_ci				, stageFlags			(stageFlags_)
1606e5c31af7Sopenharmony_ci				, useImmutableSampler	(useImmutableSampler_)
1607e5c31af7Sopenharmony_ci			{}
1608e5c31af7Sopenharmony_ci
1609e5c31af7Sopenharmony_ci			Binding (void) {}
1610e5c31af7Sopenharmony_ci		};
1611e5c31af7Sopenharmony_ci
1612e5c31af7Sopenharmony_ci		vector<Binding>	bindings;
1613e5c31af7Sopenharmony_ci
1614e5c31af7Sopenharmony_ci		Parameters (const vector<Binding>& bindings_)
1615e5c31af7Sopenharmony_ci			: bindings(bindings_)
1616e5c31af7Sopenharmony_ci		{}
1617e5c31af7Sopenharmony_ci
1618e5c31af7Sopenharmony_ci		static Parameters empty (void)
1619e5c31af7Sopenharmony_ci		{
1620e5c31af7Sopenharmony_ci			return Parameters(vector<Binding>());
1621e5c31af7Sopenharmony_ci		}
1622e5c31af7Sopenharmony_ci
1623e5c31af7Sopenharmony_ci		static Parameters single (deUint32				binding,
1624e5c31af7Sopenharmony_ci								  VkDescriptorType		descriptorType,
1625e5c31af7Sopenharmony_ci								  deUint32				descriptorCount,
1626e5c31af7Sopenharmony_ci								  VkShaderStageFlags	stageFlags,
1627e5c31af7Sopenharmony_ci								  bool					useImmutableSampler = false)
1628e5c31af7Sopenharmony_ci		{
1629e5c31af7Sopenharmony_ci			vector<Binding> bindings;
1630e5c31af7Sopenharmony_ci			bindings.push_back(Binding(binding, descriptorType, descriptorCount, stageFlags, useImmutableSampler));
1631e5c31af7Sopenharmony_ci			return Parameters(bindings);
1632e5c31af7Sopenharmony_ci		}
1633e5c31af7Sopenharmony_ci	};
1634e5c31af7Sopenharmony_ci
1635e5c31af7Sopenharmony_ci	struct Resources
1636e5c31af7Sopenharmony_ci	{
1637e5c31af7Sopenharmony_ci		vector<VkDescriptorSetLayoutBinding>	bindings;
1638e5c31af7Sopenharmony_ci		MovePtr<Dependency<Sampler> >			immutableSampler;
1639e5c31af7Sopenharmony_ci		vector<VkSampler>						immutableSamplersPtr;
1640e5c31af7Sopenharmony_ci
1641e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
1642e5c31af7Sopenharmony_ci		{
1643e5c31af7Sopenharmony_ci			// Create immutable sampler if needed
1644e5c31af7Sopenharmony_ci			for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++)
1645e5c31af7Sopenharmony_ci			{
1646e5c31af7Sopenharmony_ci				if (cur->useImmutableSampler && !immutableSampler)
1647e5c31af7Sopenharmony_ci				{
1648e5c31af7Sopenharmony_ci					immutableSampler = de::newMovePtr<Dependency<Sampler> >(env, Sampler::Parameters());
1649e5c31af7Sopenharmony_ci
1650e5c31af7Sopenharmony_ci					if (cur->useImmutableSampler && immutableSamplersPtr.size() < (size_t)cur->descriptorCount)
1651e5c31af7Sopenharmony_ci						immutableSamplersPtr.resize(cur->descriptorCount, *immutableSampler->object);
1652e5c31af7Sopenharmony_ci				}
1653e5c31af7Sopenharmony_ci			}
1654e5c31af7Sopenharmony_ci
1655e5c31af7Sopenharmony_ci			for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++)
1656e5c31af7Sopenharmony_ci			{
1657e5c31af7Sopenharmony_ci				const VkDescriptorSetLayoutBinding	binding	=
1658e5c31af7Sopenharmony_ci				{
1659e5c31af7Sopenharmony_ci					cur->binding,
1660e5c31af7Sopenharmony_ci					cur->descriptorType,
1661e5c31af7Sopenharmony_ci					cur->descriptorCount,
1662e5c31af7Sopenharmony_ci					cur->stageFlags,
1663e5c31af7Sopenharmony_ci					(cur->useImmutableSampler ? &immutableSamplersPtr[0] : DE_NULL)
1664e5c31af7Sopenharmony_ci				};
1665e5c31af7Sopenharmony_ci
1666e5c31af7Sopenharmony_ci				bindings.push_back(binding);
1667e5c31af7Sopenharmony_ci			}
1668e5c31af7Sopenharmony_ci		}
1669e5c31af7Sopenharmony_ci	};
1670e5c31af7Sopenharmony_ci
1671e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1672e5c31af7Sopenharmony_ci	{
1673e5c31af7Sopenharmony_ci		return getSafeObjectCount<DescriptorSetLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1674e5c31af7Sopenharmony_ci	}
1675e5c31af7Sopenharmony_ci
1676e5c31af7Sopenharmony_ci	static Move<VkDescriptorSetLayout> create (const Environment& env, const Resources& res, const Parameters&)
1677e5c31af7Sopenharmony_ci	{
1678e5c31af7Sopenharmony_ci		const VkDescriptorSetLayoutCreateInfo	descriptorSetLayoutInfo	=
1679e5c31af7Sopenharmony_ci		{
1680e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1681e5c31af7Sopenharmony_ci			DE_NULL,
1682e5c31af7Sopenharmony_ci			(VkDescriptorSetLayoutCreateFlags)0,
1683e5c31af7Sopenharmony_ci			(deUint32)res.bindings.size(),
1684e5c31af7Sopenharmony_ci			(res.bindings.empty() ? DE_NULL : &res.bindings[0])
1685e5c31af7Sopenharmony_ci		};
1686e5c31af7Sopenharmony_ci
1687e5c31af7Sopenharmony_ci		return createDescriptorSetLayout(env.vkd, env.device, &descriptorSetLayoutInfo, env.allocationCallbacks);
1688e5c31af7Sopenharmony_ci	}
1689e5c31af7Sopenharmony_ci};
1690e5c31af7Sopenharmony_ci
1691e5c31af7Sopenharmony_cistruct PipelineLayout
1692e5c31af7Sopenharmony_ci{
1693e5c31af7Sopenharmony_ci	typedef VkPipelineLayout Type;
1694e5c31af7Sopenharmony_ci
1695e5c31af7Sopenharmony_ci	struct Parameters
1696e5c31af7Sopenharmony_ci	{
1697e5c31af7Sopenharmony_ci		vector<DescriptorSetLayout::Parameters>	descriptorSetLayouts;
1698e5c31af7Sopenharmony_ci		vector<VkPushConstantRange>				pushConstantRanges;
1699e5c31af7Sopenharmony_ci
1700e5c31af7Sopenharmony_ci		Parameters (void) {}
1701e5c31af7Sopenharmony_ci
1702e5c31af7Sopenharmony_ci		static Parameters empty (void)
1703e5c31af7Sopenharmony_ci		{
1704e5c31af7Sopenharmony_ci			return Parameters();
1705e5c31af7Sopenharmony_ci		}
1706e5c31af7Sopenharmony_ci
1707e5c31af7Sopenharmony_ci		static Parameters singleDescriptorSet (const DescriptorSetLayout::Parameters& descriptorSetLayout)
1708e5c31af7Sopenharmony_ci		{
1709e5c31af7Sopenharmony_ci			Parameters params;
1710e5c31af7Sopenharmony_ci			params.descriptorSetLayouts.push_back(descriptorSetLayout);
1711e5c31af7Sopenharmony_ci			return params;
1712e5c31af7Sopenharmony_ci		}
1713e5c31af7Sopenharmony_ci	};
1714e5c31af7Sopenharmony_ci
1715e5c31af7Sopenharmony_ci	struct Resources
1716e5c31af7Sopenharmony_ci	{
1717e5c31af7Sopenharmony_ci		typedef SharedPtr<Dependency<DescriptorSetLayout> >	DescriptorSetLayoutDepSp;
1718e5c31af7Sopenharmony_ci		typedef vector<DescriptorSetLayoutDepSp>			DescriptorSetLayouts;
1719e5c31af7Sopenharmony_ci
1720e5c31af7Sopenharmony_ci		DescriptorSetLayouts			descriptorSetLayouts;
1721e5c31af7Sopenharmony_ci		vector<VkDescriptorSetLayout>	pSetLayouts;
1722e5c31af7Sopenharmony_ci
1723e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
1724e5c31af7Sopenharmony_ci		{
1725e5c31af7Sopenharmony_ci			for (vector<DescriptorSetLayout::Parameters>::const_iterator dsParams = params.descriptorSetLayouts.begin();
1726e5c31af7Sopenharmony_ci				 dsParams != params.descriptorSetLayouts.end();
1727e5c31af7Sopenharmony_ci				 ++dsParams)
1728e5c31af7Sopenharmony_ci			{
1729e5c31af7Sopenharmony_ci				descriptorSetLayouts.push_back(DescriptorSetLayoutDepSp(new Dependency<DescriptorSetLayout>(env, *dsParams)));
1730e5c31af7Sopenharmony_ci				pSetLayouts.push_back(*descriptorSetLayouts.back()->object);
1731e5c31af7Sopenharmony_ci			}
1732e5c31af7Sopenharmony_ci		}
1733e5c31af7Sopenharmony_ci	};
1734e5c31af7Sopenharmony_ci
1735e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1736e5c31af7Sopenharmony_ci	{
1737e5c31af7Sopenharmony_ci		return getSafeObjectCount<PipelineLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1738e5c31af7Sopenharmony_ci	}
1739e5c31af7Sopenharmony_ci
1740e5c31af7Sopenharmony_ci	static Move<VkPipelineLayout> create (const Environment& env, const Resources& res, const Parameters& params)
1741e5c31af7Sopenharmony_ci	{
1742e5c31af7Sopenharmony_ci		const VkPipelineLayoutCreateInfo	pipelineLayoutInfo	=
1743e5c31af7Sopenharmony_ci		{
1744e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1745e5c31af7Sopenharmony_ci			DE_NULL,
1746e5c31af7Sopenharmony_ci			(VkPipelineLayoutCreateFlags)0,
1747e5c31af7Sopenharmony_ci			(deUint32)res.pSetLayouts.size(),
1748e5c31af7Sopenharmony_ci			(res.pSetLayouts.empty() ? DE_NULL : &res.pSetLayouts[0]),
1749e5c31af7Sopenharmony_ci			(deUint32)params.pushConstantRanges.size(),
1750e5c31af7Sopenharmony_ci			(params.pushConstantRanges.empty() ? DE_NULL : &params.pushConstantRanges[0]),
1751e5c31af7Sopenharmony_ci		};
1752e5c31af7Sopenharmony_ci
1753e5c31af7Sopenharmony_ci		return createPipelineLayout(env.vkd, env.device, &pipelineLayoutInfo, env.allocationCallbacks);
1754e5c31af7Sopenharmony_ci	}
1755e5c31af7Sopenharmony_ci};
1756e5c31af7Sopenharmony_ci
1757e5c31af7Sopenharmony_cistruct RenderPass
1758e5c31af7Sopenharmony_ci{
1759e5c31af7Sopenharmony_ci	typedef VkRenderPass Type;
1760e5c31af7Sopenharmony_ci
1761e5c31af7Sopenharmony_ci	// \todo [2015-09-17 pyry] More interesting configurations
1762e5c31af7Sopenharmony_ci	struct Parameters
1763e5c31af7Sopenharmony_ci	{
1764e5c31af7Sopenharmony_ci		Parameters (void) {}
1765e5c31af7Sopenharmony_ci	};
1766e5c31af7Sopenharmony_ci
1767e5c31af7Sopenharmony_ci	struct Resources
1768e5c31af7Sopenharmony_ci	{
1769e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
1770e5c31af7Sopenharmony_ci	};
1771e5c31af7Sopenharmony_ci
1772e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1773e5c31af7Sopenharmony_ci	{
1774e5c31af7Sopenharmony_ci		return getSafeObjectCount<RenderPass>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1775e5c31af7Sopenharmony_ci	}
1776e5c31af7Sopenharmony_ci
1777e5c31af7Sopenharmony_ci	static Move<VkRenderPass> create (const Environment& env, const Resources&, const Parameters&)
1778e5c31af7Sopenharmony_ci	{
1779e5c31af7Sopenharmony_ci		return makeRenderPass(env.vkd, env.device, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_D16_UNORM,
1780e5c31af7Sopenharmony_ci			VK_ATTACHMENT_LOAD_OP_CLEAR,
1781e5c31af7Sopenharmony_ci			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1782e5c31af7Sopenharmony_ci			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1783e5c31af7Sopenharmony_ci			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1784e5c31af7Sopenharmony_ci			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1785e5c31af7Sopenharmony_ci			env.allocationCallbacks);
1786e5c31af7Sopenharmony_ci	}
1787e5c31af7Sopenharmony_ci};
1788e5c31af7Sopenharmony_ci
1789e5c31af7Sopenharmony_cistruct GraphicsPipeline
1790e5c31af7Sopenharmony_ci{
1791e5c31af7Sopenharmony_ci	typedef VkPipeline Type;
1792e5c31af7Sopenharmony_ci
1793e5c31af7Sopenharmony_ci	// \todo [2015-09-17 pyry] More interesting configurations
1794e5c31af7Sopenharmony_ci	struct Parameters
1795e5c31af7Sopenharmony_ci	{
1796e5c31af7Sopenharmony_ci		Parameters (void) {}
1797e5c31af7Sopenharmony_ci	};
1798e5c31af7Sopenharmony_ci
1799e5c31af7Sopenharmony_ci	struct Resources
1800e5c31af7Sopenharmony_ci	{
1801e5c31af7Sopenharmony_ci		Dependency<ShaderModule>	vertexShader;
1802e5c31af7Sopenharmony_ci		Dependency<ShaderModule>	fragmentShader;
1803e5c31af7Sopenharmony_ci		Dependency<PipelineLayout>	layout;
1804e5c31af7Sopenharmony_ci		Dependency<RenderPass>		renderPass;
1805e5c31af7Sopenharmony_ci		Dependency<PipelineCache>	pipelineCache;
1806e5c31af7Sopenharmony_ci
1807e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters&)
1808e5c31af7Sopenharmony_ci			: vertexShader		(env, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert"))
1809e5c31af7Sopenharmony_ci			, fragmentShader	(env, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag"))
1810e5c31af7Sopenharmony_ci			, layout			(env, PipelineLayout::Parameters::singleDescriptorSet(
1811e5c31af7Sopenharmony_ci										DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u, VK_SHADER_STAGE_FRAGMENT_BIT, true)))
1812e5c31af7Sopenharmony_ci			, renderPass		(env, RenderPass::Parameters())
1813e5c31af7Sopenharmony_ci			, pipelineCache		(env, PipelineCache::Parameters())
1814e5c31af7Sopenharmony_ci		{}
1815e5c31af7Sopenharmony_ci	};
1816e5c31af7Sopenharmony_ci
1817e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1818e5c31af7Sopenharmony_ci	{
1819e5c31af7Sopenharmony_ci		return getSafeObjectCount<GraphicsPipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1820e5c31af7Sopenharmony_ci	}
1821e5c31af7Sopenharmony_ci
1822e5c31af7Sopenharmony_ci	static void initPrograms (SourceCollections& dst, Parameters)
1823e5c31af7Sopenharmony_ci	{
1824e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
1825e5c31af7Sopenharmony_ci		// Pipeline cache dependency uses compute shader to ensure that pipeline cache is not empty in subprocess.
1826e5c31af7Sopenharmony_ci		// We have to add this shader even if we don't plan to use it later in any *.graphics_pipeline test
1827e5c31af7Sopenharmony_ci		ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"));
1828e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
1829e5c31af7Sopenharmony_ci		ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert"));
1830e5c31af7Sopenharmony_ci		ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag"));
1831e5c31af7Sopenharmony_ci	}
1832e5c31af7Sopenharmony_ci
1833e5c31af7Sopenharmony_ci	static vector<VkPipelineSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkPipeline>* const pOutHandles, VkResult* const pOutResult)
1834e5c31af7Sopenharmony_ci	{
1835e5c31af7Sopenharmony_ci		DE_ASSERT(pOutResult);
1836e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles);
1837e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles->size() != 0);
1838e5c31af7Sopenharmony_ci
1839e5c31af7Sopenharmony_ci		const VkPipelineShaderStageCreateInfo			stages[]			=
1840e5c31af7Sopenharmony_ci		{
1841e5c31af7Sopenharmony_ci			{
1842e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1843e5c31af7Sopenharmony_ci				DE_NULL,
1844e5c31af7Sopenharmony_ci				(VkPipelineShaderStageCreateFlags)0,
1845e5c31af7Sopenharmony_ci				VK_SHADER_STAGE_VERTEX_BIT,
1846e5c31af7Sopenharmony_ci				*res.vertexShader.object,
1847e5c31af7Sopenharmony_ci				"main",
1848e5c31af7Sopenharmony_ci				DE_NULL,							// pSpecializationInfo
1849e5c31af7Sopenharmony_ci			},
1850e5c31af7Sopenharmony_ci			{
1851e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1852e5c31af7Sopenharmony_ci				DE_NULL,
1853e5c31af7Sopenharmony_ci				(VkPipelineShaderStageCreateFlags)0,
1854e5c31af7Sopenharmony_ci				VK_SHADER_STAGE_FRAGMENT_BIT,
1855e5c31af7Sopenharmony_ci				*res.fragmentShader.object,
1856e5c31af7Sopenharmony_ci				"main",
1857e5c31af7Sopenharmony_ci				DE_NULL,							// pSpecializationInfo
1858e5c31af7Sopenharmony_ci			}
1859e5c31af7Sopenharmony_ci		};
1860e5c31af7Sopenharmony_ci		const VkVertexInputBindingDescription			vertexBindings[]	=
1861e5c31af7Sopenharmony_ci		{
1862e5c31af7Sopenharmony_ci			{
1863e5c31af7Sopenharmony_ci				0u,									// binding
1864e5c31af7Sopenharmony_ci				16u,								// stride
1865e5c31af7Sopenharmony_ci				VK_VERTEX_INPUT_RATE_VERTEX
1866e5c31af7Sopenharmony_ci			}
1867e5c31af7Sopenharmony_ci		};
1868e5c31af7Sopenharmony_ci		const VkVertexInputAttributeDescription			vertexAttribs[]		=
1869e5c31af7Sopenharmony_ci		{
1870e5c31af7Sopenharmony_ci			{
1871e5c31af7Sopenharmony_ci				0u,									// location
1872e5c31af7Sopenharmony_ci				0u,									// binding
1873e5c31af7Sopenharmony_ci				VK_FORMAT_R32G32B32A32_SFLOAT,
1874e5c31af7Sopenharmony_ci				0u,									// offset
1875e5c31af7Sopenharmony_ci			}
1876e5c31af7Sopenharmony_ci		};
1877e5c31af7Sopenharmony_ci		const VkPipelineVertexInputStateCreateInfo		vertexInputState	=
1878e5c31af7Sopenharmony_ci		{
1879e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
1880e5c31af7Sopenharmony_ci			DE_NULL,
1881e5c31af7Sopenharmony_ci			(VkPipelineVertexInputStateCreateFlags)0,
1882e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(vertexBindings),
1883e5c31af7Sopenharmony_ci			vertexBindings,
1884e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(vertexAttribs),
1885e5c31af7Sopenharmony_ci			vertexAttribs
1886e5c31af7Sopenharmony_ci		};
1887e5c31af7Sopenharmony_ci		const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyState	=
1888e5c31af7Sopenharmony_ci		{
1889e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
1890e5c31af7Sopenharmony_ci			DE_NULL,
1891e5c31af7Sopenharmony_ci			(VkPipelineInputAssemblyStateCreateFlags)0,
1892e5c31af7Sopenharmony_ci			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
1893e5c31af7Sopenharmony_ci			VK_FALSE								// primitiveRestartEnable
1894e5c31af7Sopenharmony_ci		};
1895e5c31af7Sopenharmony_ci		const VkViewport								viewport			= makeViewport(tcu::UVec2(64));
1896e5c31af7Sopenharmony_ci		const VkRect2D									scissor				= makeRect2D(tcu::UVec2(64));
1897e5c31af7Sopenharmony_ci
1898e5c31af7Sopenharmony_ci		const VkPipelineViewportStateCreateInfo			viewportState		=
1899e5c31af7Sopenharmony_ci		{
1900e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1901e5c31af7Sopenharmony_ci			DE_NULL,
1902e5c31af7Sopenharmony_ci			(VkPipelineViewportStateCreateFlags)0,
1903e5c31af7Sopenharmony_ci			1u,
1904e5c31af7Sopenharmony_ci			&viewport,
1905e5c31af7Sopenharmony_ci			1u,
1906e5c31af7Sopenharmony_ci			&scissor,
1907e5c31af7Sopenharmony_ci		};
1908e5c31af7Sopenharmony_ci		const VkPipelineRasterizationStateCreateInfo	rasterState			=
1909e5c31af7Sopenharmony_ci		{
1910e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
1911e5c31af7Sopenharmony_ci			DE_NULL,
1912e5c31af7Sopenharmony_ci			(VkPipelineRasterizationStateCreateFlags)0,
1913e5c31af7Sopenharmony_ci			VK_FALSE,								// depthClampEnable
1914e5c31af7Sopenharmony_ci			VK_FALSE,								// rasterizerDiscardEnable
1915e5c31af7Sopenharmony_ci			VK_POLYGON_MODE_FILL,
1916e5c31af7Sopenharmony_ci			VK_CULL_MODE_BACK_BIT,
1917e5c31af7Sopenharmony_ci			VK_FRONT_FACE_COUNTER_CLOCKWISE,
1918e5c31af7Sopenharmony_ci			VK_FALSE,								// depthBiasEnable
1919e5c31af7Sopenharmony_ci			0.0f,									// depthBiasConstantFactor
1920e5c31af7Sopenharmony_ci			0.0f,									// depthBiasClamp
1921e5c31af7Sopenharmony_ci			0.0f,									// depthBiasSlopeFactor
1922e5c31af7Sopenharmony_ci			1.0f,									// lineWidth
1923e5c31af7Sopenharmony_ci		};
1924e5c31af7Sopenharmony_ci		const VkPipelineMultisampleStateCreateInfo		multisampleState	=
1925e5c31af7Sopenharmony_ci		{
1926e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
1927e5c31af7Sopenharmony_ci			DE_NULL,
1928e5c31af7Sopenharmony_ci			(VkPipelineMultisampleStateCreateFlags)0,
1929e5c31af7Sopenharmony_ci			VK_SAMPLE_COUNT_1_BIT,
1930e5c31af7Sopenharmony_ci			VK_FALSE,								// sampleShadingEnable
1931e5c31af7Sopenharmony_ci			1.0f,									// minSampleShading
1932e5c31af7Sopenharmony_ci			DE_NULL,								// pSampleMask
1933e5c31af7Sopenharmony_ci			VK_FALSE,								// alphaToCoverageEnable
1934e5c31af7Sopenharmony_ci			VK_FALSE,								// alphaToOneEnable
1935e5c31af7Sopenharmony_ci		};
1936e5c31af7Sopenharmony_ci		const VkPipelineDepthStencilStateCreateInfo		depthStencilState	=
1937e5c31af7Sopenharmony_ci		{
1938e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
1939e5c31af7Sopenharmony_ci			DE_NULL,
1940e5c31af7Sopenharmony_ci			(VkPipelineDepthStencilStateCreateFlags)0,
1941e5c31af7Sopenharmony_ci			VK_TRUE,								// depthTestEnable
1942e5c31af7Sopenharmony_ci			VK_TRUE,								// depthWriteEnable
1943e5c31af7Sopenharmony_ci			VK_COMPARE_OP_LESS,						// depthCompareOp
1944e5c31af7Sopenharmony_ci			VK_FALSE,								// depthBoundsTestEnable
1945e5c31af7Sopenharmony_ci			VK_FALSE,								// stencilTestEnable
1946e5c31af7Sopenharmony_ci			{ VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u },
1947e5c31af7Sopenharmony_ci			{ VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u },
1948e5c31af7Sopenharmony_ci			0.0f,									// minDepthBounds
1949e5c31af7Sopenharmony_ci			1.0f,									// maxDepthBounds
1950e5c31af7Sopenharmony_ci		};
1951e5c31af7Sopenharmony_ci		const VkPipelineColorBlendAttachmentState		colorBlendAttState[]=
1952e5c31af7Sopenharmony_ci		{
1953e5c31af7Sopenharmony_ci			{
1954e5c31af7Sopenharmony_ci				VK_FALSE,							// blendEnable
1955e5c31af7Sopenharmony_ci				VK_BLEND_FACTOR_ONE,
1956e5c31af7Sopenharmony_ci				VK_BLEND_FACTOR_ZERO,
1957e5c31af7Sopenharmony_ci				VK_BLEND_OP_ADD,
1958e5c31af7Sopenharmony_ci				VK_BLEND_FACTOR_ONE,
1959e5c31af7Sopenharmony_ci				VK_BLEND_FACTOR_ZERO,
1960e5c31af7Sopenharmony_ci				VK_BLEND_OP_ADD,
1961e5c31af7Sopenharmony_ci				VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT
1962e5c31af7Sopenharmony_ci			}
1963e5c31af7Sopenharmony_ci		};
1964e5c31af7Sopenharmony_ci		const VkPipelineColorBlendStateCreateInfo		colorBlendState		=
1965e5c31af7Sopenharmony_ci		{
1966e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
1967e5c31af7Sopenharmony_ci			DE_NULL,
1968e5c31af7Sopenharmony_ci			(VkPipelineColorBlendStateCreateFlags)0,
1969e5c31af7Sopenharmony_ci			VK_FALSE,								// logicOpEnable
1970e5c31af7Sopenharmony_ci			VK_LOGIC_OP_COPY,
1971e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(colorBlendAttState),
1972e5c31af7Sopenharmony_ci			colorBlendAttState,
1973e5c31af7Sopenharmony_ci			{ 0.0f, 0.0f, 0.0f, 0.0f }				// blendConstants
1974e5c31af7Sopenharmony_ci		};
1975e5c31af7Sopenharmony_ci		const VkGraphicsPipelineCreateInfo				pipelineInfo		=
1976e5c31af7Sopenharmony_ci		{
1977e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1978e5c31af7Sopenharmony_ci			DE_NULL,
1979e5c31af7Sopenharmony_ci			(VkPipelineCreateFlags)0,
1980e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(stages),
1981e5c31af7Sopenharmony_ci			stages,
1982e5c31af7Sopenharmony_ci			&vertexInputState,
1983e5c31af7Sopenharmony_ci			&inputAssemblyState,
1984e5c31af7Sopenharmony_ci			DE_NULL,								// pTessellationState
1985e5c31af7Sopenharmony_ci			&viewportState,
1986e5c31af7Sopenharmony_ci			&rasterState,
1987e5c31af7Sopenharmony_ci			&multisampleState,
1988e5c31af7Sopenharmony_ci			&depthStencilState,
1989e5c31af7Sopenharmony_ci			&colorBlendState,
1990e5c31af7Sopenharmony_ci			(const VkPipelineDynamicStateCreateInfo*)DE_NULL,
1991e5c31af7Sopenharmony_ci			*res.layout.object,
1992e5c31af7Sopenharmony_ci			*res.renderPass.object,
1993e5c31af7Sopenharmony_ci			0u,										// subpass
1994e5c31af7Sopenharmony_ci			(VkPipeline)0,							// basePipelineHandle
1995e5c31af7Sopenharmony_ci			0,										// basePipelineIndex
1996e5c31af7Sopenharmony_ci		};
1997e5c31af7Sopenharmony_ci
1998e5c31af7Sopenharmony_ci		const deUint32							numPipelines	= static_cast<deUint32>(pOutHandles->size());
1999e5c31af7Sopenharmony_ci		VkPipeline*	const						pHandles		= &(*pOutHandles)[0];
2000e5c31af7Sopenharmony_ci		vector<VkGraphicsPipelineCreateInfo>	pipelineInfos	(numPipelines, pipelineInfo);
2001e5c31af7Sopenharmony_ci
2002e5c31af7Sopenharmony_ci		*pOutResult = env.vkd.createGraphicsPipelines(env.device, *res.pipelineCache.object, numPipelines, &pipelineInfos[0], env.allocationCallbacks, pHandles);
2003e5c31af7Sopenharmony_ci
2004e5c31af7Sopenharmony_ci		vector<VkPipelineSp>	pipelines;
2005e5c31af7Sopenharmony_ci
2006e5c31af7Sopenharmony_ci		// Even if an error is returned, some pipelines may have been created successfully
2007e5c31af7Sopenharmony_ci		for (deUint32 i = 0; i < numPipelines; ++i)
2008e5c31af7Sopenharmony_ci		{
2009e5c31af7Sopenharmony_ci			if (pHandles[i] != DE_NULL)
2010e5c31af7Sopenharmony_ci				pipelines.push_back(VkPipelineSp(new Move<VkPipeline>(check<VkPipeline>(pHandles[i]), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks))));
2011e5c31af7Sopenharmony_ci		}
2012e5c31af7Sopenharmony_ci
2013e5c31af7Sopenharmony_ci		return pipelines;
2014e5c31af7Sopenharmony_ci	}
2015e5c31af7Sopenharmony_ci
2016e5c31af7Sopenharmony_ci	static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&)
2017e5c31af7Sopenharmony_ci	{
2018e5c31af7Sopenharmony_ci		vector<VkPipeline>		handles			(1, DE_NULL);
2019e5c31af7Sopenharmony_ci		VkResult				result			= VK_NOT_READY;
2020e5c31af7Sopenharmony_ci		vector<VkPipelineSp>	scopedHandles	= createMultiple(env, res, Parameters(), &handles, &result);
2021e5c31af7Sopenharmony_ci
2022e5c31af7Sopenharmony_ci		VK_CHECK(result);
2023e5c31af7Sopenharmony_ci		return Move<VkPipeline>(check<VkPipeline>(scopedHandles.front()->disown()), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks));
2024e5c31af7Sopenharmony_ci	}
2025e5c31af7Sopenharmony_ci};
2026e5c31af7Sopenharmony_ci
2027e5c31af7Sopenharmony_cistruct ComputePipeline
2028e5c31af7Sopenharmony_ci{
2029e5c31af7Sopenharmony_ci	typedef VkPipeline Type;
2030e5c31af7Sopenharmony_ci
2031e5c31af7Sopenharmony_ci	// \todo [2015-09-17 pyry] More interesting configurations
2032e5c31af7Sopenharmony_ci	struct Parameters
2033e5c31af7Sopenharmony_ci	{
2034e5c31af7Sopenharmony_ci		Parameters (void) {}
2035e5c31af7Sopenharmony_ci	};
2036e5c31af7Sopenharmony_ci
2037e5c31af7Sopenharmony_ci	struct Resources
2038e5c31af7Sopenharmony_ci	{
2039e5c31af7Sopenharmony_ci		Dependency<ShaderModule>	shaderModule;
2040e5c31af7Sopenharmony_ci		Dependency<PipelineLayout>	layout;
2041e5c31af7Sopenharmony_ci		Dependency<PipelineCache>	pipelineCache;
2042e5c31af7Sopenharmony_ci
2043e5c31af7Sopenharmony_ci		static DescriptorSetLayout::Parameters getDescriptorSetLayout (void)
2044e5c31af7Sopenharmony_ci		{
2045e5c31af7Sopenharmony_ci			typedef DescriptorSetLayout::Parameters::Binding Binding;
2046e5c31af7Sopenharmony_ci
2047e5c31af7Sopenharmony_ci			vector<Binding> bindings;
2048e5c31af7Sopenharmony_ci
2049e5c31af7Sopenharmony_ci			bindings.push_back(Binding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false));
2050e5c31af7Sopenharmony_ci			bindings.push_back(Binding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false));
2051e5c31af7Sopenharmony_ci
2052e5c31af7Sopenharmony_ci			return DescriptorSetLayout::Parameters(bindings);
2053e5c31af7Sopenharmony_ci		}
2054e5c31af7Sopenharmony_ci
2055e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters&)
2056e5c31af7Sopenharmony_ci			: shaderModule		(env, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"))
2057e5c31af7Sopenharmony_ci			, layout			(env, PipelineLayout::Parameters::singleDescriptorSet(getDescriptorSetLayout()))
2058e5c31af7Sopenharmony_ci			, pipelineCache		(env, PipelineCache::Parameters())
2059e5c31af7Sopenharmony_ci		{}
2060e5c31af7Sopenharmony_ci	};
2061e5c31af7Sopenharmony_ci
2062e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2063e5c31af7Sopenharmony_ci	{
2064e5c31af7Sopenharmony_ci		return getSafeObjectCount<ComputePipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2065e5c31af7Sopenharmony_ci	}
2066e5c31af7Sopenharmony_ci
2067e5c31af7Sopenharmony_ci	static void initPrograms (SourceCollections& dst, Parameters)
2068e5c31af7Sopenharmony_ci	{
2069e5c31af7Sopenharmony_ci		ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"));
2070e5c31af7Sopenharmony_ci	}
2071e5c31af7Sopenharmony_ci
2072e5c31af7Sopenharmony_ci	static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&)
2073e5c31af7Sopenharmony_ci	{
2074e5c31af7Sopenharmony_ci		const VkComputePipelineCreateInfo	pipelineInfo	=
2075e5c31af7Sopenharmony_ci		{
2076e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2077e5c31af7Sopenharmony_ci			DE_NULL,
2078e5c31af7Sopenharmony_ci			(VkPipelineCreateFlags)0,
2079e5c31af7Sopenharmony_ci			{
2080e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2081e5c31af7Sopenharmony_ci				DE_NULL,
2082e5c31af7Sopenharmony_ci				(VkPipelineShaderStageCreateFlags)0,
2083e5c31af7Sopenharmony_ci				VK_SHADER_STAGE_COMPUTE_BIT,
2084e5c31af7Sopenharmony_ci				*res.shaderModule.object,
2085e5c31af7Sopenharmony_ci				"main",
2086e5c31af7Sopenharmony_ci				DE_NULL					// pSpecializationInfo
2087e5c31af7Sopenharmony_ci			},
2088e5c31af7Sopenharmony_ci			*res.layout.object,
2089e5c31af7Sopenharmony_ci			(VkPipeline)0,				// basePipelineHandle
2090e5c31af7Sopenharmony_ci			0u,							// basePipelineIndex
2091e5c31af7Sopenharmony_ci		};
2092e5c31af7Sopenharmony_ci
2093e5c31af7Sopenharmony_ci		return createComputePipeline(env.vkd, env.device, *res.pipelineCache.object, &pipelineInfo, env.allocationCallbacks);
2094e5c31af7Sopenharmony_ci	}
2095e5c31af7Sopenharmony_ci
2096e5c31af7Sopenharmony_ci	static vector<VkPipelineSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkPipeline>* const pOutHandles, VkResult* const pOutResult)
2097e5c31af7Sopenharmony_ci	{
2098e5c31af7Sopenharmony_ci		DE_ASSERT(pOutResult);
2099e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles);
2100e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles->size() != 0);
2101e5c31af7Sopenharmony_ci
2102e5c31af7Sopenharmony_ci		const VkComputePipelineCreateInfo	commonPipelineInfo	=
2103e5c31af7Sopenharmony_ci		{
2104e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2105e5c31af7Sopenharmony_ci			DE_NULL,
2106e5c31af7Sopenharmony_ci			(VkPipelineCreateFlags)0,
2107e5c31af7Sopenharmony_ci			{
2108e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2109e5c31af7Sopenharmony_ci				DE_NULL,
2110e5c31af7Sopenharmony_ci				(VkPipelineShaderStageCreateFlags)0,
2111e5c31af7Sopenharmony_ci				VK_SHADER_STAGE_COMPUTE_BIT,
2112e5c31af7Sopenharmony_ci				*res.shaderModule.object,
2113e5c31af7Sopenharmony_ci				"main",
2114e5c31af7Sopenharmony_ci				DE_NULL					// pSpecializationInfo
2115e5c31af7Sopenharmony_ci			},
2116e5c31af7Sopenharmony_ci			*res.layout.object,
2117e5c31af7Sopenharmony_ci			(VkPipeline)0,				// basePipelineHandle
2118e5c31af7Sopenharmony_ci			0u,							// basePipelineIndex
2119e5c31af7Sopenharmony_ci		};
2120e5c31af7Sopenharmony_ci
2121e5c31af7Sopenharmony_ci		const deUint32						numPipelines	= static_cast<deUint32>(pOutHandles->size());
2122e5c31af7Sopenharmony_ci		VkPipeline*	const					pHandles		= &(*pOutHandles)[0];
2123e5c31af7Sopenharmony_ci		vector<VkComputePipelineCreateInfo>	pipelineInfos	(numPipelines, commonPipelineInfo);
2124e5c31af7Sopenharmony_ci
2125e5c31af7Sopenharmony_ci		*pOutResult = env.vkd.createComputePipelines(env.device, *res.pipelineCache.object, numPipelines, &pipelineInfos[0], env.allocationCallbacks, pHandles);
2126e5c31af7Sopenharmony_ci
2127e5c31af7Sopenharmony_ci		vector<VkPipelineSp>	pipelines;
2128e5c31af7Sopenharmony_ci
2129e5c31af7Sopenharmony_ci		// Even if an error is returned, some pipelines may have been created successfully
2130e5c31af7Sopenharmony_ci		for (deUint32 i = 0; i < numPipelines; ++i)
2131e5c31af7Sopenharmony_ci		{
2132e5c31af7Sopenharmony_ci			if (pHandles[i] != DE_NULL)
2133e5c31af7Sopenharmony_ci				pipelines.push_back(VkPipelineSp(new Move<VkPipeline>(check<VkPipeline>(pHandles[i]), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks))));
2134e5c31af7Sopenharmony_ci		}
2135e5c31af7Sopenharmony_ci
2136e5c31af7Sopenharmony_ci		return pipelines;
2137e5c31af7Sopenharmony_ci	}
2138e5c31af7Sopenharmony_ci};
2139e5c31af7Sopenharmony_ci
2140e5c31af7Sopenharmony_cistruct DescriptorPool
2141e5c31af7Sopenharmony_ci{
2142e5c31af7Sopenharmony_ci	typedef VkDescriptorPool Type;
2143e5c31af7Sopenharmony_ci
2144e5c31af7Sopenharmony_ci	struct Parameters
2145e5c31af7Sopenharmony_ci	{
2146e5c31af7Sopenharmony_ci		VkDescriptorPoolCreateFlags		flags;
2147e5c31af7Sopenharmony_ci		deUint32						maxSets;
2148e5c31af7Sopenharmony_ci		vector<VkDescriptorPoolSize>	poolSizes;
2149e5c31af7Sopenharmony_ci
2150e5c31af7Sopenharmony_ci		Parameters (VkDescriptorPoolCreateFlags				flags_,
2151e5c31af7Sopenharmony_ci					deUint32								maxSets_,
2152e5c31af7Sopenharmony_ci					const vector<VkDescriptorPoolSize>&		poolSizes_)
2153e5c31af7Sopenharmony_ci			: flags		(flags_)
2154e5c31af7Sopenharmony_ci			, maxSets	(maxSets_)
2155e5c31af7Sopenharmony_ci			, poolSizes	(poolSizes_)
2156e5c31af7Sopenharmony_ci		{}
2157e5c31af7Sopenharmony_ci
2158e5c31af7Sopenharmony_ci		static Parameters singleType (VkDescriptorPoolCreateFlags	flags,
2159e5c31af7Sopenharmony_ci									  deUint32						maxSets,
2160e5c31af7Sopenharmony_ci									  VkDescriptorType				type,
2161e5c31af7Sopenharmony_ci									  deUint32						count)
2162e5c31af7Sopenharmony_ci		{
2163e5c31af7Sopenharmony_ci			vector<VkDescriptorPoolSize> poolSizes;
2164e5c31af7Sopenharmony_ci			poolSizes.push_back(makeDescriptorPoolSize(type, count));
2165e5c31af7Sopenharmony_ci			return Parameters(flags, maxSets, poolSizes);
2166e5c31af7Sopenharmony_ci		}
2167e5c31af7Sopenharmony_ci	};
2168e5c31af7Sopenharmony_ci
2169e5c31af7Sopenharmony_ci	struct Resources
2170e5c31af7Sopenharmony_ci	{
2171e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
2172e5c31af7Sopenharmony_ci	};
2173e5c31af7Sopenharmony_ci
2174e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2175e5c31af7Sopenharmony_ci	{
2176e5c31af7Sopenharmony_ci		return getSafeObjectCount<DescriptorPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2177e5c31af7Sopenharmony_ci	}
2178e5c31af7Sopenharmony_ci
2179e5c31af7Sopenharmony_ci	static Move<VkDescriptorPool> create (const Environment& env, const Resources&, const Parameters& params)
2180e5c31af7Sopenharmony_ci	{
2181e5c31af7Sopenharmony_ci		const VkDescriptorPoolCreateInfo	descriptorPoolInfo	=
2182e5c31af7Sopenharmony_ci		{
2183e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2184e5c31af7Sopenharmony_ci			DE_NULL,
2185e5c31af7Sopenharmony_ci			params.flags,
2186e5c31af7Sopenharmony_ci			params.maxSets,
2187e5c31af7Sopenharmony_ci			(deUint32)params.poolSizes.size(),
2188e5c31af7Sopenharmony_ci			(params.poolSizes.empty() ? DE_NULL : &params.poolSizes[0])
2189e5c31af7Sopenharmony_ci		};
2190e5c31af7Sopenharmony_ci
2191e5c31af7Sopenharmony_ci		return createDescriptorPool(env.vkd, env.device, &descriptorPoolInfo, env.allocationCallbacks);
2192e5c31af7Sopenharmony_ci	}
2193e5c31af7Sopenharmony_ci};
2194e5c31af7Sopenharmony_ci
2195e5c31af7Sopenharmony_cistruct DescriptorSet
2196e5c31af7Sopenharmony_ci{
2197e5c31af7Sopenharmony_ci	typedef VkDescriptorSet Type;
2198e5c31af7Sopenharmony_ci
2199e5c31af7Sopenharmony_ci	struct Parameters
2200e5c31af7Sopenharmony_ci	{
2201e5c31af7Sopenharmony_ci		DescriptorSetLayout::Parameters	descriptorSetLayout;
2202e5c31af7Sopenharmony_ci
2203e5c31af7Sopenharmony_ci		Parameters (const DescriptorSetLayout::Parameters& descriptorSetLayout_)
2204e5c31af7Sopenharmony_ci			: descriptorSetLayout(descriptorSetLayout_)
2205e5c31af7Sopenharmony_ci		{}
2206e5c31af7Sopenharmony_ci	};
2207e5c31af7Sopenharmony_ci
2208e5c31af7Sopenharmony_ci	struct Resources
2209e5c31af7Sopenharmony_ci	{
2210e5c31af7Sopenharmony_ci		Dependency<DescriptorPool>		descriptorPool;
2211e5c31af7Sopenharmony_ci		Dependency<DescriptorSetLayout>	descriptorSetLayout;
2212e5c31af7Sopenharmony_ci
2213e5c31af7Sopenharmony_ci		static vector<VkDescriptorPoolSize> computePoolSizes (const DescriptorSetLayout::Parameters& layout, int maxSets)
2214e5c31af7Sopenharmony_ci		{
2215e5c31af7Sopenharmony_ci			deUint32						countByType[VK_DESCRIPTOR_TYPE_LAST];
2216e5c31af7Sopenharmony_ci			vector<VkDescriptorPoolSize>	typeCounts;
2217e5c31af7Sopenharmony_ci
2218e5c31af7Sopenharmony_ci			std::fill(DE_ARRAY_BEGIN(countByType), DE_ARRAY_END(countByType), 0u);
2219e5c31af7Sopenharmony_ci
2220e5c31af7Sopenharmony_ci			for (vector<DescriptorSetLayout::Parameters::Binding>::const_iterator cur = layout.bindings.begin();
2221e5c31af7Sopenharmony_ci				 cur != layout.bindings.end();
2222e5c31af7Sopenharmony_ci				 ++cur)
2223e5c31af7Sopenharmony_ci			{
2224e5c31af7Sopenharmony_ci				DE_ASSERT((deUint32)cur->descriptorType < VK_DESCRIPTOR_TYPE_LAST);
2225e5c31af7Sopenharmony_ci				countByType[cur->descriptorType] += cur->descriptorCount * maxSets;
2226e5c31af7Sopenharmony_ci			}
2227e5c31af7Sopenharmony_ci
2228e5c31af7Sopenharmony_ci			for (deUint32 type = 0; type < VK_DESCRIPTOR_TYPE_LAST; ++type)
2229e5c31af7Sopenharmony_ci			{
2230e5c31af7Sopenharmony_ci				if (countByType[type] > 0)
2231e5c31af7Sopenharmony_ci					typeCounts.push_back(makeDescriptorPoolSize((VkDescriptorType)type, countByType[type]));
2232e5c31af7Sopenharmony_ci			}
2233e5c31af7Sopenharmony_ci
2234e5c31af7Sopenharmony_ci			return typeCounts;
2235e5c31af7Sopenharmony_ci		}
2236e5c31af7Sopenharmony_ci
2237e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
2238e5c31af7Sopenharmony_ci			: descriptorPool		(env, DescriptorPool::Parameters(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, env.maxResourceConsumers, computePoolSizes(params.descriptorSetLayout, env.maxResourceConsumers)))
2239e5c31af7Sopenharmony_ci			, descriptorSetLayout	(env, params.descriptorSetLayout)
2240e5c31af7Sopenharmony_ci		{
2241e5c31af7Sopenharmony_ci		}
2242e5c31af7Sopenharmony_ci	};
2243e5c31af7Sopenharmony_ci
2244e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2245e5c31af7Sopenharmony_ci	{
2246e5c31af7Sopenharmony_ci		return getSafeObjectCount<DescriptorSet>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2247e5c31af7Sopenharmony_ci	}
2248e5c31af7Sopenharmony_ci
2249e5c31af7Sopenharmony_ci	static Move<VkDescriptorSet> create (const Environment& env, const Resources& res, const Parameters&)
2250e5c31af7Sopenharmony_ci	{
2251e5c31af7Sopenharmony_ci		const VkDescriptorSetAllocateInfo	allocateInfo	=
2252e5c31af7Sopenharmony_ci		{
2253e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2254e5c31af7Sopenharmony_ci			DE_NULL,
2255e5c31af7Sopenharmony_ci			*res.descriptorPool.object,
2256e5c31af7Sopenharmony_ci			1u,
2257e5c31af7Sopenharmony_ci			&res.descriptorSetLayout.object.get(),
2258e5c31af7Sopenharmony_ci		};
2259e5c31af7Sopenharmony_ci
2260e5c31af7Sopenharmony_ci		return allocateDescriptorSet(env.vkd, env.device, &allocateInfo);
2261e5c31af7Sopenharmony_ci	}
2262e5c31af7Sopenharmony_ci
2263e5c31af7Sopenharmony_ci	static vector<VkDescriptorSetSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkDescriptorSet>* const pOutHandles, VkResult* const pOutResult)
2264e5c31af7Sopenharmony_ci	{
2265e5c31af7Sopenharmony_ci		DE_ASSERT(pOutResult);
2266e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles);
2267e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles->size() != 0);
2268e5c31af7Sopenharmony_ci
2269e5c31af7Sopenharmony_ci		const deUint32						numDescriptorSets		= static_cast<deUint32>(pOutHandles->size());
2270e5c31af7Sopenharmony_ci		VkDescriptorSet* const				pHandles				= &(*pOutHandles)[0];
2271e5c31af7Sopenharmony_ci		const vector<VkDescriptorSetLayout>	descriptorSetLayouts	(numDescriptorSets, res.descriptorSetLayout.object.get());
2272e5c31af7Sopenharmony_ci
2273e5c31af7Sopenharmony_ci		const VkDescriptorSetAllocateInfo	allocateInfo			=
2274e5c31af7Sopenharmony_ci		{
2275e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2276e5c31af7Sopenharmony_ci			DE_NULL,
2277e5c31af7Sopenharmony_ci			*res.descriptorPool.object,
2278e5c31af7Sopenharmony_ci			numDescriptorSets,
2279e5c31af7Sopenharmony_ci			&descriptorSetLayouts[0],
2280e5c31af7Sopenharmony_ci		};
2281e5c31af7Sopenharmony_ci
2282e5c31af7Sopenharmony_ci		*pOutResult = env.vkd.allocateDescriptorSets(env.device, &allocateInfo, pHandles);
2283e5c31af7Sopenharmony_ci
2284e5c31af7Sopenharmony_ci		vector<VkDescriptorSetSp>	descriptorSets;
2285e5c31af7Sopenharmony_ci
2286e5c31af7Sopenharmony_ci		if (*pOutResult == VK_SUCCESS)
2287e5c31af7Sopenharmony_ci		{
2288e5c31af7Sopenharmony_ci			for (deUint32 i = 0; i < numDescriptorSets; ++i)
2289e5c31af7Sopenharmony_ci				descriptorSets.push_back(VkDescriptorSetSp(new Move<VkDescriptorSet>(check<VkDescriptorSet>(pHandles[i]), Deleter<VkDescriptorSet>(env.vkd, env.device, *res.descriptorPool.object))));
2290e5c31af7Sopenharmony_ci		}
2291e5c31af7Sopenharmony_ci
2292e5c31af7Sopenharmony_ci		return descriptorSets;
2293e5c31af7Sopenharmony_ci	}
2294e5c31af7Sopenharmony_ci};
2295e5c31af7Sopenharmony_ci
2296e5c31af7Sopenharmony_cistruct Framebuffer
2297e5c31af7Sopenharmony_ci{
2298e5c31af7Sopenharmony_ci	typedef VkFramebuffer Type;
2299e5c31af7Sopenharmony_ci
2300e5c31af7Sopenharmony_ci	struct Parameters
2301e5c31af7Sopenharmony_ci	{
2302e5c31af7Sopenharmony_ci		Parameters (void)
2303e5c31af7Sopenharmony_ci		{}
2304e5c31af7Sopenharmony_ci	};
2305e5c31af7Sopenharmony_ci
2306e5c31af7Sopenharmony_ci	struct Resources
2307e5c31af7Sopenharmony_ci	{
2308e5c31af7Sopenharmony_ci		Dependency<ImageView>	colorAttachment;
2309e5c31af7Sopenharmony_ci		Dependency<ImageView>	depthStencilAttachment;
2310e5c31af7Sopenharmony_ci		Dependency<RenderPass>	renderPass;
2311e5c31af7Sopenharmony_ci
2312e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters&)
2313e5c31af7Sopenharmony_ci			: colorAttachment			(env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
2314e5c31af7Sopenharmony_ci																					  makeExtent3D(256, 256, 1),
2315e5c31af7Sopenharmony_ci																					  1u, 1u,
2316e5c31af7Sopenharmony_ci																					  VK_SAMPLE_COUNT_1_BIT,
2317e5c31af7Sopenharmony_ci																					  VK_IMAGE_TILING_OPTIMAL,
2318e5c31af7Sopenharmony_ci																					  VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
2319e5c31af7Sopenharmony_ci																					  VK_IMAGE_LAYOUT_UNDEFINED),
2320e5c31af7Sopenharmony_ci																		 VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
2321e5c31af7Sopenharmony_ci																		 makeComponentMappingRGBA(),
2322e5c31af7Sopenharmony_ci																		 makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)))
2323e5c31af7Sopenharmony_ci			, depthStencilAttachment	(env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM,
2324e5c31af7Sopenharmony_ci																					  makeExtent3D(256, 256, 1),
2325e5c31af7Sopenharmony_ci																					  1u, 1u,
2326e5c31af7Sopenharmony_ci																					  VK_SAMPLE_COUNT_1_BIT,
2327e5c31af7Sopenharmony_ci																					  VK_IMAGE_TILING_OPTIMAL,
2328e5c31af7Sopenharmony_ci																					  VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
2329e5c31af7Sopenharmony_ci																					  VK_IMAGE_LAYOUT_UNDEFINED),
2330e5c31af7Sopenharmony_ci																		 VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_D16_UNORM,
2331e5c31af7Sopenharmony_ci																		 makeComponentMappingRGBA(),
2332e5c31af7Sopenharmony_ci																		 makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u)))
2333e5c31af7Sopenharmony_ci			, renderPass				(env, RenderPass::Parameters())
2334e5c31af7Sopenharmony_ci		{}
2335e5c31af7Sopenharmony_ci	};
2336e5c31af7Sopenharmony_ci
2337e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2338e5c31af7Sopenharmony_ci	{
2339e5c31af7Sopenharmony_ci		// \todo [2016-03-23 pyry] Take into account attachment sizes
2340e5c31af7Sopenharmony_ci		return getSafeObjectCount<Framebuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2341e5c31af7Sopenharmony_ci	}
2342e5c31af7Sopenharmony_ci
2343e5c31af7Sopenharmony_ci	static Move<VkFramebuffer> create (const Environment& env, const Resources& res, const Parameters&)
2344e5c31af7Sopenharmony_ci	{
2345e5c31af7Sopenharmony_ci		const VkImageView				attachments[]	=
2346e5c31af7Sopenharmony_ci		{
2347e5c31af7Sopenharmony_ci			*res.colorAttachment.object,
2348e5c31af7Sopenharmony_ci			*res.depthStencilAttachment.object,
2349e5c31af7Sopenharmony_ci		};
2350e5c31af7Sopenharmony_ci		const VkFramebufferCreateInfo	framebufferInfo	=
2351e5c31af7Sopenharmony_ci		{
2352e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
2353e5c31af7Sopenharmony_ci			DE_NULL,
2354e5c31af7Sopenharmony_ci			(VkFramebufferCreateFlags)0,
2355e5c31af7Sopenharmony_ci			*res.renderPass.object,
2356e5c31af7Sopenharmony_ci			(deUint32)DE_LENGTH_OF_ARRAY(attachments),
2357e5c31af7Sopenharmony_ci			attachments,
2358e5c31af7Sopenharmony_ci			256u,										// width
2359e5c31af7Sopenharmony_ci			256u,										// height
2360e5c31af7Sopenharmony_ci			1u											// layers
2361e5c31af7Sopenharmony_ci		};
2362e5c31af7Sopenharmony_ci
2363e5c31af7Sopenharmony_ci		return createFramebuffer(env.vkd, env.device, &framebufferInfo, env.allocationCallbacks);
2364e5c31af7Sopenharmony_ci	}
2365e5c31af7Sopenharmony_ci};
2366e5c31af7Sopenharmony_ci
2367e5c31af7Sopenharmony_cistruct CommandPool
2368e5c31af7Sopenharmony_ci{
2369e5c31af7Sopenharmony_ci	typedef VkCommandPool Type;
2370e5c31af7Sopenharmony_ci
2371e5c31af7Sopenharmony_ci	struct Parameters
2372e5c31af7Sopenharmony_ci	{
2373e5c31af7Sopenharmony_ci		VkCommandPoolCreateFlags	flags;
2374e5c31af7Sopenharmony_ci
2375e5c31af7Sopenharmony_ci		Parameters (VkCommandPoolCreateFlags flags_)
2376e5c31af7Sopenharmony_ci			: flags(flags_)
2377e5c31af7Sopenharmony_ci		{}
2378e5c31af7Sopenharmony_ci	};
2379e5c31af7Sopenharmony_ci
2380e5c31af7Sopenharmony_ci	struct Resources
2381e5c31af7Sopenharmony_ci	{
2382e5c31af7Sopenharmony_ci		Resources (const Environment&, const Parameters&) {}
2383e5c31af7Sopenharmony_ci	};
2384e5c31af7Sopenharmony_ci
2385e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2386e5c31af7Sopenharmony_ci	{
2387e5c31af7Sopenharmony_ci		return getSafeObjectCount<CommandPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2388e5c31af7Sopenharmony_ci	}
2389e5c31af7Sopenharmony_ci
2390e5c31af7Sopenharmony_ci	static Move<VkCommandPool> create (const Environment& env, const Resources&, const Parameters& params)
2391e5c31af7Sopenharmony_ci	{
2392e5c31af7Sopenharmony_ci		const VkCommandPoolCreateInfo	cmdPoolInfo	=
2393e5c31af7Sopenharmony_ci		{
2394e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
2395e5c31af7Sopenharmony_ci			DE_NULL,
2396e5c31af7Sopenharmony_ci			params.flags,
2397e5c31af7Sopenharmony_ci			env.queueFamilyIndex,
2398e5c31af7Sopenharmony_ci		};
2399e5c31af7Sopenharmony_ci
2400e5c31af7Sopenharmony_ci		return createCommandPool(env.vkd, env.device, &cmdPoolInfo, env.allocationCallbacks);
2401e5c31af7Sopenharmony_ci	}
2402e5c31af7Sopenharmony_ci};
2403e5c31af7Sopenharmony_ci
2404e5c31af7Sopenharmony_cistruct CommandBuffer
2405e5c31af7Sopenharmony_ci{
2406e5c31af7Sopenharmony_ci	typedef VkCommandBuffer Type;
2407e5c31af7Sopenharmony_ci
2408e5c31af7Sopenharmony_ci	struct Parameters
2409e5c31af7Sopenharmony_ci	{
2410e5c31af7Sopenharmony_ci		CommandPool::Parameters		commandPool;
2411e5c31af7Sopenharmony_ci		VkCommandBufferLevel		level;
2412e5c31af7Sopenharmony_ci
2413e5c31af7Sopenharmony_ci		Parameters (const CommandPool::Parameters&	commandPool_,
2414e5c31af7Sopenharmony_ci					VkCommandBufferLevel			level_)
2415e5c31af7Sopenharmony_ci			: commandPool	(commandPool_)
2416e5c31af7Sopenharmony_ci			, level			(level_)
2417e5c31af7Sopenharmony_ci		{}
2418e5c31af7Sopenharmony_ci	};
2419e5c31af7Sopenharmony_ci
2420e5c31af7Sopenharmony_ci	struct Resources
2421e5c31af7Sopenharmony_ci	{
2422e5c31af7Sopenharmony_ci		Dependency<CommandPool>	commandPool;
2423e5c31af7Sopenharmony_ci
2424e5c31af7Sopenharmony_ci		Resources (const Environment& env, const Parameters& params)
2425e5c31af7Sopenharmony_ci			: commandPool(env, params.commandPool)
2426e5c31af7Sopenharmony_ci		{}
2427e5c31af7Sopenharmony_ci	};
2428e5c31af7Sopenharmony_ci
2429e5c31af7Sopenharmony_ci	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2430e5c31af7Sopenharmony_ci	{
2431e5c31af7Sopenharmony_ci		return getSafeObjectCount<CommandBuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2432e5c31af7Sopenharmony_ci	}
2433e5c31af7Sopenharmony_ci
2434e5c31af7Sopenharmony_ci	static Move<VkCommandBuffer> create (const Environment& env, const Resources& res, const Parameters& params)
2435e5c31af7Sopenharmony_ci	{
2436e5c31af7Sopenharmony_ci		const VkCommandBufferAllocateInfo	cmdBufferInfo	=
2437e5c31af7Sopenharmony_ci		{
2438e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
2439e5c31af7Sopenharmony_ci			DE_NULL,
2440e5c31af7Sopenharmony_ci			*res.commandPool.object,
2441e5c31af7Sopenharmony_ci			params.level,
2442e5c31af7Sopenharmony_ci			1,							// bufferCount
2443e5c31af7Sopenharmony_ci		};
2444e5c31af7Sopenharmony_ci
2445e5c31af7Sopenharmony_ci		return allocateCommandBuffer(env.vkd, env.device, &cmdBufferInfo);
2446e5c31af7Sopenharmony_ci	}
2447e5c31af7Sopenharmony_ci
2448e5c31af7Sopenharmony_ci	static vector<VkCommandBufferSp> createMultiple (const Environment& env, const Resources& res, const Parameters& params, vector<VkCommandBuffer>* const pOutHandles, VkResult* const pOutResult)
2449e5c31af7Sopenharmony_ci	{
2450e5c31af7Sopenharmony_ci		DE_ASSERT(pOutResult);
2451e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles);
2452e5c31af7Sopenharmony_ci		DE_ASSERT(pOutHandles->size() != 0);
2453e5c31af7Sopenharmony_ci
2454e5c31af7Sopenharmony_ci		const deUint32						numCommandBuffers	= static_cast<deUint32>(pOutHandles->size());
2455e5c31af7Sopenharmony_ci		VkCommandBuffer* const				pHandles			= &(*pOutHandles)[0];
2456e5c31af7Sopenharmony_ci
2457e5c31af7Sopenharmony_ci		const VkCommandBufferAllocateInfo	cmdBufferInfo		=
2458e5c31af7Sopenharmony_ci		{
2459e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
2460e5c31af7Sopenharmony_ci			DE_NULL,
2461e5c31af7Sopenharmony_ci			*res.commandPool.object,
2462e5c31af7Sopenharmony_ci			params.level,
2463e5c31af7Sopenharmony_ci			numCommandBuffers,
2464e5c31af7Sopenharmony_ci		};
2465e5c31af7Sopenharmony_ci
2466e5c31af7Sopenharmony_ci		*pOutResult = env.vkd.allocateCommandBuffers(env.device, &cmdBufferInfo, pHandles);
2467e5c31af7Sopenharmony_ci
2468e5c31af7Sopenharmony_ci		vector<VkCommandBufferSp>	commandBuffers;
2469e5c31af7Sopenharmony_ci
2470e5c31af7Sopenharmony_ci		if (*pOutResult == VK_SUCCESS)
2471e5c31af7Sopenharmony_ci		{
2472e5c31af7Sopenharmony_ci			for (deUint32 i = 0; i < numCommandBuffers; ++i)
2473e5c31af7Sopenharmony_ci				commandBuffers.push_back(VkCommandBufferSp(new Move<VkCommandBuffer>(check<VkCommandBuffer>(pHandles[i]), Deleter<VkCommandBuffer>(env.vkd, env.device, *res.commandPool.object))));
2474e5c31af7Sopenharmony_ci		}
2475e5c31af7Sopenharmony_ci
2476e5c31af7Sopenharmony_ci		return commandBuffers;
2477e5c31af7Sopenharmony_ci	}
2478e5c31af7Sopenharmony_ci};
2479e5c31af7Sopenharmony_ci
2480e5c31af7Sopenharmony_ci// Test cases
2481e5c31af7Sopenharmony_ci
2482e5c31af7Sopenharmony_citemplate<typename Object>
2483e5c31af7Sopenharmony_citcu::TestStatus createSingleTest (Context& context, typename Object::Parameters params)
2484e5c31af7Sopenharmony_ci{
2485e5c31af7Sopenharmony_ci	const Environment					env	(context, 1u);
2486e5c31af7Sopenharmony_ci	const typename Object::Resources	res	(env, params);
2487e5c31af7Sopenharmony_ci
2488e5c31af7Sopenharmony_ci	{
2489e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj	(Object::create(env, res, params));
2490e5c31af7Sopenharmony_ci	}
2491e5c31af7Sopenharmony_ci
2492e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
2493e5c31af7Sopenharmony_ci}
2494e5c31af7Sopenharmony_ci
2495e5c31af7Sopenharmony_citemplate<typename Object>
2496e5c31af7Sopenharmony_citcu::TestStatus createMultipleUniqueResourcesTest (Context& context, typename Object::Parameters params)
2497e5c31af7Sopenharmony_ci{
2498e5c31af7Sopenharmony_ci	const Environment					env		(context, 1u);
2499e5c31af7Sopenharmony_ci	const typename Object::Resources	res0	(env, params);
2500e5c31af7Sopenharmony_ci	const typename Object::Resources	res1	(env, params);
2501e5c31af7Sopenharmony_ci	const typename Object::Resources	res2	(env, params);
2502e5c31af7Sopenharmony_ci	const typename Object::Resources	res3	(env, params);
2503e5c31af7Sopenharmony_ci
2504e5c31af7Sopenharmony_ci	{
2505e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj0	(Object::create(env, res0, params));
2506e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj1	(Object::create(env, res1, params));
2507e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj2	(Object::create(env, res2, params));
2508e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj3	(Object::create(env, res3, params));
2509e5c31af7Sopenharmony_ci	}
2510e5c31af7Sopenharmony_ci
2511e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
2512e5c31af7Sopenharmony_ci}
2513e5c31af7Sopenharmony_ci
2514e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
2515e5c31af7Sopenharmony_citemplate<>
2516e5c31af7Sopenharmony_citcu::TestStatus createMultipleUniqueResourcesTest<Instance> (Context& context, Instance::Parameters params)
2517e5c31af7Sopenharmony_ci{
2518e5c31af7Sopenharmony_ci	const Environment					env(context, 1u);
2519e5c31af7Sopenharmony_ci	const typename Instance::Resources	res0(env, params);
2520e5c31af7Sopenharmony_ci	const typename Instance::Resources	res1(env, params);
2521e5c31af7Sopenharmony_ci
2522e5c31af7Sopenharmony_ci	{
2523e5c31af7Sopenharmony_ci		Unique<typename Instance::Type>	obj0(Instance::create(env, res0, params));
2524e5c31af7Sopenharmony_ci		Unique<typename Instance::Type>	obj1(Instance::create(env, res1, params));
2525e5c31af7Sopenharmony_ci	}
2526e5c31af7Sopenharmony_ci
2527e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
2528e5c31af7Sopenharmony_ci}
2529e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2530e5c31af7Sopenharmony_ci
2531e5c31af7Sopenharmony_citemplate<typename Object>
2532e5c31af7Sopenharmony_citcu::TestStatus createMultipleSharedResourcesTest (Context& context, typename Object::Parameters params)
2533e5c31af7Sopenharmony_ci{
2534e5c31af7Sopenharmony_ci	const Environment					env	(context, 4u);
2535e5c31af7Sopenharmony_ci	const typename Object::Resources	res	(env, params);
2536e5c31af7Sopenharmony_ci
2537e5c31af7Sopenharmony_ci	{
2538e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj0	(Object::create(env, res, params));
2539e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj1	(Object::create(env, res, params));
2540e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj2	(Object::create(env, res, params));
2541e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj3	(Object::create(env, res, params));
2542e5c31af7Sopenharmony_ci	}
2543e5c31af7Sopenharmony_ci
2544e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
2545e5c31af7Sopenharmony_ci}
2546e5c31af7Sopenharmony_ci
2547e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
2548e5c31af7Sopenharmony_ci
2549e5c31af7Sopenharmony_ci// Class to wrap singleton devices used by private_data tests
2550e5c31af7Sopenharmony_ciclass SingletonDevice
2551e5c31af7Sopenharmony_ci{
2552e5c31af7Sopenharmony_ci	Move<VkDevice> createPrivateDataDevice(const Context &context, int idx)
2553e5c31af7Sopenharmony_ci	{
2554e5c31af7Sopenharmony_ci		const int requestedSlots[NUM_DEVICES][2] =
2555e5c31af7Sopenharmony_ci		{
2556e5c31af7Sopenharmony_ci			{0, 0},
2557e5c31af7Sopenharmony_ci			{1, 0},
2558e5c31af7Sopenharmony_ci			{1, 1},
2559e5c31af7Sopenharmony_ci			{4, 4},
2560e5c31af7Sopenharmony_ci			{1, 100},
2561e5c31af7Sopenharmony_ci		};
2562e5c31af7Sopenharmony_ci
2563e5c31af7Sopenharmony_ci		const float	queuePriority					= 1.0;
2564e5c31af7Sopenharmony_ci		const VkDeviceQueueCreateInfo	queues[]	=
2565e5c31af7Sopenharmony_ci		{
2566e5c31af7Sopenharmony_ci			{
2567e5c31af7Sopenharmony_ci				VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
2568e5c31af7Sopenharmony_ci				DE_NULL,
2569e5c31af7Sopenharmony_ci				(VkDeviceQueueCreateFlags)0,
2570e5c31af7Sopenharmony_ci				context.getUniversalQueueFamilyIndex(),
2571e5c31af7Sopenharmony_ci				1u,									// queueCount
2572e5c31af7Sopenharmony_ci				&queuePriority,						// pQueuePriorities
2573e5c31af7Sopenharmony_ci			}
2574e5c31af7Sopenharmony_ci		};
2575e5c31af7Sopenharmony_ci
2576e5c31af7Sopenharmony_ci		VkDevicePrivateDataCreateInfoEXT pdci0 =
2577e5c31af7Sopenharmony_ci		{
2578e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT,	// VkStructureType                       sType;
2579e5c31af7Sopenharmony_ci			DE_NULL,												// const void*                           pNext;
2580e5c31af7Sopenharmony_ci			0u,														// uint32_t                              privateDataSlotRequestCount;
2581e5c31af7Sopenharmony_ci		};
2582e5c31af7Sopenharmony_ci		VkDevicePrivateDataCreateInfoEXT pdci1 =
2583e5c31af7Sopenharmony_ci		{
2584e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT,	// VkStructureType                       sType;
2585e5c31af7Sopenharmony_ci			DE_NULL,												// const void*                           pNext;
2586e5c31af7Sopenharmony_ci			0u,														// uint32_t                              privateDataSlotRequestCount;
2587e5c31af7Sopenharmony_ci		};
2588e5c31af7Sopenharmony_ci		void *pNext = DE_NULL;
2589e5c31af7Sopenharmony_ci
2590e5c31af7Sopenharmony_ci		if (requestedSlots[idx][0])
2591e5c31af7Sopenharmony_ci		{
2592e5c31af7Sopenharmony_ci			pNext = &pdci0;
2593e5c31af7Sopenharmony_ci			pdci0.privateDataSlotRequestCount = requestedSlots[idx][0];
2594e5c31af7Sopenharmony_ci			if (requestedSlots[idx][1])
2595e5c31af7Sopenharmony_ci			{
2596e5c31af7Sopenharmony_ci				pdci0.pNext = &pdci1;
2597e5c31af7Sopenharmony_ci				pdci1.privateDataSlotRequestCount = requestedSlots[idx][1];
2598e5c31af7Sopenharmony_ci			}
2599e5c31af7Sopenharmony_ci		}
2600e5c31af7Sopenharmony_ci
2601e5c31af7Sopenharmony_ci		VkPhysicalDevicePrivateDataFeaturesEXT privateDataFeatures =
2602e5c31af7Sopenharmony_ci		{
2603e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT,	// VkStructureType    sType;
2604e5c31af7Sopenharmony_ci			pNext,															// void*              pNext;
2605e5c31af7Sopenharmony_ci			VK_TRUE,														// VkBool32           privateData;
2606e5c31af7Sopenharmony_ci		};
2607e5c31af7Sopenharmony_ci		pNext = &privateDataFeatures;
2608e5c31af7Sopenharmony_ci
2609e5c31af7Sopenharmony_ci		const char *extName = "VK_EXT_private_data";
2610e5c31af7Sopenharmony_ci
2611e5c31af7Sopenharmony_ci		VkPhysicalDeviceFeatures enabledFeatures = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice());
2612e5c31af7Sopenharmony_ci
2613e5c31af7Sopenharmony_ci		const VkDeviceCreateInfo		deviceInfo	=
2614e5c31af7Sopenharmony_ci		{
2615e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
2616e5c31af7Sopenharmony_ci			pNext,
2617e5c31af7Sopenharmony_ci			(VkDeviceCreateFlags)0,
2618e5c31af7Sopenharmony_ci			DE_LENGTH_OF_ARRAY(queues),
2619e5c31af7Sopenharmony_ci			queues,
2620e5c31af7Sopenharmony_ci			0u,										// enabledLayerNameCount
2621e5c31af7Sopenharmony_ci			DE_NULL,								// ppEnabledLayerNames
2622e5c31af7Sopenharmony_ci			1u,										// enabledExtensionNameCount
2623e5c31af7Sopenharmony_ci			&extName,								// ppEnabledExtensionNames
2624e5c31af7Sopenharmony_ci			&enabledFeatures,						// pEnabledFeatures
2625e5c31af7Sopenharmony_ci		};
2626e5c31af7Sopenharmony_ci
2627e5c31af7Sopenharmony_ci		Move<VkDevice> device = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(),
2628e5c31af7Sopenharmony_ci												   context.getPlatformInterface(), context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &deviceInfo, DE_NULL);
2629e5c31af7Sopenharmony_ci		return device;
2630e5c31af7Sopenharmony_ci	}
2631e5c31af7Sopenharmony_ci
2632e5c31af7Sopenharmony_ci	SingletonDevice	(const Context& context, int idx)
2633e5c31af7Sopenharmony_ci		: m_logicalDevice	(createPrivateDataDevice(context, idx))
2634e5c31af7Sopenharmony_ci	{
2635e5c31af7Sopenharmony_ci	}
2636e5c31af7Sopenharmony_ci
2637e5c31af7Sopenharmony_ci
2638e5c31af7Sopenharmony_cipublic:
2639e5c31af7Sopenharmony_ci
2640e5c31af7Sopenharmony_ci	static const int NUM_DEVICES = 5;
2641e5c31af7Sopenharmony_ci
2642e5c31af7Sopenharmony_ci	static const Unique<vk::VkDevice>& getDevice(const Context& context, int idx)
2643e5c31af7Sopenharmony_ci	{
2644e5c31af7Sopenharmony_ci		if (!m_singletonDevice[idx])
2645e5c31af7Sopenharmony_ci			m_singletonDevice[idx] = SharedPtr<SingletonDevice>(new SingletonDevice(context, idx));
2646e5c31af7Sopenharmony_ci
2647e5c31af7Sopenharmony_ci		DE_ASSERT(m_singletonDevice[idx]);
2648e5c31af7Sopenharmony_ci		return m_singletonDevice[idx]->m_logicalDevice;
2649e5c31af7Sopenharmony_ci	}
2650e5c31af7Sopenharmony_ci
2651e5c31af7Sopenharmony_ci	static void destroy()
2652e5c31af7Sopenharmony_ci	{
2653e5c31af7Sopenharmony_ci		for (int idx = 0; idx < NUM_DEVICES; ++idx)
2654e5c31af7Sopenharmony_ci			m_singletonDevice[idx].clear();
2655e5c31af7Sopenharmony_ci	}
2656e5c31af7Sopenharmony_ci
2657e5c31af7Sopenharmony_ciprivate:
2658e5c31af7Sopenharmony_ci	const Unique<vk::VkDevice>					m_logicalDevice;
2659e5c31af7Sopenharmony_ci	static SharedPtr<SingletonDevice>			m_singletonDevice[NUM_DEVICES];
2660e5c31af7Sopenharmony_ci};
2661e5c31af7Sopenharmony_ci
2662e5c31af7Sopenharmony_ciSharedPtr<SingletonDevice>		SingletonDevice::m_singletonDevice[NUM_DEVICES];
2663e5c31af7Sopenharmony_ci
2664e5c31af7Sopenharmony_citemplate<typename T> static deUint64 HandleToInt(T t) { return t.getInternal(); }
2665e5c31af7Sopenharmony_citemplate<typename T> static deUint64 HandleToInt(T *t) { return (deUint64)(deUintptr)(t); }
2666e5c31af7Sopenharmony_ci
2667e5c31af7Sopenharmony_citemplate<typename Object>
2668e5c31af7Sopenharmony_citcu::TestStatus createPrivateDataTest (Context& context, typename Object::Parameters params)
2669e5c31af7Sopenharmony_ci{
2670e5c31af7Sopenharmony_ci	if (!context.getPrivateDataFeatures().privateData)
2671e5c31af7Sopenharmony_ci		TCU_THROW(NotSupportedError, "privateData not supported");
2672e5c31af7Sopenharmony_ci
2673e5c31af7Sopenharmony_ci	for (int d = 0; d < SingletonDevice::NUM_DEVICES; ++d)
2674e5c31af7Sopenharmony_ci	{
2675e5c31af7Sopenharmony_ci		const Unique<vk::VkDevice>&			device =			SingletonDevice::getDevice(context, d);
2676e5c31af7Sopenharmony_ci		const Environment					env					(context.getPlatformInterface(),
2677e5c31af7Sopenharmony_ci																 context.getUsedApiVersion(),
2678e5c31af7Sopenharmony_ci																 context.getInstanceInterface(),
2679e5c31af7Sopenharmony_ci																 context.getInstance(),
2680e5c31af7Sopenharmony_ci																 context.getDeviceInterface(),
2681e5c31af7Sopenharmony_ci																 *device,
2682e5c31af7Sopenharmony_ci																 context.getUniversalQueueFamilyIndex(),
2683e5c31af7Sopenharmony_ci																 context.getBinaryCollection(),
2684e5c31af7Sopenharmony_ci																 DE_NULL,
2685e5c31af7Sopenharmony_ci																 4u,
2686e5c31af7Sopenharmony_ci																 context.getTestContext().getCommandLine());
2687e5c31af7Sopenharmony_ci
2688e5c31af7Sopenharmony_ci		const typename Object::Resources	res	(env, params);
2689e5c31af7Sopenharmony_ci
2690e5c31af7Sopenharmony_ci		const VkPrivateDataSlotCreateInfoEXT createInfo =
2691e5c31af7Sopenharmony_ci		{
2692e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT,	// VkStructureType                    sType;
2693e5c31af7Sopenharmony_ci			DE_NULL,												// const void*                        pNext;
2694e5c31af7Sopenharmony_ci			0u,														// VkPrivateDataSlotCreateFlagsEXT    flags;
2695e5c31af7Sopenharmony_ci		};
2696e5c31af7Sopenharmony_ci
2697e5c31af7Sopenharmony_ci		const int numSlots = 100;
2698e5c31af7Sopenharmony_ci
2699e5c31af7Sopenharmony_ci		typedef Unique<VkPrivateDataSlot>					PrivateDataSlotUp;
2700e5c31af7Sopenharmony_ci		typedef SharedPtr<PrivateDataSlotUp>				PrivateDataSlotSp;
2701e5c31af7Sopenharmony_ci		vector<PrivateDataSlotSp> slots;
2702e5c31af7Sopenharmony_ci
2703e5c31af7Sopenharmony_ci		// interleave allocating objects and slots
2704e5c31af7Sopenharmony_ci		for (int i = 0; i < numSlots / 2; ++i)
2705e5c31af7Sopenharmony_ci		{
2706e5c31af7Sopenharmony_ci			Move<VkPrivateDataSlot> s = createPrivateDataSlot(env.vkd, *device, &createInfo, DE_NULL);
2707e5c31af7Sopenharmony_ci			slots.push_back(PrivateDataSlotSp(new PrivateDataSlotUp(s)));
2708e5c31af7Sopenharmony_ci		}
2709e5c31af7Sopenharmony_ci
2710e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj0	(Object::create(env, res, params));
2711e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj1	(Object::create(env, res, params));
2712e5c31af7Sopenharmony_ci
2713e5c31af7Sopenharmony_ci		for (int i = numSlots / 2; i < numSlots; ++i)
2714e5c31af7Sopenharmony_ci		{
2715e5c31af7Sopenharmony_ci			Move<VkPrivateDataSlot> s = createPrivateDataSlot(env.vkd, *device, &createInfo, DE_NULL);
2716e5c31af7Sopenharmony_ci			slots.push_back(PrivateDataSlotSp(new PrivateDataSlotUp(s)));
2717e5c31af7Sopenharmony_ci		}
2718e5c31af7Sopenharmony_ci
2719e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj2	(Object::create(env, res, params));
2720e5c31af7Sopenharmony_ci		Unique<typename Object::Type>	obj3	(Object::create(env, res, params));
2721e5c31af7Sopenharmony_ci
2722e5c31af7Sopenharmony_ci		Unique<typename Object::Type> *objs[4] = { &obj0, &obj1, &obj2, &obj3 };
2723e5c31af7Sopenharmony_ci
2724e5c31af7Sopenharmony_ci		for (int r = 0; r < 3; ++r)
2725e5c31af7Sopenharmony_ci		{
2726e5c31af7Sopenharmony_ci			deUint64 data;
2727e5c31af7Sopenharmony_ci
2728e5c31af7Sopenharmony_ci			// Test private data for the objects
2729e5c31af7Sopenharmony_ci			for (int o = 0; o < 4; ++o)
2730e5c31af7Sopenharmony_ci			{
2731e5c31af7Sopenharmony_ci				auto &obj = *objs[o];
2732e5c31af7Sopenharmony_ci				for (int i = 0; i < numSlots; ++i)
2733e5c31af7Sopenharmony_ci				{
2734e5c31af7Sopenharmony_ci					data = 1234;
2735e5c31af7Sopenharmony_ci					env.vkd.getPrivateData(*device, getObjectType<typename Object::Type>(), HandleToInt(obj.get()), **slots[i], &data);
2736e5c31af7Sopenharmony_ci					if (data != 0)
2737e5c31af7Sopenharmony_ci						return tcu::TestStatus::fail("Expected initial value of zero");
2738e5c31af7Sopenharmony_ci				}
2739e5c31af7Sopenharmony_ci			}
2740e5c31af7Sopenharmony_ci			for (int o = 0; o < 4; ++o)
2741e5c31af7Sopenharmony_ci			{
2742e5c31af7Sopenharmony_ci				auto &obj = *objs[o];
2743e5c31af7Sopenharmony_ci				for (int i = 0; i < numSlots; ++i)
2744e5c31af7Sopenharmony_ci					VK_CHECK(env.vkd.setPrivateData(*device, getObjectType<typename Object::Type>(), HandleToInt(obj.get()), **slots[i], i*i*i + o*o + 1));
2745e5c31af7Sopenharmony_ci			}
2746e5c31af7Sopenharmony_ci			for (int o = 0; o < 4; ++o)
2747e5c31af7Sopenharmony_ci			{
2748e5c31af7Sopenharmony_ci				auto &obj = *objs[o];
2749e5c31af7Sopenharmony_ci				for (int i = 0; i < numSlots; ++i)
2750e5c31af7Sopenharmony_ci				{
2751e5c31af7Sopenharmony_ci					data = 1234;
2752e5c31af7Sopenharmony_ci					env.vkd.getPrivateData(*device, getObjectType<typename Object::Type>(), HandleToInt(obj.get()), **slots[i], &data);
2753e5c31af7Sopenharmony_ci					if (data != (deUint64)(i*i*i + o*o + 1))
2754e5c31af7Sopenharmony_ci						return tcu::TestStatus::fail("Didn't read back set value");
2755e5c31af7Sopenharmony_ci				}
2756e5c31af7Sopenharmony_ci			}
2757e5c31af7Sopenharmony_ci
2758e5c31af7Sopenharmony_ci
2759e5c31af7Sopenharmony_ci			// Test private data for the private data objects
2760e5c31af7Sopenharmony_ci			for (int o = 0; o < numSlots; ++o)
2761e5c31af7Sopenharmony_ci			{
2762e5c31af7Sopenharmony_ci				auto &obj = **slots[o];
2763e5c31af7Sopenharmony_ci				for (int i = 0; i < numSlots; ++i)
2764e5c31af7Sopenharmony_ci				{
2765e5c31af7Sopenharmony_ci					data = 1234;
2766e5c31af7Sopenharmony_ci					env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, HandleToInt<VkPrivateDataSlotEXT>(obj), **slots[i], &data);
2767e5c31af7Sopenharmony_ci					if (data != 0)
2768e5c31af7Sopenharmony_ci						return tcu::TestStatus::fail("Expected initial value of zero");
2769e5c31af7Sopenharmony_ci				}
2770e5c31af7Sopenharmony_ci			}
2771e5c31af7Sopenharmony_ci			for (int o = 0; o < numSlots; ++o)
2772e5c31af7Sopenharmony_ci			{
2773e5c31af7Sopenharmony_ci				auto &obj = **slots[o];
2774e5c31af7Sopenharmony_ci				for (int i = 0; i < numSlots; ++i)
2775e5c31af7Sopenharmony_ci					VK_CHECK(env.vkd.setPrivateData(*device, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, HandleToInt<VkPrivateDataSlotEXT>(obj), **slots[i], i*i*i + o*o + 1));
2776e5c31af7Sopenharmony_ci			}
2777e5c31af7Sopenharmony_ci			for (int o = 0; o < numSlots; ++o)
2778e5c31af7Sopenharmony_ci			{
2779e5c31af7Sopenharmony_ci				auto &obj = **slots[o];
2780e5c31af7Sopenharmony_ci				for (int i = 0; i < numSlots; ++i)
2781e5c31af7Sopenharmony_ci				{
2782e5c31af7Sopenharmony_ci					data = 1234;
2783e5c31af7Sopenharmony_ci					env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, HandleToInt<VkPrivateDataSlotEXT>(obj), **slots[i], &data);
2784e5c31af7Sopenharmony_ci					if (data != (deUint64)(i*i*i + o*o + 1))
2785e5c31af7Sopenharmony_ci						return tcu::TestStatus::fail("Didn't read back set value");
2786e5c31af7Sopenharmony_ci				}
2787e5c31af7Sopenharmony_ci			}
2788e5c31af7Sopenharmony_ci
2789e5c31af7Sopenharmony_ci			// Test private data for the device
2790e5c31af7Sopenharmony_ci			for (int i = 0; i < numSlots; ++i)
2791e5c31af7Sopenharmony_ci			{
2792e5c31af7Sopenharmony_ci				data = 1234;
2793e5c31af7Sopenharmony_ci				env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_DEVICE, (deUint64)(deUintptr)(*device), **slots[i], &data);
2794e5c31af7Sopenharmony_ci				if (data != 0)
2795e5c31af7Sopenharmony_ci					return tcu::TestStatus::fail("Expected initial value of zero for device");
2796e5c31af7Sopenharmony_ci			}
2797e5c31af7Sopenharmony_ci			for (int i = 0; i < numSlots; ++i)
2798e5c31af7Sopenharmony_ci				VK_CHECK(env.vkd.setPrivateData(*device, VK_OBJECT_TYPE_DEVICE, (deUint64)(deUintptr)(*device), **slots[i], i*i*i + r*r + 1));
2799e5c31af7Sopenharmony_ci			for (int i = 0; i < numSlots; ++i)
2800e5c31af7Sopenharmony_ci			{
2801e5c31af7Sopenharmony_ci				data = 1234;
2802e5c31af7Sopenharmony_ci				env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_DEVICE, (deUint64)(deUintptr)(*device), **slots[i], &data);
2803e5c31af7Sopenharmony_ci				if (data != (deUint64)(i*i*i + r*r + 1))
2804e5c31af7Sopenharmony_ci					return tcu::TestStatus::fail("Didn't read back set value from device");
2805e5c31af7Sopenharmony_ci			}
2806e5c31af7Sopenharmony_ci
2807e5c31af7Sopenharmony_ci			// Destroy and realloc slots for the next iteration
2808e5c31af7Sopenharmony_ci			slots.clear();
2809e5c31af7Sopenharmony_ci			for (int i = 0; i < numSlots; ++i)
2810e5c31af7Sopenharmony_ci			{
2811e5c31af7Sopenharmony_ci				Move<VkPrivateDataSlotEXT> s = createPrivateDataSlot(env.vkd, *device, &createInfo, DE_NULL);
2812e5c31af7Sopenharmony_ci				slots.push_back(PrivateDataSlotSp(new PrivateDataSlotUp(s)));
2813e5c31af7Sopenharmony_ci			}
2814e5c31af7Sopenharmony_ci		}
2815e5c31af7Sopenharmony_ci	}
2816e5c31af7Sopenharmony_ci
2817e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
2818e5c31af7Sopenharmony_ci}
2819e5c31af7Sopenharmony_ci
2820e5c31af7Sopenharmony_citemplate<typename Object>
2821e5c31af7Sopenharmony_citcu::TestStatus createMaxConcurrentTest (Context& context, typename Object::Parameters params)
2822e5c31af7Sopenharmony_ci{
2823e5c31af7Sopenharmony_ci	typedef Unique<typename Object::Type>	UniqueObject;
2824e5c31af7Sopenharmony_ci	typedef SharedPtr<UniqueObject>			ObjectPtr;
2825e5c31af7Sopenharmony_ci
2826e5c31af7Sopenharmony_ci	const deUint32						numObjects			= Object::getMaxConcurrent(context, params);
2827e5c31af7Sopenharmony_ci	const Environment					env					(context, numObjects);
2828e5c31af7Sopenharmony_ci	const typename Object::Resources	res					(env, params);
2829e5c31af7Sopenharmony_ci	vector<ObjectPtr>					objects				(numObjects);
2830e5c31af7Sopenharmony_ci	const deUint32						watchdogInterval	= 1024;
2831e5c31af7Sopenharmony_ci
2832e5c31af7Sopenharmony_ci	context.getTestContext().getLog()
2833e5c31af7Sopenharmony_ci		<< TestLog::Message << "Creating " << numObjects << " " << getTypeName<typename Object::Type>() << " objects" << TestLog::EndMessage;
2834e5c31af7Sopenharmony_ci
2835e5c31af7Sopenharmony_ci	for (deUint32 ndx = 0; ndx < numObjects; ndx++)
2836e5c31af7Sopenharmony_ci	{
2837e5c31af7Sopenharmony_ci		objects[ndx] = ObjectPtr(new UniqueObject(Object::create(env, res, params)));
2838e5c31af7Sopenharmony_ci
2839e5c31af7Sopenharmony_ci		if ((ndx > 0) && ((ndx % watchdogInterval) == 0))
2840e5c31af7Sopenharmony_ci			context.getTestContext().touchWatchdog();
2841e5c31af7Sopenharmony_ci	}
2842e5c31af7Sopenharmony_ci
2843e5c31af7Sopenharmony_ci	context.getTestContext().touchWatchdog();
2844e5c31af7Sopenharmony_ci	objects.clear();
2845e5c31af7Sopenharmony_ci
2846e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
2847e5c31af7Sopenharmony_ci}
2848e5c31af7Sopenharmony_ci
2849e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2850e5c31af7Sopenharmony_ci
2851e5c31af7Sopenharmony_ci// How many objects to create per thread
2852e5c31af7Sopenharmony_citemplate<typename Object>	int getCreateCount				(void) { return 100;	}
2853e5c31af7Sopenharmony_ci
2854e5c31af7Sopenharmony_ci// Creating VkDevice and VkInstance can take significantly longer than other object types
2855e5c31af7Sopenharmony_ci
2856e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
2857e5c31af7Sopenharmony_citemplate<>					int getCreateCount<Instance>	(void) { return 20;		}
2858e5c31af7Sopenharmony_citemplate<>					int getCreateCount<Device>		(void) { return 20;		}
2859e5c31af7Sopenharmony_citemplate<>					int getCreateCount<DeviceGroup>	(void) { return 20;		}
2860e5c31af7Sopenharmony_ci#else
2861e5c31af7Sopenharmony_citemplate<>					int getCreateCount<Instance>	(void) { return 2;		}
2862e5c31af7Sopenharmony_citemplate<>					int getCreateCount<Device>		(void) { return 2;		}
2863e5c31af7Sopenharmony_citemplate<>					int getCreateCount<DeviceGroup>	(void) { return 2;		}
2864e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2865e5c31af7Sopenharmony_ci
2866e5c31af7Sopenharmony_citemplate<typename Object>
2867e5c31af7Sopenharmony_ciclass CreateThread : public ThreadGroupThread
2868e5c31af7Sopenharmony_ci{
2869e5c31af7Sopenharmony_cipublic:
2870e5c31af7Sopenharmony_ci	CreateThread (const Environment& env, const typename Object::Resources& resources, const typename Object::Parameters& params)
2871e5c31af7Sopenharmony_ci		: m_env			(env)
2872e5c31af7Sopenharmony_ci		, m_resources	(resources)
2873e5c31af7Sopenharmony_ci		, m_params		(params)
2874e5c31af7Sopenharmony_ci	{}
2875e5c31af7Sopenharmony_ci
2876e5c31af7Sopenharmony_ci	void runThread (void)
2877e5c31af7Sopenharmony_ci	{
2878e5c31af7Sopenharmony_ci		const int	numIters			= getCreateCount<Object>();
2879e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
2880e5c31af7Sopenharmony_ci		const int	itersBetweenSyncs	= numIters / 5;
2881e5c31af7Sopenharmony_ci#else
2882e5c31af7Sopenharmony_ci		const int	itersBetweenSyncs	= 1;
2883e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2884e5c31af7Sopenharmony_ci
2885e5c31af7Sopenharmony_ci		DE_ASSERT(itersBetweenSyncs > 0);
2886e5c31af7Sopenharmony_ci
2887e5c31af7Sopenharmony_ci		for (int iterNdx = 0; iterNdx < numIters; iterNdx++)
2888e5c31af7Sopenharmony_ci		{
2889e5c31af7Sopenharmony_ci			// Sync every Nth iteration to make entering driver at the same time more likely
2890e5c31af7Sopenharmony_ci			if ((iterNdx % itersBetweenSyncs) == 0)
2891e5c31af7Sopenharmony_ci				barrier();
2892e5c31af7Sopenharmony_ci
2893e5c31af7Sopenharmony_ci			{
2894e5c31af7Sopenharmony_ci				Unique<typename Object::Type>	obj	(Object::create(m_env, m_resources, m_params));
2895e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
2896e5c31af7Sopenharmony_ci				if (iterNdx == 0)
2897e5c31af7Sopenharmony_ci				{
2898e5c31af7Sopenharmony_ci					barrier();
2899e5c31af7Sopenharmony_ci				}
2900e5c31af7Sopenharmony_ci#endif
2901e5c31af7Sopenharmony_ci			}
2902e5c31af7Sopenharmony_ci		}
2903e5c31af7Sopenharmony_ci	}
2904e5c31af7Sopenharmony_ci
2905e5c31af7Sopenharmony_ciprivate:
2906e5c31af7Sopenharmony_ci	const Environment&					m_env;
2907e5c31af7Sopenharmony_ci	const typename Object::Resources&	m_resources;
2908e5c31af7Sopenharmony_ci	const typename Object::Parameters&	m_params;
2909e5c31af7Sopenharmony_ci};
2910e5c31af7Sopenharmony_ci
2911e5c31af7Sopenharmony_citemplate<typename Object>
2912e5c31af7Sopenharmony_citcu::TestStatus multithreadedCreateSharedResourcesTest (Context& context, typename Object::Parameters params)
2913e5c31af7Sopenharmony_ci{
2914e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
2915e5c31af7Sopenharmony_ci	MultithreadedDestroyGuard			mdGuard		(context.getResourceInterface());
2916e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2917e5c31af7Sopenharmony_ci	TestLog&							log			= context.getTestContext().getLog();
2918e5c31af7Sopenharmony_ci	const deUint32						numThreads	= getDefaultTestThreadCount();
2919e5c31af7Sopenharmony_ci	const Environment					env			(context, numThreads);
2920e5c31af7Sopenharmony_ci	const typename Object::Resources	res			(env, params);
2921e5c31af7Sopenharmony_ci	ThreadGroup							threads;
2922e5c31af7Sopenharmony_ci
2923e5c31af7Sopenharmony_ci	log << TestLog::Message << "numThreads = " << numThreads << TestLog::EndMessage;
2924e5c31af7Sopenharmony_ci
2925e5c31af7Sopenharmony_ci	for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2926e5c31af7Sopenharmony_ci		threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, res, params)));
2927e5c31af7Sopenharmony_ci
2928e5c31af7Sopenharmony_ci	return threads.run();
2929e5c31af7Sopenharmony_ci}
2930e5c31af7Sopenharmony_ci
2931e5c31af7Sopenharmony_citemplate<typename Object>
2932e5c31af7Sopenharmony_citcu::TestStatus multithreadedCreatePerThreadResourcesTest (Context& context, typename Object::Parameters params)
2933e5c31af7Sopenharmony_ci{
2934e5c31af7Sopenharmony_ci	typedef SharedPtr<typename Object::Resources>	ResPtr;
2935e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
2936e5c31af7Sopenharmony_ci	MultithreadedDestroyGuard	mdGuard	(context.getResourceInterface());
2937e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2938e5c31af7Sopenharmony_ci	TestLog&					log			= context.getTestContext().getLog();
2939e5c31af7Sopenharmony_ci	const deUint32				numThreads	= getDefaultTestThreadCount();
2940e5c31af7Sopenharmony_ci	const Environment			env			(context, 1u);
2941e5c31af7Sopenharmony_ci	vector<ResPtr>				resources	(numThreads);
2942e5c31af7Sopenharmony_ci	ThreadGroup					threads;
2943e5c31af7Sopenharmony_ci
2944e5c31af7Sopenharmony_ci	log << TestLog::Message << "numThreads = " << numThreads << TestLog::EndMessage;
2945e5c31af7Sopenharmony_ci
2946e5c31af7Sopenharmony_ci	for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2947e5c31af7Sopenharmony_ci	{
2948e5c31af7Sopenharmony_ci		resources[ndx] = ResPtr(new typename Object::Resources(env, params));
2949e5c31af7Sopenharmony_ci		threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, *resources[ndx], params)));
2950e5c31af7Sopenharmony_ci	}
2951e5c31af7Sopenharmony_ci
2952e5c31af7Sopenharmony_ci	return threads.run();
2953e5c31af7Sopenharmony_ci}
2954e5c31af7Sopenharmony_ci
2955e5c31af7Sopenharmony_cistruct EnvClone
2956e5c31af7Sopenharmony_ci{
2957e5c31af7Sopenharmony_ci	Device::Resources											deviceRes;
2958e5c31af7Sopenharmony_ci	Unique<VkDevice>											device;
2959e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
2960e5c31af7Sopenharmony_ci	de::MovePtr<vk::DeviceDriver>								vkd;
2961e5c31af7Sopenharmony_ci#else
2962e5c31af7Sopenharmony_ci	de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter>	vkd;
2963e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2964e5c31af7Sopenharmony_ci	Environment													env;
2965e5c31af7Sopenharmony_ci
2966e5c31af7Sopenharmony_ci	EnvClone (const Environment& parent, const Device::Parameters& deviceParams, deUint32 maxResourceConsumers)
2967e5c31af7Sopenharmony_ci		: deviceRes	(parent, deviceParams)
2968e5c31af7Sopenharmony_ci		, device	(Device::create(parent, deviceRes, deviceParams))
2969e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
2970e5c31af7Sopenharmony_ci		, vkd(de::MovePtr<DeviceDriver>(new DeviceDriver(parent.vkp, parent.instance, *device, parent.apiVersion)))
2971e5c31af7Sopenharmony_ci		, env(parent.vkp, parent.apiVersion, parent.instanceInterface, parent.instance, *vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers, parent.commandLine)
2972e5c31af7Sopenharmony_ci#else
2973e5c31af7Sopenharmony_ci		, vkd(de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(parent.vkp, parent.instance, *device, parent.commandLine, parent.resourceInterface, parent.vulkanSC10Properties, parent.properties, parent.apiVersion), vk::DeinitDeviceDeleter(parent.resourceInterface.get(), *device)))
2974e5c31af7Sopenharmony_ci		, env(parent.vkp, parent.apiVersion, parent.instanceInterface, parent.instance, *vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers, parent.resourceInterface, parent.vulkanSC10Properties, parent.commandLine)
2975e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2976e5c31af7Sopenharmony_ci	{
2977e5c31af7Sopenharmony_ci	}
2978e5c31af7Sopenharmony_ci};
2979e5c31af7Sopenharmony_ci
2980e5c31af7Sopenharmony_ciDevice::Parameters getDefaulDeviceParameters (Context& context)
2981e5c31af7Sopenharmony_ci{
2982e5c31af7Sopenharmony_ci	return Device::Parameters(context.getTestContext().getCommandLine().getVKDeviceId()-1u,
2983e5c31af7Sopenharmony_ci							  VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT);
2984e5c31af7Sopenharmony_ci}
2985e5c31af7Sopenharmony_ci
2986e5c31af7Sopenharmony_citemplate<typename Object>
2987e5c31af7Sopenharmony_citcu::TestStatus multithreadedCreatePerThreadDeviceTest (Context& context, typename Object::Parameters params)
2988e5c31af7Sopenharmony_ci{
2989e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
2990e5c31af7Sopenharmony_ci	MultithreadedDestroyGuard						mdGuard(context.getResourceInterface());
2991e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
2992e5c31af7Sopenharmony_ci	typedef SharedPtr<EnvClone>						EnvPtr;
2993e5c31af7Sopenharmony_ci	typedef SharedPtr<typename Object::Resources>	ResPtr;
2994e5c31af7Sopenharmony_ci
2995e5c31af7Sopenharmony_ci	TestLog&					log				= context.getTestContext().getLog();
2996e5c31af7Sopenharmony_ci	const deUint32				numThreads		= getDefaultTestThreadCount();
2997e5c31af7Sopenharmony_ci	const Device::Parameters	deviceParams	= getDefaulDeviceParameters(context);
2998e5c31af7Sopenharmony_ci	const Environment			sharedEnv		(context, numThreads);			// For creating Device's
2999e5c31af7Sopenharmony_ci	vector<EnvPtr>				perThreadEnv	(numThreads);
3000e5c31af7Sopenharmony_ci	vector<ResPtr>				resources		(numThreads);
3001e5c31af7Sopenharmony_ci	ThreadGroup					threads;
3002e5c31af7Sopenharmony_ci
3003e5c31af7Sopenharmony_ci	log << TestLog::Message << "numThreads = " << numThreads << TestLog::EndMessage;
3004e5c31af7Sopenharmony_ci
3005e5c31af7Sopenharmony_ci	for (deUint32 ndx = 0; ndx < numThreads; ndx++)
3006e5c31af7Sopenharmony_ci	{
3007e5c31af7Sopenharmony_ci		perThreadEnv[ndx]	= EnvPtr(new EnvClone(sharedEnv, deviceParams, 1u));
3008e5c31af7Sopenharmony_ci		resources[ndx]		= ResPtr(new typename Object::Resources(perThreadEnv[ndx]->env, params));
3009e5c31af7Sopenharmony_ci
3010e5c31af7Sopenharmony_ci		threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(perThreadEnv[ndx]->env, *resources[ndx], params)));
3011e5c31af7Sopenharmony_ci	}
3012e5c31af7Sopenharmony_ci
3013e5c31af7Sopenharmony_ci	return threads.run();
3014e5c31af7Sopenharmony_ci}
3015e5c31af7Sopenharmony_ci
3016e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3017e5c31af7Sopenharmony_ci
3018e5c31af7Sopenharmony_citemplate<typename Object>
3019e5c31af7Sopenharmony_citcu::TestStatus createSingleAllocCallbacksTest (Context& context, typename Object::Parameters params)
3020e5c31af7Sopenharmony_ci{
3021e5c31af7Sopenharmony_ci	const deUint32						noCmdScope		= (1u << VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE)
3022e5c31af7Sopenharmony_ci														| (1u << VK_SYSTEM_ALLOCATION_SCOPE_DEVICE)
3023e5c31af7Sopenharmony_ci														| (1u << VK_SYSTEM_ALLOCATION_SCOPE_CACHE)
3024e5c31af7Sopenharmony_ci														| (1u << VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
3025e5c31af7Sopenharmony_ci
3026e5c31af7Sopenharmony_ci	// Callbacks used by resources
3027e5c31af7Sopenharmony_ci	AllocationCallbackRecorder			resCallbacks	(getSystemAllocator(), 128);
3028e5c31af7Sopenharmony_ci
3029e5c31af7Sopenharmony_ci	// Root environment still uses default instance and device, created without callbacks
3030e5c31af7Sopenharmony_ci	const Environment					rootEnv			(context.getPlatformInterface(),
3031e5c31af7Sopenharmony_ci														 context.getUsedApiVersion(),
3032e5c31af7Sopenharmony_ci														 context.getInstanceInterface(),
3033e5c31af7Sopenharmony_ci														 context.getInstance(),
3034e5c31af7Sopenharmony_ci														 context.getDeviceInterface(),
3035e5c31af7Sopenharmony_ci														 context.getDevice(),
3036e5c31af7Sopenharmony_ci														 context.getUniversalQueueFamilyIndex(),
3037e5c31af7Sopenharmony_ci														 context.getBinaryCollection(),
3038e5c31af7Sopenharmony_ci														 resCallbacks.getCallbacks(),
3039e5c31af7Sopenharmony_ci														 1u,
3040e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
3041e5c31af7Sopenharmony_ci														 context.getResourceInterface(),
3042e5c31af7Sopenharmony_ci														 context.getDeviceVulkanSC10Properties(),
3043e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3044e5c31af7Sopenharmony_ci														 context.getTestContext().getCommandLine());
3045e5c31af7Sopenharmony_ci
3046e5c31af7Sopenharmony_ci	{
3047e5c31af7Sopenharmony_ci		// Test env has instance & device created with callbacks
3048e5c31af7Sopenharmony_ci		const EnvClone						resEnv		(rootEnv, getDefaulDeviceParameters(context), 1u);
3049e5c31af7Sopenharmony_ci		const typename Object::Resources	res			(resEnv.env, params);
3050e5c31af7Sopenharmony_ci
3051e5c31af7Sopenharmony_ci		// Supply a separate callback recorder just for object construction
3052e5c31af7Sopenharmony_ci		AllocationCallbackRecorder			objCallbacks(getSystemAllocator(), 128);
3053e5c31af7Sopenharmony_ci		const Environment					objEnv		(resEnv.env.vkp,
3054e5c31af7Sopenharmony_ci														 resEnv.env.apiVersion,
3055e5c31af7Sopenharmony_ci														 resEnv.env.instanceInterface,
3056e5c31af7Sopenharmony_ci														 resEnv.env.instance,
3057e5c31af7Sopenharmony_ci														 resEnv.env.vkd,
3058e5c31af7Sopenharmony_ci														 resEnv.env.device,
3059e5c31af7Sopenharmony_ci														 resEnv.env.queueFamilyIndex,
3060e5c31af7Sopenharmony_ci														 resEnv.env.programBinaries,
3061e5c31af7Sopenharmony_ci														 objCallbacks.getCallbacks(),
3062e5c31af7Sopenharmony_ci														 resEnv.env.maxResourceConsumers,
3063e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
3064e5c31af7Sopenharmony_ci														 resEnv.env.resourceInterface,
3065e5c31af7Sopenharmony_ci														 resEnv.env.vulkanSC10Properties,
3066e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3067e5c31af7Sopenharmony_ci														 resEnv.env.commandLine);
3068e5c31af7Sopenharmony_ci
3069e5c31af7Sopenharmony_ci		{
3070e5c31af7Sopenharmony_ci			Unique<typename Object::Type>	obj	(Object::create(objEnv, res, params));
3071e5c31af7Sopenharmony_ci
3072e5c31af7Sopenharmony_ci			// Validate that no command-level allocations are live
3073e5c31af7Sopenharmony_ci			if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, noCmdScope))
3074e5c31af7Sopenharmony_ci				return tcu::TestStatus::fail("Invalid allocation callback");
3075e5c31af7Sopenharmony_ci		}
3076e5c31af7Sopenharmony_ci
3077e5c31af7Sopenharmony_ci		// At this point all allocations made against object callbacks must have been freed
3078e5c31af7Sopenharmony_ci		if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, 0u))
3079e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail("Invalid allocation callback");
3080e5c31af7Sopenharmony_ci	}
3081e5c31af7Sopenharmony_ci
3082e5c31af7Sopenharmony_ci	if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u))
3083e5c31af7Sopenharmony_ci		return tcu::TestStatus::fail("Invalid allocation callback");
3084e5c31af7Sopenharmony_ci
3085e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Ok");
3086e5c31af7Sopenharmony_ci}
3087e5c31af7Sopenharmony_ci
3088e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3089e5c31af7Sopenharmony_ci
3090e5c31af7Sopenharmony_citemplate<typename Object>	deUint32	getOomIterLimit					(void) { return 40;		}
3091e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3092e5c31af7Sopenharmony_citemplate<>					deUint32	getOomIterLimit<Device>			(void) { return 20;		}
3093e5c31af7Sopenharmony_citemplate<>					deUint32	getOomIterLimit<DeviceGroup>	(void) { return 20;		}
3094e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3095e5c31af7Sopenharmony_ci
3096e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3097e5c31af7Sopenharmony_ci
3098e5c31af7Sopenharmony_citemplate<typename Object>
3099e5c31af7Sopenharmony_citcu::TestStatus allocCallbackFailTest (Context& context, typename Object::Parameters params)
3100e5c31af7Sopenharmony_ci{
3101e5c31af7Sopenharmony_ci	AllocationCallbackRecorder			resCallbacks		(getSystemAllocator(), 128);
3102e5c31af7Sopenharmony_ci	const Environment					rootEnv				(context.getPlatformInterface(),
3103e5c31af7Sopenharmony_ci															 context.getUsedApiVersion(),
3104e5c31af7Sopenharmony_ci															 context.getInstanceInterface(),
3105e5c31af7Sopenharmony_ci															 context.getInstance(),
3106e5c31af7Sopenharmony_ci															 context.getDeviceInterface(),
3107e5c31af7Sopenharmony_ci															 context.getDevice(),
3108e5c31af7Sopenharmony_ci															 context.getUniversalQueueFamilyIndex(),
3109e5c31af7Sopenharmony_ci															 context.getBinaryCollection(),
3110e5c31af7Sopenharmony_ci															 resCallbacks.getCallbacks(),
3111e5c31af7Sopenharmony_ci															 1u,
3112e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
3113e5c31af7Sopenharmony_ci															 context.getResourceInterface(),
3114e5c31af7Sopenharmony_ci															 context.getDeviceVulkanSC10Properties(),
3115e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3116e5c31af7Sopenharmony_ci															 context.getTestContext().getCommandLine());
3117e5c31af7Sopenharmony_ci	deUint32							numPassingAllocs	= 0;
3118e5c31af7Sopenharmony_ci	const deUint32						cmdLineIterCount	= (deUint32)context.getTestContext().getCommandLine().getTestIterationCount();
3119e5c31af7Sopenharmony_ci	const deUint32						maxTries			= cmdLineIterCount != 0 ? cmdLineIterCount : getOomIterLimit<Object>();
3120e5c31af7Sopenharmony_ci	const deUint32						finalLimit			= std::max(maxTries, 10000u);
3121e5c31af7Sopenharmony_ci	bool								createOk			= false;
3122e5c31af7Sopenharmony_ci
3123e5c31af7Sopenharmony_ci	{
3124e5c31af7Sopenharmony_ci		const EnvClone						resEnv	(rootEnv, getDefaulDeviceParameters(context), 1u);
3125e5c31af7Sopenharmony_ci		const typename Object::Resources	res		(resEnv.env, params);
3126e5c31af7Sopenharmony_ci
3127e5c31af7Sopenharmony_ci		// Iterate over test until object allocation succeeds
3128e5c31af7Sopenharmony_ci		while(true)
3129e5c31af7Sopenharmony_ci		{
3130e5c31af7Sopenharmony_ci			DeterministicFailAllocator			objAllocator(getSystemAllocator(),
3131e5c31af7Sopenharmony_ci															 DeterministicFailAllocator::MODE_COUNT_AND_FAIL,
3132e5c31af7Sopenharmony_ci															 numPassingAllocs);
3133e5c31af7Sopenharmony_ci			AllocationCallbackRecorder			recorder	(objAllocator.getCallbacks(), 128);
3134e5c31af7Sopenharmony_ci			const Environment					objEnv		(resEnv.env.vkp,
3135e5c31af7Sopenharmony_ci															 resEnv.env.apiVersion,
3136e5c31af7Sopenharmony_ci															 resEnv.env.instanceInterface,
3137e5c31af7Sopenharmony_ci															 resEnv.env.instance,
3138e5c31af7Sopenharmony_ci															 resEnv.env.vkd,
3139e5c31af7Sopenharmony_ci															 resEnv.env.device,
3140e5c31af7Sopenharmony_ci															 resEnv.env.queueFamilyIndex,
3141e5c31af7Sopenharmony_ci															 resEnv.env.programBinaries,
3142e5c31af7Sopenharmony_ci															 recorder.getCallbacks(),
3143e5c31af7Sopenharmony_ci															 resEnv.env.maxResourceConsumers,
3144e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
3145e5c31af7Sopenharmony_ci															 resEnv.env.resourceInterface,
3146e5c31af7Sopenharmony_ci															 resEnv.env.vulkanSC10Properties,
3147e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3148e5c31af7Sopenharmony_ci															 resEnv.env.commandLine);
3149e5c31af7Sopenharmony_ci
3150e5c31af7Sopenharmony_ci			context.getTestContext().getLog()
3151e5c31af7Sopenharmony_ci				<< TestLog::Message
3152e5c31af7Sopenharmony_ci				<< "Trying to create object with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing"
3153e5c31af7Sopenharmony_ci				<< TestLog::EndMessage;
3154e5c31af7Sopenharmony_ci
3155e5c31af7Sopenharmony_ci			createOk = false;
3156e5c31af7Sopenharmony_ci			try
3157e5c31af7Sopenharmony_ci			{
3158e5c31af7Sopenharmony_ci				Unique<typename Object::Type>	obj	(Object::create(objEnv, res, params));
3159e5c31af7Sopenharmony_ci				createOk = true;
3160e5c31af7Sopenharmony_ci			}
3161e5c31af7Sopenharmony_ci			catch (const vk::OutOfMemoryError& e)
3162e5c31af7Sopenharmony_ci			{
3163e5c31af7Sopenharmony_ci				if (e.getError() != VK_ERROR_OUT_OF_HOST_MEMORY)
3164e5c31af7Sopenharmony_ci				{
3165e5c31af7Sopenharmony_ci					context.getTestContext().getLog() << e;
3166e5c31af7Sopenharmony_ci					return tcu::TestStatus::fail("Got invalid error code");
3167e5c31af7Sopenharmony_ci				}
3168e5c31af7Sopenharmony_ci			}
3169e5c31af7Sopenharmony_ci
3170e5c31af7Sopenharmony_ci			if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u))
3171e5c31af7Sopenharmony_ci				return tcu::TestStatus::fail("Invalid allocation callback");
3172e5c31af7Sopenharmony_ci
3173e5c31af7Sopenharmony_ci			if (createOk)
3174e5c31af7Sopenharmony_ci			{
3175e5c31af7Sopenharmony_ci				context.getTestContext().getLog()
3176e5c31af7Sopenharmony_ci					<< TestLog::Message << "Object construction succeeded! " << TestLog::EndMessage;
3177e5c31af7Sopenharmony_ci				break;
3178e5c31af7Sopenharmony_ci			}
3179e5c31af7Sopenharmony_ci
3180e5c31af7Sopenharmony_ci			++numPassingAllocs;
3181e5c31af7Sopenharmony_ci			// if allocation didn't succeed with huge limit then stop trying
3182e5c31af7Sopenharmony_ci			if (numPassingAllocs >= finalLimit)
3183e5c31af7Sopenharmony_ci				break;
3184e5c31af7Sopenharmony_ci			// if we reached maxTries but didn't create object, try doing it with huge limit
3185e5c31af7Sopenharmony_ci			if (numPassingAllocs >= maxTries)
3186e5c31af7Sopenharmony_ci				numPassingAllocs = finalLimit;
3187e5c31af7Sopenharmony_ci		}
3188e5c31af7Sopenharmony_ci	}
3189e5c31af7Sopenharmony_ci
3190e5c31af7Sopenharmony_ci	if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u))
3191e5c31af7Sopenharmony_ci		return tcu::TestStatus::fail("Invalid allocation callback");
3192e5c31af7Sopenharmony_ci
3193e5c31af7Sopenharmony_ci	if (numPassingAllocs == 0)
3194e5c31af7Sopenharmony_ci		return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks not called");
3195e5c31af7Sopenharmony_ci	else if (numPassingAllocs >= finalLimit)
3196e5c31af7Sopenharmony_ci	{
3197e5c31af7Sopenharmony_ci		if (createOk)
3198e5c31af7Sopenharmony_ci		{
3199e5c31af7Sopenharmony_ci			context.getTestContext().getLog()
3200e5c31af7Sopenharmony_ci				<< TestLog::Message << "Maximum iteration count (" << maxTries << ") reached without object construction passing. "
3201e5c31af7Sopenharmony_ci				<< "Object was succesfully constructed with " << numPassingAllocs << " iterations limit." << TestLog::EndMessage;
3202e5c31af7Sopenharmony_ci			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Construction passed but not all iterations were checked");
3203e5c31af7Sopenharmony_ci		}
3204e5c31af7Sopenharmony_ci
3205e5c31af7Sopenharmony_ci		context.getTestContext().getLog()
3206e5c31af7Sopenharmony_ci			<< TestLog::Message << "WARNING: Maximum iteration count (" << finalLimit << ") reached without object construction passing. "
3207e5c31af7Sopenharmony_ci			<< "OOM testing incomplete, use --deqp-test-iteration-count= to test with higher limit." << TestLog::EndMessage;
3208e5c31af7Sopenharmony_ci		return tcu::TestStatus(QP_TEST_RESULT_PASS, "Max iter count reached");
3209e5c31af7Sopenharmony_ci	}
3210e5c31af7Sopenharmony_ci	else
3211e5c31af7Sopenharmony_ci		return tcu::TestStatus::pass("Ok");
3212e5c31af7Sopenharmony_ci}
3213e5c31af7Sopenharmony_ci
3214e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3215e5c31af7Sopenharmony_ci
3216e5c31af7Sopenharmony_ci// Determine whether an API call sets the invalid handles to NULL (true) or leaves them undefined or not modified (false)
3217e5c31af7Sopenharmony_citemplate<typename T> inline bool isNullHandleOnAllocationFailure				  (Context&)		 { return false; }
3218e5c31af7Sopenharmony_ci
3219e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3220e5c31af7Sopenharmony_citemplate<>			 inline bool isNullHandleOnAllocationFailure<VkCommandBuffer> (Context& context) { return hasDeviceExtension(context, "VK_KHR_maintenance1"); }
3221e5c31af7Sopenharmony_citemplate<>			 inline bool isNullHandleOnAllocationFailure<VkDescriptorSet> (Context& context) { return hasDeviceExtension(context, "VK_KHR_maintenance1"); }
3222e5c31af7Sopenharmony_citemplate<>			 inline bool isNullHandleOnAllocationFailure<VkPipeline>	  (Context&)		 { return true;  }
3223e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3224e5c31af7Sopenharmony_ci
3225e5c31af7Sopenharmony_citemplate<typename T> inline bool isPooledObject					 (void) { return false; };
3226e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3227e5c31af7Sopenharmony_citemplate<>			 inline bool isPooledObject<VkCommandBuffer> (void) { return true;  };
3228e5c31af7Sopenharmony_citemplate<>			 inline bool isPooledObject<VkDescriptorSet> (void) { return true;  };
3229e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3230e5c31af7Sopenharmony_ci
3231e5c31af7Sopenharmony_citemplate<typename Object>
3232e5c31af7Sopenharmony_citcu::TestStatus allocCallbackFailMultipleObjectsTest (Context& context, typename Object::Parameters params)
3233e5c31af7Sopenharmony_ci{
3234e5c31af7Sopenharmony_ci	typedef SharedPtr<Move<typename Object::Type> >	ObjectTypeSp;
3235e5c31af7Sopenharmony_ci
3236e5c31af7Sopenharmony_ci	static const deUint32	numObjects			= 4;
3237e5c31af7Sopenharmony_ci	const bool				expectNullHandles	= isNullHandleOnAllocationFailure<typename Object::Type>(context);
3238e5c31af7Sopenharmony_ci	deUint32				numPassingAllocs	= 0;
3239e5c31af7Sopenharmony_ci
3240e5c31af7Sopenharmony_ci	{
3241e5c31af7Sopenharmony_ci		vector<typename Object::Type>	handles	(numObjects);
3242e5c31af7Sopenharmony_ci		VkResult						result	= VK_NOT_READY;
3243e5c31af7Sopenharmony_ci
3244e5c31af7Sopenharmony_ci		for (; numPassingAllocs <= numObjects; ++numPassingAllocs)
3245e5c31af7Sopenharmony_ci		{
3246e5c31af7Sopenharmony_ci			ValidateQueryBits::fillBits(handles.begin(), handles.end());	// fill with garbage
3247e5c31af7Sopenharmony_ci
3248e5c31af7Sopenharmony_ci			// \note We have to use the same allocator for both resource dependencies and the object under test,
3249e5c31af7Sopenharmony_ci			//       because pooled objects take memory from the pool.
3250e5c31af7Sopenharmony_ci			DeterministicFailAllocator			objAllocator(getSystemAllocator(), DeterministicFailAllocator::MODE_DO_NOT_COUNT, 0);
3251e5c31af7Sopenharmony_ci			AllocationCallbackRecorder			recorder	(objAllocator.getCallbacks(), 128);
3252e5c31af7Sopenharmony_ci			const Environment					objEnv		(context.getPlatformInterface(),
3253e5c31af7Sopenharmony_ci															 context.getUsedApiVersion(),
3254e5c31af7Sopenharmony_ci															 context.getInstanceInterface(),
3255e5c31af7Sopenharmony_ci															 context.getInstance(),
3256e5c31af7Sopenharmony_ci															 context.getDeviceInterface(),
3257e5c31af7Sopenharmony_ci															 context.getDevice(),
3258e5c31af7Sopenharmony_ci															 context.getUniversalQueueFamilyIndex(),
3259e5c31af7Sopenharmony_ci															 context.getBinaryCollection(),
3260e5c31af7Sopenharmony_ci															 recorder.getCallbacks(),
3261e5c31af7Sopenharmony_ci															 numObjects,
3262e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
3263e5c31af7Sopenharmony_ci															 context.getResourceInterface(),
3264e5c31af7Sopenharmony_ci															 context.getDeviceVulkanSC10Properties(),
3265e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3266e5c31af7Sopenharmony_ci															 context.getTestContext().getCommandLine());
3267e5c31af7Sopenharmony_ci
3268e5c31af7Sopenharmony_ci			context.getTestContext().getLog()
3269e5c31af7Sopenharmony_ci				<< TestLog::Message
3270e5c31af7Sopenharmony_ci				<< "Trying to create " << numObjects << " objects with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing"
3271e5c31af7Sopenharmony_ci				<< TestLog::EndMessage;
3272e5c31af7Sopenharmony_ci
3273e5c31af7Sopenharmony_ci			{
3274e5c31af7Sopenharmony_ci				const typename Object::Resources res (objEnv, params);
3275e5c31af7Sopenharmony_ci
3276e5c31af7Sopenharmony_ci				objAllocator.reset(DeterministicFailAllocator::MODE_COUNT_AND_FAIL, numPassingAllocs);
3277e5c31af7Sopenharmony_ci				const vector<ObjectTypeSp> scopedHandles = Object::createMultiple(objEnv, res, params, &handles, &result);
3278e5c31af7Sopenharmony_ci			}
3279e5c31af7Sopenharmony_ci
3280e5c31af7Sopenharmony_ci			if (result == VK_SUCCESS)
3281e5c31af7Sopenharmony_ci			{
3282e5c31af7Sopenharmony_ci				context.getTestContext().getLog() << TestLog::Message << "Construction of all objects succeeded! " << TestLog::EndMessage;
3283e5c31af7Sopenharmony_ci				break;
3284e5c31af7Sopenharmony_ci			}
3285e5c31af7Sopenharmony_ci			else
3286e5c31af7Sopenharmony_ci			{
3287e5c31af7Sopenharmony_ci				if (expectNullHandles)
3288e5c31af7Sopenharmony_ci				{
3289e5c31af7Sopenharmony_ci					for (deUint32 nullNdx = numPassingAllocs; nullNdx < numObjects; ++nullNdx)
3290e5c31af7Sopenharmony_ci					{
3291e5c31af7Sopenharmony_ci						if (handles[nullNdx] != DE_NULL)
3292e5c31af7Sopenharmony_ci							return tcu::TestStatus::fail("Some object handles weren't set to NULL");
3293e5c31af7Sopenharmony_ci					}
3294e5c31af7Sopenharmony_ci				}
3295e5c31af7Sopenharmony_ci
3296e5c31af7Sopenharmony_ci				if (result != VK_ERROR_OUT_OF_HOST_MEMORY)
3297e5c31af7Sopenharmony_ci					return tcu::TestStatus::fail("Got invalid error code: " + de::toString(getResultName(result)));
3298e5c31af7Sopenharmony_ci
3299e5c31af7Sopenharmony_ci				if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u))
3300e5c31af7Sopenharmony_ci					return tcu::TestStatus::fail("Invalid allocation callback");
3301e5c31af7Sopenharmony_ci			}
3302e5c31af7Sopenharmony_ci		}
3303e5c31af7Sopenharmony_ci	}
3304e5c31af7Sopenharmony_ci
3305e5c31af7Sopenharmony_ci	if (numPassingAllocs == 0)
3306e5c31af7Sopenharmony_ci	{
3307e5c31af7Sopenharmony_ci		if (isPooledObject<typename Object::Type>())
3308e5c31af7Sopenharmony_ci			return tcu::TestStatus::pass("Not validated: pooled objects didn't seem to use host memory");
3309e5c31af7Sopenharmony_ci		else
3310e5c31af7Sopenharmony_ci			return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks not called");
3311e5c31af7Sopenharmony_ci	}
3312e5c31af7Sopenharmony_ci	else
3313e5c31af7Sopenharmony_ci		return tcu::TestStatus::pass("Ok");
3314e5c31af7Sopenharmony_ci}
3315e5c31af7Sopenharmony_ci
3316e5c31af7Sopenharmony_ci// Utilities for creating groups
3317e5c31af7Sopenharmony_ci
3318e5c31af7Sopenharmony_citemplate<typename Object>
3319e5c31af7Sopenharmony_cistruct NamedParameters
3320e5c31af7Sopenharmony_ci{
3321e5c31af7Sopenharmony_ci	const char*						name;
3322e5c31af7Sopenharmony_ci	typename Object::Parameters		parameters;
3323e5c31af7Sopenharmony_ci};
3324e5c31af7Sopenharmony_ci
3325e5c31af7Sopenharmony_citemplate<typename Object>
3326e5c31af7Sopenharmony_cistruct CaseDescription
3327e5c31af7Sopenharmony_ci{
3328e5c31af7Sopenharmony_ci	typename FunctionInstance1<typename Object::Parameters>::Function	function;
3329e5c31af7Sopenharmony_ci	const NamedParameters<Object>*										paramsBegin;
3330e5c31af7Sopenharmony_ci	const NamedParameters<Object>*										paramsEnd;
3331e5c31af7Sopenharmony_ci	typename FunctionSupport1<typename Object::Parameters>::Function	supportFunction;
3332e5c31af7Sopenharmony_ci};
3333e5c31af7Sopenharmony_ci
3334e5c31af7Sopenharmony_ci#define EMPTY_CASE_DESC(OBJECT)	\
3335e5c31af7Sopenharmony_ci	{ (FunctionInstance1<OBJECT::Parameters>::Function)DE_NULL, DE_NULL, DE_NULL, DE_NULL }
3336e5c31af7Sopenharmony_ci
3337e5c31af7Sopenharmony_ci#define CASE_DESC(FUNCTION, CASES, SUPPORT)	\
3338e5c31af7Sopenharmony_ci	{ FUNCTION, DE_ARRAY_BEGIN(CASES), DE_ARRAY_END(CASES), SUPPORT	}
3339e5c31af7Sopenharmony_ci
3340e5c31af7Sopenharmony_cistruct CaseDescriptions
3341e5c31af7Sopenharmony_ci{
3342e5c31af7Sopenharmony_ci	CaseDescription<Instance>				instance;
3343e5c31af7Sopenharmony_ci	CaseDescription<Device>					device;
3344e5c31af7Sopenharmony_ci	CaseDescription<DeviceGroup>			deviceGroup;
3345e5c31af7Sopenharmony_ci	CaseDescription<DeviceMemory>			deviceMemory;
3346e5c31af7Sopenharmony_ci	CaseDescription<Buffer>					buffer;
3347e5c31af7Sopenharmony_ci	CaseDescription<BufferView>				bufferView;
3348e5c31af7Sopenharmony_ci	CaseDescription<Image>					image;
3349e5c31af7Sopenharmony_ci	CaseDescription<ImageView>				imageView;
3350e5c31af7Sopenharmony_ci	CaseDescription<Semaphore>				semaphore;
3351e5c31af7Sopenharmony_ci	CaseDescription<Event>					event;
3352e5c31af7Sopenharmony_ci	CaseDescription<Fence>					fence;
3353e5c31af7Sopenharmony_ci	CaseDescription<QueryPool>				queryPool;
3354e5c31af7Sopenharmony_ci	CaseDescription<ShaderModule>			shaderModule;
3355e5c31af7Sopenharmony_ci	CaseDescription<PipelineCache>			pipelineCache;
3356e5c31af7Sopenharmony_ci	CaseDescription<PipelineLayout>			pipelineLayout;
3357e5c31af7Sopenharmony_ci	CaseDescription<RenderPass>				renderPass;
3358e5c31af7Sopenharmony_ci	CaseDescription<GraphicsPipeline>		graphicsPipeline;
3359e5c31af7Sopenharmony_ci	CaseDescription<ComputePipeline>		computePipeline;
3360e5c31af7Sopenharmony_ci	CaseDescription<DescriptorSetLayout>	descriptorSetLayout;
3361e5c31af7Sopenharmony_ci	CaseDescription<Sampler>				sampler;
3362e5c31af7Sopenharmony_ci	CaseDescription<DescriptorPool>			descriptorPool;
3363e5c31af7Sopenharmony_ci	CaseDescription<DescriptorSet>			descriptorSet;
3364e5c31af7Sopenharmony_ci	CaseDescription<Framebuffer>			framebuffer;
3365e5c31af7Sopenharmony_ci	CaseDescription<CommandPool>			commandPool;
3366e5c31af7Sopenharmony_ci	CaseDescription<CommandBuffer>			commandBuffer;
3367e5c31af7Sopenharmony_ci};
3368e5c31af7Sopenharmony_ci
3369e5c31af7Sopenharmony_citemplate<typename Object>
3370e5c31af7Sopenharmony_civoid addCases (tcu::TestCaseGroup *group, const CaseDescription<Object>& cases)
3371e5c31af7Sopenharmony_ci{
3372e5c31af7Sopenharmony_ci	for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
3373e5c31af7Sopenharmony_ci	{
3374e5c31af7Sopenharmony_ci		if(cases.supportFunction == DE_NULL)
3375e5c31af7Sopenharmony_ci			addFunctionCase(group, cur->name, cases.function, cur->parameters);
3376e5c31af7Sopenharmony_ci		else
3377e5c31af7Sopenharmony_ci			addFunctionCase(group, cur->name, cases.supportFunction, cases.function, cur->parameters);
3378e5c31af7Sopenharmony_ci	}
3379e5c31af7Sopenharmony_ci}
3380e5c31af7Sopenharmony_ci
3381e5c31af7Sopenharmony_civoid checkImageCubeArraySupport (Context& context, const ImageView::Parameters params) {
3382e5c31af7Sopenharmony_ci	if (params.viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray)
3383e5c31af7Sopenharmony_ci		TCU_THROW(NotSupportedError, "imageCubeArray feature is not supported by this implementation");
3384e5c31af7Sopenharmony_ci}
3385e5c31af7Sopenharmony_ci
3386e5c31af7Sopenharmony_civoid checkEventSupport (Context& context, const Event::Parameters)
3387e5c31af7Sopenharmony_ci{
3388e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3389e5c31af7Sopenharmony_ci	if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
3390e5c31af7Sopenharmony_ci		TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
3391e5c31af7Sopenharmony_ci#else
3392e5c31af7Sopenharmony_ci	DE_UNREF(context);
3393e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3394e5c31af7Sopenharmony_ci}
3395e5c31af7Sopenharmony_ci
3396e5c31af7Sopenharmony_civoid checkRecycleDescriptorSetMemorySupport (Context& context, const DescriptorSet::Parameters)
3397e5c31af7Sopenharmony_ci{
3398e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC
3399e5c31af7Sopenharmony_ci	if (!context.getDeviceVulkanSC10Properties().recycleDescriptorSetMemory)
3400e5c31af7Sopenharmony_ci		TCU_THROW(NotSupportedError, "VkPhysicalDeviceVulkanSC10Properties::recycleDescriptorSetMemory not supported by this implementation");
3401e5c31af7Sopenharmony_ci#else
3402e5c31af7Sopenharmony_ci	DE_UNREF(context);
3403e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3404e5c31af7Sopenharmony_ci}
3405e5c31af7Sopenharmony_ci
3406e5c31af7Sopenharmony_citemplate<typename Object>
3407e5c31af7Sopenharmony_civoid addCasesWithProgs (tcu::TestCaseGroup *group, const CaseDescription<Object>& cases)
3408e5c31af7Sopenharmony_ci{
3409e5c31af7Sopenharmony_ci	for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
3410e5c31af7Sopenharmony_ci	{
3411e5c31af7Sopenharmony_ci		if (cases.supportFunction == DE_NULL)
3412e5c31af7Sopenharmony_ci			addFunctionCaseWithPrograms(group, cur->name, Object::initPrograms, cases.function, cur->parameters);
3413e5c31af7Sopenharmony_ci		else
3414e5c31af7Sopenharmony_ci			addFunctionCaseWithPrograms(group, cur->name, cases.supportFunction, Object::initPrograms, cases.function, cur->parameters);
3415e5c31af7Sopenharmony_ci	}
3416e5c31af7Sopenharmony_ci}
3417e5c31af7Sopenharmony_ci
3418e5c31af7Sopenharmony_cistatic void createTests (tcu::TestCaseGroup* group, CaseDescriptions cases)
3419e5c31af7Sopenharmony_ci{
3420e5c31af7Sopenharmony_ci	addCases			(group, cases.instance);
3421e5c31af7Sopenharmony_ci	addCases			(group, cases.device);
3422e5c31af7Sopenharmony_ci	addCases			(group, cases.deviceGroup);
3423e5c31af7Sopenharmony_ci	addCases			(group, cases.deviceMemory);
3424e5c31af7Sopenharmony_ci	addCases			(group, cases.buffer);
3425e5c31af7Sopenharmony_ci	addCases			(group, cases.bufferView);
3426e5c31af7Sopenharmony_ci	addCases			(group, cases.image);
3427e5c31af7Sopenharmony_ci	addCases			(group, cases.imageView);
3428e5c31af7Sopenharmony_ci	addCases			(group, cases.semaphore);
3429e5c31af7Sopenharmony_ci	addCases			(group, cases.event);
3430e5c31af7Sopenharmony_ci	addCases			(group, cases.fence);
3431e5c31af7Sopenharmony_ci	addCases			(group, cases.queryPool);
3432e5c31af7Sopenharmony_ci	addCases			(group, cases.sampler);
3433e5c31af7Sopenharmony_ci	addCasesWithProgs	(group, cases.shaderModule);
3434e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3435e5c31af7Sopenharmony_ci	addCases			(group, cases.pipelineCache);
3436e5c31af7Sopenharmony_ci#else
3437e5c31af7Sopenharmony_ci	addCasesWithProgs	(group, cases.pipelineCache);
3438e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3439e5c31af7Sopenharmony_ci	addCases			(group, cases.pipelineLayout);
3440e5c31af7Sopenharmony_ci	addCases			(group, cases.renderPass);
3441e5c31af7Sopenharmony_ci	addCasesWithProgs	(group, cases.graphicsPipeline);
3442e5c31af7Sopenharmony_ci	addCasesWithProgs	(group, cases.computePipeline);
3443e5c31af7Sopenharmony_ci	addCases			(group, cases.descriptorSetLayout);
3444e5c31af7Sopenharmony_ci	addCases			(group, cases.descriptorPool);
3445e5c31af7Sopenharmony_ci	addCases			(group, cases.descriptorSet);
3446e5c31af7Sopenharmony_ci	addCases			(group, cases.framebuffer);
3447e5c31af7Sopenharmony_ci	addCases			(group, cases.commandPool);
3448e5c31af7Sopenharmony_ci	addCases			(group, cases.commandBuffer);
3449e5c31af7Sopenharmony_ci}
3450e5c31af7Sopenharmony_ci
3451e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3452e5c31af7Sopenharmony_cistatic void cleanupGroup (tcu::TestCaseGroup* group, CaseDescriptions cases)
3453e5c31af7Sopenharmony_ci{
3454e5c31af7Sopenharmony_ci	DE_UNREF(group);
3455e5c31af7Sopenharmony_ci	DE_UNREF(cases);
3456e5c31af7Sopenharmony_ci	// Destroy singleton object
3457e5c31af7Sopenharmony_ci
3458e5c31af7Sopenharmony_ci	SingletonDevice::destroy();
3459e5c31af7Sopenharmony_ci}
3460e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3461e5c31af7Sopenharmony_ci
3462e5c31af7Sopenharmony_citcu::TestCaseGroup* createGroup (tcu::TestContext& testCtx, const char* name, const CaseDescriptions& cases)
3463e5c31af7Sopenharmony_ci{
3464e5c31af7Sopenharmony_ci	MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, name));
3465e5c31af7Sopenharmony_ci	createTests(group.get(), cases);
3466e5c31af7Sopenharmony_ci	return group.release();
3467e5c31af7Sopenharmony_ci}
3468e5c31af7Sopenharmony_ci
3469e5c31af7Sopenharmony_ci} // anonymous
3470e5c31af7Sopenharmony_ci
3471e5c31af7Sopenharmony_citcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
3472e5c31af7Sopenharmony_ci{
3473e5c31af7Sopenharmony_ci	MovePtr<tcu::TestCaseGroup>	objectMgmtTests	(new tcu::TestCaseGroup(testCtx, "object_management"));
3474e5c31af7Sopenharmony_ci
3475e5c31af7Sopenharmony_ci	const Image::Parameters		img1D			(0u, VK_IMAGE_TYPE_1D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D(256,   1, 1), 1u,  4u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
3476e5c31af7Sopenharmony_ci	const Image::Parameters		img2D			(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D( 64,  64, 1), 1u, 12u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
3477e5c31af7Sopenharmony_ci	const Image::Parameters		imgCube			(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D( 64,  64, 1), 1u, 12u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
3478e5c31af7Sopenharmony_ci	const Image::Parameters		img3D			(0u, VK_IMAGE_TYPE_3D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D( 64,  64, 4), 1u,  1u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
3479e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgView1D		(img1D, VK_IMAGE_VIEW_TYPE_1D,			img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
3480e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgView1DArr	(img1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY,	img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 4u));
3481e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgView2D		(img2D, VK_IMAGE_VIEW_TYPE_2D,			img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
3482e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgView2DArr	(img2D, VK_IMAGE_VIEW_TYPE_2D_ARRAY,	img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 8u));
3483e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgViewCube		(imgCube, VK_IMAGE_VIEW_TYPE_CUBE,		img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 6u));
3484e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgViewCubeArr	(imgCube, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY,	img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 12u));
3485e5c31af7Sopenharmony_ci	const ImageView::Parameters	imgView3D		(img3D, VK_IMAGE_VIEW_TYPE_3D,			img3D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
3486e5c31af7Sopenharmony_ci
3487e5c31af7Sopenharmony_ci	const DescriptorSetLayout::Parameters	singleUboDescLayout	= DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u, VK_SHADER_STAGE_VERTEX_BIT);
3488e5c31af7Sopenharmony_ci
3489e5c31af7Sopenharmony_ci	static const NamedParameters<Instance>					s_instanceCases[]				=
3490e5c31af7Sopenharmony_ci	{
3491e5c31af7Sopenharmony_ci		{ "instance",					Instance::Parameters() },
3492e5c31af7Sopenharmony_ci	};
3493e5c31af7Sopenharmony_ci	// \note Device index may change - must not be static
3494e5c31af7Sopenharmony_ci
3495e5c31af7Sopenharmony_ci	const NamedParameters<Device>				s_deviceCases[]					=
3496e5c31af7Sopenharmony_ci	{
3497e5c31af7Sopenharmony_ci		{ "device",						Device::Parameters(testCtx.getCommandLine().getVKDeviceId()-1u, VK_QUEUE_GRAPHICS_BIT)	},
3498e5c31af7Sopenharmony_ci	};
3499e5c31af7Sopenharmony_ci	const NamedParameters<DeviceGroup>					s_deviceGroupCases[]			=
3500e5c31af7Sopenharmony_ci	{
3501e5c31af7Sopenharmony_ci		{ "device_group",				DeviceGroup::Parameters(testCtx.getCommandLine().getVKDeviceGroupId() - 1u, testCtx.getCommandLine().getVKDeviceId() - 1u, VK_QUEUE_GRAPHICS_BIT) },
3502e5c31af7Sopenharmony_ci	};
3503e5c31af7Sopenharmony_ci	static const NamedParameters<DeviceMemory>			s_deviceMemCases[]				=
3504e5c31af7Sopenharmony_ci	{
3505e5c31af7Sopenharmony_ci		{ "device_memory_small",		DeviceMemory::Parameters(1024, 0u)	},
3506e5c31af7Sopenharmony_ci	};
3507e5c31af7Sopenharmony_ci	static const NamedParameters<Buffer>				s_bufferCases[]					=
3508e5c31af7Sopenharmony_ci	{
3509e5c31af7Sopenharmony_ci		{ "buffer_uniform_small",		Buffer::Parameters(1024u,			VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT),	},
3510e5c31af7Sopenharmony_ci		{ "buffer_uniform_large",		Buffer::Parameters(1024u*1024u*16u,	VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT),	},
3511e5c31af7Sopenharmony_ci		{ "buffer_storage_small",		Buffer::Parameters(1024u,			VK_BUFFER_USAGE_STORAGE_BUFFER_BIT),	},
3512e5c31af7Sopenharmony_ci		{ "buffer_storage_large",		Buffer::Parameters(1024u*1024u*16u,	VK_BUFFER_USAGE_STORAGE_BUFFER_BIT),	},
3513e5c31af7Sopenharmony_ci	};
3514e5c31af7Sopenharmony_ci	static const NamedParameters<BufferView>			s_bufferViewCases[]				=
3515e5c31af7Sopenharmony_ci	{
3516e5c31af7Sopenharmony_ci		{ "buffer_view_uniform_r8g8b8a8_unorm",	BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u)	},
3517e5c31af7Sopenharmony_ci		{ "buffer_view_storage_r8g8b8a8_unorm",	BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u)	},
3518e5c31af7Sopenharmony_ci	};
3519e5c31af7Sopenharmony_ci	static const NamedParameters<Image>					s_imageCases[]					=
3520e5c31af7Sopenharmony_ci	{
3521e5c31af7Sopenharmony_ci		{ "image_1d",					img1D		},
3522e5c31af7Sopenharmony_ci		{ "image_2d",					img2D		},
3523e5c31af7Sopenharmony_ci		{ "image_3d",					img3D		},
3524e5c31af7Sopenharmony_ci	};
3525e5c31af7Sopenharmony_ci	static const NamedParameters<ImageView>				s_imageViewCases[]				=
3526e5c31af7Sopenharmony_ci	{
3527e5c31af7Sopenharmony_ci		{ "image_view_1d",				imgView1D		},
3528e5c31af7Sopenharmony_ci		{ "image_view_1d_arr",			imgView1DArr	},
3529e5c31af7Sopenharmony_ci		{ "image_view_2d",				imgView2D		},
3530e5c31af7Sopenharmony_ci		{ "image_view_2d_arr",			imgView2DArr	},
3531e5c31af7Sopenharmony_ci		{ "image_view_cube",			imgViewCube		},
3532e5c31af7Sopenharmony_ci		{ "image_view_cube_arr",		imgViewCubeArr	},
3533e5c31af7Sopenharmony_ci		{ "image_view_3d",				imgView3D		},
3534e5c31af7Sopenharmony_ci	};
3535e5c31af7Sopenharmony_ci	static const NamedParameters<Semaphore>				s_semaphoreCases[]				=
3536e5c31af7Sopenharmony_ci	{
3537e5c31af7Sopenharmony_ci		{ "semaphore",					Semaphore::Parameters(0u),	}
3538e5c31af7Sopenharmony_ci	};
3539e5c31af7Sopenharmony_ci	static const NamedParameters<Event>					s_eventCases[]					=
3540e5c31af7Sopenharmony_ci	{
3541e5c31af7Sopenharmony_ci		{ "event",						Event::Parameters(0u)		}
3542e5c31af7Sopenharmony_ci	};
3543e5c31af7Sopenharmony_ci	static const NamedParameters<Fence>					s_fenceCases[]					=
3544e5c31af7Sopenharmony_ci	{
3545e5c31af7Sopenharmony_ci		{ "fence",						Fence::Parameters(0u)								},
3546e5c31af7Sopenharmony_ci		{ "fence_signaled",				Fence::Parameters(VK_FENCE_CREATE_SIGNALED_BIT)		}
3547e5c31af7Sopenharmony_ci	};
3548e5c31af7Sopenharmony_ci	static const NamedParameters<QueryPool>				s_queryPoolCases[]				=
3549e5c31af7Sopenharmony_ci	{
3550e5c31af7Sopenharmony_ci		{ "query_pool",					QueryPool::Parameters(VK_QUERY_TYPE_OCCLUSION, 1u, 0u)	}
3551e5c31af7Sopenharmony_ci	};
3552e5c31af7Sopenharmony_ci	static const NamedParameters<ShaderModule>			s_shaderModuleCases[]			=
3553e5c31af7Sopenharmony_ci	{
3554e5c31af7Sopenharmony_ci		{ "shader_module",				ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "test")	}
3555e5c31af7Sopenharmony_ci	};
3556e5c31af7Sopenharmony_ci	static const NamedParameters<PipelineCache>			s_pipelineCacheCases[]			=
3557e5c31af7Sopenharmony_ci	{
3558e5c31af7Sopenharmony_ci		{ "pipeline_cache",				PipelineCache::Parameters()		}
3559e5c31af7Sopenharmony_ci	};
3560e5c31af7Sopenharmony_ci	static const NamedParameters<PipelineLayout>		s_pipelineLayoutCases[]			=
3561e5c31af7Sopenharmony_ci	{
3562e5c31af7Sopenharmony_ci		{ "pipeline_layout_empty",		PipelineLayout::Parameters::empty()										},
3563e5c31af7Sopenharmony_ci		{ "pipeline_layout_single",		PipelineLayout::Parameters::singleDescriptorSet(singleUboDescLayout)	}
3564e5c31af7Sopenharmony_ci	};
3565e5c31af7Sopenharmony_ci	static const NamedParameters<RenderPass>			s_renderPassCases[]				=
3566e5c31af7Sopenharmony_ci	{
3567e5c31af7Sopenharmony_ci		{ "render_pass",				RenderPass::Parameters()		}
3568e5c31af7Sopenharmony_ci	};
3569e5c31af7Sopenharmony_ci	static const NamedParameters<GraphicsPipeline>		s_graphicsPipelineCases[]		=
3570e5c31af7Sopenharmony_ci	{
3571e5c31af7Sopenharmony_ci		{ "graphics_pipeline",			GraphicsPipeline::Parameters()	}
3572e5c31af7Sopenharmony_ci	};
3573e5c31af7Sopenharmony_ci	static const NamedParameters<ComputePipeline>		s_computePipelineCases[]		=
3574e5c31af7Sopenharmony_ci	{
3575e5c31af7Sopenharmony_ci		{ "compute_pipeline",			ComputePipeline::Parameters()	}
3576e5c31af7Sopenharmony_ci	};
3577e5c31af7Sopenharmony_ci	static const NamedParameters<DescriptorSetLayout>	s_descriptorSetLayoutCases[]	=
3578e5c31af7Sopenharmony_ci	{
3579e5c31af7Sopenharmony_ci		{ "descriptor_set_layout_empty",	DescriptorSetLayout::Parameters::empty()	},
3580e5c31af7Sopenharmony_ci		{ "descriptor_set_layout_single",	singleUboDescLayout							}
3581e5c31af7Sopenharmony_ci	};
3582e5c31af7Sopenharmony_ci	static const NamedParameters<Sampler>				s_samplerCases[]				=
3583e5c31af7Sopenharmony_ci	{
3584e5c31af7Sopenharmony_ci		{ "sampler",					Sampler::Parameters()	}
3585e5c31af7Sopenharmony_ci	};
3586e5c31af7Sopenharmony_ci	static const NamedParameters<DescriptorPool>		s_descriptorPoolCases[]			=
3587e5c31af7Sopenharmony_ci	{
3588e5c31af7Sopenharmony_ci		{ "descriptor_pool",						DescriptorPool::Parameters::singleType((VkDescriptorPoolCreateFlags)0,						4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u)	},
3589e5c31af7Sopenharmony_ci		{ "descriptor_pool_free_descriptor_set",	DescriptorPool::Parameters::singleType(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,	4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u)	}
3590e5c31af7Sopenharmony_ci	};
3591e5c31af7Sopenharmony_ci	static const NamedParameters<DescriptorSet>			s_descriptorSetCases[]			=
3592e5c31af7Sopenharmony_ci	{
3593e5c31af7Sopenharmony_ci		{ "descriptor_set",				DescriptorSet::Parameters(singleUboDescLayout)	}
3594e5c31af7Sopenharmony_ci	};
3595e5c31af7Sopenharmony_ci	static const NamedParameters<Framebuffer>			s_framebufferCases[]			=
3596e5c31af7Sopenharmony_ci	{
3597e5c31af7Sopenharmony_ci		{ "framebuffer",				Framebuffer::Parameters()	}
3598e5c31af7Sopenharmony_ci	};
3599e5c31af7Sopenharmony_ci	static const NamedParameters<CommandPool>			s_commandPoolCases[]			=
3600e5c31af7Sopenharmony_ci	{
3601e5c31af7Sopenharmony_ci		{ "command_pool",				CommandPool::Parameters((VkCommandPoolCreateFlags)0)			},
3602e5c31af7Sopenharmony_ci		{ "command_pool_transient",		CommandPool::Parameters(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT)	}
3603e5c31af7Sopenharmony_ci	};
3604e5c31af7Sopenharmony_ci	static const NamedParameters<CommandBuffer>			s_commandBufferCases[]			=
3605e5c31af7Sopenharmony_ci	{
3606e5c31af7Sopenharmony_ci		{ "command_buffer_primary",		CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_PRIMARY)	},
3607e5c31af7Sopenharmony_ci		{ "command_buffer_secondary",	CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_SECONDARY)	}
3608e5c31af7Sopenharmony_ci	};
3609e5c31af7Sopenharmony_ci
3610e5c31af7Sopenharmony_ci	const CaseDescriptions	s_createSingleGroup	=
3611e5c31af7Sopenharmony_ci	{
3612e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Instance>,					s_instanceCases,			DE_NULL),
3613e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Device>,					s_deviceCases,				DE_NULL),
3614e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3615e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3616e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Buffer>,					s_bufferCases,				DE_NULL),
3617e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3618e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Image>,					s_imageCases,				DE_NULL),
3619e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3620e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3621e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Event>,					s_eventCases,				checkEventSupport),
3622e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Fence>,					s_fenceCases,				DE_NULL),
3623e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3624e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3625e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3626e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3627e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3628e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3629e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3630e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3631e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Sampler>,					s_samplerCases,				DE_NULL),
3632e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3633e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3634e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3635e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3636e5c31af7Sopenharmony_ci		CASE_DESC(createSingleTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3637e5c31af7Sopenharmony_ci	};
3638e5c31af7Sopenharmony_ci	// Create single object
3639e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "single", s_createSingleGroup));
3640e5c31af7Sopenharmony_ci
3641e5c31af7Sopenharmony_ci	const CaseDescriptions	s_createMultipleUniqueResourcesGroup	=
3642e5c31af7Sopenharmony_ci	{
3643e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Instance>,					s_instanceCases,			DE_NULL),
3644e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3645e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Device>,					s_deviceCases,				DE_NULL),
3646e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3647e5c31af7Sopenharmony_ci#else
3648e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Device),
3649e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceGroup),
3650e5c31af7Sopenharmony_ci#endif
3651e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3652e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Buffer>,					s_bufferCases,				DE_NULL),
3653e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3654e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Image>,					s_imageCases,				DE_NULL),
3655e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3656e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3657e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Event>,					s_eventCases,				checkEventSupport),
3658e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Fence>,					s_fenceCases,				DE_NULL),
3659e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3660e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3661e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3662e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3663e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3664e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3665e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3666e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3667e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Sampler>,					s_samplerCases,				DE_NULL),
3668e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3669e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3670e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3671e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3672e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleUniqueResourcesTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3673e5c31af7Sopenharmony_ci	};
3674e5c31af7Sopenharmony_ci	// Multiple objects with per-object unique resources
3675e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "multiple_unique_resources", s_createMultipleUniqueResourcesGroup));
3676e5c31af7Sopenharmony_ci
3677e5c31af7Sopenharmony_ci	const CaseDescriptions	s_createMultipleSharedResourcesGroup	=
3678e5c31af7Sopenharmony_ci	{
3679e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Instance), // No resources used
3680e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3681e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Device>,					s_deviceCases,				DE_NULL),
3682e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3683e5c31af7Sopenharmony_ci#else
3684e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Device),
3685e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceGroup),
3686e5c31af7Sopenharmony_ci#endif
3687e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3688e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Buffer>,					s_bufferCases,				DE_NULL),
3689e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3690e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Image>,					s_imageCases,				DE_NULL),
3691e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3692e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3693e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Event>,					s_eventCases,				checkEventSupport),
3694e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Fence>,					s_fenceCases,				DE_NULL),
3695e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3696e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3697e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3698e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3699e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3700e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3701e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3702e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3703e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Sampler>,					s_samplerCases,				DE_NULL),
3704e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3705e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3706e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3707e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3708e5c31af7Sopenharmony_ci		CASE_DESC(createMultipleSharedResourcesTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3709e5c31af7Sopenharmony_ci	};
3710e5c31af7Sopenharmony_ci	// Multiple objects with shared resources
3711e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "multiple_shared_resources", s_createMultipleSharedResourcesGroup));
3712e5c31af7Sopenharmony_ci
3713e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3714e5c31af7Sopenharmony_ci// Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL
3715e5c31af7Sopenharmony_ci	const CaseDescriptions	s_createMaxConcurrentGroup	=
3716e5c31af7Sopenharmony_ci	{
3717e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Instance>,					s_instanceCases,			DE_NULL),
3718e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Device>,					s_deviceCases,				DE_NULL),
3719e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3720e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3721e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Buffer>,					s_bufferCases,				DE_NULL),
3722e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3723e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Image>,					s_imageCases,				DE_NULL),
3724e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3725e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3726e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Event>,					s_eventCases,				checkEventSupport),
3727e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Fence>,					s_fenceCases,				DE_NULL),
3728e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3729e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3730e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3731e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3732e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3733e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3734e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3735e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3736e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Sampler>,					s_samplerCases,				DE_NULL),
3737e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3738e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3739e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3740e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3741e5c31af7Sopenharmony_ci		CASE_DESC(createMaxConcurrentTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3742e5c31af7Sopenharmony_ci	};
3743e5c31af7Sopenharmony_ci	// Maximum number of concurrently live objects
3744e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "max_concurrent", s_createMaxConcurrentGroup));
3745e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3746e5c31af7Sopenharmony_ci
3747e5c31af7Sopenharmony_ci	const CaseDescriptions	s_multithreadedCreatePerThreadDeviceGroup	=
3748e5c31af7Sopenharmony_ci	{
3749e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Instance),		// Does not make sense
3750e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Device),		// Does not make sense
3751e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceGroup),	// Does not make sense
3752e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3753e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Buffer>,					s_bufferCases,				DE_NULL),
3754e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3755e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Image>,					s_imageCases,				DE_NULL),
3756e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3757e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3758e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Event>,					s_eventCases,				checkEventSupport),
3759e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Fence>,					s_fenceCases,				DE_NULL),
3760e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3761e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3762e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3763e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3764e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3765e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3766e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3767e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3768e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Sampler>,					s_samplerCases,				DE_NULL),
3769e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3770e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<DescriptorSet>,			s_descriptorSetCases,		checkRecycleDescriptorSetMemorySupport),
3771e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3772e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3773e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3774e5c31af7Sopenharmony_ci	};
3775e5c31af7Sopenharmony_ci	// Multithreaded object construction with per-thread device
3776e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_device", s_multithreadedCreatePerThreadDeviceGroup));
3777e5c31af7Sopenharmony_ci
3778e5c31af7Sopenharmony_ci	const CaseDescriptions	s_multithreadedCreatePerThreadResourcesGroup	=
3779e5c31af7Sopenharmony_ci	{
3780e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Instance>,					s_instanceCases,			DE_NULL),
3781e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Device>,					s_deviceCases,				DE_NULL),
3782e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3783e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3784e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Buffer>,					s_bufferCases,				DE_NULL),
3785e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3786e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Image>,					s_imageCases,				DE_NULL),
3787e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3788e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3789e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Event>,					s_eventCases,				checkEventSupport),
3790e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Fence>,					s_fenceCases,				DE_NULL),
3791e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3792e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3793e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3794e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3795e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3796e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3797e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3798e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3799e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Sampler>,					s_samplerCases,				DE_NULL),
3800e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3801e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DescriptorSet>,			s_descriptorSetCases,		checkRecycleDescriptorSetMemorySupport),
3802e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3803e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3804e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3805e5c31af7Sopenharmony_ci	};
3806e5c31af7Sopenharmony_ci	// Multithreaded object construction with per-thread resources
3807e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_resources", s_multithreadedCreatePerThreadResourcesGroup));
3808e5c31af7Sopenharmony_ci
3809e5c31af7Sopenharmony_ci	const CaseDescriptions	s_multithreadedCreateSharedResourcesGroup	=
3810e5c31af7Sopenharmony_ci	{
3811e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Instance),
3812e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3813e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Device>,					s_deviceCases,				DE_NULL),
3814e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3815e5c31af7Sopenharmony_ci#else
3816e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Device),
3817e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceGroup),
3818e5c31af7Sopenharmony_ci#endif
3819e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3820e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Buffer>,					s_bufferCases,				DE_NULL),
3821e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3822e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Image>,					s_imageCases,				DE_NULL),
3823e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3824e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3825e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Event>,					s_eventCases,				checkEventSupport),
3826e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Fence>,					s_fenceCases,				DE_NULL),
3827e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3828e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3829e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3830e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3831e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3832e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3833e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3834e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3835e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Sampler>,					s_samplerCases,				DE_NULL),
3836e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3837e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DescriptorSet),		// \note Needs per-thread DescriptorPool
3838e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3839e5c31af7Sopenharmony_ci		CASE_DESC(multithreadedCreateSharedResourcesTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3840e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(CommandBuffer),			// \note Needs per-thread CommandPool
3841e5c31af7Sopenharmony_ci	};
3842e5c31af7Sopenharmony_ci	// Multithreaded object construction with shared resources
3843e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_shared_resources", s_multithreadedCreateSharedResourcesGroup));
3844e5c31af7Sopenharmony_ci
3845e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3846e5c31af7Sopenharmony_ci
3847e5c31af7Sopenharmony_ci// Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL
3848e5c31af7Sopenharmony_ci	const CaseDescriptions	s_createSingleAllocCallbacksGroup	=
3849e5c31af7Sopenharmony_ci	{
3850e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Instance>,					s_instanceCases,			DE_NULL),
3851e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Device>,					s_deviceCases,				DE_NULL),
3852e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3853e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3854e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Buffer>,					s_bufferCases,				DE_NULL),
3855e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3856e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Image>,					s_imageCases,				DE_NULL),
3857e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3858e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3859e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Event>,					s_eventCases,				checkEventSupport),
3860e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Fence>,					s_fenceCases,				DE_NULL),
3861e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3862e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3863e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3864e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3865e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3866e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3867e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3868e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3869e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Sampler>,					s_samplerCases,				DE_NULL),
3870e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3871e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3872e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3873e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3874e5c31af7Sopenharmony_ci		CASE_DESC(createSingleAllocCallbacksTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3875e5c31af7Sopenharmony_ci	};
3876e5c31af7Sopenharmony_ci	// Create single object
3877e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "single_alloc_callbacks", s_createSingleAllocCallbacksGroup));
3878e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3879e5c31af7Sopenharmony_ci
3880e5c31af7Sopenharmony_ci
3881e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3882e5c31af7Sopenharmony_ci	// Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL
3883e5c31af7Sopenharmony_ci	// \note Skip pooled objects in this test group. They are properly handled by the "multiple" group farther down below.
3884e5c31af7Sopenharmony_ci	const CaseDescriptions	s_allocCallbackFailGroup	=
3885e5c31af7Sopenharmony_ci	{
3886e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Instance>,					s_instanceCases,			DE_NULL),
3887e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Device>,					s_deviceCases,				DE_NULL),
3888e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<DeviceGroup>,				s_deviceGroupCases,			DE_NULL),
3889e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3890e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Buffer>,					s_bufferCases,				DE_NULL),
3891e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3892e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Image>,					s_imageCases,				DE_NULL),
3893e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3894e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3895e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Event>,					s_eventCases,				checkEventSupport),
3896e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Fence>,					s_fenceCases,				DE_NULL),
3897e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3898e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3899e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3900e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3901e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3902e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3903e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3904e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3905e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Sampler>,					s_samplerCases,				DE_NULL),
3906e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3907e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DescriptorSet),
3908e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3909e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3910e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(CommandBuffer),
3911e5c31af7Sopenharmony_ci	};
3912e5c31af7Sopenharmony_ci	// Allocation callback failure
3913e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail", s_allocCallbackFailGroup));
3914e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3915e5c31af7Sopenharmony_ci
3916e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3917e5c31af7Sopenharmony_ci	// Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL
3918e5c31af7Sopenharmony_ci	// \note Test objects that can be created in bulk
3919e5c31af7Sopenharmony_ci	const CaseDescriptions	s_allocCallbackFailMultipleObjectsGroup	=
3920e5c31af7Sopenharmony_ci	{
3921e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Instance),			// most objects can be created one at a time only
3922e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Device),
3923e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceGroup),
3924e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceMemory),
3925e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Buffer),
3926e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(BufferView),
3927e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Image),
3928e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(ImageView),
3929e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Semaphore),
3930e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Event),
3931e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Fence),
3932e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(QueryPool),
3933e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(ShaderModule),
3934e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(PipelineCache),
3935e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(PipelineLayout),
3936e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(RenderPass),
3937e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailMultipleObjectsTest <GraphicsPipeline>,		s_graphicsPipelineCases,	DE_NULL),
3938e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailMultipleObjectsTest <ComputePipeline>,		s_computePipelineCases,		DE_NULL),
3939e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DescriptorSetLayout),
3940e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Sampler),
3941e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DescriptorPool),
3942e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailMultipleObjectsTest <DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3943e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Framebuffer),
3944e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(CommandPool),
3945e5c31af7Sopenharmony_ci		CASE_DESC(allocCallbackFailMultipleObjectsTest <CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3946e5c31af7Sopenharmony_ci	};
3947e5c31af7Sopenharmony_ci	// Allocation callback failure creating multiple objects with one call
3948e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail_multiple", s_allocCallbackFailMultipleObjectsGroup));
3949e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3950e5c31af7Sopenharmony_ci
3951e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
3952e5c31af7Sopenharmony_ci	// Removed from Vulkan SC test set: VK_EXT_private_data extension does not exist in Vulkan SC
3953e5c31af7Sopenharmony_ci	const CaseDescriptions	s_privateDataResourcesGroup	=
3954e5c31af7Sopenharmony_ci	{
3955e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Instance),		// Does not make sense
3956e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(Device),		// Device is tested in each object test
3957e5c31af7Sopenharmony_ci		EMPTY_CASE_DESC(DeviceGroup),	// Device is tested in each object test
3958e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<DeviceMemory>,				s_deviceMemCases,			DE_NULL),
3959e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Buffer>,					s_bufferCases,				DE_NULL),
3960e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<BufferView>,				s_bufferViewCases,			DE_NULL),
3961e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Image>,					s_imageCases,				DE_NULL),
3962e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<ImageView>,				s_imageViewCases,			checkImageCubeArraySupport),
3963e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Semaphore>,				s_semaphoreCases,			DE_NULL),
3964e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Event>,					s_eventCases,				checkEventSupport),
3965e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Fence>,					s_fenceCases,				DE_NULL),
3966e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<QueryPool>,				s_queryPoolCases,			DE_NULL),
3967e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<ShaderModule>,				s_shaderModuleCases,		DE_NULL),
3968e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<PipelineCache>,			s_pipelineCacheCases,		DE_NULL),
3969e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<PipelineLayout>,			s_pipelineLayoutCases,		DE_NULL),
3970e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<RenderPass>,				s_renderPassCases,			DE_NULL),
3971e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<GraphicsPipeline>,			s_graphicsPipelineCases,	DE_NULL),
3972e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<ComputePipeline>,			s_computePipelineCases,		DE_NULL),
3973e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<DescriptorSetLayout>,		s_descriptorSetLayoutCases,	DE_NULL),
3974e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Sampler>,					s_samplerCases,				DE_NULL),
3975e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<DescriptorPool>,			s_descriptorPoolCases,		DE_NULL),
3976e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<DescriptorSet>,			s_descriptorSetCases,		DE_NULL),
3977e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<Framebuffer>,				s_framebufferCases,			DE_NULL),
3978e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<CommandPool>,				s_commandPoolCases,			DE_NULL),
3979e5c31af7Sopenharmony_ci		CASE_DESC(createPrivateDataTest	<CommandBuffer>,			s_commandBufferCases,		DE_NULL),
3980e5c31af7Sopenharmony_ci	};
3981e5c31af7Sopenharmony_ci	// Multiple objects with private data
3982e5c31af7Sopenharmony_ci	objectMgmtTests->addChild(createTestGroup(testCtx, "private_data", createTests, s_privateDataResourcesGroup, cleanupGroup));
3983e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
3984e5c31af7Sopenharmony_ci
3985e5c31af7Sopenharmony_ci	return objectMgmtTests.release();
3986e5c31af7Sopenharmony_ci}
3987e5c31af7Sopenharmony_ci
3988e5c31af7Sopenharmony_ci} // api
3989e5c31af7Sopenharmony_ci} // vkt
3990