• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* WARNING: This is auto-generated file. Do not modify, since changes will
2 * be lost! Modify the generating script instead.
3 * This file was generated by /scripts/gen_framework.py
4 */
5
6tcu::TestStatus validate_roadmap_2022(Context& context)
7{
8	const VkBool32 checkAlways = true;
9	bool oneOrMoreChecksFailed = false;
10	auto pd = context.getPhysicalDevice();
11	const auto &vki = context.getInstanceInterface();
12	TestLog& log = context.getTestContext().getLog();
13
14	VkPhysicalDeviceVulkan11Features vkVulkan11Features = initVulkanStructure();
15	VkPhysicalDeviceVulkan12Features vkVulkan12Features = initVulkanStructure(&vkVulkan11Features);
16	VkPhysicalDeviceVulkan13Features vkVulkan13Features = initVulkanStructure(&vkVulkan12Features);
17
18	VkPhysicalDeviceFeatures2 vkFeatures2 = initVulkanStructure(&vkVulkan13Features);
19	auto& vkFeatures = vkFeatures2.features;
20	vki.getPhysicalDeviceFeatures2(pd, &vkFeatures2);
21
22	VkPhysicalDeviceVulkan11Properties vkVulkan11Properties = initVulkanStructure();
23	VkPhysicalDeviceVulkan12Properties vkVulkan12Properties = initVulkanStructure(&vkVulkan11Properties);
24	VkPhysicalDeviceVulkan13Properties vkVulkan13Properties = initVulkanStructure(&vkVulkan12Properties);
25
26	VkPhysicalDeviceProperties2 vkProperties2 = initVulkanStructure(&vkVulkan13Properties);
27	auto& vkProperties = vkProperties2.properties;
28	vki.getPhysicalDeviceProperties2(pd, &vkProperties2);
29
30	const std::vector<FeatureEntry> featureTable {
31		// vulkan10requirements
32		ROADMAP_FEATURE_ITEM(vkFeatures, robustBufferAccess),
33
34		// vulkan10requirements_roadmap2022
35		ROADMAP_FEATURE_ITEM(vkFeatures, fullDrawIndexUint32),
36		ROADMAP_FEATURE_ITEM(vkFeatures, imageCubeArray),
37		ROADMAP_FEATURE_ITEM(vkFeatures, independentBlend),
38		ROADMAP_FEATURE_ITEM(vkFeatures, sampleRateShading),
39		ROADMAP_FEATURE_ITEM(vkFeatures, drawIndirectFirstInstance),
40		ROADMAP_FEATURE_ITEM(vkFeatures, depthClamp),
41		ROADMAP_FEATURE_ITEM(vkFeatures, depthBiasClamp),
42		ROADMAP_FEATURE_ITEM(vkFeatures, samplerAnisotropy),
43		ROADMAP_FEATURE_ITEM(vkFeatures, occlusionQueryPrecise),
44		ROADMAP_FEATURE_ITEM(vkFeatures, fragmentStoresAndAtomics),
45		ROADMAP_FEATURE_ITEM(vkFeatures, shaderStorageImageExtendedFormats),
46		ROADMAP_FEATURE_ITEM(vkFeatures, shaderUniformBufferArrayDynamicIndexing),
47		ROADMAP_FEATURE_ITEM(vkFeatures, shaderSampledImageArrayDynamicIndexing),
48		ROADMAP_FEATURE_ITEM(vkFeatures, shaderStorageBufferArrayDynamicIndexing),
49		ROADMAP_FEATURE_ITEM(vkFeatures, shaderStorageImageArrayDynamicIndexing),
50
51		// vulkan11requirements
52		ROADMAP_FEATURE_ITEM(vkVulkan11Features, multiview),
53
54		// vulkan11requirements_roadmap2022
55		ROADMAP_FEATURE_ITEM(vkVulkan11Features, samplerYcbcrConversion),
56
57		// vulkan12requirements
58		ROADMAP_FEATURE_ITEM(vkVulkan12Features, uniformBufferStandardLayout),
59		ROADMAP_FEATURE_ITEM(vkVulkan12Features, subgroupBroadcastDynamicId),
60		ROADMAP_FEATURE_ITEM(vkVulkan12Features, imagelessFramebuffer),
61		ROADMAP_FEATURE_ITEM(vkVulkan12Features, separateDepthStencilLayouts),
62		ROADMAP_FEATURE_ITEM(vkVulkan12Features, hostQueryReset),
63		ROADMAP_FEATURE_ITEM(vkVulkan12Features, timelineSemaphore),
64		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderSubgroupExtendedTypes),
65
66		// vulkan12requirements_roadmap2022
67		ROADMAP_FEATURE_ITEM(vkVulkan12Features, samplerMirrorClampToEdge),
68		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorIndexing),
69		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing),
70		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing),
71		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderUniformBufferArrayNonUniformIndexing),
72		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderSampledImageArrayNonUniformIndexing),
73		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderStorageBufferArrayNonUniformIndexing),
74		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderStorageImageArrayNonUniformIndexing),
75		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing),
76		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing),
77		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingSampledImageUpdateAfterBind),
78		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingStorageImageUpdateAfterBind),
79		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingStorageBufferUpdateAfterBind),
80		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingUniformTexelBufferUpdateAfterBind),
81		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingStorageTexelBufferUpdateAfterBind),
82		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingUpdateUnusedWhilePending),
83		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingPartiallyBound),
84		ROADMAP_FEATURE_ITEM(vkVulkan12Features, descriptorBindingVariableDescriptorCount),
85		ROADMAP_FEATURE_ITEM(vkVulkan12Features, runtimeDescriptorArray),
86		ROADMAP_FEATURE_ITEM(vkVulkan12Features, scalarBlockLayout),
87
88		// vulkan13requirements
89		ROADMAP_FEATURE_ITEM(vkVulkan12Features, vulkanMemoryModel),
90		ROADMAP_FEATURE_ITEM(vkVulkan12Features, vulkanMemoryModelDeviceScope),
91		ROADMAP_FEATURE_ITEM(vkVulkan12Features, bufferDeviceAddress),
92
93		ROADMAP_FEATURE_ITEM(vkVulkan13Features, robustImageAccess),
94		ROADMAP_FEATURE_ITEM(vkVulkan13Features, shaderTerminateInvocation),
95		ROADMAP_FEATURE_ITEM(vkVulkan13Features, shaderZeroInitializeWorkgroupMemory),
96		ROADMAP_FEATURE_ITEM(vkVulkan13Features, synchronization2),
97		ROADMAP_FEATURE_ITEM(vkVulkan13Features, shaderIntegerDotProduct),
98		ROADMAP_FEATURE_ITEM(vkVulkan13Features, maintenance4),
99		ROADMAP_FEATURE_ITEM(vkVulkan13Features, pipelineCreationCacheControl),
100		ROADMAP_FEATURE_ITEM(vkVulkan13Features, subgroupSizeControl),
101		ROADMAP_FEATURE_ITEM(vkVulkan13Features, computeFullSubgroups),
102		ROADMAP_FEATURE_ITEM(vkVulkan13Features, shaderDemoteToHelperInvocation),
103		ROADMAP_FEATURE_ITEM(vkVulkan13Features, inlineUniformBlock),
104		ROADMAP_FEATURE_ITEM(vkVulkan13Features, dynamicRendering),
105
106		// vulkan13requirements_roadmap2022
107		ROADMAP_FEATURE_ITEM(vkVulkan13Features, descriptorBindingInlineUniformBlockUpdateAfterBind),
108
109		// vulkan10optionals_roadmap2022
110		ROADMAP_FEATURE_ITEM(vkFeatures, largePoints),
111		ROADMAP_FEATURE_ITEM(vkFeatures, wideLines),
112	};
113	for (const auto &testedFeature : featureTable)
114	{
115	    if (!testedFeature.fieldPtr[0])
116	    {
117	        log << TestLog::Message
118	            << "Feature " << testedFeature.fieldName << " is not supported"
119	            << TestLog::EndMessage;
120	        oneOrMoreChecksFailed = true;
121	    }
122	}
123
124	const std::vector<FeatureLimitTableItem> propertyTable {
125		// vulkan10requirements_roadmap2022
126		{ PN(checkAlways), PN(vkProperties.limits.maxImageDimension1D), LIM_MIN_UINT32(8192) },
127		{ PN(checkAlways), PN(vkProperties.limits.maxImageDimension2D), LIM_MIN_UINT32(8192) },
128		{ PN(checkAlways), PN(vkProperties.limits.maxImageDimensionCube), LIM_MIN_UINT32(8192) },
129		{ PN(checkAlways), PN(vkProperties.limits.maxImageArrayLayers), LIM_MIN_UINT32(2048) },
130		{ PN(checkAlways), PN(vkProperties.limits.maxUniformBufferRange), LIM_MIN_UINT32(65536) },
131		{ PN(checkAlways), PN(vkProperties.limits.bufferImageGranularity), LIM_MAX_UINT32(4096) },
132		{ PN(checkAlways), PN(vkProperties.limits.maxPerStageDescriptorSamplers), LIM_MIN_UINT32(64) },
133		{ PN(checkAlways), PN(vkProperties.limits.maxPerStageDescriptorUniformBuffers), LIM_MIN_UINT32(15) },
134		{ PN(checkAlways), PN(vkProperties.limits.maxPerStageDescriptorStorageBuffers), LIM_MIN_UINT32(30) },
135		{ PN(checkAlways), PN(vkProperties.limits.maxPerStageDescriptorSampledImages), LIM_MIN_UINT32(200) },
136		{ PN(checkAlways), PN(vkProperties.limits.maxPerStageDescriptorStorageImages), LIM_MIN_UINT32(16) },
137		{ PN(checkAlways), PN(vkProperties.limits.maxPerStageResources), LIM_MIN_UINT32(200) },
138		{ PN(checkAlways), PN(vkProperties.limits.maxDescriptorSetSamplers), LIM_MIN_UINT32(576) },
139		{ PN(checkAlways), PN(vkProperties.limits.maxDescriptorSetUniformBuffers), LIM_MIN_UINT32(90) },
140		{ PN(checkAlways), PN(vkProperties.limits.maxDescriptorSetStorageBuffers), LIM_MIN_UINT32(96) },
141		{ PN(checkAlways), PN(vkProperties.limits.maxDescriptorSetSampledImages), LIM_MIN_UINT32(1800) },
142		{ PN(checkAlways), PN(vkProperties.limits.maxDescriptorSetStorageImages), LIM_MIN_UINT32(144) },
143		{ PN(checkAlways), PN(vkProperties.limits.maxFragmentCombinedOutputResources), LIM_MIN_UINT32(16) },
144		{ PN(checkAlways), PN(vkProperties.limits.maxComputeWorkGroupInvocations), LIM_MIN_UINT32(256) },
145		{ PN(checkAlways), PN(vkProperties.limits.maxComputeWorkGroupSize[0]), LIM_MIN_UINT32(256) },
146		{ PN(checkAlways), PN(vkProperties.limits.maxComputeWorkGroupSize[1]), LIM_MIN_UINT32(256) },
147		{ PN(checkAlways), PN(vkProperties.limits.maxComputeWorkGroupSize[2]), LIM_MIN_UINT32(64) },
148		{ PN(checkAlways), PN(vkProperties.limits.subTexelPrecisionBits), LIM_MIN_UINT32(8) },
149		{ PN(checkAlways), PN(vkProperties.limits.mipmapPrecisionBits), LIM_MIN_UINT32(6) },
150		{ PN(checkAlways), PN(vkProperties.limits.maxSamplerLodBias), LIM_MIN_FLOAT(14) },
151		{ PN(checkAlways), PN(vkProperties.limits.standardSampleLocations), LIM_MIN_UINT32(true) },
152		{ PN(checkAlways), PN(vkProperties.limits.maxColorAttachments), LIM_MIN_UINT32(7) },
153
154		// vulkan11requirements
155		{ PN(checkAlways), PN(vkVulkan11Properties.maxMultiviewViewCount), LIM_MIN_UINT32(6) },
156		{ PN(checkAlways), PN(vkVulkan11Properties.maxMultiviewInstanceIndex), LIM_MIN_UINT32(134217727) },
157
158		// vulkan11requirements_roadmap2022
159		{ PN(checkAlways), PN(vkVulkan11Properties.subgroupSize), LIM_MIN_UINT32(4) },
160		{ PN(checkAlways), PN(vkVulkan11Properties.subgroupSupportedStages), LIM_MIN_UINT32(VK_SHADER_STAGE_COMPUTE_BIT|VK_SHADER_STAGE_FRAGMENT_BIT) },
161		{ PN(checkAlways), PN(vkVulkan11Properties.subgroupSupportedOperations), LIM_MIN_UINT32(VK_SUBGROUP_FEATURE_BASIC_BIT|VK_SUBGROUP_FEATURE_VOTE_BIT|VK_SUBGROUP_FEATURE_ARITHMETIC_BIT|VK_SUBGROUP_FEATURE_BALLOT_BIT|VK_SUBGROUP_FEATURE_SHUFFLE_BIT|VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT|VK_SUBGROUP_FEATURE_QUAD_BIT) },
162
163		// vulkan12requirements
164		{ PN(checkAlways), PN(vkVulkan12Properties.maxTimelineSemaphoreValueDifference), LIM_MIN_UINT32(2147483647) },
165
166		// vulkan12requirements_roadmap2022
167		{ PN(checkAlways), PN(vkVulkan12Properties.shaderSignedZeroInfNanPreserveFloat16), LIM_MIN_UINT32(true) },
168		{ PN(checkAlways), PN(vkVulkan12Properties.shaderSignedZeroInfNanPreserveFloat32), LIM_MIN_UINT32(true) },
169		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageDescriptorUpdateAfterBindSamplers), LIM_MIN_UINT32(500000) },
170		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(12) },
171		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(500000) },
172		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageDescriptorUpdateAfterBindSampledImages), LIM_MIN_UINT32(500000) },
173		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageImages), LIM_MIN_UINT32(500000) },
174		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageDescriptorUpdateAfterBindInputAttachments), LIM_MIN_UINT32(7) },
175		{ PN(checkAlways), PN(vkVulkan12Properties.maxPerStageUpdateAfterBindResources), LIM_MIN_UINT32(500000) },
176		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindSamplers), LIM_MIN_UINT32(500000) },
177		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(72) },
178		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic), LIM_MIN_UINT32(8) },
179		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(500000) },
180		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic), LIM_MIN_UINT32(4) },
181		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindSampledImages), LIM_MIN_UINT32(500000) },
182		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageImages), LIM_MIN_UINT32(500000) },
183		{ PN(checkAlways), PN(vkVulkan12Properties.maxDescriptorSetUpdateAfterBindInputAttachments), LIM_MIN_UINT32(7) },
184
185		// vulkan13requirements
186		{ PN(checkAlways), PN(vkVulkan13Properties.maxBufferSize), LIM_MIN_DEVSIZE(1073741824) },
187		{ PN(checkAlways), PN(vkVulkan13Properties.maxInlineUniformBlockSize), LIM_MIN_UINT32(256) },
188		{ PN(checkAlways), PN(vkVulkan13Properties.maxPerStageDescriptorInlineUniformBlocks), LIM_MIN_UINT32(4) },
189		{ PN(checkAlways), PN(vkVulkan13Properties.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks), LIM_MIN_UINT32(4) },
190		{ PN(checkAlways), PN(vkVulkan13Properties.maxDescriptorSetInlineUniformBlocks), LIM_MIN_UINT32(4) },
191		{ PN(checkAlways), PN(vkVulkan13Properties.maxDescriptorSetUpdateAfterBindInlineUniformBlocks), LIM_MIN_UINT32(4) },
192		{ PN(checkAlways), PN(vkVulkan13Properties.maxInlineUniformTotalSize), LIM_MIN_UINT32(256) },
193
194		// vulkan10optionals_roadmap2022
195		{ PN(checkAlways), PN(vkProperties.limits.pointSizeGranularity), LIM_MAX_FLOAT(0.125) },
196		{ PN(checkAlways), PN(vkProperties.limits.lineWidthGranularity), LIM_MAX_FLOAT(0.5) },
197	};
198	for (const auto& testedProperty : propertyTable)
199	    oneOrMoreChecksFailed |= !validateLimit(testedProperty, log);
200
201	std::vector<std::string> extensionList {
202		"VK_KHR_global_priority"
203	};
204	const auto deviceExtensions = enumerateDeviceExtensionProperties(vki, pd, nullptr);
205	for (const auto& testedExtension : extensionList)
206	{
207	    if (isExtensionStructSupported(deviceExtensions, RequiredExtension(testedExtension)) ||
208	        context.isInstanceFunctionalitySupported(testedExtension))
209	        continue;
210	    log << TestLog::Message
211	        << testedExtension << " is not supported"
212	        << TestLog::EndMessage;
213	    oneOrMoreChecksFailed = true;
214	}
215
216	if (oneOrMoreChecksFailed)
217	    TCU_THROW(NotSupportedError, "Profile not supported");
218	return tcu::TestStatus::pass("Profile supported");
219}
220
221tcu::TestStatus validate_roadmap_2024(Context& context)
222{
223	const VkBool32 checkAlways = true;
224	bool oneOrMoreChecksFailed = false;
225	auto pd = context.getPhysicalDevice();
226	const auto &vki = context.getInstanceInterface();
227	TestLog& log = context.getTestContext().getLog();
228
229	VkPhysicalDeviceVulkan11Features vkVulkan11Features = initVulkanStructure();
230	VkPhysicalDeviceVulkan12Features vkVulkan12Features = initVulkanStructure(&vkVulkan11Features);
231
232	VkPhysicalDeviceFeatures2 vkFeatures2 = initVulkanStructure(&vkVulkan12Features);
233	auto& vkFeatures = vkFeatures2.features;
234	vki.getPhysicalDeviceFeatures2(pd, &vkFeatures2);
235
236	VkPhysicalDeviceVulkan12Properties vkVulkan12Properties = initVulkanStructure();
237
238	VkPhysicalDeviceProperties2 vkProperties2 = initVulkanStructure(&vkVulkan12Properties);
239	auto& vkProperties = vkProperties2.properties;
240	vki.getPhysicalDeviceProperties2(pd, &vkProperties2);
241
242	const std::vector<FeatureEntry> featureTable {
243		// vulkan10requirements_roadmap2024
244		ROADMAP_FEATURE_ITEM(vkFeatures, multiDrawIndirect),
245		ROADMAP_FEATURE_ITEM(vkFeatures, shaderInt16),
246		ROADMAP_FEATURE_ITEM(vkFeatures, shaderImageGatherExtended),
247
248		// vulkan11requirements_roadmap2024
249		ROADMAP_FEATURE_ITEM(vkVulkan11Features, shaderDrawParameters),
250		ROADMAP_FEATURE_ITEM(vkVulkan11Features, storageBuffer16BitAccess),
251
252		// vulkan12requirements_roadmap2024
253		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderInt8),
254		ROADMAP_FEATURE_ITEM(vkVulkan12Features, shaderFloat16),
255		ROADMAP_FEATURE_ITEM(vkVulkan12Features, storageBuffer8BitAccess),
256	};
257	for (const auto &testedFeature : featureTable)
258	{
259	    if (!testedFeature.fieldPtr[0])
260	    {
261	        log << TestLog::Message
262	            << "Feature " << testedFeature.fieldName << " is not supported"
263	            << TestLog::EndMessage;
264	        oneOrMoreChecksFailed = true;
265	    }
266	}
267
268	const std::vector<FeatureLimitTableItem> propertyTable {
269		// vulkan10requirements_roadmap2024
270		{ PN(checkAlways), PN(vkProperties.limits.timestampComputeAndGraphics), LIM_MIN_UINT32(true) },
271		{ PN(checkAlways), PN(vkProperties.limits.maxColorAttachments), LIM_MIN_UINT32(8) },
272		{ PN(checkAlways), PN(vkProperties.limits.maxBoundDescriptorSets), LIM_MIN_UINT32(7) },
273
274		// vulkan12requirements_roadmap2024
275		{ PN(checkAlways), PN(vkVulkan12Properties.shaderRoundingModeRTEFloat16), LIM_MIN_UINT32(true) },
276		{ PN(checkAlways), PN(vkVulkan12Properties.shaderRoundingModeRTEFloat32), LIM_MIN_UINT32(true) },
277	};
278	for (const auto& testedProperty : propertyTable)
279	    oneOrMoreChecksFailed |= !validateLimit(testedProperty, log);
280
281	std::vector<std::string> extensionList {
282		"VK_KHR_dynamic_rendering_local_read",
283		"VK_KHR_load_store_op_none",
284		"VK_KHR_shader_quad_control",
285		"VK_KHR_shader_maximal_reconvergence",
286		"VK_KHR_shader_subgroup_uniform_control_flow",
287		"VK_KHR_shader_subgroup_rotate",
288		"VK_KHR_shader_float_controls2",
289		"VK_KHR_shader_expect_assume",
290		"VK_KHR_line_rasterization",
291		"VK_KHR_vertex_attribute_divisor",
292		"VK_KHR_index_type_uint8",
293		"VK_KHR_map_memory2",
294		"VK_KHR_maintenance5",
295		"VK_KHR_push_descriptor"
296	};
297	const auto deviceExtensions = enumerateDeviceExtensionProperties(vki, pd, nullptr);
298	for (const auto& testedExtension : extensionList)
299	{
300	    if (isExtensionStructSupported(deviceExtensions, RequiredExtension(testedExtension)) ||
301	        context.isInstanceFunctionalitySupported(testedExtension))
302	        continue;
303	    log << TestLog::Message
304	        << testedExtension << " is not supported"
305	        << TestLog::EndMessage;
306	    oneOrMoreChecksFailed = true;
307	}
308
309	if (oneOrMoreChecksFailed)
310	    TCU_THROW(NotSupportedError, "Profile not supported");
311	return tcu::TestStatus::pass("Profile supported");
312}
313
314static const std::vector<ProfileEntry> profileEntries {
315	{ "roadmap_2022", checkApiVersionSupport<1, 3>, validate_roadmap_2022 },
316	{ "roadmap_2024", checkApiVersionSupport<1, 3>, validate_roadmap_2024 },
317};
318