1e5c31af7Sopenharmony_ci#ifndef _VKTSUBGROUPSTESTSUTILS_HPP
2e5c31af7Sopenharmony_ci#define _VKTSUBGROUPSTESTSUTILS_HPP
3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
5e5c31af7Sopenharmony_ci * ------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2017 The Khronos Group Inc.
8e5c31af7Sopenharmony_ci * Copyright (c) 2017 Codeplay Software Ltd.
9e5c31af7Sopenharmony_ci *
10e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
11e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
12e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
13e5c31af7Sopenharmony_ci *
14e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
15e5c31af7Sopenharmony_ci *
16e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
17e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
18e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
20e5c31af7Sopenharmony_ci * limitations under the License.
21e5c31af7Sopenharmony_ci *
22e5c31af7Sopenharmony_ci */ /*!
23e5c31af7Sopenharmony_ci * \file
24e5c31af7Sopenharmony_ci * \brief Subgroups tests utility classes
25e5c31af7Sopenharmony_ci */ /*--------------------------------------------------------------------*/
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ci#include "vkBuilderUtil.hpp"
28e5c31af7Sopenharmony_ci#include "vkDefs.hpp"
29e5c31af7Sopenharmony_ci#include "vkDeviceUtil.hpp"
30e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp"
31e5c31af7Sopenharmony_ci#include "vkPlatform.hpp"
32e5c31af7Sopenharmony_ci#include "vkPrograms.hpp"
33e5c31af7Sopenharmony_ci#include "vkQueryUtil.hpp"
34e5c31af7Sopenharmony_ci#include "vkRef.hpp"
35e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp"
36e5c31af7Sopenharmony_ci#include "vkStrUtil.hpp"
37e5c31af7Sopenharmony_ci#include "vkTypeUtil.hpp"
38e5c31af7Sopenharmony_ci#include "vktTestCase.hpp"
39e5c31af7Sopenharmony_ci#include "vktTestCaseUtil.hpp"
40e5c31af7Sopenharmony_ci#include "vkRayTracingUtil.hpp"
41e5c31af7Sopenharmony_ci
42e5c31af7Sopenharmony_ci#include "tcuFormatUtil.hpp"
43e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp"
44e5c31af7Sopenharmony_ci#include "tcuVectorUtil.hpp"
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_ci#include "gluShaderUtil.hpp"
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp"
49e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci#include <string>
52e5c31af7Sopenharmony_ci#include <vector>
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_cinamespace vkt
55e5c31af7Sopenharmony_ci{
56e5c31af7Sopenharmony_cinamespace subgroups
57e5c31af7Sopenharmony_ci{
58e5c31af7Sopenharmony_citypedef bool (*CheckResult)(const void* internalData, std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize);
59e5c31af7Sopenharmony_citypedef bool (*CheckResultFragment)(const void* internalData, std::vector<const void*> datas, deUint32 width, deUint32 height, deUint32 subgroupSize);
60e5c31af7Sopenharmony_citypedef bool (*CheckResultCompute)(const void* internalData, std::vector<const void*> datas, const deUint32 numWorkgroups[3], const deUint32 localSize[3], deUint32 subgroupSize);
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_ci// A struct to represent input data to a shader
63e5c31af7Sopenharmony_cistruct SSBOData
64e5c31af7Sopenharmony_ci{
65e5c31af7Sopenharmony_ci	enum InputDataInitializeType
66e5c31af7Sopenharmony_ci	{
67e5c31af7Sopenharmony_ci		InitializeNone = 0,
68e5c31af7Sopenharmony_ci		InitializeNonZero,
69e5c31af7Sopenharmony_ci		InitializeZero,
70e5c31af7Sopenharmony_ci	};
71e5c31af7Sopenharmony_ci	enum InputDataLayoutType
72e5c31af7Sopenharmony_ci	{
73e5c31af7Sopenharmony_ci		LayoutStd140 = 0,
74e5c31af7Sopenharmony_ci		LayoutStd430,
75e5c31af7Sopenharmony_ci		LayoutPacked
76e5c31af7Sopenharmony_ci	};
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ci	enum BindingType
79e5c31af7Sopenharmony_ci	{
80e5c31af7Sopenharmony_ci		BindingSSBO,
81e5c31af7Sopenharmony_ci		BindingImage,
82e5c31af7Sopenharmony_ci		BindingUBO,
83e5c31af7Sopenharmony_ci	};
84e5c31af7Sopenharmony_ci
85e5c31af7Sopenharmony_ci	SSBOData() :
86e5c31af7Sopenharmony_ci		initializeType	(InitializeNone),
87e5c31af7Sopenharmony_ci		layout			(LayoutStd140),
88e5c31af7Sopenharmony_ci		format			(vk::VK_FORMAT_UNDEFINED),
89e5c31af7Sopenharmony_ci		numElements		(0),
90e5c31af7Sopenharmony_ci		bindingType		(BindingSSBO),
91e5c31af7Sopenharmony_ci		binding			(0u),
92e5c31af7Sopenharmony_ci		stages			((vk::VkShaderStageFlags)0u)
93e5c31af7Sopenharmony_ci	{}
94e5c31af7Sopenharmony_ci
95e5c31af7Sopenharmony_ci	SSBOData (InputDataInitializeType	initializeType_,
96e5c31af7Sopenharmony_ci			  InputDataLayoutType		layout_,
97e5c31af7Sopenharmony_ci			  vk::VkFormat				format_,
98e5c31af7Sopenharmony_ci			  vk::VkDeviceSize			numElements_,
99e5c31af7Sopenharmony_ci			  BindingType				bindingType_	= BindingSSBO,
100e5c31af7Sopenharmony_ci			  deUint32					binding_		= 0u,
101e5c31af7Sopenharmony_ci			  vk::VkShaderStageFlags	stages_			= static_cast<vk::VkShaderStageFlags>(0u))
102e5c31af7Sopenharmony_ci		: initializeType	(initializeType_)
103e5c31af7Sopenharmony_ci		, layout			(layout_)
104e5c31af7Sopenharmony_ci		, format			(format_)
105e5c31af7Sopenharmony_ci		, numElements		(numElements_)
106e5c31af7Sopenharmony_ci		, bindingType		(bindingType_)
107e5c31af7Sopenharmony_ci		, binding			(binding_)
108e5c31af7Sopenharmony_ci		, stages			(stages_)
109e5c31af7Sopenharmony_ci	{
110e5c31af7Sopenharmony_ci		if (bindingType == BindingUBO)
111e5c31af7Sopenharmony_ci			DE_ASSERT(layout == LayoutStd140);
112e5c31af7Sopenharmony_ci	}
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci	bool isImage () const
115e5c31af7Sopenharmony_ci	{
116e5c31af7Sopenharmony_ci		return (bindingType == BindingImage);
117e5c31af7Sopenharmony_ci	}
118e5c31af7Sopenharmony_ci
119e5c31af7Sopenharmony_ci	bool isUBO () const
120e5c31af7Sopenharmony_ci	{
121e5c31af7Sopenharmony_ci		return (bindingType == BindingUBO);
122e5c31af7Sopenharmony_ci	}
123e5c31af7Sopenharmony_ci
124e5c31af7Sopenharmony_ci	InputDataInitializeType		initializeType;
125e5c31af7Sopenharmony_ci	InputDataLayoutType			layout;
126e5c31af7Sopenharmony_ci	vk::VkFormat				format;
127e5c31af7Sopenharmony_ci	vk::VkDeviceSize			numElements;
128e5c31af7Sopenharmony_ci	BindingType					bindingType;
129e5c31af7Sopenharmony_ci	deUint32					binding;
130e5c31af7Sopenharmony_ci	vk::VkShaderStageFlags		stages;
131e5c31af7Sopenharmony_ci};
132e5c31af7Sopenharmony_ci
133e5c31af7Sopenharmony_cideUint32 getStagesCount (vk::VkShaderStageFlags shaderStages);
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_cistd::string getSharedMemoryBallotHelper ();
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_cistd::string getSharedMemoryBallotHelperARB ();
138e5c31af7Sopenharmony_ci
139e5c31af7Sopenharmony_cideUint32 getSubgroupSize (Context& context);
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_cideUint32 maxSupportedSubgroupSize ();
142e5c31af7Sopenharmony_ci
143e5c31af7Sopenharmony_cistd::string getShaderStageName (vk::VkShaderStageFlags stage);
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_cistd::string getSubgroupFeatureName (vk::VkSubgroupFeatureFlagBits bit);
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_civoid addNoSubgroupShader (vk::SourceCollections& programCollection);
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_civoid initStdFrameBufferPrograms (vk::SourceCollections&				programCollection,
150e5c31af7Sopenharmony_ci								 const vk::ShaderBuildOptions&		buildOptions,
151e5c31af7Sopenharmony_ci								 vk::VkShaderStageFlags				shaderStage,
152e5c31af7Sopenharmony_ci								 vk::VkFormat						format,
153e5c31af7Sopenharmony_ci								 bool								gsPointSize,
154e5c31af7Sopenharmony_ci								 const std::string&					extHeader,
155e5c31af7Sopenharmony_ci								 const std::string&					testSrc,
156e5c31af7Sopenharmony_ci								 const std::string&					helperStr,
157e5c31af7Sopenharmony_ci								 const std::vector<std::string>&	declarations	= std::vector<std::string>());
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_civoid initStdPrograms (vk::SourceCollections&			programCollection,
160e5c31af7Sopenharmony_ci					  const vk::ShaderBuildOptions&		buildOptions,
161e5c31af7Sopenharmony_ci					  vk::VkShaderStageFlags			shaderStage,
162e5c31af7Sopenharmony_ci					  vk::VkFormat						format,
163e5c31af7Sopenharmony_ci					  bool								gsPointSize,
164e5c31af7Sopenharmony_ci					  const std::string&				extHeader,
165e5c31af7Sopenharmony_ci					  const std::string&				testSrc,
166e5c31af7Sopenharmony_ci					  const std::string&				helperStr,
167e5c31af7Sopenharmony_ci					  const std::vector<std::string>&	declarations			= std::vector<std::string>(),
168e5c31af7Sopenharmony_ci					  const bool						avoidHelperInvocations	= false,
169e5c31af7Sopenharmony_ci					  const std::string&				tempRes					= "  uint tempRes;\n");
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_cibool isSubgroupSupported (Context& context);
172e5c31af7Sopenharmony_ci
173e5c31af7Sopenharmony_cibool areSubgroupOperationsSupportedForStage (Context& context, vk::VkShaderStageFlags stage);
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_cibool isSubgroupFeatureSupportedForDevice (Context& context, vk::VkSubgroupFeatureFlagBits bit);
176e5c31af7Sopenharmony_ci
177e5c31af7Sopenharmony_cibool areQuadOperationsSupportedForStages (Context& context, const vk::VkShaderStageFlags stages);
178e5c31af7Sopenharmony_ci
179e5c31af7Sopenharmony_cibool isFragmentSSBOSupportedForDevice (Context& context);
180e5c31af7Sopenharmony_ci
181e5c31af7Sopenharmony_cibool isVertexSSBOSupportedForDevice (Context& context);
182e5c31af7Sopenharmony_ci
183e5c31af7Sopenharmony_cibool isFormatSupportedForDevice (Context& context, vk::VkFormat format);
184e5c31af7Sopenharmony_ci
185e5c31af7Sopenharmony_cibool isInt64SupportedForDevice (Context& context);
186e5c31af7Sopenharmony_ci
187e5c31af7Sopenharmony_cibool isTessellationAndGeometryPointSizeSupported (Context& context);
188e5c31af7Sopenharmony_ci
189e5c31af7Sopenharmony_cibool is16BitUBOStorageSupported (Context& context);
190e5c31af7Sopenharmony_ci
191e5c31af7Sopenharmony_cibool is8BitUBOStorageSupported (Context& context);
192e5c31af7Sopenharmony_ci
193e5c31af7Sopenharmony_cibool isSubgroupBroadcastDynamicIdSupported (Context& context);
194e5c31af7Sopenharmony_ci
195e5c31af7Sopenharmony_cistd::string getFormatNameForGLSL (vk::VkFormat format);
196e5c31af7Sopenharmony_ci
197e5c31af7Sopenharmony_cistd::string getAdditionalExtensionForFormat (vk::VkFormat format);
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ciconst std::vector<vk::VkFormat> getAllFormats ();
200e5c31af7Sopenharmony_ci
201e5c31af7Sopenharmony_cibool isFormatSigned (vk::VkFormat format);
202e5c31af7Sopenharmony_cibool isFormatUnsigned (vk::VkFormat format);
203e5c31af7Sopenharmony_cibool isFormatFloat (vk::VkFormat format);
204e5c31af7Sopenharmony_cibool isFormatBool (vk::VkFormat format);
205e5c31af7Sopenharmony_cibool isFormat8bitTy (vk::VkFormat format);
206e5c31af7Sopenharmony_cibool isFormat16BitTy (vk::VkFormat format);
207e5c31af7Sopenharmony_ci
208e5c31af7Sopenharmony_civoid addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection);
209e5c31af7Sopenharmony_civoid addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection);
210e5c31af7Sopenharmony_ci
211e5c31af7Sopenharmony_civoid setVertexShaderFrameBuffer (vk::SourceCollections& programCollection);
212e5c31af7Sopenharmony_ci
213e5c31af7Sopenharmony_civoid setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection);
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_civoid setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection);
216e5c31af7Sopenharmony_ci
217e5c31af7Sopenharmony_civoid setTesCtrlShaderFrameBuffer (vk::SourceCollections& programCollection);
218e5c31af7Sopenharmony_ci
219e5c31af7Sopenharmony_civoid setTesEvalShaderFrameBuffer (vk::SourceCollections& programCollection);
220e5c31af7Sopenharmony_ci
221e5c31af7Sopenharmony_cibool check (std::vector<const void*> datas, deUint32 width, deUint32 ref);
222e5c31af7Sopenharmony_ci
223e5c31af7Sopenharmony_cibool checkComputeOrMesh (std::vector<const void*>	datas,
224e5c31af7Sopenharmony_ci						 const deUint32				numWorkgroups[3],
225e5c31af7Sopenharmony_ci						 const deUint32				localSize[3],
226e5c31af7Sopenharmony_ci						 deUint32					ref);
227e5c31af7Sopenharmony_ci
228e5c31af7Sopenharmony_citcu::TestStatus makeTessellationEvaluationFrameBufferTest (Context&						context,
229e5c31af7Sopenharmony_ci														   vk::VkFormat					format,
230e5c31af7Sopenharmony_ci														   const SSBOData*				extraData,
231e5c31af7Sopenharmony_ci														   deUint32						extraDataCount,
232e5c31af7Sopenharmony_ci														   const void*					internalData,
233e5c31af7Sopenharmony_ci														   CheckResult					checkResult,
234e5c31af7Sopenharmony_ci														   const vk::VkShaderStageFlags	shaderStage = vk::VK_SHADER_STAGE_ALL_GRAPHICS);
235e5c31af7Sopenharmony_ci
236e5c31af7Sopenharmony_citcu::TestStatus makeGeometryFrameBufferTest (Context&			context,
237e5c31af7Sopenharmony_ci											 vk::VkFormat		format,
238e5c31af7Sopenharmony_ci											 const SSBOData*	extraData,
239e5c31af7Sopenharmony_ci											 deUint32			extraDataCount,
240e5c31af7Sopenharmony_ci											 const void*		internalData,
241e5c31af7Sopenharmony_ci											 CheckResult		checkResult);
242e5c31af7Sopenharmony_ci
243e5c31af7Sopenharmony_ci// Allows using verification functions with or without the optional last boolean argument.
244e5c31af7Sopenharmony_ci// If using a function that does not need the last argument, it will not be passed down to it.
245e5c31af7Sopenharmony_ciclass VerificationFunctor
246e5c31af7Sopenharmony_ci{
247e5c31af7Sopenharmony_cipublic:
248e5c31af7Sopenharmony_ci	using NoLastArgVariant	= bool(*)(const void*, std::vector<const void*>, deUint32, deUint32);
249e5c31af7Sopenharmony_ci	using AllArgsVariant	= bool(*)(const void*, std::vector<const void*>, deUint32, deUint32, bool);
250e5c31af7Sopenharmony_ci
251e5c31af7Sopenharmony_ci	VerificationFunctor (NoLastArgVariant func)
252e5c31af7Sopenharmony_ci		: m_noLastArgFunc{func}, m_allArgsFunc{nullptr}
253e5c31af7Sopenharmony_ci		{}
254e5c31af7Sopenharmony_ci
255e5c31af7Sopenharmony_ci	VerificationFunctor (AllArgsVariant func)
256e5c31af7Sopenharmony_ci		: m_noLastArgFunc{nullptr}, m_allArgsFunc{func}
257e5c31af7Sopenharmony_ci		{}
258e5c31af7Sopenharmony_ci
259e5c31af7Sopenharmony_ci	bool operator() (const void* extraData, std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize, bool multipleCallsPossible) const
260e5c31af7Sopenharmony_ci	{
261e5c31af7Sopenharmony_ci		if (m_allArgsFunc)
262e5c31af7Sopenharmony_ci			return m_allArgsFunc(extraData, datas, width, subgroupSize, multipleCallsPossible);
263e5c31af7Sopenharmony_ci		return m_noLastArgFunc(extraData, datas, width, subgroupSize);
264e5c31af7Sopenharmony_ci	}
265e5c31af7Sopenharmony_ci
266e5c31af7Sopenharmony_ciprivate:
267e5c31af7Sopenharmony_ci	NoLastArgVariant	m_noLastArgFunc;
268e5c31af7Sopenharmony_ci	AllArgsVariant		m_allArgsFunc;
269e5c31af7Sopenharmony_ci};
270e5c31af7Sopenharmony_ci
271e5c31af7Sopenharmony_civk::VkShaderStageFlags getPossibleGraphicsSubgroupStages (Context& context, const vk::VkShaderStageFlags testedStages);
272e5c31af7Sopenharmony_ci
273e5c31af7Sopenharmony_citcu::TestStatus allStages (Context&						context,
274e5c31af7Sopenharmony_ci						   vk::VkFormat					format,
275e5c31af7Sopenharmony_ci						   const SSBOData*				extraData,
276e5c31af7Sopenharmony_ci						   deUint32						extraDataCount,
277e5c31af7Sopenharmony_ci						   const void*					internalData,
278e5c31af7Sopenharmony_ci						   const VerificationFunctor&	checkResult,
279e5c31af7Sopenharmony_ci						   const vk::VkShaderStageFlags	shaderStage);
280e5c31af7Sopenharmony_ci
281e5c31af7Sopenharmony_citcu::TestStatus makeVertexFrameBufferTest (Context&			context,
282e5c31af7Sopenharmony_ci										   vk::VkFormat		format,
283e5c31af7Sopenharmony_ci										   const SSBOData*	extraData,
284e5c31af7Sopenharmony_ci										   deUint32			extraDataCount,
285e5c31af7Sopenharmony_ci										   const void*		internalData,
286e5c31af7Sopenharmony_ci										   CheckResult		checkResult);
287e5c31af7Sopenharmony_ci
288e5c31af7Sopenharmony_citcu::TestStatus makeFragmentFrameBufferTest (Context&				context,
289e5c31af7Sopenharmony_ci											 vk::VkFormat			format,
290e5c31af7Sopenharmony_ci											 const SSBOData*		extraData,
291e5c31af7Sopenharmony_ci											 deUint32				extraDataCount,
292e5c31af7Sopenharmony_ci											 const void*			internalData,
293e5c31af7Sopenharmony_ci											 CheckResultFragment	checkResult);
294e5c31af7Sopenharmony_ci
295e5c31af7Sopenharmony_citcu::TestStatus makeComputeTest (Context&				context,
296e5c31af7Sopenharmony_ci								 vk::VkFormat			format,
297e5c31af7Sopenharmony_ci								 const SSBOData*		inputs,
298e5c31af7Sopenharmony_ci								 deUint32				inputsCount,
299e5c31af7Sopenharmony_ci								 const void*			internalData,
300e5c31af7Sopenharmony_ci								 CheckResultCompute		checkResult,
301e5c31af7Sopenharmony_ci								 deUint32				requiredSubgroupSize = 0u,
302e5c31af7Sopenharmony_ci								 const deUint32			pipelineShaderStageCreateFlags = 0u);
303e5c31af7Sopenharmony_ci
304e5c31af7Sopenharmony_citcu::TestStatus makeMeshTest (Context&				context,
305e5c31af7Sopenharmony_ci							  vk::VkFormat			format,
306e5c31af7Sopenharmony_ci							  const SSBOData*		inputs,
307e5c31af7Sopenharmony_ci							  deUint32				inputsCount,
308e5c31af7Sopenharmony_ci							  const void*			internalData,
309e5c31af7Sopenharmony_ci							  CheckResultCompute	checkResult,
310e5c31af7Sopenharmony_ci							  deUint32				requiredSubgroupSize = 0u,
311e5c31af7Sopenharmony_ci							  const deUint32		pipelineShaderStageCreateFlags = 0u);
312e5c31af7Sopenharmony_ci
313e5c31af7Sopenharmony_ci/* Functions needed for VK_EXT_subgroup_size_control tests */
314e5c31af7Sopenharmony_citcu::TestStatus makeTessellationEvaluationFrameBufferTestRequiredSubgroupSize (Context&							context,
315e5c31af7Sopenharmony_ci																			   vk::VkFormat						format,
316e5c31af7Sopenharmony_ci																			   const SSBOData*					extraData,
317e5c31af7Sopenharmony_ci																			   deUint32							extraDataCount,
318e5c31af7Sopenharmony_ci																			   const void*						internalData,
319e5c31af7Sopenharmony_ci																			   CheckResult						checkResult,
320e5c31af7Sopenharmony_ci																			   const vk::VkShaderStageFlags		shaderStage = vk::VK_SHADER_STAGE_ALL_GRAPHICS,
321e5c31af7Sopenharmony_ci																			   const deUint32					tessShaderStageCreateFlags = 0u,
322e5c31af7Sopenharmony_ci																			   const deUint32					requiredSubgroupSize = 0u);
323e5c31af7Sopenharmony_ci
324e5c31af7Sopenharmony_citcu::TestStatus makeGeometryFrameBufferTestRequiredSubgroupSize (Context&			context,
325e5c31af7Sopenharmony_ci																 vk::VkFormat		format,
326e5c31af7Sopenharmony_ci																 const SSBOData*	extraData,
327e5c31af7Sopenharmony_ci																 deUint32			extraDataCount,
328e5c31af7Sopenharmony_ci																 const void*		internalData,
329e5c31af7Sopenharmony_ci																 CheckResult		checkResult,
330e5c31af7Sopenharmony_ci																 const deUint32		geometryShaderStageCreateFlags = 0u,
331e5c31af7Sopenharmony_ci																 const deUint32		requiredSubgroupSize = 0u);
332e5c31af7Sopenharmony_ci
333e5c31af7Sopenharmony_citcu::TestStatus allStagesRequiredSubgroupSize (Context&						context,
334e5c31af7Sopenharmony_ci											   vk::VkFormat					format,
335e5c31af7Sopenharmony_ci											   const SSBOData*				extraDatas,
336e5c31af7Sopenharmony_ci											   deUint32						extraDatasCount,
337e5c31af7Sopenharmony_ci											   const void*					internalData,
338e5c31af7Sopenharmony_ci											   const VerificationFunctor&	checkResult,
339e5c31af7Sopenharmony_ci											   const vk::VkShaderStageFlags	shaderStageTested,
340e5c31af7Sopenharmony_ci											   const deUint32				vertexShaderStageCreateFlags,
341e5c31af7Sopenharmony_ci											   const deUint32				tessellationControlShaderStageCreateFlags,
342e5c31af7Sopenharmony_ci											   const deUint32				tessellationEvalShaderStageCreateFlags,
343e5c31af7Sopenharmony_ci											   const deUint32				geometryShaderStageCreateFlags,
344e5c31af7Sopenharmony_ci											   const deUint32				fragmentShaderStageCreateFlags,
345e5c31af7Sopenharmony_ci											   const deUint32				requiredSubgroupSize[5]);
346e5c31af7Sopenharmony_ci
347e5c31af7Sopenharmony_citcu::TestStatus makeVertexFrameBufferTestRequiredSubgroupSize (Context&				context,
348e5c31af7Sopenharmony_ci															   vk::VkFormat			format,
349e5c31af7Sopenharmony_ci															   const SSBOData*		extraData,
350e5c31af7Sopenharmony_ci															   deUint32				extraDataCount,
351e5c31af7Sopenharmony_ci															   const void*			internalData,
352e5c31af7Sopenharmony_ci															   CheckResult			checkResult,
353e5c31af7Sopenharmony_ci															   const deUint32		vertexShaderStageCreateFlags = 0u,
354e5c31af7Sopenharmony_ci															   const deUint32		requiredSubgroupSize = 0u);
355e5c31af7Sopenharmony_ci
356e5c31af7Sopenharmony_citcu::TestStatus makeFragmentFrameBufferTestRequiredSubgroupSize (Context&				context,
357e5c31af7Sopenharmony_ci																 vk::VkFormat			format,
358e5c31af7Sopenharmony_ci																 const SSBOData*		extraData,
359e5c31af7Sopenharmony_ci																 deUint32				extraDataCount,
360e5c31af7Sopenharmony_ci																 const void*			internalData,
361e5c31af7Sopenharmony_ci																 CheckResultFragment	checkResult,
362e5c31af7Sopenharmony_ci																 const deUint32			fragmentShaderStageCreateFlags = 0u,
363e5c31af7Sopenharmony_ci																 const deUint32			requiredSubgroupSize = 0u);
364e5c31af7Sopenharmony_ci
365e5c31af7Sopenharmony_citcu::TestStatus makeComputeTestRequiredSubgroupSize (Context&				context,
366e5c31af7Sopenharmony_ci													 vk::VkFormat			format,
367e5c31af7Sopenharmony_ci													 const SSBOData*		inputs,
368e5c31af7Sopenharmony_ci													 deUint32				inputsCount,
369e5c31af7Sopenharmony_ci													 const void*			internalData,
370e5c31af7Sopenharmony_ci													 CheckResultCompute		checkResult,
371e5c31af7Sopenharmony_ci													 const deUint32			pipelineShaderStageCreateFlags,
372e5c31af7Sopenharmony_ci													 const deUint32			numWorkgroups[3],
373e5c31af7Sopenharmony_ci													 const deBool			isRequiredSubgroupSize,
374e5c31af7Sopenharmony_ci													 const deUint32			subgroupSize,
375e5c31af7Sopenharmony_ci													 const deUint32			localSizesToTest[][3],
376e5c31af7Sopenharmony_ci													 const deUint32			localSizesToTestCount);
377e5c31af7Sopenharmony_ci
378e5c31af7Sopenharmony_citcu::TestStatus makeMeshTestRequiredSubgroupSize	(Context&				context,
379e5c31af7Sopenharmony_ci													 vk::VkFormat			format,
380e5c31af7Sopenharmony_ci													 const SSBOData*		inputs,
381e5c31af7Sopenharmony_ci													 deUint32				inputsCount,
382e5c31af7Sopenharmony_ci													 const void*			internalData,
383e5c31af7Sopenharmony_ci													 CheckResultCompute		checkResult,
384e5c31af7Sopenharmony_ci													 const deUint32			pipelineShaderStageCreateFlags,
385e5c31af7Sopenharmony_ci													 const deUint32			numWorkgroups[3],
386e5c31af7Sopenharmony_ci													 const deBool			isRequiredSubgroupSize,
387e5c31af7Sopenharmony_ci													 const deUint32			subgroupSize,
388e5c31af7Sopenharmony_ci													 const deUint32			localSizesToTest[][3],
389e5c31af7Sopenharmony_ci													 const deUint32			localSizesToTestCount);
390e5c31af7Sopenharmony_ci
391e5c31af7Sopenharmony_civoid supportedCheckShader (Context& context, const vk::VkShaderStageFlags shaderStage);
392e5c31af7Sopenharmony_ci
393e5c31af7Sopenharmony_ciconst std::vector<vk::VkFormat> getAllRayTracingFormats();
394e5c31af7Sopenharmony_ci
395e5c31af7Sopenharmony_civoid addRayTracingNoSubgroupShader (vk::SourceCollections& programCollection);
396e5c31af7Sopenharmony_ci
397e5c31af7Sopenharmony_civk::VkShaderStageFlags getPossibleRayTracingSubgroupStages (Context& context, const vk::VkShaderStageFlags testedStages);
398e5c31af7Sopenharmony_ci
399e5c31af7Sopenharmony_citcu::TestStatus allRayTracingStages (Context&						context,
400e5c31af7Sopenharmony_ci									 vk::VkFormat					format,
401e5c31af7Sopenharmony_ci									 const SSBOData*				extraData,
402e5c31af7Sopenharmony_ci									 deUint32						extraDataCount,
403e5c31af7Sopenharmony_ci									 const void*					internalData,
404e5c31af7Sopenharmony_ci									 const VerificationFunctor&		checkResult,
405e5c31af7Sopenharmony_ci									 const vk::VkShaderStageFlags	shaderStage);
406e5c31af7Sopenharmony_ci
407e5c31af7Sopenharmony_citcu::TestStatus allRayTracingStagesRequiredSubgroupSize (Context&						context,
408e5c31af7Sopenharmony_ci														 vk::VkFormat					format,
409e5c31af7Sopenharmony_ci														 const SSBOData*				extraDatas,
410e5c31af7Sopenharmony_ci														 deUint32						extraDatasCount,
411e5c31af7Sopenharmony_ci														 const void*					internalData,
412e5c31af7Sopenharmony_ci														 const VerificationFunctor&		checkResult,
413e5c31af7Sopenharmony_ci														 const vk::VkShaderStageFlags	shaderStageTested,
414e5c31af7Sopenharmony_ci														 const deUint32					shaderStageCreateFlags[6],
415e5c31af7Sopenharmony_ci														 const deUint32					requiredSubgroupSize[6]);
416e5c31af7Sopenharmony_ci} // subgroups
417e5c31af7Sopenharmony_ci} // vkt
418e5c31af7Sopenharmony_ci
419e5c31af7Sopenharmony_ci#endif // _VKTSUBGROUPSTESTSUTILS_HPP
420