• 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 testPhysicalDeviceFeaturePrivateDataFeatures (Context& context)
7{
8	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
9	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
10	const InstanceDriver&		vki				(instance.getDriver());
11	const int					count			= 2u;
12	TestLog&					log				= context.getTestContext().getLog();
13	VkPhysicalDeviceFeatures2	extFeatures;
14	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
15
16	VkPhysicalDevicePrivateDataFeatures	devicePrivateDataFeatures[count];
17	const bool							isPrivateDataFeatures = checkExtension(properties, "VK_EXT_private_data") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
18
19	for (int ndx = 0; ndx < count; ++ndx)
20	{
21		deMemset(&devicePrivateDataFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePrivateDataFeatures));
22		devicePrivateDataFeatures[ndx].sType = isPrivateDataFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
23		devicePrivateDataFeatures[ndx].pNext = DE_NULL;
24
25		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
26		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
27		extFeatures.pNext = &devicePrivateDataFeatures[ndx];
28
29		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
30	}
31
32	if (isPrivateDataFeatures)
33		log << TestLog::Message << devicePrivateDataFeatures[0] << TestLog::EndMessage;
34
35	if (isPrivateDataFeatures &&
36		(devicePrivateDataFeatures[0].privateData != devicePrivateDataFeatures[1].privateData))
37	{
38		TCU_FAIL("Mismatch between VkPhysicalDevicePrivateDataFeatures");
39	}
40	return tcu::TestStatus::pass("Querying succeeded");
41}
42
43tcu::TestStatus testPhysicalDeviceFeatureVariablePointersFeatures (Context& context)
44{
45	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
46	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
47	const InstanceDriver&		vki				(instance.getDriver());
48	const int					count			= 2u;
49	TestLog&					log				= context.getTestContext().getLog();
50	VkPhysicalDeviceFeatures2	extFeatures;
51	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
52
53	VkPhysicalDeviceVariablePointersFeatures	deviceVariablePointersFeatures[count];
54	const bool									isVariablePointersFeatures = checkExtension(properties, "VK_KHR_variable_pointers") || context.contextSupports(vk::ApiVersion(0, 1, 1, 0));
55
56	for (int ndx = 0; ndx < count; ++ndx)
57	{
58		deMemset(&deviceVariablePointersFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVariablePointersFeatures));
59		deviceVariablePointersFeatures[ndx].sType = isVariablePointersFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
60		deviceVariablePointersFeatures[ndx].pNext = DE_NULL;
61
62		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
63		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
64		extFeatures.pNext = &deviceVariablePointersFeatures[ndx];
65
66		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
67	}
68
69	if (isVariablePointersFeatures)
70		log << TestLog::Message << deviceVariablePointersFeatures[0] << TestLog::EndMessage;
71
72	if (isVariablePointersFeatures &&
73		(deviceVariablePointersFeatures[0].variablePointersStorageBuffer != deviceVariablePointersFeatures[1].variablePointersStorageBuffer ||
74		 deviceVariablePointersFeatures[0].variablePointers != deviceVariablePointersFeatures[1].variablePointers))
75	{
76		TCU_FAIL("Mismatch between VkPhysicalDeviceVariablePointersFeatures");
77	}
78	return tcu::TestStatus::pass("Querying succeeded");
79}
80
81tcu::TestStatus testPhysicalDeviceFeatureMultiviewFeatures (Context& context)
82{
83	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
84	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
85	const InstanceDriver&		vki				(instance.getDriver());
86	const int					count			= 2u;
87	TestLog&					log				= context.getTestContext().getLog();
88	VkPhysicalDeviceFeatures2	extFeatures;
89	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
90
91	VkPhysicalDeviceMultiviewFeatures	deviceMultiviewFeatures[count];
92	const bool							isMultiviewFeatures = checkExtension(properties, "VK_KHR_multiview") || context.contextSupports(vk::ApiVersion(0, 1, 1, 0));
93
94	for (int ndx = 0; ndx < count; ++ndx)
95	{
96		deMemset(&deviceMultiviewFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMultiviewFeatures));
97		deviceMultiviewFeatures[ndx].sType = isMultiviewFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
98		deviceMultiviewFeatures[ndx].pNext = DE_NULL;
99
100		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
101		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
102		extFeatures.pNext = &deviceMultiviewFeatures[ndx];
103
104		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
105	}
106
107	if (isMultiviewFeatures)
108		log << TestLog::Message << deviceMultiviewFeatures[0] << TestLog::EndMessage;
109
110	if (isMultiviewFeatures &&
111		(deviceMultiviewFeatures[0].multiview != deviceMultiviewFeatures[1].multiview ||
112		 deviceMultiviewFeatures[0].multiviewGeometryShader != deviceMultiviewFeatures[1].multiviewGeometryShader ||
113		 deviceMultiviewFeatures[0].multiviewTessellationShader != deviceMultiviewFeatures[1].multiviewTessellationShader))
114	{
115		TCU_FAIL("Mismatch between VkPhysicalDeviceMultiviewFeatures");
116	}
117	return tcu::TestStatus::pass("Querying succeeded");
118}
119
120tcu::TestStatus testPhysicalDeviceFeaturePresentIdFeaturesKHR (Context& context)
121{
122	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
123	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
124	const InstanceDriver&		vki				(instance.getDriver());
125	const int					count			= 2u;
126	TestLog&					log				= context.getTestContext().getLog();
127	VkPhysicalDeviceFeatures2	extFeatures;
128	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
129
130	VkPhysicalDevicePresentIdFeaturesKHR	devicePresentIdFeaturesKHR[count];
131	const bool								isPresentIdFeaturesKHR = checkExtension(properties, "VK_KHR_present_id");
132
133	for (int ndx = 0; ndx < count; ++ndx)
134	{
135		deMemset(&devicePresentIdFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePresentIdFeaturesKHR));
136		devicePresentIdFeaturesKHR[ndx].sType = isPresentIdFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
137		devicePresentIdFeaturesKHR[ndx].pNext = DE_NULL;
138
139		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
140		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
141		extFeatures.pNext = &devicePresentIdFeaturesKHR[ndx];
142
143		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
144	}
145
146	if (isPresentIdFeaturesKHR)
147		log << TestLog::Message << devicePresentIdFeaturesKHR[0] << TestLog::EndMessage;
148
149	if (isPresentIdFeaturesKHR &&
150		(devicePresentIdFeaturesKHR[0].presentId != devicePresentIdFeaturesKHR[1].presentId))
151	{
152		TCU_FAIL("Mismatch between VkPhysicalDevicePresentIdFeaturesKHR");
153	}
154	return tcu::TestStatus::pass("Querying succeeded");
155}
156
157tcu::TestStatus testPhysicalDeviceFeaturePresentWaitFeaturesKHR (Context& context)
158{
159	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
160	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
161	const InstanceDriver&		vki				(instance.getDriver());
162	const int					count			= 2u;
163	TestLog&					log				= context.getTestContext().getLog();
164	VkPhysicalDeviceFeatures2	extFeatures;
165	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
166
167	VkPhysicalDevicePresentWaitFeaturesKHR	devicePresentWaitFeaturesKHR[count];
168	const bool								isPresentWaitFeaturesKHR = checkExtension(properties, "VK_KHR_present_wait");
169
170	for (int ndx = 0; ndx < count; ++ndx)
171	{
172		deMemset(&devicePresentWaitFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePresentWaitFeaturesKHR));
173		devicePresentWaitFeaturesKHR[ndx].sType = isPresentWaitFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
174		devicePresentWaitFeaturesKHR[ndx].pNext = DE_NULL;
175
176		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
177		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
178		extFeatures.pNext = &devicePresentWaitFeaturesKHR[ndx];
179
180		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
181	}
182
183	if (isPresentWaitFeaturesKHR)
184		log << TestLog::Message << devicePresentWaitFeaturesKHR[0] << TestLog::EndMessage;
185
186	if (isPresentWaitFeaturesKHR &&
187		(devicePresentWaitFeaturesKHR[0].presentWait != devicePresentWaitFeaturesKHR[1].presentWait))
188	{
189		TCU_FAIL("Mismatch between VkPhysicalDevicePresentWaitFeaturesKHR");
190	}
191	return tcu::TestStatus::pass("Querying succeeded");
192}
193
194tcu::TestStatus testPhysicalDeviceFeature16BitStorageFeatures (Context& context)
195{
196	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
197	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
198	const InstanceDriver&		vki				(instance.getDriver());
199	const int					count			= 2u;
200	TestLog&					log				= context.getTestContext().getLog();
201	VkPhysicalDeviceFeatures2	extFeatures;
202	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
203
204	VkPhysicalDevice16BitStorageFeatures	device16BitStorageFeatures[count];
205	const bool								is16BitStorageFeatures = checkExtension(properties, "VK_KHR_16bit_storage") || context.contextSupports(vk::ApiVersion(0, 1, 1, 0));
206
207	for (int ndx = 0; ndx < count; ++ndx)
208	{
209		deMemset(&device16BitStorageFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevice16BitStorageFeatures));
210		device16BitStorageFeatures[ndx].sType = is16BitStorageFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
211		device16BitStorageFeatures[ndx].pNext = DE_NULL;
212
213		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
214		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
215		extFeatures.pNext = &device16BitStorageFeatures[ndx];
216
217		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
218	}
219
220	if (is16BitStorageFeatures)
221		log << TestLog::Message << device16BitStorageFeatures[0] << TestLog::EndMessage;
222
223	if (is16BitStorageFeatures &&
224		(device16BitStorageFeatures[0].storageBuffer16BitAccess != device16BitStorageFeatures[1].storageBuffer16BitAccess ||
225		 device16BitStorageFeatures[0].uniformAndStorageBuffer16BitAccess != device16BitStorageFeatures[1].uniformAndStorageBuffer16BitAccess ||
226		 device16BitStorageFeatures[0].storagePushConstant16 != device16BitStorageFeatures[1].storagePushConstant16 ||
227		 device16BitStorageFeatures[0].storageInputOutput16 != device16BitStorageFeatures[1].storageInputOutput16))
228	{
229		TCU_FAIL("Mismatch between VkPhysicalDevice16BitStorageFeatures");
230	}
231	return tcu::TestStatus::pass("Querying succeeded");
232}
233
234tcu::TestStatus testPhysicalDeviceFeatureShaderSubgroupExtendedTypesFeatures (Context& context)
235{
236	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
237	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
238	const InstanceDriver&		vki				(instance.getDriver());
239	const int					count			= 2u;
240	TestLog&					log				= context.getTestContext().getLog();
241	VkPhysicalDeviceFeatures2	extFeatures;
242	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
243
244	VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures	deviceShaderSubgroupExtendedTypesFeatures[count];
245	const bool											isShaderSubgroupExtendedTypesFeatures = checkExtension(properties, "VK_KHR_shader_subgroup_extended_types") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
246
247	for (int ndx = 0; ndx < count; ++ndx)
248	{
249		deMemset(&deviceShaderSubgroupExtendedTypesFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures));
250		deviceShaderSubgroupExtendedTypesFeatures[ndx].sType = isShaderSubgroupExtendedTypesFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
251		deviceShaderSubgroupExtendedTypesFeatures[ndx].pNext = DE_NULL;
252
253		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
254		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
255		extFeatures.pNext = &deviceShaderSubgroupExtendedTypesFeatures[ndx];
256
257		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
258	}
259
260	if (isShaderSubgroupExtendedTypesFeatures)
261		log << TestLog::Message << deviceShaderSubgroupExtendedTypesFeatures[0] << TestLog::EndMessage;
262
263	if (isShaderSubgroupExtendedTypesFeatures &&
264		(deviceShaderSubgroupExtendedTypesFeatures[0].shaderSubgroupExtendedTypes != deviceShaderSubgroupExtendedTypesFeatures[1].shaderSubgroupExtendedTypes))
265	{
266		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures");
267	}
268	return tcu::TestStatus::pass("Querying succeeded");
269}
270
271tcu::TestStatus testPhysicalDeviceFeatureSamplerYcbcrConversionFeatures (Context& context)
272{
273	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
274	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
275	const InstanceDriver&		vki				(instance.getDriver());
276	const int					count			= 2u;
277	TestLog&					log				= context.getTestContext().getLog();
278	VkPhysicalDeviceFeatures2	extFeatures;
279	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
280
281	VkPhysicalDeviceSamplerYcbcrConversionFeatures	deviceSamplerYcbcrConversionFeatures[count];
282	const bool										isSamplerYcbcrConversionFeatures = checkExtension(properties, "VK_KHR_sampler_ycbcr_conversion") || context.contextSupports(vk::ApiVersion(0, 1, 1, 0));
283
284	for (int ndx = 0; ndx < count; ++ndx)
285	{
286		deMemset(&deviceSamplerYcbcrConversionFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures));
287		deviceSamplerYcbcrConversionFeatures[ndx].sType = isSamplerYcbcrConversionFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
288		deviceSamplerYcbcrConversionFeatures[ndx].pNext = DE_NULL;
289
290		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
291		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
292		extFeatures.pNext = &deviceSamplerYcbcrConversionFeatures[ndx];
293
294		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
295	}
296
297	if (isSamplerYcbcrConversionFeatures)
298		log << TestLog::Message << deviceSamplerYcbcrConversionFeatures[0] << TestLog::EndMessage;
299
300	if (isSamplerYcbcrConversionFeatures &&
301		(deviceSamplerYcbcrConversionFeatures[0].samplerYcbcrConversion != deviceSamplerYcbcrConversionFeatures[1].samplerYcbcrConversion))
302	{
303		TCU_FAIL("Mismatch between VkPhysicalDeviceSamplerYcbcrConversionFeatures");
304	}
305	return tcu::TestStatus::pass("Querying succeeded");
306}
307
308tcu::TestStatus testPhysicalDeviceFeatureProtectedMemoryFeatures (Context& context)
309{
310	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
311	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
312	const InstanceDriver&		vki				(instance.getDriver());
313	const int					count			= 2u;
314	TestLog&					log				= context.getTestContext().getLog();
315	VkPhysicalDeviceFeatures2	extFeatures;
316	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
317
318	VkPhysicalDeviceProtectedMemoryFeatures	deviceProtectedMemoryFeatures[count];
319	const bool								isProtectedMemoryFeatures = context.contextSupports(vk::ApiVersion(0, 1, 1, 0));
320
321	for (int ndx = 0; ndx < count; ++ndx)
322	{
323		deMemset(&deviceProtectedMemoryFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceProtectedMemoryFeatures));
324		deviceProtectedMemoryFeatures[ndx].sType = isProtectedMemoryFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
325		deviceProtectedMemoryFeatures[ndx].pNext = DE_NULL;
326
327		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
328		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
329		extFeatures.pNext = &deviceProtectedMemoryFeatures[ndx];
330
331		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
332	}
333
334	if (isProtectedMemoryFeatures)
335		log << TestLog::Message << deviceProtectedMemoryFeatures[0] << TestLog::EndMessage;
336
337	if (isProtectedMemoryFeatures &&
338		(deviceProtectedMemoryFeatures[0].protectedMemory != deviceProtectedMemoryFeatures[1].protectedMemory))
339	{
340		TCU_FAIL("Mismatch between VkPhysicalDeviceProtectedMemoryFeatures");
341	}
342	return tcu::TestStatus::pass("Querying succeeded");
343}
344
345tcu::TestStatus testPhysicalDeviceFeatureBlendOperationAdvancedFeaturesEXT (Context& context)
346{
347	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
348	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
349	const InstanceDriver&		vki				(instance.getDriver());
350	const int					count			= 2u;
351	TestLog&					log				= context.getTestContext().getLog();
352	VkPhysicalDeviceFeatures2	extFeatures;
353	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
354
355	VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT	deviceBlendOperationAdvancedFeaturesEXT[count];
356	const bool											isBlendOperationAdvancedFeaturesEXT = checkExtension(properties, "VK_EXT_blend_operation_advanced");
357
358	for (int ndx = 0; ndx < count; ++ndx)
359	{
360		deMemset(&deviceBlendOperationAdvancedFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT));
361		deviceBlendOperationAdvancedFeaturesEXT[ndx].sType = isBlendOperationAdvancedFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
362		deviceBlendOperationAdvancedFeaturesEXT[ndx].pNext = DE_NULL;
363
364		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
365		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
366		extFeatures.pNext = &deviceBlendOperationAdvancedFeaturesEXT[ndx];
367
368		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
369	}
370
371	if (isBlendOperationAdvancedFeaturesEXT)
372		log << TestLog::Message << deviceBlendOperationAdvancedFeaturesEXT[0] << TestLog::EndMessage;
373
374	if (isBlendOperationAdvancedFeaturesEXT &&
375		(deviceBlendOperationAdvancedFeaturesEXT[0].advancedBlendCoherentOperations != deviceBlendOperationAdvancedFeaturesEXT[1].advancedBlendCoherentOperations))
376	{
377		TCU_FAIL("Mismatch between VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT");
378	}
379	return tcu::TestStatus::pass("Querying succeeded");
380}
381
382tcu::TestStatus testPhysicalDeviceFeatureMultiDrawFeaturesEXT (Context& context)
383{
384	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
385	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
386	const InstanceDriver&		vki				(instance.getDriver());
387	const int					count			= 2u;
388	TestLog&					log				= context.getTestContext().getLog();
389	VkPhysicalDeviceFeatures2	extFeatures;
390	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
391
392	VkPhysicalDeviceMultiDrawFeaturesEXT	deviceMultiDrawFeaturesEXT[count];
393	const bool								isMultiDrawFeaturesEXT = checkExtension(properties, "VK_EXT_multi_draw");
394
395	for (int ndx = 0; ndx < count; ++ndx)
396	{
397		deMemset(&deviceMultiDrawFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMultiDrawFeaturesEXT));
398		deviceMultiDrawFeaturesEXT[ndx].sType = isMultiDrawFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
399		deviceMultiDrawFeaturesEXT[ndx].pNext = DE_NULL;
400
401		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
402		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
403		extFeatures.pNext = &deviceMultiDrawFeaturesEXT[ndx];
404
405		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
406	}
407
408	if (isMultiDrawFeaturesEXT)
409		log << TestLog::Message << deviceMultiDrawFeaturesEXT[0] << TestLog::EndMessage;
410
411	if (isMultiDrawFeaturesEXT &&
412		(deviceMultiDrawFeaturesEXT[0].multiDraw != deviceMultiDrawFeaturesEXT[1].multiDraw))
413	{
414		TCU_FAIL("Mismatch between VkPhysicalDeviceMultiDrawFeaturesEXT");
415	}
416	return tcu::TestStatus::pass("Querying succeeded");
417}
418
419tcu::TestStatus testPhysicalDeviceFeatureInlineUniformBlockFeatures (Context& context)
420{
421	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
422	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
423	const InstanceDriver&		vki				(instance.getDriver());
424	const int					count			= 2u;
425	TestLog&					log				= context.getTestContext().getLog();
426	VkPhysicalDeviceFeatures2	extFeatures;
427	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
428
429	VkPhysicalDeviceInlineUniformBlockFeatures	deviceInlineUniformBlockFeatures[count];
430	const bool									isInlineUniformBlockFeatures = checkExtension(properties, "VK_EXT_inline_uniform_block") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
431
432	for (int ndx = 0; ndx < count; ++ndx)
433	{
434		deMemset(&deviceInlineUniformBlockFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceInlineUniformBlockFeatures));
435		deviceInlineUniformBlockFeatures[ndx].sType = isInlineUniformBlockFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
436		deviceInlineUniformBlockFeatures[ndx].pNext = DE_NULL;
437
438		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
439		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
440		extFeatures.pNext = &deviceInlineUniformBlockFeatures[ndx];
441
442		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
443	}
444
445	if (isInlineUniformBlockFeatures)
446		log << TestLog::Message << deviceInlineUniformBlockFeatures[0] << TestLog::EndMessage;
447
448	if (isInlineUniformBlockFeatures &&
449		(deviceInlineUniformBlockFeatures[0].inlineUniformBlock != deviceInlineUniformBlockFeatures[1].inlineUniformBlock ||
450		 deviceInlineUniformBlockFeatures[0].descriptorBindingInlineUniformBlockUpdateAfterBind != deviceInlineUniformBlockFeatures[1].descriptorBindingInlineUniformBlockUpdateAfterBind))
451	{
452		TCU_FAIL("Mismatch between VkPhysicalDeviceInlineUniformBlockFeatures");
453	}
454	return tcu::TestStatus::pass("Querying succeeded");
455}
456
457tcu::TestStatus testPhysicalDeviceFeatureMaintenance4Features (Context& context)
458{
459	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
460	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
461	const InstanceDriver&		vki				(instance.getDriver());
462	const int					count			= 2u;
463	TestLog&					log				= context.getTestContext().getLog();
464	VkPhysicalDeviceFeatures2	extFeatures;
465	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
466
467	VkPhysicalDeviceMaintenance4Features	deviceMaintenance4Features[count];
468	const bool								isMaintenance4Features = checkExtension(properties, "VK_KHR_maintenance4") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
469
470	for (int ndx = 0; ndx < count; ++ndx)
471	{
472		deMemset(&deviceMaintenance4Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMaintenance4Features));
473		deviceMaintenance4Features[ndx].sType = isMaintenance4Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
474		deviceMaintenance4Features[ndx].pNext = DE_NULL;
475
476		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
477		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
478		extFeatures.pNext = &deviceMaintenance4Features[ndx];
479
480		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
481	}
482
483	if (isMaintenance4Features)
484		log << TestLog::Message << deviceMaintenance4Features[0] << TestLog::EndMessage;
485
486	if (isMaintenance4Features &&
487		(deviceMaintenance4Features[0].maintenance4 != deviceMaintenance4Features[1].maintenance4))
488	{
489		TCU_FAIL("Mismatch between VkPhysicalDeviceMaintenance4Features");
490	}
491	return tcu::TestStatus::pass("Querying succeeded");
492}
493
494tcu::TestStatus testPhysicalDeviceFeatureMaintenance5FeaturesKHR (Context& context)
495{
496	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
497	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
498	const InstanceDriver&		vki				(instance.getDriver());
499	const int					count			= 2u;
500	TestLog&					log				= context.getTestContext().getLog();
501	VkPhysicalDeviceFeatures2	extFeatures;
502	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
503
504	VkPhysicalDeviceMaintenance5FeaturesKHR	deviceMaintenance5FeaturesKHR[count];
505	const bool								isMaintenance5FeaturesKHR = checkExtension(properties, "VK_KHR_maintenance5");
506
507	for (int ndx = 0; ndx < count; ++ndx)
508	{
509		deMemset(&deviceMaintenance5FeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMaintenance5FeaturesKHR));
510		deviceMaintenance5FeaturesKHR[ndx].sType = isMaintenance5FeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
511		deviceMaintenance5FeaturesKHR[ndx].pNext = DE_NULL;
512
513		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
514		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
515		extFeatures.pNext = &deviceMaintenance5FeaturesKHR[ndx];
516
517		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
518	}
519
520	if (isMaintenance5FeaturesKHR)
521		log << TestLog::Message << deviceMaintenance5FeaturesKHR[0] << TestLog::EndMessage;
522
523	if (isMaintenance5FeaturesKHR &&
524		(deviceMaintenance5FeaturesKHR[0].maintenance5 != deviceMaintenance5FeaturesKHR[1].maintenance5))
525	{
526		TCU_FAIL("Mismatch between VkPhysicalDeviceMaintenance5FeaturesKHR");
527	}
528	return tcu::TestStatus::pass("Querying succeeded");
529}
530
531tcu::TestStatus testPhysicalDeviceFeatureShaderDrawParametersFeatures (Context& context)
532{
533	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
534	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
535	const InstanceDriver&		vki				(instance.getDriver());
536	const int					count			= 2u;
537	TestLog&					log				= context.getTestContext().getLog();
538	VkPhysicalDeviceFeatures2	extFeatures;
539	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
540
541	VkPhysicalDeviceShaderDrawParametersFeatures	deviceShaderDrawParametersFeatures[count];
542	const bool										isShaderDrawParametersFeatures = context.contextSupports(vk::ApiVersion(0, 1, 1, 0));
543
544	for (int ndx = 0; ndx < count; ++ndx)
545	{
546		deMemset(&deviceShaderDrawParametersFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderDrawParametersFeatures));
547		deviceShaderDrawParametersFeatures[ndx].sType = isShaderDrawParametersFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
548		deviceShaderDrawParametersFeatures[ndx].pNext = DE_NULL;
549
550		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
551		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
552		extFeatures.pNext = &deviceShaderDrawParametersFeatures[ndx];
553
554		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
555	}
556
557	if (isShaderDrawParametersFeatures)
558		log << TestLog::Message << deviceShaderDrawParametersFeatures[0] << TestLog::EndMessage;
559
560	if (isShaderDrawParametersFeatures &&
561		(deviceShaderDrawParametersFeatures[0].shaderDrawParameters != deviceShaderDrawParametersFeatures[1].shaderDrawParameters))
562	{
563		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderDrawParametersFeatures");
564	}
565	return tcu::TestStatus::pass("Querying succeeded");
566}
567
568tcu::TestStatus testPhysicalDeviceFeatureShaderFloat16Int8Features (Context& context)
569{
570	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
571	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
572	const InstanceDriver&		vki				(instance.getDriver());
573	const int					count			= 2u;
574	TestLog&					log				= context.getTestContext().getLog();
575	VkPhysicalDeviceFeatures2	extFeatures;
576	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
577
578	VkPhysicalDeviceShaderFloat16Int8Features	deviceShaderFloat16Int8Features[count];
579	const bool									isShaderFloat16Int8Features = checkExtension(properties, "VK_KHR_shader_float16_int8") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
580
581	for (int ndx = 0; ndx < count; ++ndx)
582	{
583		deMemset(&deviceShaderFloat16Int8Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderFloat16Int8Features));
584		deviceShaderFloat16Int8Features[ndx].sType = isShaderFloat16Int8Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
585		deviceShaderFloat16Int8Features[ndx].pNext = DE_NULL;
586
587		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
588		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
589		extFeatures.pNext = &deviceShaderFloat16Int8Features[ndx];
590
591		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
592	}
593
594	if (isShaderFloat16Int8Features)
595		log << TestLog::Message << deviceShaderFloat16Int8Features[0] << TestLog::EndMessage;
596
597	if (isShaderFloat16Int8Features &&
598		(deviceShaderFloat16Int8Features[0].shaderFloat16 != deviceShaderFloat16Int8Features[1].shaderFloat16 ||
599		 deviceShaderFloat16Int8Features[0].shaderInt8 != deviceShaderFloat16Int8Features[1].shaderInt8))
600	{
601		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderFloat16Int8Features");
602	}
603	return tcu::TestStatus::pass("Querying succeeded");
604}
605
606tcu::TestStatus testPhysicalDeviceFeatureHostQueryResetFeatures (Context& context)
607{
608	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
609	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
610	const InstanceDriver&		vki				(instance.getDriver());
611	const int					count			= 2u;
612	TestLog&					log				= context.getTestContext().getLog();
613	VkPhysicalDeviceFeatures2	extFeatures;
614	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
615
616	VkPhysicalDeviceHostQueryResetFeatures	deviceHostQueryResetFeatures[count];
617	const bool								isHostQueryResetFeatures = checkExtension(properties, "VK_EXT_host_query_reset") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
618
619	for (int ndx = 0; ndx < count; ++ndx)
620	{
621		deMemset(&deviceHostQueryResetFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceHostQueryResetFeatures));
622		deviceHostQueryResetFeatures[ndx].sType = isHostQueryResetFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
623		deviceHostQueryResetFeatures[ndx].pNext = DE_NULL;
624
625		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
626		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
627		extFeatures.pNext = &deviceHostQueryResetFeatures[ndx];
628
629		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
630	}
631
632	if (isHostQueryResetFeatures)
633		log << TestLog::Message << deviceHostQueryResetFeatures[0] << TestLog::EndMessage;
634
635	if (isHostQueryResetFeatures &&
636		(deviceHostQueryResetFeatures[0].hostQueryReset != deviceHostQueryResetFeatures[1].hostQueryReset))
637	{
638		TCU_FAIL("Mismatch between VkPhysicalDeviceHostQueryResetFeatures");
639	}
640	return tcu::TestStatus::pass("Querying succeeded");
641}
642
643tcu::TestStatus testPhysicalDeviceFeatureGlobalPriorityQueryFeaturesKHR (Context& context)
644{
645	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
646	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
647	const InstanceDriver&		vki				(instance.getDriver());
648	const int					count			= 2u;
649	TestLog&					log				= context.getTestContext().getLog();
650	VkPhysicalDeviceFeatures2	extFeatures;
651	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
652
653	VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR	deviceGlobalPriorityQueryFeaturesKHR[count];
654	const bool										isGlobalPriorityQueryFeaturesKHR = checkExtension(properties, "VK_KHR_global_priority");
655
656	for (int ndx = 0; ndx < count; ++ndx)
657	{
658		deMemset(&deviceGlobalPriorityQueryFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR));
659		deviceGlobalPriorityQueryFeaturesKHR[ndx].sType = isGlobalPriorityQueryFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
660		deviceGlobalPriorityQueryFeaturesKHR[ndx].pNext = DE_NULL;
661
662		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
663		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
664		extFeatures.pNext = &deviceGlobalPriorityQueryFeaturesKHR[ndx];
665
666		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
667	}
668
669	if (isGlobalPriorityQueryFeaturesKHR)
670		log << TestLog::Message << deviceGlobalPriorityQueryFeaturesKHR[0] << TestLog::EndMessage;
671
672	if (isGlobalPriorityQueryFeaturesKHR &&
673		(deviceGlobalPriorityQueryFeaturesKHR[0].globalPriorityQuery != deviceGlobalPriorityQueryFeaturesKHR[1].globalPriorityQuery))
674	{
675		TCU_FAIL("Mismatch between VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR");
676	}
677	return tcu::TestStatus::pass("Querying succeeded");
678}
679
680tcu::TestStatus testPhysicalDeviceFeatureDeviceMemoryReportFeaturesEXT (Context& context)
681{
682	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
683	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
684	const InstanceDriver&		vki				(instance.getDriver());
685	const int					count			= 2u;
686	TestLog&					log				= context.getTestContext().getLog();
687	VkPhysicalDeviceFeatures2	extFeatures;
688	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
689
690	VkPhysicalDeviceDeviceMemoryReportFeaturesEXT	deviceDeviceMemoryReportFeaturesEXT[count];
691	const bool										isDeviceMemoryReportFeaturesEXT = checkExtension(properties, "VK_EXT_device_memory_report");
692
693	for (int ndx = 0; ndx < count; ++ndx)
694	{
695		deMemset(&deviceDeviceMemoryReportFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT));
696		deviceDeviceMemoryReportFeaturesEXT[ndx].sType = isDeviceMemoryReportFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
697		deviceDeviceMemoryReportFeaturesEXT[ndx].pNext = DE_NULL;
698
699		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
700		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
701		extFeatures.pNext = &deviceDeviceMemoryReportFeaturesEXT[ndx];
702
703		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
704	}
705
706	if (isDeviceMemoryReportFeaturesEXT)
707		log << TestLog::Message << deviceDeviceMemoryReportFeaturesEXT[0] << TestLog::EndMessage;
708
709	if (isDeviceMemoryReportFeaturesEXT &&
710		(deviceDeviceMemoryReportFeaturesEXT[0].deviceMemoryReport != deviceDeviceMemoryReportFeaturesEXT[1].deviceMemoryReport))
711	{
712		TCU_FAIL("Mismatch between VkPhysicalDeviceDeviceMemoryReportFeaturesEXT");
713	}
714	return tcu::TestStatus::pass("Querying succeeded");
715}
716
717tcu::TestStatus testPhysicalDeviceFeatureDescriptorIndexingFeatures (Context& context)
718{
719	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
720	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
721	const InstanceDriver&		vki				(instance.getDriver());
722	const int					count			= 2u;
723	TestLog&					log				= context.getTestContext().getLog();
724	VkPhysicalDeviceFeatures2	extFeatures;
725	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
726
727	VkPhysicalDeviceDescriptorIndexingFeatures	deviceDescriptorIndexingFeatures[count];
728	const bool									isDescriptorIndexingFeatures = checkExtension(properties, "VK_EXT_descriptor_indexing") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
729
730	for (int ndx = 0; ndx < count; ++ndx)
731	{
732		deMemset(&deviceDescriptorIndexingFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDescriptorIndexingFeatures));
733		deviceDescriptorIndexingFeatures[ndx].sType = isDescriptorIndexingFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
734		deviceDescriptorIndexingFeatures[ndx].pNext = DE_NULL;
735
736		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
737		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
738		extFeatures.pNext = &deviceDescriptorIndexingFeatures[ndx];
739
740		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
741	}
742
743	if (isDescriptorIndexingFeatures)
744		log << TestLog::Message << deviceDescriptorIndexingFeatures[0] << TestLog::EndMessage;
745
746	if (isDescriptorIndexingFeatures &&
747		(deviceDescriptorIndexingFeatures[0].shaderInputAttachmentArrayDynamicIndexing != deviceDescriptorIndexingFeatures[1].shaderInputAttachmentArrayDynamicIndexing ||
748		 deviceDescriptorIndexingFeatures[0].shaderUniformTexelBufferArrayDynamicIndexing != deviceDescriptorIndexingFeatures[1].shaderUniformTexelBufferArrayDynamicIndexing ||
749		 deviceDescriptorIndexingFeatures[0].shaderStorageTexelBufferArrayDynamicIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageTexelBufferArrayDynamicIndexing ||
750		 deviceDescriptorIndexingFeatures[0].shaderUniformBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderUniformBufferArrayNonUniformIndexing ||
751		 deviceDescriptorIndexingFeatures[0].shaderSampledImageArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderSampledImageArrayNonUniformIndexing ||
752		 deviceDescriptorIndexingFeatures[0].shaderStorageBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageBufferArrayNonUniformIndexing ||
753		 deviceDescriptorIndexingFeatures[0].shaderStorageImageArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageImageArrayNonUniformIndexing ||
754		 deviceDescriptorIndexingFeatures[0].shaderInputAttachmentArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderInputAttachmentArrayNonUniformIndexing ||
755		 deviceDescriptorIndexingFeatures[0].shaderUniformTexelBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderUniformTexelBufferArrayNonUniformIndexing ||
756		 deviceDescriptorIndexingFeatures[0].shaderStorageTexelBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageTexelBufferArrayNonUniformIndexing ||
757		 deviceDescriptorIndexingFeatures[0].descriptorBindingUniformBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingUniformBufferUpdateAfterBind ||
758		 deviceDescriptorIndexingFeatures[0].descriptorBindingSampledImageUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingSampledImageUpdateAfterBind ||
759		 deviceDescriptorIndexingFeatures[0].descriptorBindingStorageImageUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingStorageImageUpdateAfterBind ||
760		 deviceDescriptorIndexingFeatures[0].descriptorBindingStorageBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingStorageBufferUpdateAfterBind ||
761		 deviceDescriptorIndexingFeatures[0].descriptorBindingUniformTexelBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingUniformTexelBufferUpdateAfterBind ||
762		 deviceDescriptorIndexingFeatures[0].descriptorBindingStorageTexelBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingStorageTexelBufferUpdateAfterBind ||
763		 deviceDescriptorIndexingFeatures[0].descriptorBindingUpdateUnusedWhilePending != deviceDescriptorIndexingFeatures[1].descriptorBindingUpdateUnusedWhilePending ||
764		 deviceDescriptorIndexingFeatures[0].descriptorBindingPartiallyBound != deviceDescriptorIndexingFeatures[1].descriptorBindingPartiallyBound ||
765		 deviceDescriptorIndexingFeatures[0].descriptorBindingVariableDescriptorCount != deviceDescriptorIndexingFeatures[1].descriptorBindingVariableDescriptorCount ||
766		 deviceDescriptorIndexingFeatures[0].runtimeDescriptorArray != deviceDescriptorIndexingFeatures[1].runtimeDescriptorArray))
767	{
768		TCU_FAIL("Mismatch between VkPhysicalDeviceDescriptorIndexingFeatures");
769	}
770	return tcu::TestStatus::pass("Querying succeeded");
771}
772
773tcu::TestStatus testPhysicalDeviceFeatureTimelineSemaphoreFeatures (Context& context)
774{
775	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
776	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
777	const InstanceDriver&		vki				(instance.getDriver());
778	const int					count			= 2u;
779	TestLog&					log				= context.getTestContext().getLog();
780	VkPhysicalDeviceFeatures2	extFeatures;
781	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
782
783	VkPhysicalDeviceTimelineSemaphoreFeatures	deviceTimelineSemaphoreFeatures[count];
784	const bool									isTimelineSemaphoreFeatures = checkExtension(properties, "VK_KHR_timeline_semaphore") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
785
786	for (int ndx = 0; ndx < count; ++ndx)
787	{
788		deMemset(&deviceTimelineSemaphoreFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceTimelineSemaphoreFeatures));
789		deviceTimelineSemaphoreFeatures[ndx].sType = isTimelineSemaphoreFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
790		deviceTimelineSemaphoreFeatures[ndx].pNext = DE_NULL;
791
792		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
793		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
794		extFeatures.pNext = &deviceTimelineSemaphoreFeatures[ndx];
795
796		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
797	}
798
799	if (isTimelineSemaphoreFeatures)
800		log << TestLog::Message << deviceTimelineSemaphoreFeatures[0] << TestLog::EndMessage;
801
802	if (isTimelineSemaphoreFeatures &&
803		(deviceTimelineSemaphoreFeatures[0].timelineSemaphore != deviceTimelineSemaphoreFeatures[1].timelineSemaphore))
804	{
805		TCU_FAIL("Mismatch between VkPhysicalDeviceTimelineSemaphoreFeatures");
806	}
807	return tcu::TestStatus::pass("Querying succeeded");
808}
809
810tcu::TestStatus testPhysicalDeviceFeature8BitStorageFeatures (Context& context)
811{
812	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
813	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
814	const InstanceDriver&		vki				(instance.getDriver());
815	const int					count			= 2u;
816	TestLog&					log				= context.getTestContext().getLog();
817	VkPhysicalDeviceFeatures2	extFeatures;
818	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
819
820	VkPhysicalDevice8BitStorageFeatures	device8BitStorageFeatures[count];
821	const bool							is8BitStorageFeatures = checkExtension(properties, "VK_KHR_8bit_storage") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
822
823	for (int ndx = 0; ndx < count; ++ndx)
824	{
825		deMemset(&device8BitStorageFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevice8BitStorageFeatures));
826		device8BitStorageFeatures[ndx].sType = is8BitStorageFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
827		device8BitStorageFeatures[ndx].pNext = DE_NULL;
828
829		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
830		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
831		extFeatures.pNext = &device8BitStorageFeatures[ndx];
832
833		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
834	}
835
836	if (is8BitStorageFeatures)
837		log << TestLog::Message << device8BitStorageFeatures[0] << TestLog::EndMessage;
838
839	if (is8BitStorageFeatures &&
840		(device8BitStorageFeatures[0].storageBuffer8BitAccess != device8BitStorageFeatures[1].storageBuffer8BitAccess ||
841		 device8BitStorageFeatures[0].uniformAndStorageBuffer8BitAccess != device8BitStorageFeatures[1].uniformAndStorageBuffer8BitAccess ||
842		 device8BitStorageFeatures[0].storagePushConstant8 != device8BitStorageFeatures[1].storagePushConstant8))
843	{
844		TCU_FAIL("Mismatch between VkPhysicalDevice8BitStorageFeatures");
845	}
846	return tcu::TestStatus::pass("Querying succeeded");
847}
848
849tcu::TestStatus testPhysicalDeviceFeatureConditionalRenderingFeaturesEXT (Context& context)
850{
851	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
852	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
853	const InstanceDriver&		vki				(instance.getDriver());
854	const int					count			= 2u;
855	TestLog&					log				= context.getTestContext().getLog();
856	VkPhysicalDeviceFeatures2	extFeatures;
857	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
858
859	VkPhysicalDeviceConditionalRenderingFeaturesEXT	deviceConditionalRenderingFeaturesEXT[count];
860	const bool										isConditionalRenderingFeaturesEXT = checkExtension(properties, "VK_EXT_conditional_rendering");
861
862	for (int ndx = 0; ndx < count; ++ndx)
863	{
864		deMemset(&deviceConditionalRenderingFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceConditionalRenderingFeaturesEXT));
865		deviceConditionalRenderingFeaturesEXT[ndx].sType = isConditionalRenderingFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
866		deviceConditionalRenderingFeaturesEXT[ndx].pNext = DE_NULL;
867
868		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
869		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
870		extFeatures.pNext = &deviceConditionalRenderingFeaturesEXT[ndx];
871
872		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
873	}
874
875	if (isConditionalRenderingFeaturesEXT)
876		log << TestLog::Message << deviceConditionalRenderingFeaturesEXT[0] << TestLog::EndMessage;
877
878	if (isConditionalRenderingFeaturesEXT &&
879		(deviceConditionalRenderingFeaturesEXT[0].conditionalRendering != deviceConditionalRenderingFeaturesEXT[1].conditionalRendering ||
880		 deviceConditionalRenderingFeaturesEXT[0].inheritedConditionalRendering != deviceConditionalRenderingFeaturesEXT[1].inheritedConditionalRendering))
881	{
882		TCU_FAIL("Mismatch between VkPhysicalDeviceConditionalRenderingFeaturesEXT");
883	}
884	return tcu::TestStatus::pass("Querying succeeded");
885}
886
887tcu::TestStatus testPhysicalDeviceFeatureVulkanMemoryModelFeatures (Context& context)
888{
889	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
890	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
891	const InstanceDriver&		vki				(instance.getDriver());
892	const int					count			= 2u;
893	TestLog&					log				= context.getTestContext().getLog();
894	VkPhysicalDeviceFeatures2	extFeatures;
895	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
896
897	VkPhysicalDeviceVulkanMemoryModelFeatures	deviceVulkanMemoryModelFeatures[count];
898	const bool									isVulkanMemoryModelFeatures = checkExtension(properties, "VK_KHR_vulkan_memory_model") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
899
900	for (int ndx = 0; ndx < count; ++ndx)
901	{
902		deMemset(&deviceVulkanMemoryModelFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkanMemoryModelFeatures));
903		deviceVulkanMemoryModelFeatures[ndx].sType = isVulkanMemoryModelFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
904		deviceVulkanMemoryModelFeatures[ndx].pNext = DE_NULL;
905
906		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
907		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
908		extFeatures.pNext = &deviceVulkanMemoryModelFeatures[ndx];
909
910		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
911	}
912
913	if (isVulkanMemoryModelFeatures)
914		log << TestLog::Message << deviceVulkanMemoryModelFeatures[0] << TestLog::EndMessage;
915
916	if (isVulkanMemoryModelFeatures &&
917		(deviceVulkanMemoryModelFeatures[0].vulkanMemoryModel != deviceVulkanMemoryModelFeatures[1].vulkanMemoryModel ||
918		 deviceVulkanMemoryModelFeatures[0].vulkanMemoryModelDeviceScope != deviceVulkanMemoryModelFeatures[1].vulkanMemoryModelDeviceScope ||
919		 deviceVulkanMemoryModelFeatures[0].vulkanMemoryModelAvailabilityVisibilityChains != deviceVulkanMemoryModelFeatures[1].vulkanMemoryModelAvailabilityVisibilityChains))
920	{
921		TCU_FAIL("Mismatch between VkPhysicalDeviceVulkanMemoryModelFeatures");
922	}
923	return tcu::TestStatus::pass("Querying succeeded");
924}
925
926tcu::TestStatus testPhysicalDeviceFeatureShaderAtomicInt64Features (Context& context)
927{
928	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
929	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
930	const InstanceDriver&		vki				(instance.getDriver());
931	const int					count			= 2u;
932	TestLog&					log				= context.getTestContext().getLog();
933	VkPhysicalDeviceFeatures2	extFeatures;
934	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
935
936	VkPhysicalDeviceShaderAtomicInt64Features	deviceShaderAtomicInt64Features[count];
937	const bool									isShaderAtomicInt64Features = checkExtension(properties, "VK_KHR_shader_atomic_int64") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
938
939	for (int ndx = 0; ndx < count; ++ndx)
940	{
941		deMemset(&deviceShaderAtomicInt64Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderAtomicInt64Features));
942		deviceShaderAtomicInt64Features[ndx].sType = isShaderAtomicInt64Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
943		deviceShaderAtomicInt64Features[ndx].pNext = DE_NULL;
944
945		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
946		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
947		extFeatures.pNext = &deviceShaderAtomicInt64Features[ndx];
948
949		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
950	}
951
952	if (isShaderAtomicInt64Features)
953		log << TestLog::Message << deviceShaderAtomicInt64Features[0] << TestLog::EndMessage;
954
955	if (isShaderAtomicInt64Features &&
956		(deviceShaderAtomicInt64Features[0].shaderBufferInt64Atomics != deviceShaderAtomicInt64Features[1].shaderBufferInt64Atomics ||
957		 deviceShaderAtomicInt64Features[0].shaderSharedInt64Atomics != deviceShaderAtomicInt64Features[1].shaderSharedInt64Atomics))
958	{
959		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderAtomicInt64Features");
960	}
961	return tcu::TestStatus::pass("Querying succeeded");
962}
963
964tcu::TestStatus testPhysicalDeviceFeatureShaderAtomicFloatFeaturesEXT (Context& context)
965{
966	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
967	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
968	const InstanceDriver&		vki				(instance.getDriver());
969	const int					count			= 2u;
970	TestLog&					log				= context.getTestContext().getLog();
971	VkPhysicalDeviceFeatures2	extFeatures;
972	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
973
974	VkPhysicalDeviceShaderAtomicFloatFeaturesEXT	deviceShaderAtomicFloatFeaturesEXT[count];
975	const bool										isShaderAtomicFloatFeaturesEXT = checkExtension(properties, "VK_EXT_shader_atomic_float");
976
977	for (int ndx = 0; ndx < count; ++ndx)
978	{
979		deMemset(&deviceShaderAtomicFloatFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT));
980		deviceShaderAtomicFloatFeaturesEXT[ndx].sType = isShaderAtomicFloatFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
981		deviceShaderAtomicFloatFeaturesEXT[ndx].pNext = DE_NULL;
982
983		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
984		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
985		extFeatures.pNext = &deviceShaderAtomicFloatFeaturesEXT[ndx];
986
987		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
988	}
989
990	if (isShaderAtomicFloatFeaturesEXT)
991		log << TestLog::Message << deviceShaderAtomicFloatFeaturesEXT[0] << TestLog::EndMessage;
992
993	if (isShaderAtomicFloatFeaturesEXT &&
994		(deviceShaderAtomicFloatFeaturesEXT[0].shaderBufferFloat32Atomics != deviceShaderAtomicFloatFeaturesEXT[1].shaderBufferFloat32Atomics ||
995		 deviceShaderAtomicFloatFeaturesEXT[0].shaderBufferFloat32AtomicAdd != deviceShaderAtomicFloatFeaturesEXT[1].shaderBufferFloat32AtomicAdd ||
996		 deviceShaderAtomicFloatFeaturesEXT[0].shaderBufferFloat64Atomics != deviceShaderAtomicFloatFeaturesEXT[1].shaderBufferFloat64Atomics ||
997		 deviceShaderAtomicFloatFeaturesEXT[0].shaderBufferFloat64AtomicAdd != deviceShaderAtomicFloatFeaturesEXT[1].shaderBufferFloat64AtomicAdd ||
998		 deviceShaderAtomicFloatFeaturesEXT[0].shaderSharedFloat32Atomics != deviceShaderAtomicFloatFeaturesEXT[1].shaderSharedFloat32Atomics ||
999		 deviceShaderAtomicFloatFeaturesEXT[0].shaderSharedFloat32AtomicAdd != deviceShaderAtomicFloatFeaturesEXT[1].shaderSharedFloat32AtomicAdd ||
1000		 deviceShaderAtomicFloatFeaturesEXT[0].shaderSharedFloat64Atomics != deviceShaderAtomicFloatFeaturesEXT[1].shaderSharedFloat64Atomics ||
1001		 deviceShaderAtomicFloatFeaturesEXT[0].shaderSharedFloat64AtomicAdd != deviceShaderAtomicFloatFeaturesEXT[1].shaderSharedFloat64AtomicAdd ||
1002		 deviceShaderAtomicFloatFeaturesEXT[0].shaderImageFloat32Atomics != deviceShaderAtomicFloatFeaturesEXT[1].shaderImageFloat32Atomics ||
1003		 deviceShaderAtomicFloatFeaturesEXT[0].shaderImageFloat32AtomicAdd != deviceShaderAtomicFloatFeaturesEXT[1].shaderImageFloat32AtomicAdd ||
1004		 deviceShaderAtomicFloatFeaturesEXT[0].sparseImageFloat32Atomics != deviceShaderAtomicFloatFeaturesEXT[1].sparseImageFloat32Atomics ||
1005		 deviceShaderAtomicFloatFeaturesEXT[0].sparseImageFloat32AtomicAdd != deviceShaderAtomicFloatFeaturesEXT[1].sparseImageFloat32AtomicAdd))
1006	{
1007		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderAtomicFloatFeaturesEXT");
1008	}
1009	return tcu::TestStatus::pass("Querying succeeded");
1010}
1011
1012tcu::TestStatus testPhysicalDeviceFeatureShaderAtomicFloat2FeaturesEXT (Context& context)
1013{
1014	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1015	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1016	const InstanceDriver&		vki				(instance.getDriver());
1017	const int					count			= 2u;
1018	TestLog&					log				= context.getTestContext().getLog();
1019	VkPhysicalDeviceFeatures2	extFeatures;
1020	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1021
1022	VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT	deviceShaderAtomicFloat2FeaturesEXT[count];
1023	const bool										isShaderAtomicFloat2FeaturesEXT = checkExtension(properties, "VK_EXT_shader_atomic_float2");
1024
1025	for (int ndx = 0; ndx < count; ++ndx)
1026	{
1027		deMemset(&deviceShaderAtomicFloat2FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT));
1028		deviceShaderAtomicFloat2FeaturesEXT[ndx].sType = isShaderAtomicFloat2FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1029		deviceShaderAtomicFloat2FeaturesEXT[ndx].pNext = DE_NULL;
1030
1031		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1032		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1033		extFeatures.pNext = &deviceShaderAtomicFloat2FeaturesEXT[ndx];
1034
1035		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1036	}
1037
1038	if (isShaderAtomicFloat2FeaturesEXT)
1039		log << TestLog::Message << deviceShaderAtomicFloat2FeaturesEXT[0] << TestLog::EndMessage;
1040
1041	if (isShaderAtomicFloat2FeaturesEXT &&
1042		(deviceShaderAtomicFloat2FeaturesEXT[0].shaderBufferFloat16Atomics != deviceShaderAtomicFloat2FeaturesEXT[1].shaderBufferFloat16Atomics ||
1043		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderBufferFloat16AtomicAdd != deviceShaderAtomicFloat2FeaturesEXT[1].shaderBufferFloat16AtomicAdd ||
1044		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderBufferFloat16AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderBufferFloat16AtomicMinMax ||
1045		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderBufferFloat32AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderBufferFloat32AtomicMinMax ||
1046		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderBufferFloat64AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderBufferFloat64AtomicMinMax ||
1047		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderSharedFloat16Atomics != deviceShaderAtomicFloat2FeaturesEXT[1].shaderSharedFloat16Atomics ||
1048		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderSharedFloat16AtomicAdd != deviceShaderAtomicFloat2FeaturesEXT[1].shaderSharedFloat16AtomicAdd ||
1049		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderSharedFloat16AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderSharedFloat16AtomicMinMax ||
1050		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderSharedFloat32AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderSharedFloat32AtomicMinMax ||
1051		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderSharedFloat64AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderSharedFloat64AtomicMinMax ||
1052		 deviceShaderAtomicFloat2FeaturesEXT[0].shaderImageFloat32AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].shaderImageFloat32AtomicMinMax ||
1053		 deviceShaderAtomicFloat2FeaturesEXT[0].sparseImageFloat32AtomicMinMax != deviceShaderAtomicFloat2FeaturesEXT[1].sparseImageFloat32AtomicMinMax))
1054	{
1055		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT");
1056	}
1057	return tcu::TestStatus::pass("Querying succeeded");
1058}
1059
1060tcu::TestStatus testPhysicalDeviceFeatureVertexAttributeDivisorFeaturesEXT (Context& context)
1061{
1062	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1063	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1064	const InstanceDriver&		vki				(instance.getDriver());
1065	const int					count			= 2u;
1066	TestLog&					log				= context.getTestContext().getLog();
1067	VkPhysicalDeviceFeatures2	extFeatures;
1068	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1069
1070	VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT	deviceVertexAttributeDivisorFeaturesEXT[count];
1071	const bool											isVertexAttributeDivisorFeaturesEXT = checkExtension(properties, "VK_EXT_vertex_attribute_divisor");
1072
1073	for (int ndx = 0; ndx < count; ++ndx)
1074	{
1075		deMemset(&deviceVertexAttributeDivisorFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT));
1076		deviceVertexAttributeDivisorFeaturesEXT[ndx].sType = isVertexAttributeDivisorFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1077		deviceVertexAttributeDivisorFeaturesEXT[ndx].pNext = DE_NULL;
1078
1079		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1080		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1081		extFeatures.pNext = &deviceVertexAttributeDivisorFeaturesEXT[ndx];
1082
1083		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1084	}
1085
1086	if (isVertexAttributeDivisorFeaturesEXT)
1087		log << TestLog::Message << deviceVertexAttributeDivisorFeaturesEXT[0] << TestLog::EndMessage;
1088
1089	if (isVertexAttributeDivisorFeaturesEXT &&
1090		(deviceVertexAttributeDivisorFeaturesEXT[0].vertexAttributeInstanceRateDivisor != deviceVertexAttributeDivisorFeaturesEXT[1].vertexAttributeInstanceRateDivisor ||
1091		 deviceVertexAttributeDivisorFeaturesEXT[0].vertexAttributeInstanceRateZeroDivisor != deviceVertexAttributeDivisorFeaturesEXT[1].vertexAttributeInstanceRateZeroDivisor))
1092	{
1093		TCU_FAIL("Mismatch between VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT");
1094	}
1095	return tcu::TestStatus::pass("Querying succeeded");
1096}
1097
1098tcu::TestStatus testPhysicalDeviceFeatureASTCDecodeFeaturesEXT (Context& context)
1099{
1100	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1101	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1102	const InstanceDriver&		vki				(instance.getDriver());
1103	const int					count			= 2u;
1104	TestLog&					log				= context.getTestContext().getLog();
1105	VkPhysicalDeviceFeatures2	extFeatures;
1106	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1107
1108	VkPhysicalDeviceASTCDecodeFeaturesEXT	deviceASTCDecodeFeaturesEXT[count];
1109	const bool								isASTCDecodeFeaturesEXT = checkExtension(properties, "VK_EXT_astc_decode_mode");
1110
1111	for (int ndx = 0; ndx < count; ++ndx)
1112	{
1113		deMemset(&deviceASTCDecodeFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceASTCDecodeFeaturesEXT));
1114		deviceASTCDecodeFeaturesEXT[ndx].sType = isASTCDecodeFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1115		deviceASTCDecodeFeaturesEXT[ndx].pNext = DE_NULL;
1116
1117		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1118		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1119		extFeatures.pNext = &deviceASTCDecodeFeaturesEXT[ndx];
1120
1121		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1122	}
1123
1124	if (isASTCDecodeFeaturesEXT)
1125		log << TestLog::Message << deviceASTCDecodeFeaturesEXT[0] << TestLog::EndMessage;
1126
1127	if (isASTCDecodeFeaturesEXT &&
1128		(deviceASTCDecodeFeaturesEXT[0].decodeModeSharedExponent != deviceASTCDecodeFeaturesEXT[1].decodeModeSharedExponent))
1129	{
1130		TCU_FAIL("Mismatch between VkPhysicalDeviceASTCDecodeFeaturesEXT");
1131	}
1132	return tcu::TestStatus::pass("Querying succeeded");
1133}
1134
1135tcu::TestStatus testPhysicalDeviceFeatureTransformFeedbackFeaturesEXT (Context& context)
1136{
1137	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1138	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1139	const InstanceDriver&		vki				(instance.getDriver());
1140	const int					count			= 2u;
1141	TestLog&					log				= context.getTestContext().getLog();
1142	VkPhysicalDeviceFeatures2	extFeatures;
1143	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1144
1145	VkPhysicalDeviceTransformFeedbackFeaturesEXT	deviceTransformFeedbackFeaturesEXT[count];
1146	const bool										isTransformFeedbackFeaturesEXT = checkExtension(properties, "VK_EXT_transform_feedback");
1147
1148	for (int ndx = 0; ndx < count; ++ndx)
1149	{
1150		deMemset(&deviceTransformFeedbackFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceTransformFeedbackFeaturesEXT));
1151		deviceTransformFeedbackFeaturesEXT[ndx].sType = isTransformFeedbackFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1152		deviceTransformFeedbackFeaturesEXT[ndx].pNext = DE_NULL;
1153
1154		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1155		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1156		extFeatures.pNext = &deviceTransformFeedbackFeaturesEXT[ndx];
1157
1158		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1159	}
1160
1161	if (isTransformFeedbackFeaturesEXT)
1162		log << TestLog::Message << deviceTransformFeedbackFeaturesEXT[0] << TestLog::EndMessage;
1163
1164	if (isTransformFeedbackFeaturesEXT &&
1165		(deviceTransformFeedbackFeaturesEXT[0].transformFeedback != deviceTransformFeedbackFeaturesEXT[1].transformFeedback ||
1166		 deviceTransformFeedbackFeaturesEXT[0].geometryStreams != deviceTransformFeedbackFeaturesEXT[1].geometryStreams))
1167	{
1168		TCU_FAIL("Mismatch between VkPhysicalDeviceTransformFeedbackFeaturesEXT");
1169	}
1170	return tcu::TestStatus::pass("Querying succeeded");
1171}
1172
1173tcu::TestStatus testPhysicalDeviceFeatureMeshShaderFeaturesEXT (Context& context)
1174{
1175	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1176	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1177	const InstanceDriver&		vki				(instance.getDriver());
1178	const int					count			= 2u;
1179	TestLog&					log				= context.getTestContext().getLog();
1180	VkPhysicalDeviceFeatures2	extFeatures;
1181	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1182
1183	VkPhysicalDeviceMeshShaderFeaturesEXT	deviceMeshShaderFeaturesEXT[count];
1184	const bool								isMeshShaderFeaturesEXT = checkExtension(properties, "VK_EXT_mesh_shader");
1185
1186	for (int ndx = 0; ndx < count; ++ndx)
1187	{
1188		deMemset(&deviceMeshShaderFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMeshShaderFeaturesEXT));
1189		deviceMeshShaderFeaturesEXT[ndx].sType = isMeshShaderFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1190		deviceMeshShaderFeaturesEXT[ndx].pNext = DE_NULL;
1191
1192		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1193		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1194		extFeatures.pNext = &deviceMeshShaderFeaturesEXT[ndx];
1195
1196		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1197	}
1198
1199	if (isMeshShaderFeaturesEXT)
1200		log << TestLog::Message << deviceMeshShaderFeaturesEXT[0] << TestLog::EndMessage;
1201
1202	if (isMeshShaderFeaturesEXT &&
1203		(deviceMeshShaderFeaturesEXT[0].taskShader != deviceMeshShaderFeaturesEXT[1].taskShader ||
1204		 deviceMeshShaderFeaturesEXT[0].meshShader != deviceMeshShaderFeaturesEXT[1].meshShader ||
1205		 deviceMeshShaderFeaturesEXT[0].multiviewMeshShader != deviceMeshShaderFeaturesEXT[1].multiviewMeshShader ||
1206		 deviceMeshShaderFeaturesEXT[0].primitiveFragmentShadingRateMeshShader != deviceMeshShaderFeaturesEXT[1].primitiveFragmentShadingRateMeshShader ||
1207		 deviceMeshShaderFeaturesEXT[0].meshShaderQueries != deviceMeshShaderFeaturesEXT[1].meshShaderQueries))
1208	{
1209		TCU_FAIL("Mismatch between VkPhysicalDeviceMeshShaderFeaturesEXT");
1210	}
1211	return tcu::TestStatus::pass("Querying succeeded");
1212}
1213
1214tcu::TestStatus testPhysicalDeviceFeatureAccelerationStructureFeaturesKHR (Context& context)
1215{
1216	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1217	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1218	const InstanceDriver&		vki				(instance.getDriver());
1219	const int					count			= 2u;
1220	TestLog&					log				= context.getTestContext().getLog();
1221	VkPhysicalDeviceFeatures2	extFeatures;
1222	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1223
1224	VkPhysicalDeviceAccelerationStructureFeaturesKHR	deviceAccelerationStructureFeaturesKHR[count];
1225	const bool											isAccelerationStructureFeaturesKHR = checkExtension(properties, "VK_KHR_acceleration_structure");
1226
1227	for (int ndx = 0; ndx < count; ++ndx)
1228	{
1229		deMemset(&deviceAccelerationStructureFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceAccelerationStructureFeaturesKHR));
1230		deviceAccelerationStructureFeaturesKHR[ndx].sType = isAccelerationStructureFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
1231		deviceAccelerationStructureFeaturesKHR[ndx].pNext = DE_NULL;
1232
1233		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1234		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1235		extFeatures.pNext = &deviceAccelerationStructureFeaturesKHR[ndx];
1236
1237		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1238	}
1239
1240	if (isAccelerationStructureFeaturesKHR)
1241		log << TestLog::Message << deviceAccelerationStructureFeaturesKHR[0] << TestLog::EndMessage;
1242
1243	if (isAccelerationStructureFeaturesKHR &&
1244		(deviceAccelerationStructureFeaturesKHR[0].accelerationStructure != deviceAccelerationStructureFeaturesKHR[1].accelerationStructure ||
1245		 deviceAccelerationStructureFeaturesKHR[0].accelerationStructureCaptureReplay != deviceAccelerationStructureFeaturesKHR[1].accelerationStructureCaptureReplay ||
1246		 deviceAccelerationStructureFeaturesKHR[0].accelerationStructureIndirectBuild != deviceAccelerationStructureFeaturesKHR[1].accelerationStructureIndirectBuild ||
1247		 deviceAccelerationStructureFeaturesKHR[0].accelerationStructureHostCommands != deviceAccelerationStructureFeaturesKHR[1].accelerationStructureHostCommands ||
1248		 deviceAccelerationStructureFeaturesKHR[0].descriptorBindingAccelerationStructureUpdateAfterBind != deviceAccelerationStructureFeaturesKHR[1].descriptorBindingAccelerationStructureUpdateAfterBind))
1249	{
1250		TCU_FAIL("Mismatch between VkPhysicalDeviceAccelerationStructureFeaturesKHR");
1251	}
1252	return tcu::TestStatus::pass("Querying succeeded");
1253}
1254
1255tcu::TestStatus testPhysicalDeviceFeatureRayTracingPipelineFeaturesKHR (Context& context)
1256{
1257	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1258	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1259	const InstanceDriver&		vki				(instance.getDriver());
1260	const int					count			= 2u;
1261	TestLog&					log				= context.getTestContext().getLog();
1262	VkPhysicalDeviceFeatures2	extFeatures;
1263	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1264
1265	VkPhysicalDeviceRayTracingPipelineFeaturesKHR	deviceRayTracingPipelineFeaturesKHR[count];
1266	const bool										isRayTracingPipelineFeaturesKHR = checkExtension(properties, "VK_KHR_ray_tracing_pipeline");
1267
1268	for (int ndx = 0; ndx < count; ++ndx)
1269	{
1270		deMemset(&deviceRayTracingPipelineFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRayTracingPipelineFeaturesKHR));
1271		deviceRayTracingPipelineFeaturesKHR[ndx].sType = isRayTracingPipelineFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
1272		deviceRayTracingPipelineFeaturesKHR[ndx].pNext = DE_NULL;
1273
1274		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1275		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1276		extFeatures.pNext = &deviceRayTracingPipelineFeaturesKHR[ndx];
1277
1278		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1279	}
1280
1281	if (isRayTracingPipelineFeaturesKHR)
1282		log << TestLog::Message << deviceRayTracingPipelineFeaturesKHR[0] << TestLog::EndMessage;
1283
1284	if (isRayTracingPipelineFeaturesKHR &&
1285		(deviceRayTracingPipelineFeaturesKHR[0].rayTracingPipeline != deviceRayTracingPipelineFeaturesKHR[1].rayTracingPipeline ||
1286		 deviceRayTracingPipelineFeaturesKHR[0].rayTracingPipelineShaderGroupHandleCaptureReplay != deviceRayTracingPipelineFeaturesKHR[1].rayTracingPipelineShaderGroupHandleCaptureReplay ||
1287		 deviceRayTracingPipelineFeaturesKHR[0].rayTracingPipelineShaderGroupHandleCaptureReplayMixed != deviceRayTracingPipelineFeaturesKHR[1].rayTracingPipelineShaderGroupHandleCaptureReplayMixed ||
1288		 deviceRayTracingPipelineFeaturesKHR[0].rayTracingPipelineTraceRaysIndirect != deviceRayTracingPipelineFeaturesKHR[1].rayTracingPipelineTraceRaysIndirect ||
1289		 deviceRayTracingPipelineFeaturesKHR[0].rayTraversalPrimitiveCulling != deviceRayTracingPipelineFeaturesKHR[1].rayTraversalPrimitiveCulling))
1290	{
1291		TCU_FAIL("Mismatch between VkPhysicalDeviceRayTracingPipelineFeaturesKHR");
1292	}
1293	return tcu::TestStatus::pass("Querying succeeded");
1294}
1295
1296tcu::TestStatus testPhysicalDeviceFeatureRayQueryFeaturesKHR (Context& context)
1297{
1298	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1299	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1300	const InstanceDriver&		vki				(instance.getDriver());
1301	const int					count			= 2u;
1302	TestLog&					log				= context.getTestContext().getLog();
1303	VkPhysicalDeviceFeatures2	extFeatures;
1304	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1305
1306	VkPhysicalDeviceRayQueryFeaturesKHR	deviceRayQueryFeaturesKHR[count];
1307	const bool							isRayQueryFeaturesKHR = checkExtension(properties, "VK_KHR_ray_query");
1308
1309	for (int ndx = 0; ndx < count; ++ndx)
1310	{
1311		deMemset(&deviceRayQueryFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRayQueryFeaturesKHR));
1312		deviceRayQueryFeaturesKHR[ndx].sType = isRayQueryFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
1313		deviceRayQueryFeaturesKHR[ndx].pNext = DE_NULL;
1314
1315		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1316		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1317		extFeatures.pNext = &deviceRayQueryFeaturesKHR[ndx];
1318
1319		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1320	}
1321
1322	if (isRayQueryFeaturesKHR)
1323		log << TestLog::Message << deviceRayQueryFeaturesKHR[0] << TestLog::EndMessage;
1324
1325	if (isRayQueryFeaturesKHR &&
1326		(deviceRayQueryFeaturesKHR[0].rayQuery != deviceRayQueryFeaturesKHR[1].rayQuery))
1327	{
1328		TCU_FAIL("Mismatch between VkPhysicalDeviceRayQueryFeaturesKHR");
1329	}
1330	return tcu::TestStatus::pass("Querying succeeded");
1331}
1332
1333tcu::TestStatus testPhysicalDeviceFeatureRayTracingMaintenance1FeaturesKHR (Context& context)
1334{
1335	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1336	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1337	const InstanceDriver&		vki				(instance.getDriver());
1338	const int					count			= 2u;
1339	TestLog&					log				= context.getTestContext().getLog();
1340	VkPhysicalDeviceFeatures2	extFeatures;
1341	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1342
1343	VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR	deviceRayTracingMaintenance1FeaturesKHR[count];
1344	const bool											isRayTracingMaintenance1FeaturesKHR = checkExtension(properties, "VK_KHR_ray_tracing_maintenance1");
1345
1346	for (int ndx = 0; ndx < count; ++ndx)
1347	{
1348		deMemset(&deviceRayTracingMaintenance1FeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR));
1349		deviceRayTracingMaintenance1FeaturesKHR[ndx].sType = isRayTracingMaintenance1FeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
1350		deviceRayTracingMaintenance1FeaturesKHR[ndx].pNext = DE_NULL;
1351
1352		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1353		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1354		extFeatures.pNext = &deviceRayTracingMaintenance1FeaturesKHR[ndx];
1355
1356		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1357	}
1358
1359	if (isRayTracingMaintenance1FeaturesKHR)
1360		log << TestLog::Message << deviceRayTracingMaintenance1FeaturesKHR[0] << TestLog::EndMessage;
1361
1362	if (isRayTracingMaintenance1FeaturesKHR &&
1363		(deviceRayTracingMaintenance1FeaturesKHR[0].rayTracingMaintenance1 != deviceRayTracingMaintenance1FeaturesKHR[1].rayTracingMaintenance1 ||
1364		 deviceRayTracingMaintenance1FeaturesKHR[0].rayTracingPipelineTraceRaysIndirect2 != deviceRayTracingMaintenance1FeaturesKHR[1].rayTracingPipelineTraceRaysIndirect2))
1365	{
1366		TCU_FAIL("Mismatch between VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR");
1367	}
1368	return tcu::TestStatus::pass("Querying succeeded");
1369}
1370
1371tcu::TestStatus testPhysicalDeviceFeatureFragmentDensityMapFeaturesEXT (Context& context)
1372{
1373	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1374	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1375	const InstanceDriver&		vki				(instance.getDriver());
1376	const int					count			= 2u;
1377	TestLog&					log				= context.getTestContext().getLog();
1378	VkPhysicalDeviceFeatures2	extFeatures;
1379	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1380
1381	VkPhysicalDeviceFragmentDensityMapFeaturesEXT	deviceFragmentDensityMapFeaturesEXT[count];
1382	const bool										isFragmentDensityMapFeaturesEXT = checkExtension(properties, "VK_EXT_fragment_density_map");
1383
1384	for (int ndx = 0; ndx < count; ++ndx)
1385	{
1386		deMemset(&deviceFragmentDensityMapFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT));
1387		deviceFragmentDensityMapFeaturesEXT[ndx].sType = isFragmentDensityMapFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1388		deviceFragmentDensityMapFeaturesEXT[ndx].pNext = DE_NULL;
1389
1390		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1391		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1392		extFeatures.pNext = &deviceFragmentDensityMapFeaturesEXT[ndx];
1393
1394		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1395	}
1396
1397	if (isFragmentDensityMapFeaturesEXT)
1398		log << TestLog::Message << deviceFragmentDensityMapFeaturesEXT[0] << TestLog::EndMessage;
1399
1400	if (isFragmentDensityMapFeaturesEXT &&
1401		(deviceFragmentDensityMapFeaturesEXT[0].fragmentDensityMap != deviceFragmentDensityMapFeaturesEXT[1].fragmentDensityMap ||
1402		 deviceFragmentDensityMapFeaturesEXT[0].fragmentDensityMapDynamic != deviceFragmentDensityMapFeaturesEXT[1].fragmentDensityMapDynamic ||
1403		 deviceFragmentDensityMapFeaturesEXT[0].fragmentDensityMapNonSubsampledImages != deviceFragmentDensityMapFeaturesEXT[1].fragmentDensityMapNonSubsampledImages))
1404	{
1405		TCU_FAIL("Mismatch between VkPhysicalDeviceFragmentDensityMapFeaturesEXT");
1406	}
1407	return tcu::TestStatus::pass("Querying succeeded");
1408}
1409
1410tcu::TestStatus testPhysicalDeviceFeatureFragmentDensityMap2FeaturesEXT (Context& context)
1411{
1412	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1413	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1414	const InstanceDriver&		vki				(instance.getDriver());
1415	const int					count			= 2u;
1416	TestLog&					log				= context.getTestContext().getLog();
1417	VkPhysicalDeviceFeatures2	extFeatures;
1418	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1419
1420	VkPhysicalDeviceFragmentDensityMap2FeaturesEXT	deviceFragmentDensityMap2FeaturesEXT[count];
1421	const bool										isFragmentDensityMap2FeaturesEXT = checkExtension(properties, "VK_EXT_fragment_density_map2");
1422
1423	for (int ndx = 0; ndx < count; ++ndx)
1424	{
1425		deMemset(&deviceFragmentDensityMap2FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT));
1426		deviceFragmentDensityMap2FeaturesEXT[ndx].sType = isFragmentDensityMap2FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1427		deviceFragmentDensityMap2FeaturesEXT[ndx].pNext = DE_NULL;
1428
1429		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1430		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1431		extFeatures.pNext = &deviceFragmentDensityMap2FeaturesEXT[ndx];
1432
1433		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1434	}
1435
1436	if (isFragmentDensityMap2FeaturesEXT)
1437		log << TestLog::Message << deviceFragmentDensityMap2FeaturesEXT[0] << TestLog::EndMessage;
1438
1439	if (isFragmentDensityMap2FeaturesEXT &&
1440		(deviceFragmentDensityMap2FeaturesEXT[0].fragmentDensityMapDeferred != deviceFragmentDensityMap2FeaturesEXT[1].fragmentDensityMapDeferred))
1441	{
1442		TCU_FAIL("Mismatch between VkPhysicalDeviceFragmentDensityMap2FeaturesEXT");
1443	}
1444	return tcu::TestStatus::pass("Querying succeeded");
1445}
1446
1447tcu::TestStatus testPhysicalDeviceFeatureScalarBlockLayoutFeatures (Context& context)
1448{
1449	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1450	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1451	const InstanceDriver&		vki				(instance.getDriver());
1452	const int					count			= 2u;
1453	TestLog&					log				= context.getTestContext().getLog();
1454	VkPhysicalDeviceFeatures2	extFeatures;
1455	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1456
1457	VkPhysicalDeviceScalarBlockLayoutFeatures	deviceScalarBlockLayoutFeatures[count];
1458	const bool									isScalarBlockLayoutFeatures = checkExtension(properties, "VK_EXT_scalar_block_layout") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
1459
1460	for (int ndx = 0; ndx < count; ++ndx)
1461	{
1462		deMemset(&deviceScalarBlockLayoutFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceScalarBlockLayoutFeatures));
1463		deviceScalarBlockLayoutFeatures[ndx].sType = isScalarBlockLayoutFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
1464		deviceScalarBlockLayoutFeatures[ndx].pNext = DE_NULL;
1465
1466		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1467		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1468		extFeatures.pNext = &deviceScalarBlockLayoutFeatures[ndx];
1469
1470		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1471	}
1472
1473	if (isScalarBlockLayoutFeatures)
1474		log << TestLog::Message << deviceScalarBlockLayoutFeatures[0] << TestLog::EndMessage;
1475
1476	if (isScalarBlockLayoutFeatures &&
1477		(deviceScalarBlockLayoutFeatures[0].scalarBlockLayout != deviceScalarBlockLayoutFeatures[1].scalarBlockLayout))
1478	{
1479		TCU_FAIL("Mismatch between VkPhysicalDeviceScalarBlockLayoutFeatures");
1480	}
1481	return tcu::TestStatus::pass("Querying succeeded");
1482}
1483
1484tcu::TestStatus testPhysicalDeviceFeatureUniformBufferStandardLayoutFeatures (Context& context)
1485{
1486	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1487	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1488	const InstanceDriver&		vki				(instance.getDriver());
1489	const int					count			= 2u;
1490	TestLog&					log				= context.getTestContext().getLog();
1491	VkPhysicalDeviceFeatures2	extFeatures;
1492	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1493
1494	VkPhysicalDeviceUniformBufferStandardLayoutFeatures	deviceUniformBufferStandardLayoutFeatures[count];
1495	const bool											isUniformBufferStandardLayoutFeatures = checkExtension(properties, "VK_KHR_uniform_buffer_standard_layout") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
1496
1497	for (int ndx = 0; ndx < count; ++ndx)
1498	{
1499		deMemset(&deviceUniformBufferStandardLayoutFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceUniformBufferStandardLayoutFeatures));
1500		deviceUniformBufferStandardLayoutFeatures[ndx].sType = isUniformBufferStandardLayoutFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
1501		deviceUniformBufferStandardLayoutFeatures[ndx].pNext = DE_NULL;
1502
1503		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1504		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1505		extFeatures.pNext = &deviceUniformBufferStandardLayoutFeatures[ndx];
1506
1507		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1508	}
1509
1510	if (isUniformBufferStandardLayoutFeatures)
1511		log << TestLog::Message << deviceUniformBufferStandardLayoutFeatures[0] << TestLog::EndMessage;
1512
1513	if (isUniformBufferStandardLayoutFeatures &&
1514		(deviceUniformBufferStandardLayoutFeatures[0].uniformBufferStandardLayout != deviceUniformBufferStandardLayoutFeatures[1].uniformBufferStandardLayout))
1515	{
1516		TCU_FAIL("Mismatch between VkPhysicalDeviceUniformBufferStandardLayoutFeatures");
1517	}
1518	return tcu::TestStatus::pass("Querying succeeded");
1519}
1520
1521tcu::TestStatus testPhysicalDeviceFeatureDepthClipEnableFeaturesEXT (Context& context)
1522{
1523	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1524	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1525	const InstanceDriver&		vki				(instance.getDriver());
1526	const int					count			= 2u;
1527	TestLog&					log				= context.getTestContext().getLog();
1528	VkPhysicalDeviceFeatures2	extFeatures;
1529	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1530
1531	VkPhysicalDeviceDepthClipEnableFeaturesEXT	deviceDepthClipEnableFeaturesEXT[count];
1532	const bool									isDepthClipEnableFeaturesEXT = checkExtension(properties, "VK_EXT_depth_clip_enable");
1533
1534	for (int ndx = 0; ndx < count; ++ndx)
1535	{
1536		deMemset(&deviceDepthClipEnableFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDepthClipEnableFeaturesEXT));
1537		deviceDepthClipEnableFeaturesEXT[ndx].sType = isDepthClipEnableFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1538		deviceDepthClipEnableFeaturesEXT[ndx].pNext = DE_NULL;
1539
1540		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1541		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1542		extFeatures.pNext = &deviceDepthClipEnableFeaturesEXT[ndx];
1543
1544		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1545	}
1546
1547	if (isDepthClipEnableFeaturesEXT)
1548		log << TestLog::Message << deviceDepthClipEnableFeaturesEXT[0] << TestLog::EndMessage;
1549
1550	if (isDepthClipEnableFeaturesEXT &&
1551		(deviceDepthClipEnableFeaturesEXT[0].depthClipEnable != deviceDepthClipEnableFeaturesEXT[1].depthClipEnable))
1552	{
1553		TCU_FAIL("Mismatch between VkPhysicalDeviceDepthClipEnableFeaturesEXT");
1554	}
1555	return tcu::TestStatus::pass("Querying succeeded");
1556}
1557
1558tcu::TestStatus testPhysicalDeviceFeatureMemoryPriorityFeaturesEXT (Context& context)
1559{
1560	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1561	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1562	const InstanceDriver&		vki				(instance.getDriver());
1563	const int					count			= 2u;
1564	TestLog&					log				= context.getTestContext().getLog();
1565	VkPhysicalDeviceFeatures2	extFeatures;
1566	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1567
1568	VkPhysicalDeviceMemoryPriorityFeaturesEXT	deviceMemoryPriorityFeaturesEXT[count];
1569	const bool									isMemoryPriorityFeaturesEXT = checkExtension(properties, "VK_EXT_memory_priority");
1570
1571	for (int ndx = 0; ndx < count; ++ndx)
1572	{
1573		deMemset(&deviceMemoryPriorityFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMemoryPriorityFeaturesEXT));
1574		deviceMemoryPriorityFeaturesEXT[ndx].sType = isMemoryPriorityFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1575		deviceMemoryPriorityFeaturesEXT[ndx].pNext = DE_NULL;
1576
1577		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1578		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1579		extFeatures.pNext = &deviceMemoryPriorityFeaturesEXT[ndx];
1580
1581		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1582	}
1583
1584	if (isMemoryPriorityFeaturesEXT)
1585		log << TestLog::Message << deviceMemoryPriorityFeaturesEXT[0] << TestLog::EndMessage;
1586
1587	if (isMemoryPriorityFeaturesEXT &&
1588		(deviceMemoryPriorityFeaturesEXT[0].memoryPriority != deviceMemoryPriorityFeaturesEXT[1].memoryPriority))
1589	{
1590		TCU_FAIL("Mismatch between VkPhysicalDeviceMemoryPriorityFeaturesEXT");
1591	}
1592	return tcu::TestStatus::pass("Querying succeeded");
1593}
1594
1595tcu::TestStatus testPhysicalDeviceFeaturePageableDeviceLocalMemoryFeaturesEXT (Context& context)
1596{
1597	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1598	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1599	const InstanceDriver&		vki				(instance.getDriver());
1600	const int					count			= 2u;
1601	TestLog&					log				= context.getTestContext().getLog();
1602	VkPhysicalDeviceFeatures2	extFeatures;
1603	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1604
1605	VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT	devicePageableDeviceLocalMemoryFeaturesEXT[count];
1606	const bool												isPageableDeviceLocalMemoryFeaturesEXT = checkExtension(properties, "VK_EXT_pageable_device_local_memory");
1607
1608	for (int ndx = 0; ndx < count; ++ndx)
1609	{
1610		deMemset(&devicePageableDeviceLocalMemoryFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT));
1611		devicePageableDeviceLocalMemoryFeaturesEXT[ndx].sType = isPageableDeviceLocalMemoryFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1612		devicePageableDeviceLocalMemoryFeaturesEXT[ndx].pNext = DE_NULL;
1613
1614		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1615		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1616		extFeatures.pNext = &devicePageableDeviceLocalMemoryFeaturesEXT[ndx];
1617
1618		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1619	}
1620
1621	if (isPageableDeviceLocalMemoryFeaturesEXT)
1622		log << TestLog::Message << devicePageableDeviceLocalMemoryFeaturesEXT[0] << TestLog::EndMessage;
1623
1624	if (isPageableDeviceLocalMemoryFeaturesEXT &&
1625		(devicePageableDeviceLocalMemoryFeaturesEXT[0].pageableDeviceLocalMemory != devicePageableDeviceLocalMemoryFeaturesEXT[1].pageableDeviceLocalMemory))
1626	{
1627		TCU_FAIL("Mismatch between VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT");
1628	}
1629	return tcu::TestStatus::pass("Querying succeeded");
1630}
1631
1632tcu::TestStatus testPhysicalDeviceFeatureBufferDeviceAddressFeatures (Context& context)
1633{
1634	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1635	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1636	const InstanceDriver&		vki				(instance.getDriver());
1637	const int					count			= 2u;
1638	TestLog&					log				= context.getTestContext().getLog();
1639	VkPhysicalDeviceFeatures2	extFeatures;
1640	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1641
1642	VkPhysicalDeviceBufferDeviceAddressFeatures	deviceBufferDeviceAddressFeatures[count];
1643	const bool									isBufferDeviceAddressFeatures = checkExtension(properties, "VK_KHR_buffer_device_address") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
1644
1645	for (int ndx = 0; ndx < count; ++ndx)
1646	{
1647		deMemset(&deviceBufferDeviceAddressFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceBufferDeviceAddressFeatures));
1648		deviceBufferDeviceAddressFeatures[ndx].sType = isBufferDeviceAddressFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
1649		deviceBufferDeviceAddressFeatures[ndx].pNext = DE_NULL;
1650
1651		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1652		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1653		extFeatures.pNext = &deviceBufferDeviceAddressFeatures[ndx];
1654
1655		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1656	}
1657
1658	if (isBufferDeviceAddressFeatures)
1659		log << TestLog::Message << deviceBufferDeviceAddressFeatures[0] << TestLog::EndMessage;
1660
1661	if (isBufferDeviceAddressFeatures &&
1662		(deviceBufferDeviceAddressFeatures[0].bufferDeviceAddress != deviceBufferDeviceAddressFeatures[1].bufferDeviceAddress ||
1663		 deviceBufferDeviceAddressFeatures[0].bufferDeviceAddressCaptureReplay != deviceBufferDeviceAddressFeatures[1].bufferDeviceAddressCaptureReplay ||
1664		 deviceBufferDeviceAddressFeatures[0].bufferDeviceAddressMultiDevice != deviceBufferDeviceAddressFeatures[1].bufferDeviceAddressMultiDevice))
1665	{
1666		TCU_FAIL("Mismatch between VkPhysicalDeviceBufferDeviceAddressFeatures");
1667	}
1668	return tcu::TestStatus::pass("Querying succeeded");
1669}
1670
1671tcu::TestStatus testPhysicalDeviceFeatureBufferDeviceAddressFeaturesEXT (Context& context)
1672{
1673	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1674	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1675	const InstanceDriver&		vki				(instance.getDriver());
1676	const int					count			= 2u;
1677	TestLog&					log				= context.getTestContext().getLog();
1678	VkPhysicalDeviceFeatures2	extFeatures;
1679	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1680
1681	VkPhysicalDeviceBufferDeviceAddressFeaturesEXT	deviceBufferDeviceAddressFeaturesEXT[count];
1682	const bool										isBufferDeviceAddressFeaturesEXT = checkExtension(properties, "VK_EXT_buffer_device_address");
1683
1684	for (int ndx = 0; ndx < count; ++ndx)
1685	{
1686		deMemset(&deviceBufferDeviceAddressFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT));
1687		deviceBufferDeviceAddressFeaturesEXT[ndx].sType = isBufferDeviceAddressFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1688		deviceBufferDeviceAddressFeaturesEXT[ndx].pNext = DE_NULL;
1689
1690		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1691		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1692		extFeatures.pNext = &deviceBufferDeviceAddressFeaturesEXT[ndx];
1693
1694		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1695	}
1696
1697	if (isBufferDeviceAddressFeaturesEXT)
1698		log << TestLog::Message << deviceBufferDeviceAddressFeaturesEXT[0] << TestLog::EndMessage;
1699
1700	if (isBufferDeviceAddressFeaturesEXT &&
1701		(deviceBufferDeviceAddressFeaturesEXT[0].bufferDeviceAddress != deviceBufferDeviceAddressFeaturesEXT[1].bufferDeviceAddress ||
1702		 deviceBufferDeviceAddressFeaturesEXT[0].bufferDeviceAddressCaptureReplay != deviceBufferDeviceAddressFeaturesEXT[1].bufferDeviceAddressCaptureReplay ||
1703		 deviceBufferDeviceAddressFeaturesEXT[0].bufferDeviceAddressMultiDevice != deviceBufferDeviceAddressFeaturesEXT[1].bufferDeviceAddressMultiDevice))
1704	{
1705		TCU_FAIL("Mismatch between VkPhysicalDeviceBufferDeviceAddressFeaturesEXT");
1706	}
1707	return tcu::TestStatus::pass("Querying succeeded");
1708}
1709
1710tcu::TestStatus testPhysicalDeviceFeatureImagelessFramebufferFeatures (Context& context)
1711{
1712	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1713	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1714	const InstanceDriver&		vki				(instance.getDriver());
1715	const int					count			= 2u;
1716	TestLog&					log				= context.getTestContext().getLog();
1717	VkPhysicalDeviceFeatures2	extFeatures;
1718	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1719
1720	VkPhysicalDeviceImagelessFramebufferFeatures	deviceImagelessFramebufferFeatures[count];
1721	const bool										isImagelessFramebufferFeatures = checkExtension(properties, "VK_KHR_imageless_framebuffer") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
1722
1723	for (int ndx = 0; ndx < count; ++ndx)
1724	{
1725		deMemset(&deviceImagelessFramebufferFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImagelessFramebufferFeatures));
1726		deviceImagelessFramebufferFeatures[ndx].sType = isImagelessFramebufferFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
1727		deviceImagelessFramebufferFeatures[ndx].pNext = DE_NULL;
1728
1729		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1730		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1731		extFeatures.pNext = &deviceImagelessFramebufferFeatures[ndx];
1732
1733		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1734	}
1735
1736	if (isImagelessFramebufferFeatures)
1737		log << TestLog::Message << deviceImagelessFramebufferFeatures[0] << TestLog::EndMessage;
1738
1739	if (isImagelessFramebufferFeatures &&
1740		(deviceImagelessFramebufferFeatures[0].imagelessFramebuffer != deviceImagelessFramebufferFeatures[1].imagelessFramebuffer))
1741	{
1742		TCU_FAIL("Mismatch between VkPhysicalDeviceImagelessFramebufferFeatures");
1743	}
1744	return tcu::TestStatus::pass("Querying succeeded");
1745}
1746
1747tcu::TestStatus testPhysicalDeviceFeatureTextureCompressionASTCHDRFeatures (Context& context)
1748{
1749	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1750	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1751	const InstanceDriver&		vki				(instance.getDriver());
1752	const int					count			= 2u;
1753	TestLog&					log				= context.getTestContext().getLog();
1754	VkPhysicalDeviceFeatures2	extFeatures;
1755	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1756
1757	VkPhysicalDeviceTextureCompressionASTCHDRFeatures	deviceTextureCompressionASTCHDRFeatures[count];
1758	const bool											isTextureCompressionASTCHDRFeatures = checkExtension(properties, "VK_EXT_texture_compression_astc_hdr") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
1759
1760	for (int ndx = 0; ndx < count; ++ndx)
1761	{
1762		deMemset(&deviceTextureCompressionASTCHDRFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceTextureCompressionASTCHDRFeatures));
1763		deviceTextureCompressionASTCHDRFeatures[ndx].sType = isTextureCompressionASTCHDRFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
1764		deviceTextureCompressionASTCHDRFeatures[ndx].pNext = DE_NULL;
1765
1766		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1767		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1768		extFeatures.pNext = &deviceTextureCompressionASTCHDRFeatures[ndx];
1769
1770		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1771	}
1772
1773	if (isTextureCompressionASTCHDRFeatures)
1774		log << TestLog::Message << deviceTextureCompressionASTCHDRFeatures[0] << TestLog::EndMessage;
1775
1776	if (isTextureCompressionASTCHDRFeatures &&
1777		(deviceTextureCompressionASTCHDRFeatures[0].textureCompressionASTC_HDR != deviceTextureCompressionASTCHDRFeatures[1].textureCompressionASTC_HDR))
1778	{
1779		TCU_FAIL("Mismatch between VkPhysicalDeviceTextureCompressionASTCHDRFeatures");
1780	}
1781	return tcu::TestStatus::pass("Querying succeeded");
1782}
1783
1784tcu::TestStatus testPhysicalDeviceFeatureYcbcrImageArraysFeaturesEXT (Context& context)
1785{
1786	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1787	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1788	const InstanceDriver&		vki				(instance.getDriver());
1789	const int					count			= 2u;
1790	TestLog&					log				= context.getTestContext().getLog();
1791	VkPhysicalDeviceFeatures2	extFeatures;
1792	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1793
1794	VkPhysicalDeviceYcbcrImageArraysFeaturesEXT	deviceYcbcrImageArraysFeaturesEXT[count];
1795	const bool									isYcbcrImageArraysFeaturesEXT = checkExtension(properties, "VK_EXT_ycbcr_image_arrays");
1796
1797	for (int ndx = 0; ndx < count; ++ndx)
1798	{
1799		deMemset(&deviceYcbcrImageArraysFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT));
1800		deviceYcbcrImageArraysFeaturesEXT[ndx].sType = isYcbcrImageArraysFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1801		deviceYcbcrImageArraysFeaturesEXT[ndx].pNext = DE_NULL;
1802
1803		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1804		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1805		extFeatures.pNext = &deviceYcbcrImageArraysFeaturesEXT[ndx];
1806
1807		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1808	}
1809
1810	if (isYcbcrImageArraysFeaturesEXT)
1811		log << TestLog::Message << deviceYcbcrImageArraysFeaturesEXT[0] << TestLog::EndMessage;
1812
1813	if (isYcbcrImageArraysFeaturesEXT &&
1814		(deviceYcbcrImageArraysFeaturesEXT[0].ycbcrImageArrays != deviceYcbcrImageArraysFeaturesEXT[1].ycbcrImageArrays))
1815	{
1816		TCU_FAIL("Mismatch between VkPhysicalDeviceYcbcrImageArraysFeaturesEXT");
1817	}
1818	return tcu::TestStatus::pass("Querying succeeded");
1819}
1820
1821tcu::TestStatus testPhysicalDeviceFeaturePerformanceQueryFeaturesKHR (Context& context)
1822{
1823	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1824	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1825	const InstanceDriver&		vki				(instance.getDriver());
1826	const int					count			= 2u;
1827	TestLog&					log				= context.getTestContext().getLog();
1828	VkPhysicalDeviceFeatures2	extFeatures;
1829	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1830
1831	VkPhysicalDevicePerformanceQueryFeaturesKHR	devicePerformanceQueryFeaturesKHR[count];
1832	const bool									isPerformanceQueryFeaturesKHR = checkExtension(properties, "VK_KHR_performance_query");
1833
1834	for (int ndx = 0; ndx < count; ++ndx)
1835	{
1836		deMemset(&devicePerformanceQueryFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePerformanceQueryFeaturesKHR));
1837		devicePerformanceQueryFeaturesKHR[ndx].sType = isPerformanceQueryFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
1838		devicePerformanceQueryFeaturesKHR[ndx].pNext = DE_NULL;
1839
1840		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1841		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1842		extFeatures.pNext = &devicePerformanceQueryFeaturesKHR[ndx];
1843
1844		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1845	}
1846
1847	if (isPerformanceQueryFeaturesKHR)
1848		log << TestLog::Message << devicePerformanceQueryFeaturesKHR[0] << TestLog::EndMessage;
1849
1850	if (isPerformanceQueryFeaturesKHR &&
1851		(devicePerformanceQueryFeaturesKHR[0].performanceCounterQueryPools != devicePerformanceQueryFeaturesKHR[1].performanceCounterQueryPools ||
1852		 devicePerformanceQueryFeaturesKHR[0].performanceCounterMultipleQueryPools != devicePerformanceQueryFeaturesKHR[1].performanceCounterMultipleQueryPools))
1853	{
1854		TCU_FAIL("Mismatch between VkPhysicalDevicePerformanceQueryFeaturesKHR");
1855	}
1856	return tcu::TestStatus::pass("Querying succeeded");
1857}
1858
1859tcu::TestStatus testPhysicalDeviceFeatureShaderClockFeaturesKHR (Context& context)
1860{
1861	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1862	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1863	const InstanceDriver&		vki				(instance.getDriver());
1864	const int					count			= 2u;
1865	TestLog&					log				= context.getTestContext().getLog();
1866	VkPhysicalDeviceFeatures2	extFeatures;
1867	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1868
1869	VkPhysicalDeviceShaderClockFeaturesKHR	deviceShaderClockFeaturesKHR[count];
1870	const bool								isShaderClockFeaturesKHR = checkExtension(properties, "VK_KHR_shader_clock");
1871
1872	for (int ndx = 0; ndx < count; ++ndx)
1873	{
1874		deMemset(&deviceShaderClockFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderClockFeaturesKHR));
1875		deviceShaderClockFeaturesKHR[ndx].sType = isShaderClockFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
1876		deviceShaderClockFeaturesKHR[ndx].pNext = DE_NULL;
1877
1878		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1879		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1880		extFeatures.pNext = &deviceShaderClockFeaturesKHR[ndx];
1881
1882		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1883	}
1884
1885	if (isShaderClockFeaturesKHR)
1886		log << TestLog::Message << deviceShaderClockFeaturesKHR[0] << TestLog::EndMessage;
1887
1888	if (isShaderClockFeaturesKHR &&
1889		(deviceShaderClockFeaturesKHR[0].shaderSubgroupClock != deviceShaderClockFeaturesKHR[1].shaderSubgroupClock ||
1890		 deviceShaderClockFeaturesKHR[0].shaderDeviceClock != deviceShaderClockFeaturesKHR[1].shaderDeviceClock))
1891	{
1892		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderClockFeaturesKHR");
1893	}
1894	return tcu::TestStatus::pass("Querying succeeded");
1895}
1896
1897tcu::TestStatus testPhysicalDeviceFeatureIndexTypeUint8FeaturesEXT (Context& context)
1898{
1899	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1900	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1901	const InstanceDriver&		vki				(instance.getDriver());
1902	const int					count			= 2u;
1903	TestLog&					log				= context.getTestContext().getLog();
1904	VkPhysicalDeviceFeatures2	extFeatures;
1905	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1906
1907	VkPhysicalDeviceIndexTypeUint8FeaturesEXT	deviceIndexTypeUint8FeaturesEXT[count];
1908	const bool									isIndexTypeUint8FeaturesEXT = checkExtension(properties, "VK_EXT_index_type_uint8");
1909
1910	for (int ndx = 0; ndx < count; ++ndx)
1911	{
1912		deMemset(&deviceIndexTypeUint8FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceIndexTypeUint8FeaturesEXT));
1913		deviceIndexTypeUint8FeaturesEXT[ndx].sType = isIndexTypeUint8FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1914		deviceIndexTypeUint8FeaturesEXT[ndx].pNext = DE_NULL;
1915
1916		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1917		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1918		extFeatures.pNext = &deviceIndexTypeUint8FeaturesEXT[ndx];
1919
1920		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1921	}
1922
1923	if (isIndexTypeUint8FeaturesEXT)
1924		log << TestLog::Message << deviceIndexTypeUint8FeaturesEXT[0] << TestLog::EndMessage;
1925
1926	if (isIndexTypeUint8FeaturesEXT &&
1927		(deviceIndexTypeUint8FeaturesEXT[0].indexTypeUint8 != deviceIndexTypeUint8FeaturesEXT[1].indexTypeUint8))
1928	{
1929		TCU_FAIL("Mismatch between VkPhysicalDeviceIndexTypeUint8FeaturesEXT");
1930	}
1931	return tcu::TestStatus::pass("Querying succeeded");
1932}
1933
1934tcu::TestStatus testPhysicalDeviceFeatureFragmentShaderInterlockFeaturesEXT (Context& context)
1935{
1936	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1937	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1938	const InstanceDriver&		vki				(instance.getDriver());
1939	const int					count			= 2u;
1940	TestLog&					log				= context.getTestContext().getLog();
1941	VkPhysicalDeviceFeatures2	extFeatures;
1942	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1943
1944	VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT	deviceFragmentShaderInterlockFeaturesEXT[count];
1945	const bool											isFragmentShaderInterlockFeaturesEXT = checkExtension(properties, "VK_EXT_fragment_shader_interlock");
1946
1947	for (int ndx = 0; ndx < count; ++ndx)
1948	{
1949		deMemset(&deviceFragmentShaderInterlockFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT));
1950		deviceFragmentShaderInterlockFeaturesEXT[ndx].sType = isFragmentShaderInterlockFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
1951		deviceFragmentShaderInterlockFeaturesEXT[ndx].pNext = DE_NULL;
1952
1953		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1954		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1955		extFeatures.pNext = &deviceFragmentShaderInterlockFeaturesEXT[ndx];
1956
1957		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1958	}
1959
1960	if (isFragmentShaderInterlockFeaturesEXT)
1961		log << TestLog::Message << deviceFragmentShaderInterlockFeaturesEXT[0] << TestLog::EndMessage;
1962
1963	if (isFragmentShaderInterlockFeaturesEXT &&
1964		(deviceFragmentShaderInterlockFeaturesEXT[0].fragmentShaderSampleInterlock != deviceFragmentShaderInterlockFeaturesEXT[1].fragmentShaderSampleInterlock ||
1965		 deviceFragmentShaderInterlockFeaturesEXT[0].fragmentShaderPixelInterlock != deviceFragmentShaderInterlockFeaturesEXT[1].fragmentShaderPixelInterlock ||
1966		 deviceFragmentShaderInterlockFeaturesEXT[0].fragmentShaderShadingRateInterlock != deviceFragmentShaderInterlockFeaturesEXT[1].fragmentShaderShadingRateInterlock))
1967	{
1968		TCU_FAIL("Mismatch between VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT");
1969	}
1970	return tcu::TestStatus::pass("Querying succeeded");
1971}
1972
1973tcu::TestStatus testPhysicalDeviceFeatureSeparateDepthStencilLayoutsFeatures (Context& context)
1974{
1975	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
1976	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1977	const InstanceDriver&		vki				(instance.getDriver());
1978	const int					count			= 2u;
1979	TestLog&					log				= context.getTestContext().getLog();
1980	VkPhysicalDeviceFeatures2	extFeatures;
1981	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
1982
1983	VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures	deviceSeparateDepthStencilLayoutsFeatures[count];
1984	const bool											isSeparateDepthStencilLayoutsFeatures = checkExtension(properties, "VK_KHR_separate_depth_stencil_layouts") || context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
1985
1986	for (int ndx = 0; ndx < count; ++ndx)
1987	{
1988		deMemset(&deviceSeparateDepthStencilLayoutsFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures));
1989		deviceSeparateDepthStencilLayoutsFeatures[ndx].sType = isSeparateDepthStencilLayoutsFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
1990		deviceSeparateDepthStencilLayoutsFeatures[ndx].pNext = DE_NULL;
1991
1992		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
1993		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1994		extFeatures.pNext = &deviceSeparateDepthStencilLayoutsFeatures[ndx];
1995
1996		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
1997	}
1998
1999	if (isSeparateDepthStencilLayoutsFeatures)
2000		log << TestLog::Message << deviceSeparateDepthStencilLayoutsFeatures[0] << TestLog::EndMessage;
2001
2002	if (isSeparateDepthStencilLayoutsFeatures &&
2003		(deviceSeparateDepthStencilLayoutsFeatures[0].separateDepthStencilLayouts != deviceSeparateDepthStencilLayoutsFeatures[1].separateDepthStencilLayouts))
2004	{
2005		TCU_FAIL("Mismatch between VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures");
2006	}
2007	return tcu::TestStatus::pass("Querying succeeded");
2008}
2009
2010tcu::TestStatus testPhysicalDeviceFeaturePrimitiveTopologyListRestartFeaturesEXT (Context& context)
2011{
2012	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2013	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2014	const InstanceDriver&		vki				(instance.getDriver());
2015	const int					count			= 2u;
2016	TestLog&					log				= context.getTestContext().getLog();
2017	VkPhysicalDeviceFeatures2	extFeatures;
2018	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2019
2020	VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT	devicePrimitiveTopologyListRestartFeaturesEXT[count];
2021	const bool												isPrimitiveTopologyListRestartFeaturesEXT = checkExtension(properties, "VK_EXT_primitive_topology_list_restart");
2022
2023	for (int ndx = 0; ndx < count; ++ndx)
2024	{
2025		deMemset(&devicePrimitiveTopologyListRestartFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT));
2026		devicePrimitiveTopologyListRestartFeaturesEXT[ndx].sType = isPrimitiveTopologyListRestartFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2027		devicePrimitiveTopologyListRestartFeaturesEXT[ndx].pNext = DE_NULL;
2028
2029		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2030		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2031		extFeatures.pNext = &devicePrimitiveTopologyListRestartFeaturesEXT[ndx];
2032
2033		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2034	}
2035
2036	if (isPrimitiveTopologyListRestartFeaturesEXT)
2037		log << TestLog::Message << devicePrimitiveTopologyListRestartFeaturesEXT[0] << TestLog::EndMessage;
2038
2039	if (isPrimitiveTopologyListRestartFeaturesEXT &&
2040		(devicePrimitiveTopologyListRestartFeaturesEXT[0].primitiveTopologyListRestart != devicePrimitiveTopologyListRestartFeaturesEXT[1].primitiveTopologyListRestart ||
2041		 devicePrimitiveTopologyListRestartFeaturesEXT[0].primitiveTopologyPatchListRestart != devicePrimitiveTopologyListRestartFeaturesEXT[1].primitiveTopologyPatchListRestart))
2042	{
2043		TCU_FAIL("Mismatch between VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT");
2044	}
2045	return tcu::TestStatus::pass("Querying succeeded");
2046}
2047
2048tcu::TestStatus testPhysicalDeviceFeaturePipelineExecutablePropertiesFeaturesKHR (Context& context)
2049{
2050	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2051	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2052	const InstanceDriver&		vki				(instance.getDriver());
2053	const int					count			= 2u;
2054	TestLog&					log				= context.getTestContext().getLog();
2055	VkPhysicalDeviceFeatures2	extFeatures;
2056	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2057
2058	VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR	devicePipelineExecutablePropertiesFeaturesKHR[count];
2059	const bool												isPipelineExecutablePropertiesFeaturesKHR = checkExtension(properties, "VK_KHR_pipeline_executable_properties");
2060
2061	for (int ndx = 0; ndx < count; ++ndx)
2062	{
2063		deMemset(&devicePipelineExecutablePropertiesFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR));
2064		devicePipelineExecutablePropertiesFeaturesKHR[ndx].sType = isPipelineExecutablePropertiesFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
2065		devicePipelineExecutablePropertiesFeaturesKHR[ndx].pNext = DE_NULL;
2066
2067		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2068		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2069		extFeatures.pNext = &devicePipelineExecutablePropertiesFeaturesKHR[ndx];
2070
2071		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2072	}
2073
2074	if (isPipelineExecutablePropertiesFeaturesKHR)
2075		log << TestLog::Message << devicePipelineExecutablePropertiesFeaturesKHR[0] << TestLog::EndMessage;
2076
2077	if (isPipelineExecutablePropertiesFeaturesKHR &&
2078		(devicePipelineExecutablePropertiesFeaturesKHR[0].pipelineExecutableInfo != devicePipelineExecutablePropertiesFeaturesKHR[1].pipelineExecutableInfo))
2079	{
2080		TCU_FAIL("Mismatch between VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR");
2081	}
2082	return tcu::TestStatus::pass("Querying succeeded");
2083}
2084
2085tcu::TestStatus testPhysicalDeviceFeatureShaderDemoteToHelperInvocationFeatures (Context& context)
2086{
2087	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2088	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2089	const InstanceDriver&		vki				(instance.getDriver());
2090	const int					count			= 2u;
2091	TestLog&					log				= context.getTestContext().getLog();
2092	VkPhysicalDeviceFeatures2	extFeatures;
2093	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2094
2095	VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures	deviceShaderDemoteToHelperInvocationFeatures[count];
2096	const bool												isShaderDemoteToHelperInvocationFeatures = checkExtension(properties, "VK_EXT_shader_demote_to_helper_invocation") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
2097
2098	for (int ndx = 0; ndx < count; ++ndx)
2099	{
2100		deMemset(&deviceShaderDemoteToHelperInvocationFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures));
2101		deviceShaderDemoteToHelperInvocationFeatures[ndx].sType = isShaderDemoteToHelperInvocationFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2102		deviceShaderDemoteToHelperInvocationFeatures[ndx].pNext = DE_NULL;
2103
2104		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2105		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2106		extFeatures.pNext = &deviceShaderDemoteToHelperInvocationFeatures[ndx];
2107
2108		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2109	}
2110
2111	if (isShaderDemoteToHelperInvocationFeatures)
2112		log << TestLog::Message << deviceShaderDemoteToHelperInvocationFeatures[0] << TestLog::EndMessage;
2113
2114	if (isShaderDemoteToHelperInvocationFeatures &&
2115		(deviceShaderDemoteToHelperInvocationFeatures[0].shaderDemoteToHelperInvocation != deviceShaderDemoteToHelperInvocationFeatures[1].shaderDemoteToHelperInvocation))
2116	{
2117		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures");
2118	}
2119	return tcu::TestStatus::pass("Querying succeeded");
2120}
2121
2122tcu::TestStatus testPhysicalDeviceFeatureTexelBufferAlignmentFeaturesEXT (Context& context)
2123{
2124	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2125	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2126	const InstanceDriver&		vki				(instance.getDriver());
2127	const int					count			= 2u;
2128	TestLog&					log				= context.getTestContext().getLog();
2129	VkPhysicalDeviceFeatures2	extFeatures;
2130	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2131
2132	VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT	deviceTexelBufferAlignmentFeaturesEXT[count];
2133	const bool										isTexelBufferAlignmentFeaturesEXT = checkExtension(properties, "VK_EXT_texel_buffer_alignment");
2134
2135	for (int ndx = 0; ndx < count; ++ndx)
2136	{
2137		deMemset(&deviceTexelBufferAlignmentFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT));
2138		deviceTexelBufferAlignmentFeaturesEXT[ndx].sType = isTexelBufferAlignmentFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2139		deviceTexelBufferAlignmentFeaturesEXT[ndx].pNext = DE_NULL;
2140
2141		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2142		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2143		extFeatures.pNext = &deviceTexelBufferAlignmentFeaturesEXT[ndx];
2144
2145		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2146	}
2147
2148	if (isTexelBufferAlignmentFeaturesEXT)
2149		log << TestLog::Message << deviceTexelBufferAlignmentFeaturesEXT[0] << TestLog::EndMessage;
2150
2151	if (isTexelBufferAlignmentFeaturesEXT &&
2152		(deviceTexelBufferAlignmentFeaturesEXT[0].texelBufferAlignment != deviceTexelBufferAlignmentFeaturesEXT[1].texelBufferAlignment))
2153	{
2154		TCU_FAIL("Mismatch between VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT");
2155	}
2156	return tcu::TestStatus::pass("Querying succeeded");
2157}
2158
2159tcu::TestStatus testPhysicalDeviceFeatureSubgroupSizeControlFeatures (Context& context)
2160{
2161	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2162	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2163	const InstanceDriver&		vki				(instance.getDriver());
2164	const int					count			= 2u;
2165	TestLog&					log				= context.getTestContext().getLog();
2166	VkPhysicalDeviceFeatures2	extFeatures;
2167	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2168
2169	VkPhysicalDeviceSubgroupSizeControlFeatures	deviceSubgroupSizeControlFeatures[count];
2170	const bool									isSubgroupSizeControlFeatures = checkExtension(properties, "VK_EXT_subgroup_size_control") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
2171
2172	for (int ndx = 0; ndx < count; ++ndx)
2173	{
2174		deMemset(&deviceSubgroupSizeControlFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSubgroupSizeControlFeatures));
2175		deviceSubgroupSizeControlFeatures[ndx].sType = isSubgroupSizeControlFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2176		deviceSubgroupSizeControlFeatures[ndx].pNext = DE_NULL;
2177
2178		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2179		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2180		extFeatures.pNext = &deviceSubgroupSizeControlFeatures[ndx];
2181
2182		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2183	}
2184
2185	if (isSubgroupSizeControlFeatures)
2186		log << TestLog::Message << deviceSubgroupSizeControlFeatures[0] << TestLog::EndMessage;
2187
2188	if (isSubgroupSizeControlFeatures &&
2189		(deviceSubgroupSizeControlFeatures[0].subgroupSizeControl != deviceSubgroupSizeControlFeatures[1].subgroupSizeControl ||
2190		 deviceSubgroupSizeControlFeatures[0].computeFullSubgroups != deviceSubgroupSizeControlFeatures[1].computeFullSubgroups))
2191	{
2192		TCU_FAIL("Mismatch between VkPhysicalDeviceSubgroupSizeControlFeatures");
2193	}
2194	return tcu::TestStatus::pass("Querying succeeded");
2195}
2196
2197tcu::TestStatus testPhysicalDeviceFeatureLineRasterizationFeaturesEXT (Context& context)
2198{
2199	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2200	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2201	const InstanceDriver&		vki				(instance.getDriver());
2202	const int					count			= 2u;
2203	TestLog&					log				= context.getTestContext().getLog();
2204	VkPhysicalDeviceFeatures2	extFeatures;
2205	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2206
2207	VkPhysicalDeviceLineRasterizationFeaturesEXT	deviceLineRasterizationFeaturesEXT[count];
2208	const bool										isLineRasterizationFeaturesEXT = checkExtension(properties, "VK_EXT_line_rasterization");
2209
2210	for (int ndx = 0; ndx < count; ++ndx)
2211	{
2212		deMemset(&deviceLineRasterizationFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceLineRasterizationFeaturesEXT));
2213		deviceLineRasterizationFeaturesEXT[ndx].sType = isLineRasterizationFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2214		deviceLineRasterizationFeaturesEXT[ndx].pNext = DE_NULL;
2215
2216		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2217		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2218		extFeatures.pNext = &deviceLineRasterizationFeaturesEXT[ndx];
2219
2220		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2221	}
2222
2223	if (isLineRasterizationFeaturesEXT)
2224		log << TestLog::Message << deviceLineRasterizationFeaturesEXT[0] << TestLog::EndMessage;
2225
2226	if (isLineRasterizationFeaturesEXT &&
2227		(deviceLineRasterizationFeaturesEXT[0].rectangularLines != deviceLineRasterizationFeaturesEXT[1].rectangularLines ||
2228		 deviceLineRasterizationFeaturesEXT[0].bresenhamLines != deviceLineRasterizationFeaturesEXT[1].bresenhamLines ||
2229		 deviceLineRasterizationFeaturesEXT[0].smoothLines != deviceLineRasterizationFeaturesEXT[1].smoothLines ||
2230		 deviceLineRasterizationFeaturesEXT[0].stippledRectangularLines != deviceLineRasterizationFeaturesEXT[1].stippledRectangularLines ||
2231		 deviceLineRasterizationFeaturesEXT[0].stippledBresenhamLines != deviceLineRasterizationFeaturesEXT[1].stippledBresenhamLines ||
2232		 deviceLineRasterizationFeaturesEXT[0].stippledSmoothLines != deviceLineRasterizationFeaturesEXT[1].stippledSmoothLines))
2233	{
2234		TCU_FAIL("Mismatch between VkPhysicalDeviceLineRasterizationFeaturesEXT");
2235	}
2236	return tcu::TestStatus::pass("Querying succeeded");
2237}
2238
2239tcu::TestStatus testPhysicalDeviceFeaturePipelineCreationCacheControlFeatures (Context& context)
2240{
2241	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2242	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2243	const InstanceDriver&		vki				(instance.getDriver());
2244	const int					count			= 2u;
2245	TestLog&					log				= context.getTestContext().getLog();
2246	VkPhysicalDeviceFeatures2	extFeatures;
2247	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2248
2249	VkPhysicalDevicePipelineCreationCacheControlFeatures	devicePipelineCreationCacheControlFeatures[count];
2250	const bool												isPipelineCreationCacheControlFeatures = checkExtension(properties, "VK_EXT_pipeline_creation_cache_control") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
2251
2252	for (int ndx = 0; ndx < count; ++ndx)
2253	{
2254		deMemset(&devicePipelineCreationCacheControlFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePipelineCreationCacheControlFeatures));
2255		devicePipelineCreationCacheControlFeatures[ndx].sType = isPipelineCreationCacheControlFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2256		devicePipelineCreationCacheControlFeatures[ndx].pNext = DE_NULL;
2257
2258		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2259		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2260		extFeatures.pNext = &devicePipelineCreationCacheControlFeatures[ndx];
2261
2262		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2263	}
2264
2265	if (isPipelineCreationCacheControlFeatures)
2266		log << TestLog::Message << devicePipelineCreationCacheControlFeatures[0] << TestLog::EndMessage;
2267
2268	if (isPipelineCreationCacheControlFeatures &&
2269		(devicePipelineCreationCacheControlFeatures[0].pipelineCreationCacheControl != devicePipelineCreationCacheControlFeatures[1].pipelineCreationCacheControl))
2270	{
2271		TCU_FAIL("Mismatch between VkPhysicalDevicePipelineCreationCacheControlFeatures");
2272	}
2273	return tcu::TestStatus::pass("Querying succeeded");
2274}
2275
2276tcu::TestStatus testPhysicalDeviceFeatureVulkan11Features (Context& context)
2277{
2278	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2279	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2280	const InstanceDriver&		vki				(instance.getDriver());
2281	const int					count			= 2u;
2282	TestLog&					log				= context.getTestContext().getLog();
2283	VkPhysicalDeviceFeatures2	extFeatures;
2284	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2285
2286	VkPhysicalDeviceVulkan11Features	deviceVulkan11Features[count];
2287	const bool							isVulkan11Features = context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
2288
2289	for (int ndx = 0; ndx < count; ++ndx)
2290	{
2291		deMemset(&deviceVulkan11Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan11Features));
2292		deviceVulkan11Features[ndx].sType = isVulkan11Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2293		deviceVulkan11Features[ndx].pNext = DE_NULL;
2294
2295		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2296		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2297		extFeatures.pNext = &deviceVulkan11Features[ndx];
2298
2299		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2300	}
2301
2302	if (isVulkan11Features)
2303		log << TestLog::Message << deviceVulkan11Features[0] << TestLog::EndMessage;
2304
2305	if (isVulkan11Features &&
2306		(deviceVulkan11Features[0].storageBuffer16BitAccess != deviceVulkan11Features[1].storageBuffer16BitAccess ||
2307		 deviceVulkan11Features[0].uniformAndStorageBuffer16BitAccess != deviceVulkan11Features[1].uniformAndStorageBuffer16BitAccess ||
2308		 deviceVulkan11Features[0].storagePushConstant16 != deviceVulkan11Features[1].storagePushConstant16 ||
2309		 deviceVulkan11Features[0].storageInputOutput16 != deviceVulkan11Features[1].storageInputOutput16 ||
2310		 deviceVulkan11Features[0].multiview != deviceVulkan11Features[1].multiview ||
2311		 deviceVulkan11Features[0].multiviewGeometryShader != deviceVulkan11Features[1].multiviewGeometryShader ||
2312		 deviceVulkan11Features[0].multiviewTessellationShader != deviceVulkan11Features[1].multiviewTessellationShader ||
2313		 deviceVulkan11Features[0].variablePointersStorageBuffer != deviceVulkan11Features[1].variablePointersStorageBuffer ||
2314		 deviceVulkan11Features[0].variablePointers != deviceVulkan11Features[1].variablePointers ||
2315		 deviceVulkan11Features[0].protectedMemory != deviceVulkan11Features[1].protectedMemory ||
2316		 deviceVulkan11Features[0].samplerYcbcrConversion != deviceVulkan11Features[1].samplerYcbcrConversion ||
2317		 deviceVulkan11Features[0].shaderDrawParameters != deviceVulkan11Features[1].shaderDrawParameters))
2318	{
2319		TCU_FAIL("Mismatch between VkPhysicalDeviceVulkan11Features");
2320	}
2321	return tcu::TestStatus::pass("Querying succeeded");
2322}
2323
2324tcu::TestStatus testPhysicalDeviceFeatureVulkan12Features (Context& context)
2325{
2326	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2327	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2328	const InstanceDriver&		vki				(instance.getDriver());
2329	const int					count			= 2u;
2330	TestLog&					log				= context.getTestContext().getLog();
2331	VkPhysicalDeviceFeatures2	extFeatures;
2332	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2333
2334	VkPhysicalDeviceVulkan12Features	deviceVulkan12Features[count];
2335	const bool							isVulkan12Features = context.contextSupports(vk::ApiVersion(0, 1, 2, 0));
2336
2337	for (int ndx = 0; ndx < count; ++ndx)
2338	{
2339		deMemset(&deviceVulkan12Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan12Features));
2340		deviceVulkan12Features[ndx].sType = isVulkan12Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2341		deviceVulkan12Features[ndx].pNext = DE_NULL;
2342
2343		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2344		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2345		extFeatures.pNext = &deviceVulkan12Features[ndx];
2346
2347		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2348	}
2349
2350	if (isVulkan12Features)
2351		log << TestLog::Message << deviceVulkan12Features[0] << TestLog::EndMessage;
2352
2353	if (isVulkan12Features &&
2354		(deviceVulkan12Features[0].samplerMirrorClampToEdge != deviceVulkan12Features[1].samplerMirrorClampToEdge ||
2355		 deviceVulkan12Features[0].drawIndirectCount != deviceVulkan12Features[1].drawIndirectCount ||
2356		 deviceVulkan12Features[0].storageBuffer8BitAccess != deviceVulkan12Features[1].storageBuffer8BitAccess ||
2357		 deviceVulkan12Features[0].uniformAndStorageBuffer8BitAccess != deviceVulkan12Features[1].uniformAndStorageBuffer8BitAccess ||
2358		 deviceVulkan12Features[0].storagePushConstant8 != deviceVulkan12Features[1].storagePushConstant8 ||
2359		 deviceVulkan12Features[0].shaderBufferInt64Atomics != deviceVulkan12Features[1].shaderBufferInt64Atomics ||
2360		 deviceVulkan12Features[0].shaderSharedInt64Atomics != deviceVulkan12Features[1].shaderSharedInt64Atomics ||
2361		 deviceVulkan12Features[0].shaderFloat16 != deviceVulkan12Features[1].shaderFloat16 ||
2362		 deviceVulkan12Features[0].shaderInt8 != deviceVulkan12Features[1].shaderInt8 ||
2363		 deviceVulkan12Features[0].descriptorIndexing != deviceVulkan12Features[1].descriptorIndexing ||
2364		 deviceVulkan12Features[0].shaderInputAttachmentArrayDynamicIndexing != deviceVulkan12Features[1].shaderInputAttachmentArrayDynamicIndexing ||
2365		 deviceVulkan12Features[0].shaderUniformTexelBufferArrayDynamicIndexing != deviceVulkan12Features[1].shaderUniformTexelBufferArrayDynamicIndexing ||
2366		 deviceVulkan12Features[0].shaderStorageTexelBufferArrayDynamicIndexing != deviceVulkan12Features[1].shaderStorageTexelBufferArrayDynamicIndexing ||
2367		 deviceVulkan12Features[0].shaderUniformBufferArrayNonUniformIndexing != deviceVulkan12Features[1].shaderUniformBufferArrayNonUniformIndexing ||
2368		 deviceVulkan12Features[0].shaderSampledImageArrayNonUniformIndexing != deviceVulkan12Features[1].shaderSampledImageArrayNonUniformIndexing ||
2369		 deviceVulkan12Features[0].shaderStorageBufferArrayNonUniformIndexing != deviceVulkan12Features[1].shaderStorageBufferArrayNonUniformIndexing ||
2370		 deviceVulkan12Features[0].shaderStorageImageArrayNonUniformIndexing != deviceVulkan12Features[1].shaderStorageImageArrayNonUniformIndexing ||
2371		 deviceVulkan12Features[0].shaderInputAttachmentArrayNonUniformIndexing != deviceVulkan12Features[1].shaderInputAttachmentArrayNonUniformIndexing ||
2372		 deviceVulkan12Features[0].shaderUniformTexelBufferArrayNonUniformIndexing != deviceVulkan12Features[1].shaderUniformTexelBufferArrayNonUniformIndexing ||
2373		 deviceVulkan12Features[0].shaderStorageTexelBufferArrayNonUniformIndexing != deviceVulkan12Features[1].shaderStorageTexelBufferArrayNonUniformIndexing ||
2374		 deviceVulkan12Features[0].descriptorBindingUniformBufferUpdateAfterBind != deviceVulkan12Features[1].descriptorBindingUniformBufferUpdateAfterBind ||
2375		 deviceVulkan12Features[0].descriptorBindingSampledImageUpdateAfterBind != deviceVulkan12Features[1].descriptorBindingSampledImageUpdateAfterBind ||
2376		 deviceVulkan12Features[0].descriptorBindingStorageImageUpdateAfterBind != deviceVulkan12Features[1].descriptorBindingStorageImageUpdateAfterBind ||
2377		 deviceVulkan12Features[0].descriptorBindingStorageBufferUpdateAfterBind != deviceVulkan12Features[1].descriptorBindingStorageBufferUpdateAfterBind ||
2378		 deviceVulkan12Features[0].descriptorBindingUniformTexelBufferUpdateAfterBind != deviceVulkan12Features[1].descriptorBindingUniformTexelBufferUpdateAfterBind ||
2379		 deviceVulkan12Features[0].descriptorBindingStorageTexelBufferUpdateAfterBind != deviceVulkan12Features[1].descriptorBindingStorageTexelBufferUpdateAfterBind ||
2380		 deviceVulkan12Features[0].descriptorBindingUpdateUnusedWhilePending != deviceVulkan12Features[1].descriptorBindingUpdateUnusedWhilePending ||
2381		 deviceVulkan12Features[0].descriptorBindingPartiallyBound != deviceVulkan12Features[1].descriptorBindingPartiallyBound ||
2382		 deviceVulkan12Features[0].descriptorBindingVariableDescriptorCount != deviceVulkan12Features[1].descriptorBindingVariableDescriptorCount ||
2383		 deviceVulkan12Features[0].runtimeDescriptorArray != deviceVulkan12Features[1].runtimeDescriptorArray ||
2384		 deviceVulkan12Features[0].samplerFilterMinmax != deviceVulkan12Features[1].samplerFilterMinmax ||
2385		 deviceVulkan12Features[0].scalarBlockLayout != deviceVulkan12Features[1].scalarBlockLayout ||
2386		 deviceVulkan12Features[0].imagelessFramebuffer != deviceVulkan12Features[1].imagelessFramebuffer ||
2387		 deviceVulkan12Features[0].uniformBufferStandardLayout != deviceVulkan12Features[1].uniformBufferStandardLayout ||
2388		 deviceVulkan12Features[0].shaderSubgroupExtendedTypes != deviceVulkan12Features[1].shaderSubgroupExtendedTypes ||
2389		 deviceVulkan12Features[0].separateDepthStencilLayouts != deviceVulkan12Features[1].separateDepthStencilLayouts ||
2390		 deviceVulkan12Features[0].hostQueryReset != deviceVulkan12Features[1].hostQueryReset ||
2391		 deviceVulkan12Features[0].timelineSemaphore != deviceVulkan12Features[1].timelineSemaphore ||
2392		 deviceVulkan12Features[0].bufferDeviceAddress != deviceVulkan12Features[1].bufferDeviceAddress ||
2393		 deviceVulkan12Features[0].bufferDeviceAddressCaptureReplay != deviceVulkan12Features[1].bufferDeviceAddressCaptureReplay ||
2394		 deviceVulkan12Features[0].bufferDeviceAddressMultiDevice != deviceVulkan12Features[1].bufferDeviceAddressMultiDevice ||
2395		 deviceVulkan12Features[0].vulkanMemoryModel != deviceVulkan12Features[1].vulkanMemoryModel ||
2396		 deviceVulkan12Features[0].vulkanMemoryModelDeviceScope != deviceVulkan12Features[1].vulkanMemoryModelDeviceScope ||
2397		 deviceVulkan12Features[0].vulkanMemoryModelAvailabilityVisibilityChains != deviceVulkan12Features[1].vulkanMemoryModelAvailabilityVisibilityChains ||
2398		 deviceVulkan12Features[0].shaderOutputViewportIndex != deviceVulkan12Features[1].shaderOutputViewportIndex ||
2399		 deviceVulkan12Features[0].shaderOutputLayer != deviceVulkan12Features[1].shaderOutputLayer ||
2400		 deviceVulkan12Features[0].subgroupBroadcastDynamicId != deviceVulkan12Features[1].subgroupBroadcastDynamicId))
2401	{
2402		TCU_FAIL("Mismatch between VkPhysicalDeviceVulkan12Features");
2403	}
2404	return tcu::TestStatus::pass("Querying succeeded");
2405}
2406
2407tcu::TestStatus testPhysicalDeviceFeatureVulkan13Features (Context& context)
2408{
2409	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2410	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2411	const InstanceDriver&		vki				(instance.getDriver());
2412	const int					count			= 2u;
2413	TestLog&					log				= context.getTestContext().getLog();
2414	VkPhysicalDeviceFeatures2	extFeatures;
2415	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2416
2417	VkPhysicalDeviceVulkan13Features	deviceVulkan13Features[count];
2418	const bool							isVulkan13Features = context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
2419
2420	for (int ndx = 0; ndx < count; ++ndx)
2421	{
2422		deMemset(&deviceVulkan13Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan13Features));
2423		deviceVulkan13Features[ndx].sType = isVulkan13Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2424		deviceVulkan13Features[ndx].pNext = DE_NULL;
2425
2426		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2427		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2428		extFeatures.pNext = &deviceVulkan13Features[ndx];
2429
2430		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2431	}
2432
2433	if (isVulkan13Features)
2434		log << TestLog::Message << deviceVulkan13Features[0] << TestLog::EndMessage;
2435
2436	if (isVulkan13Features &&
2437		(deviceVulkan13Features[0].robustImageAccess != deviceVulkan13Features[1].robustImageAccess ||
2438		 deviceVulkan13Features[0].inlineUniformBlock != deviceVulkan13Features[1].inlineUniformBlock ||
2439		 deviceVulkan13Features[0].descriptorBindingInlineUniformBlockUpdateAfterBind != deviceVulkan13Features[1].descriptorBindingInlineUniformBlockUpdateAfterBind ||
2440		 deviceVulkan13Features[0].pipelineCreationCacheControl != deviceVulkan13Features[1].pipelineCreationCacheControl ||
2441		 deviceVulkan13Features[0].privateData != deviceVulkan13Features[1].privateData ||
2442		 deviceVulkan13Features[0].shaderDemoteToHelperInvocation != deviceVulkan13Features[1].shaderDemoteToHelperInvocation ||
2443		 deviceVulkan13Features[0].shaderTerminateInvocation != deviceVulkan13Features[1].shaderTerminateInvocation ||
2444		 deviceVulkan13Features[0].subgroupSizeControl != deviceVulkan13Features[1].subgroupSizeControl ||
2445		 deviceVulkan13Features[0].computeFullSubgroups != deviceVulkan13Features[1].computeFullSubgroups ||
2446		 deviceVulkan13Features[0].synchronization2 != deviceVulkan13Features[1].synchronization2 ||
2447		 deviceVulkan13Features[0].textureCompressionASTC_HDR != deviceVulkan13Features[1].textureCompressionASTC_HDR ||
2448		 deviceVulkan13Features[0].shaderZeroInitializeWorkgroupMemory != deviceVulkan13Features[1].shaderZeroInitializeWorkgroupMemory ||
2449		 deviceVulkan13Features[0].dynamicRendering != deviceVulkan13Features[1].dynamicRendering ||
2450		 deviceVulkan13Features[0].shaderIntegerDotProduct != deviceVulkan13Features[1].shaderIntegerDotProduct ||
2451		 deviceVulkan13Features[0].maintenance4 != deviceVulkan13Features[1].maintenance4))
2452	{
2453		TCU_FAIL("Mismatch between VkPhysicalDeviceVulkan13Features");
2454	}
2455	return tcu::TestStatus::pass("Querying succeeded");
2456}
2457
2458tcu::TestStatus testPhysicalDeviceFeatureCustomBorderColorFeaturesEXT (Context& context)
2459{
2460	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2461	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2462	const InstanceDriver&		vki				(instance.getDriver());
2463	const int					count			= 2u;
2464	TestLog&					log				= context.getTestContext().getLog();
2465	VkPhysicalDeviceFeatures2	extFeatures;
2466	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2467
2468	VkPhysicalDeviceCustomBorderColorFeaturesEXT	deviceCustomBorderColorFeaturesEXT[count];
2469	const bool										isCustomBorderColorFeaturesEXT = checkExtension(properties, "VK_EXT_custom_border_color");
2470
2471	for (int ndx = 0; ndx < count; ++ndx)
2472	{
2473		deMemset(&deviceCustomBorderColorFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceCustomBorderColorFeaturesEXT));
2474		deviceCustomBorderColorFeaturesEXT[ndx].sType = isCustomBorderColorFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2475		deviceCustomBorderColorFeaturesEXT[ndx].pNext = DE_NULL;
2476
2477		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2478		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2479		extFeatures.pNext = &deviceCustomBorderColorFeaturesEXT[ndx];
2480
2481		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2482	}
2483
2484	if (isCustomBorderColorFeaturesEXT)
2485		log << TestLog::Message << deviceCustomBorderColorFeaturesEXT[0] << TestLog::EndMessage;
2486
2487	if (isCustomBorderColorFeaturesEXT &&
2488		(deviceCustomBorderColorFeaturesEXT[0].customBorderColors != deviceCustomBorderColorFeaturesEXT[1].customBorderColors ||
2489		 deviceCustomBorderColorFeaturesEXT[0].customBorderColorWithoutFormat != deviceCustomBorderColorFeaturesEXT[1].customBorderColorWithoutFormat))
2490	{
2491		TCU_FAIL("Mismatch between VkPhysicalDeviceCustomBorderColorFeaturesEXT");
2492	}
2493	return tcu::TestStatus::pass("Querying succeeded");
2494}
2495
2496tcu::TestStatus testPhysicalDeviceFeatureBorderColorSwizzleFeaturesEXT (Context& context)
2497{
2498	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2499	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2500	const InstanceDriver&		vki				(instance.getDriver());
2501	const int					count			= 2u;
2502	TestLog&					log				= context.getTestContext().getLog();
2503	VkPhysicalDeviceFeatures2	extFeatures;
2504	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2505
2506	VkPhysicalDeviceBorderColorSwizzleFeaturesEXT	deviceBorderColorSwizzleFeaturesEXT[count];
2507	const bool										isBorderColorSwizzleFeaturesEXT = checkExtension(properties, "VK_EXT_border_color_swizzle");
2508
2509	for (int ndx = 0; ndx < count; ++ndx)
2510	{
2511		deMemset(&deviceBorderColorSwizzleFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT));
2512		deviceBorderColorSwizzleFeaturesEXT[ndx].sType = isBorderColorSwizzleFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2513		deviceBorderColorSwizzleFeaturesEXT[ndx].pNext = DE_NULL;
2514
2515		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2516		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2517		extFeatures.pNext = &deviceBorderColorSwizzleFeaturesEXT[ndx];
2518
2519		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2520	}
2521
2522	if (isBorderColorSwizzleFeaturesEXT)
2523		log << TestLog::Message << deviceBorderColorSwizzleFeaturesEXT[0] << TestLog::EndMessage;
2524
2525	if (isBorderColorSwizzleFeaturesEXT &&
2526		(deviceBorderColorSwizzleFeaturesEXT[0].borderColorSwizzle != deviceBorderColorSwizzleFeaturesEXT[1].borderColorSwizzle ||
2527		 deviceBorderColorSwizzleFeaturesEXT[0].borderColorSwizzleFromImage != deviceBorderColorSwizzleFeaturesEXT[1].borderColorSwizzleFromImage))
2528	{
2529		TCU_FAIL("Mismatch between VkPhysicalDeviceBorderColorSwizzleFeaturesEXT");
2530	}
2531	return tcu::TestStatus::pass("Querying succeeded");
2532}
2533
2534tcu::TestStatus testPhysicalDeviceFeatureExtendedDynamicStateFeaturesEXT (Context& context)
2535{
2536	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2537	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2538	const InstanceDriver&		vki				(instance.getDriver());
2539	const int					count			= 2u;
2540	TestLog&					log				= context.getTestContext().getLog();
2541	VkPhysicalDeviceFeatures2	extFeatures;
2542	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2543
2544	VkPhysicalDeviceExtendedDynamicStateFeaturesEXT	deviceExtendedDynamicStateFeaturesEXT[count];
2545	const bool										isExtendedDynamicStateFeaturesEXT = checkExtension(properties, "VK_EXT_extended_dynamic_state");
2546
2547	for (int ndx = 0; ndx < count; ++ndx)
2548	{
2549		deMemset(&deviceExtendedDynamicStateFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT));
2550		deviceExtendedDynamicStateFeaturesEXT[ndx].sType = isExtendedDynamicStateFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2551		deviceExtendedDynamicStateFeaturesEXT[ndx].pNext = DE_NULL;
2552
2553		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2554		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2555		extFeatures.pNext = &deviceExtendedDynamicStateFeaturesEXT[ndx];
2556
2557		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2558	}
2559
2560	if (isExtendedDynamicStateFeaturesEXT)
2561		log << TestLog::Message << deviceExtendedDynamicStateFeaturesEXT[0] << TestLog::EndMessage;
2562
2563	if (isExtendedDynamicStateFeaturesEXT &&
2564		(deviceExtendedDynamicStateFeaturesEXT[0].extendedDynamicState != deviceExtendedDynamicStateFeaturesEXT[1].extendedDynamicState))
2565	{
2566		TCU_FAIL("Mismatch between VkPhysicalDeviceExtendedDynamicStateFeaturesEXT");
2567	}
2568	return tcu::TestStatus::pass("Querying succeeded");
2569}
2570
2571tcu::TestStatus testPhysicalDeviceFeatureExtendedDynamicState2FeaturesEXT (Context& context)
2572{
2573	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2574	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2575	const InstanceDriver&		vki				(instance.getDriver());
2576	const int					count			= 2u;
2577	TestLog&					log				= context.getTestContext().getLog();
2578	VkPhysicalDeviceFeatures2	extFeatures;
2579	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2580
2581	VkPhysicalDeviceExtendedDynamicState2FeaturesEXT	deviceExtendedDynamicState2FeaturesEXT[count];
2582	const bool											isExtendedDynamicState2FeaturesEXT = checkExtension(properties, "VK_EXT_extended_dynamic_state2");
2583
2584	for (int ndx = 0; ndx < count; ++ndx)
2585	{
2586		deMemset(&deviceExtendedDynamicState2FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT));
2587		deviceExtendedDynamicState2FeaturesEXT[ndx].sType = isExtendedDynamicState2FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2588		deviceExtendedDynamicState2FeaturesEXT[ndx].pNext = DE_NULL;
2589
2590		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2591		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2592		extFeatures.pNext = &deviceExtendedDynamicState2FeaturesEXT[ndx];
2593
2594		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2595	}
2596
2597	if (isExtendedDynamicState2FeaturesEXT)
2598		log << TestLog::Message << deviceExtendedDynamicState2FeaturesEXT[0] << TestLog::EndMessage;
2599
2600	if (isExtendedDynamicState2FeaturesEXT &&
2601		(deviceExtendedDynamicState2FeaturesEXT[0].extendedDynamicState2 != deviceExtendedDynamicState2FeaturesEXT[1].extendedDynamicState2 ||
2602		 deviceExtendedDynamicState2FeaturesEXT[0].extendedDynamicState2LogicOp != deviceExtendedDynamicState2FeaturesEXT[1].extendedDynamicState2LogicOp ||
2603		 deviceExtendedDynamicState2FeaturesEXT[0].extendedDynamicState2PatchControlPoints != deviceExtendedDynamicState2FeaturesEXT[1].extendedDynamicState2PatchControlPoints))
2604	{
2605		TCU_FAIL("Mismatch between VkPhysicalDeviceExtendedDynamicState2FeaturesEXT");
2606	}
2607	return tcu::TestStatus::pass("Querying succeeded");
2608}
2609
2610tcu::TestStatus testPhysicalDeviceFeatureExtendedDynamicState3FeaturesEXT (Context& context)
2611{
2612	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2613	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2614	const InstanceDriver&		vki				(instance.getDriver());
2615	const int					count			= 2u;
2616	TestLog&					log				= context.getTestContext().getLog();
2617	VkPhysicalDeviceFeatures2	extFeatures;
2618	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2619
2620	VkPhysicalDeviceExtendedDynamicState3FeaturesEXT	deviceExtendedDynamicState3FeaturesEXT[count];
2621	const bool											isExtendedDynamicState3FeaturesEXT = checkExtension(properties, "VK_EXT_extended_dynamic_state3");
2622
2623	for (int ndx = 0; ndx < count; ++ndx)
2624	{
2625		deMemset(&deviceExtendedDynamicState3FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT));
2626		deviceExtendedDynamicState3FeaturesEXT[ndx].sType = isExtendedDynamicState3FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2627		deviceExtendedDynamicState3FeaturesEXT[ndx].pNext = DE_NULL;
2628
2629		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2630		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2631		extFeatures.pNext = &deviceExtendedDynamicState3FeaturesEXT[ndx];
2632
2633		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2634	}
2635
2636	if (isExtendedDynamicState3FeaturesEXT)
2637		log << TestLog::Message << deviceExtendedDynamicState3FeaturesEXT[0] << TestLog::EndMessage;
2638
2639	if (isExtendedDynamicState3FeaturesEXT &&
2640		(deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3TessellationDomainOrigin != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3TessellationDomainOrigin ||
2641		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3DepthClampEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3DepthClampEnable ||
2642		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3PolygonMode != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3PolygonMode ||
2643		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3RasterizationSamples != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3RasterizationSamples ||
2644		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3SampleMask != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3SampleMask ||
2645		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3AlphaToCoverageEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3AlphaToCoverageEnable ||
2646		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3AlphaToOneEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3AlphaToOneEnable ||
2647		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3LogicOpEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3LogicOpEnable ||
2648		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ColorBlendEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ColorBlendEnable ||
2649		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ColorBlendEquation != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ColorBlendEquation ||
2650		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ColorWriteMask != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ColorWriteMask ||
2651		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3RasterizationStream != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3RasterizationStream ||
2652		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ConservativeRasterizationMode != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ConservativeRasterizationMode ||
2653		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ExtraPrimitiveOverestimationSize != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ExtraPrimitiveOverestimationSize ||
2654		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3DepthClipEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3DepthClipEnable ||
2655		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3SampleLocationsEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3SampleLocationsEnable ||
2656		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ColorBlendAdvanced != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ColorBlendAdvanced ||
2657		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ProvokingVertexMode != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ProvokingVertexMode ||
2658		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3LineRasterizationMode != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3LineRasterizationMode ||
2659		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3LineStippleEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3LineStippleEnable ||
2660		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3DepthClipNegativeOneToOne != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3DepthClipNegativeOneToOne ||
2661		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ViewportWScalingEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ViewportWScalingEnable ||
2662		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ViewportSwizzle != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ViewportSwizzle ||
2663		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3CoverageToColorEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3CoverageToColorEnable ||
2664		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3CoverageToColorLocation != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3CoverageToColorLocation ||
2665		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3CoverageModulationMode != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3CoverageModulationMode ||
2666		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3CoverageModulationTableEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3CoverageModulationTableEnable ||
2667		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3CoverageModulationTable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3CoverageModulationTable ||
2668		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3CoverageReductionMode != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3CoverageReductionMode ||
2669		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3RepresentativeFragmentTestEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3RepresentativeFragmentTestEnable ||
2670		 deviceExtendedDynamicState3FeaturesEXT[0].extendedDynamicState3ShadingRateImageEnable != deviceExtendedDynamicState3FeaturesEXT[1].extendedDynamicState3ShadingRateImageEnable))
2671	{
2672		TCU_FAIL("Mismatch between VkPhysicalDeviceExtendedDynamicState3FeaturesEXT");
2673	}
2674	return tcu::TestStatus::pass("Querying succeeded");
2675}
2676
2677tcu::TestStatus testPhysicalDeviceFeatureZeroInitializeWorkgroupMemoryFeatures (Context& context)
2678{
2679	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2680	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2681	const InstanceDriver&		vki				(instance.getDriver());
2682	const int					count			= 2u;
2683	TestLog&					log				= context.getTestContext().getLog();
2684	VkPhysicalDeviceFeatures2	extFeatures;
2685	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2686
2687	VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures	deviceZeroInitializeWorkgroupMemoryFeatures[count];
2688	const bool												isZeroInitializeWorkgroupMemoryFeatures = checkExtension(properties, "VK_KHR_zero_initialize_workgroup_memory") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
2689
2690	for (int ndx = 0; ndx < count; ++ndx)
2691	{
2692		deMemset(&deviceZeroInitializeWorkgroupMemoryFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures));
2693		deviceZeroInitializeWorkgroupMemoryFeatures[ndx].sType = isZeroInitializeWorkgroupMemoryFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2694		deviceZeroInitializeWorkgroupMemoryFeatures[ndx].pNext = DE_NULL;
2695
2696		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2697		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2698		extFeatures.pNext = &deviceZeroInitializeWorkgroupMemoryFeatures[ndx];
2699
2700		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2701	}
2702
2703	if (isZeroInitializeWorkgroupMemoryFeatures)
2704		log << TestLog::Message << deviceZeroInitializeWorkgroupMemoryFeatures[0] << TestLog::EndMessage;
2705
2706	if (isZeroInitializeWorkgroupMemoryFeatures &&
2707		(deviceZeroInitializeWorkgroupMemoryFeatures[0].shaderZeroInitializeWorkgroupMemory != deviceZeroInitializeWorkgroupMemoryFeatures[1].shaderZeroInitializeWorkgroupMemory))
2708	{
2709		TCU_FAIL("Mismatch between VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures");
2710	}
2711	return tcu::TestStatus::pass("Querying succeeded");
2712}
2713
2714tcu::TestStatus testPhysicalDeviceFeatureShaderSubgroupUniformControlFlowFeaturesKHR (Context& context)
2715{
2716	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2717	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2718	const InstanceDriver&		vki				(instance.getDriver());
2719	const int					count			= 2u;
2720	TestLog&					log				= context.getTestContext().getLog();
2721	VkPhysicalDeviceFeatures2	extFeatures;
2722	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2723
2724	VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR	deviceShaderSubgroupUniformControlFlowFeaturesKHR[count];
2725	const bool													isShaderSubgroupUniformControlFlowFeaturesKHR = checkExtension(properties, "VK_KHR_shader_subgroup_uniform_control_flow");
2726
2727	for (int ndx = 0; ndx < count; ++ndx)
2728	{
2729		deMemset(&deviceShaderSubgroupUniformControlFlowFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR));
2730		deviceShaderSubgroupUniformControlFlowFeaturesKHR[ndx].sType = isShaderSubgroupUniformControlFlowFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
2731		deviceShaderSubgroupUniformControlFlowFeaturesKHR[ndx].pNext = DE_NULL;
2732
2733		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2734		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2735		extFeatures.pNext = &deviceShaderSubgroupUniformControlFlowFeaturesKHR[ndx];
2736
2737		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2738	}
2739
2740	if (isShaderSubgroupUniformControlFlowFeaturesKHR)
2741		log << TestLog::Message << deviceShaderSubgroupUniformControlFlowFeaturesKHR[0] << TestLog::EndMessage;
2742
2743	if (isShaderSubgroupUniformControlFlowFeaturesKHR &&
2744		(deviceShaderSubgroupUniformControlFlowFeaturesKHR[0].shaderSubgroupUniformControlFlow != deviceShaderSubgroupUniformControlFlowFeaturesKHR[1].shaderSubgroupUniformControlFlow))
2745	{
2746		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR");
2747	}
2748	return tcu::TestStatus::pass("Querying succeeded");
2749}
2750
2751tcu::TestStatus testPhysicalDeviceFeatureRobustness2FeaturesEXT (Context& context)
2752{
2753	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2754	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2755	const InstanceDriver&		vki				(instance.getDriver());
2756	const int					count			= 2u;
2757	TestLog&					log				= context.getTestContext().getLog();
2758	VkPhysicalDeviceFeatures2	extFeatures;
2759	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2760
2761	VkPhysicalDeviceRobustness2FeaturesEXT	deviceRobustness2FeaturesEXT[count];
2762	const bool								isRobustness2FeaturesEXT = checkExtension(properties, "VK_EXT_robustness2");
2763
2764	for (int ndx = 0; ndx < count; ++ndx)
2765	{
2766		deMemset(&deviceRobustness2FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRobustness2FeaturesEXT));
2767		deviceRobustness2FeaturesEXT[ndx].sType = isRobustness2FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2768		deviceRobustness2FeaturesEXT[ndx].pNext = DE_NULL;
2769
2770		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2771		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2772		extFeatures.pNext = &deviceRobustness2FeaturesEXT[ndx];
2773
2774		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2775	}
2776
2777	if (isRobustness2FeaturesEXT)
2778		log << TestLog::Message << deviceRobustness2FeaturesEXT[0] << TestLog::EndMessage;
2779
2780	if (isRobustness2FeaturesEXT &&
2781		(deviceRobustness2FeaturesEXT[0].robustBufferAccess2 != deviceRobustness2FeaturesEXT[1].robustBufferAccess2 ||
2782		 deviceRobustness2FeaturesEXT[0].robustImageAccess2 != deviceRobustness2FeaturesEXT[1].robustImageAccess2 ||
2783		 deviceRobustness2FeaturesEXT[0].nullDescriptor != deviceRobustness2FeaturesEXT[1].nullDescriptor))
2784	{
2785		TCU_FAIL("Mismatch between VkPhysicalDeviceRobustness2FeaturesEXT");
2786	}
2787	return tcu::TestStatus::pass("Querying succeeded");
2788}
2789
2790tcu::TestStatus testPhysicalDeviceFeatureImageRobustnessFeatures (Context& context)
2791{
2792	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2793	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2794	const InstanceDriver&		vki				(instance.getDriver());
2795	const int					count			= 2u;
2796	TestLog&					log				= context.getTestContext().getLog();
2797	VkPhysicalDeviceFeatures2	extFeatures;
2798	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2799
2800	VkPhysicalDeviceImageRobustnessFeatures	deviceImageRobustnessFeatures[count];
2801	const bool								isImageRobustnessFeatures = checkExtension(properties, "VK_EXT_image_robustness") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
2802
2803	for (int ndx = 0; ndx < count; ++ndx)
2804	{
2805		deMemset(&deviceImageRobustnessFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImageRobustnessFeatures));
2806		deviceImageRobustnessFeatures[ndx].sType = isImageRobustnessFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
2807		deviceImageRobustnessFeatures[ndx].pNext = DE_NULL;
2808
2809		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2810		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2811		extFeatures.pNext = &deviceImageRobustnessFeatures[ndx];
2812
2813		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2814	}
2815
2816	if (isImageRobustnessFeatures)
2817		log << TestLog::Message << deviceImageRobustnessFeatures[0] << TestLog::EndMessage;
2818
2819	if (isImageRobustnessFeatures &&
2820		(deviceImageRobustnessFeatures[0].robustImageAccess != deviceImageRobustnessFeatures[1].robustImageAccess))
2821	{
2822		TCU_FAIL("Mismatch between VkPhysicalDeviceImageRobustnessFeatures");
2823	}
2824	return tcu::TestStatus::pass("Querying succeeded");
2825}
2826
2827tcu::TestStatus testPhysicalDeviceFeatureWorkgroupMemoryExplicitLayoutFeaturesKHR (Context& context)
2828{
2829	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2830	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2831	const InstanceDriver&		vki				(instance.getDriver());
2832	const int					count			= 2u;
2833	TestLog&					log				= context.getTestContext().getLog();
2834	VkPhysicalDeviceFeatures2	extFeatures;
2835	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2836
2837	VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR	deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[count];
2838	const bool													isWorkgroupMemoryExplicitLayoutFeaturesKHR = checkExtension(properties, "VK_KHR_workgroup_memory_explicit_layout");
2839
2840	for (int ndx = 0; ndx < count; ++ndx)
2841	{
2842		deMemset(&deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR));
2843		deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[ndx].sType = isWorkgroupMemoryExplicitLayoutFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
2844		deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[ndx].pNext = DE_NULL;
2845
2846		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2847		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2848		extFeatures.pNext = &deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[ndx];
2849
2850		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2851	}
2852
2853	if (isWorkgroupMemoryExplicitLayoutFeaturesKHR)
2854		log << TestLog::Message << deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[0] << TestLog::EndMessage;
2855
2856	if (isWorkgroupMemoryExplicitLayoutFeaturesKHR &&
2857		(deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[0].workgroupMemoryExplicitLayout != deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[1].workgroupMemoryExplicitLayout ||
2858		 deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[0].workgroupMemoryExplicitLayoutScalarBlockLayout != deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[1].workgroupMemoryExplicitLayoutScalarBlockLayout ||
2859		 deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[0].workgroupMemoryExplicitLayout8BitAccess != deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[1].workgroupMemoryExplicitLayout8BitAccess ||
2860		 deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[0].workgroupMemoryExplicitLayout16BitAccess != deviceWorkgroupMemoryExplicitLayoutFeaturesKHR[1].workgroupMemoryExplicitLayout16BitAccess))
2861	{
2862		TCU_FAIL("Mismatch between VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR");
2863	}
2864	return tcu::TestStatus::pass("Querying succeeded");
2865}
2866
2867tcu::TestStatus testPhysicalDeviceFeaturePortabilitySubsetFeaturesKHR (Context& context)
2868{
2869	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2870	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2871	const InstanceDriver&		vki				(instance.getDriver());
2872	const int					count			= 2u;
2873	TestLog&					log				= context.getTestContext().getLog();
2874	VkPhysicalDeviceFeatures2	extFeatures;
2875	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2876
2877	VkPhysicalDevicePortabilitySubsetFeaturesKHR	devicePortabilitySubsetFeaturesKHR[count];
2878	const bool										isPortabilitySubsetFeaturesKHR = checkExtension(properties, "VK_KHR_portability_subset");
2879
2880	for (int ndx = 0; ndx < count; ++ndx)
2881	{
2882		deMemset(&devicePortabilitySubsetFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePortabilitySubsetFeaturesKHR));
2883		devicePortabilitySubsetFeaturesKHR[ndx].sType = isPortabilitySubsetFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
2884		devicePortabilitySubsetFeaturesKHR[ndx].pNext = DE_NULL;
2885
2886		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2887		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2888		extFeatures.pNext = &devicePortabilitySubsetFeaturesKHR[ndx];
2889
2890		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2891	}
2892
2893	if (isPortabilitySubsetFeaturesKHR)
2894		log << TestLog::Message << devicePortabilitySubsetFeaturesKHR[0] << TestLog::EndMessage;
2895
2896	if (isPortabilitySubsetFeaturesKHR &&
2897		(devicePortabilitySubsetFeaturesKHR[0].constantAlphaColorBlendFactors != devicePortabilitySubsetFeaturesKHR[1].constantAlphaColorBlendFactors ||
2898		 devicePortabilitySubsetFeaturesKHR[0].events != devicePortabilitySubsetFeaturesKHR[1].events ||
2899		 devicePortabilitySubsetFeaturesKHR[0].imageViewFormatReinterpretation != devicePortabilitySubsetFeaturesKHR[1].imageViewFormatReinterpretation ||
2900		 devicePortabilitySubsetFeaturesKHR[0].imageViewFormatSwizzle != devicePortabilitySubsetFeaturesKHR[1].imageViewFormatSwizzle ||
2901		 devicePortabilitySubsetFeaturesKHR[0].imageView2DOn3DImage != devicePortabilitySubsetFeaturesKHR[1].imageView2DOn3DImage ||
2902		 devicePortabilitySubsetFeaturesKHR[0].multisampleArrayImage != devicePortabilitySubsetFeaturesKHR[1].multisampleArrayImage ||
2903		 devicePortabilitySubsetFeaturesKHR[0].mutableComparisonSamplers != devicePortabilitySubsetFeaturesKHR[1].mutableComparisonSamplers ||
2904		 devicePortabilitySubsetFeaturesKHR[0].pointPolygons != devicePortabilitySubsetFeaturesKHR[1].pointPolygons ||
2905		 devicePortabilitySubsetFeaturesKHR[0].samplerMipLodBias != devicePortabilitySubsetFeaturesKHR[1].samplerMipLodBias ||
2906		 devicePortabilitySubsetFeaturesKHR[0].separateStencilMaskRef != devicePortabilitySubsetFeaturesKHR[1].separateStencilMaskRef ||
2907		 devicePortabilitySubsetFeaturesKHR[0].shaderSampleRateInterpolationFunctions != devicePortabilitySubsetFeaturesKHR[1].shaderSampleRateInterpolationFunctions ||
2908		 devicePortabilitySubsetFeaturesKHR[0].tessellationIsolines != devicePortabilitySubsetFeaturesKHR[1].tessellationIsolines ||
2909		 devicePortabilitySubsetFeaturesKHR[0].tessellationPointMode != devicePortabilitySubsetFeaturesKHR[1].tessellationPointMode ||
2910		 devicePortabilitySubsetFeaturesKHR[0].triangleFans != devicePortabilitySubsetFeaturesKHR[1].triangleFans ||
2911		 devicePortabilitySubsetFeaturesKHR[0].vertexAttributeAccessBeyondStride != devicePortabilitySubsetFeaturesKHR[1].vertexAttributeAccessBeyondStride))
2912	{
2913		TCU_FAIL("Mismatch between VkPhysicalDevicePortabilitySubsetFeaturesKHR");
2914	}
2915	return tcu::TestStatus::pass("Querying succeeded");
2916}
2917
2918tcu::TestStatus testPhysicalDeviceFeature4444FormatsFeaturesEXT (Context& context)
2919{
2920	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2921	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2922	const InstanceDriver&		vki				(instance.getDriver());
2923	const int					count			= 2u;
2924	TestLog&					log				= context.getTestContext().getLog();
2925	VkPhysicalDeviceFeatures2	extFeatures;
2926	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2927
2928	VkPhysicalDevice4444FormatsFeaturesEXT	device4444FormatsFeaturesEXT[count];
2929	const bool								is4444FormatsFeaturesEXT = checkExtension(properties, "VK_EXT_4444_formats");
2930
2931	for (int ndx = 0; ndx < count; ++ndx)
2932	{
2933		deMemset(&device4444FormatsFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevice4444FormatsFeaturesEXT));
2934		device4444FormatsFeaturesEXT[ndx].sType = is4444FormatsFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2935		device4444FormatsFeaturesEXT[ndx].pNext = DE_NULL;
2936
2937		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2938		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2939		extFeatures.pNext = &device4444FormatsFeaturesEXT[ndx];
2940
2941		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2942	}
2943
2944	if (is4444FormatsFeaturesEXT)
2945		log << TestLog::Message << device4444FormatsFeaturesEXT[0] << TestLog::EndMessage;
2946
2947	if (is4444FormatsFeaturesEXT &&
2948		(device4444FormatsFeaturesEXT[0].formatA4R4G4B4 != device4444FormatsFeaturesEXT[1].formatA4R4G4B4 ||
2949		 device4444FormatsFeaturesEXT[0].formatA4B4G4R4 != device4444FormatsFeaturesEXT[1].formatA4B4G4R4))
2950	{
2951		TCU_FAIL("Mismatch between VkPhysicalDevice4444FormatsFeaturesEXT");
2952	}
2953	return tcu::TestStatus::pass("Querying succeeded");
2954}
2955
2956tcu::TestStatus testPhysicalDeviceFeatureShaderImageAtomicInt64FeaturesEXT (Context& context)
2957{
2958	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2959	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2960	const InstanceDriver&		vki				(instance.getDriver());
2961	const int					count			= 2u;
2962	TestLog&					log				= context.getTestContext().getLog();
2963	VkPhysicalDeviceFeatures2	extFeatures;
2964	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
2965
2966	VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT	deviceShaderImageAtomicInt64FeaturesEXT[count];
2967	const bool											isShaderImageAtomicInt64FeaturesEXT = checkExtension(properties, "VK_EXT_shader_image_atomic_int64");
2968
2969	for (int ndx = 0; ndx < count; ++ndx)
2970	{
2971		deMemset(&deviceShaderImageAtomicInt64FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT));
2972		deviceShaderImageAtomicInt64FeaturesEXT[ndx].sType = isShaderImageAtomicInt64FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
2973		deviceShaderImageAtomicInt64FeaturesEXT[ndx].pNext = DE_NULL;
2974
2975		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
2976		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2977		extFeatures.pNext = &deviceShaderImageAtomicInt64FeaturesEXT[ndx];
2978
2979		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
2980	}
2981
2982	if (isShaderImageAtomicInt64FeaturesEXT)
2983		log << TestLog::Message << deviceShaderImageAtomicInt64FeaturesEXT[0] << TestLog::EndMessage;
2984
2985	if (isShaderImageAtomicInt64FeaturesEXT &&
2986		(deviceShaderImageAtomicInt64FeaturesEXT[0].shaderImageInt64Atomics != deviceShaderImageAtomicInt64FeaturesEXT[1].shaderImageInt64Atomics ||
2987		 deviceShaderImageAtomicInt64FeaturesEXT[0].sparseImageInt64Atomics != deviceShaderImageAtomicInt64FeaturesEXT[1].sparseImageInt64Atomics))
2988	{
2989		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT");
2990	}
2991	return tcu::TestStatus::pass("Querying succeeded");
2992}
2993
2994tcu::TestStatus testPhysicalDeviceFeatureFragmentShadingRateFeaturesKHR (Context& context)
2995{
2996	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
2997	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
2998	const InstanceDriver&		vki				(instance.getDriver());
2999	const int					count			= 2u;
3000	TestLog&					log				= context.getTestContext().getLog();
3001	VkPhysicalDeviceFeatures2	extFeatures;
3002	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3003
3004	VkPhysicalDeviceFragmentShadingRateFeaturesKHR	deviceFragmentShadingRateFeaturesKHR[count];
3005	const bool										isFragmentShadingRateFeaturesKHR = checkExtension(properties, "VK_KHR_fragment_shading_rate");
3006
3007	for (int ndx = 0; ndx < count; ++ndx)
3008	{
3009		deMemset(&deviceFragmentShadingRateFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceFragmentShadingRateFeaturesKHR));
3010		deviceFragmentShadingRateFeaturesKHR[ndx].sType = isFragmentShadingRateFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
3011		deviceFragmentShadingRateFeaturesKHR[ndx].pNext = DE_NULL;
3012
3013		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3014		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3015		extFeatures.pNext = &deviceFragmentShadingRateFeaturesKHR[ndx];
3016
3017		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3018	}
3019
3020	if (isFragmentShadingRateFeaturesKHR)
3021		log << TestLog::Message << deviceFragmentShadingRateFeaturesKHR[0] << TestLog::EndMessage;
3022
3023	if (isFragmentShadingRateFeaturesKHR &&
3024		(deviceFragmentShadingRateFeaturesKHR[0].pipelineFragmentShadingRate != deviceFragmentShadingRateFeaturesKHR[1].pipelineFragmentShadingRate ||
3025		 deviceFragmentShadingRateFeaturesKHR[0].primitiveFragmentShadingRate != deviceFragmentShadingRateFeaturesKHR[1].primitiveFragmentShadingRate ||
3026		 deviceFragmentShadingRateFeaturesKHR[0].attachmentFragmentShadingRate != deviceFragmentShadingRateFeaturesKHR[1].attachmentFragmentShadingRate))
3027	{
3028		TCU_FAIL("Mismatch between VkPhysicalDeviceFragmentShadingRateFeaturesKHR");
3029	}
3030	return tcu::TestStatus::pass("Querying succeeded");
3031}
3032
3033tcu::TestStatus testPhysicalDeviceFeatureShaderTerminateInvocationFeatures (Context& context)
3034{
3035	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3036	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3037	const InstanceDriver&		vki				(instance.getDriver());
3038	const int					count			= 2u;
3039	TestLog&					log				= context.getTestContext().getLog();
3040	VkPhysicalDeviceFeatures2	extFeatures;
3041	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3042
3043	VkPhysicalDeviceShaderTerminateInvocationFeatures	deviceShaderTerminateInvocationFeatures[count];
3044	const bool											isShaderTerminateInvocationFeatures = checkExtension(properties, "VK_KHR_shader_terminate_invocation") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
3045
3046	for (int ndx = 0; ndx < count; ++ndx)
3047	{
3048		deMemset(&deviceShaderTerminateInvocationFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderTerminateInvocationFeatures));
3049		deviceShaderTerminateInvocationFeatures[ndx].sType = isShaderTerminateInvocationFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
3050		deviceShaderTerminateInvocationFeatures[ndx].pNext = DE_NULL;
3051
3052		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3053		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3054		extFeatures.pNext = &deviceShaderTerminateInvocationFeatures[ndx];
3055
3056		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3057	}
3058
3059	if (isShaderTerminateInvocationFeatures)
3060		log << TestLog::Message << deviceShaderTerminateInvocationFeatures[0] << TestLog::EndMessage;
3061
3062	if (isShaderTerminateInvocationFeatures &&
3063		(deviceShaderTerminateInvocationFeatures[0].shaderTerminateInvocation != deviceShaderTerminateInvocationFeatures[1].shaderTerminateInvocation))
3064	{
3065		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderTerminateInvocationFeatures");
3066	}
3067	return tcu::TestStatus::pass("Querying succeeded");
3068}
3069
3070tcu::TestStatus testPhysicalDeviceFeatureImage2DViewOf3DFeaturesEXT (Context& context)
3071{
3072	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3073	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3074	const InstanceDriver&		vki				(instance.getDriver());
3075	const int					count			= 2u;
3076	TestLog&					log				= context.getTestContext().getLog();
3077	VkPhysicalDeviceFeatures2	extFeatures;
3078	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3079
3080	VkPhysicalDeviceImage2DViewOf3DFeaturesEXT	deviceImage2DViewOf3DFeaturesEXT[count];
3081	const bool									isImage2DViewOf3DFeaturesEXT = checkExtension(properties, "VK_EXT_image_2d_view_of_3d");
3082
3083	for (int ndx = 0; ndx < count; ++ndx)
3084	{
3085		deMemset(&deviceImage2DViewOf3DFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImage2DViewOf3DFeaturesEXT));
3086		deviceImage2DViewOf3DFeaturesEXT[ndx].sType = isImage2DViewOf3DFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3087		deviceImage2DViewOf3DFeaturesEXT[ndx].pNext = DE_NULL;
3088
3089		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3090		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3091		extFeatures.pNext = &deviceImage2DViewOf3DFeaturesEXT[ndx];
3092
3093		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3094	}
3095
3096	if (isImage2DViewOf3DFeaturesEXT)
3097		log << TestLog::Message << deviceImage2DViewOf3DFeaturesEXT[0] << TestLog::EndMessage;
3098
3099	if (isImage2DViewOf3DFeaturesEXT &&
3100		(deviceImage2DViewOf3DFeaturesEXT[0].image2DViewOf3D != deviceImage2DViewOf3DFeaturesEXT[1].image2DViewOf3D ||
3101		 deviceImage2DViewOf3DFeaturesEXT[0].sampler2DViewOf3D != deviceImage2DViewOf3DFeaturesEXT[1].sampler2DViewOf3D))
3102	{
3103		TCU_FAIL("Mismatch between VkPhysicalDeviceImage2DViewOf3DFeaturesEXT");
3104	}
3105	return tcu::TestStatus::pass("Querying succeeded");
3106}
3107
3108tcu::TestStatus testPhysicalDeviceFeatureImageSlicedViewOf3DFeaturesEXT (Context& context)
3109{
3110	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3111	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3112	const InstanceDriver&		vki				(instance.getDriver());
3113	const int					count			= 2u;
3114	TestLog&					log				= context.getTestContext().getLog();
3115	VkPhysicalDeviceFeatures2	extFeatures;
3116	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3117
3118	VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT	deviceImageSlicedViewOf3DFeaturesEXT[count];
3119	const bool										isImageSlicedViewOf3DFeaturesEXT = checkExtension(properties, "VK_EXT_image_sliced_view_of_3d");
3120
3121	for (int ndx = 0; ndx < count; ++ndx)
3122	{
3123		deMemset(&deviceImageSlicedViewOf3DFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT));
3124		deviceImageSlicedViewOf3DFeaturesEXT[ndx].sType = isImageSlicedViewOf3DFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3125		deviceImageSlicedViewOf3DFeaturesEXT[ndx].pNext = DE_NULL;
3126
3127		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3128		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3129		extFeatures.pNext = &deviceImageSlicedViewOf3DFeaturesEXT[ndx];
3130
3131		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3132	}
3133
3134	if (isImageSlicedViewOf3DFeaturesEXT)
3135		log << TestLog::Message << deviceImageSlicedViewOf3DFeaturesEXT[0] << TestLog::EndMessage;
3136
3137	if (isImageSlicedViewOf3DFeaturesEXT &&
3138		(deviceImageSlicedViewOf3DFeaturesEXT[0].imageSlicedViewOf3D != deviceImageSlicedViewOf3DFeaturesEXT[1].imageSlicedViewOf3D))
3139	{
3140		TCU_FAIL("Mismatch between VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT");
3141	}
3142	return tcu::TestStatus::pass("Querying succeeded");
3143}
3144
3145tcu::TestStatus testPhysicalDeviceFeatureAttachmentFeedbackLoopDynamicStateFeaturesEXT (Context& context)
3146{
3147	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3148	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3149	const InstanceDriver&		vki				(instance.getDriver());
3150	const int					count			= 2u;
3151	TestLog&					log				= context.getTestContext().getLog();
3152	VkPhysicalDeviceFeatures2	extFeatures;
3153	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3154
3155	VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT	deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[count];
3156	const bool														isAttachmentFeedbackLoopDynamicStateFeaturesEXT = checkExtension(properties, "VK_EXT_attachment_feedback_loop_dynamic_state");
3157
3158	for (int ndx = 0; ndx < count; ++ndx)
3159	{
3160		deMemset(&deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT));
3161		deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[ndx].sType = isAttachmentFeedbackLoopDynamicStateFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3162		deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[ndx].pNext = DE_NULL;
3163
3164		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3165		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3166		extFeatures.pNext = &deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[ndx];
3167
3168		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3169	}
3170
3171	if (isAttachmentFeedbackLoopDynamicStateFeaturesEXT)
3172		log << TestLog::Message << deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[0] << TestLog::EndMessage;
3173
3174	if (isAttachmentFeedbackLoopDynamicStateFeaturesEXT &&
3175		(deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[0].attachmentFeedbackLoopDynamicState != deviceAttachmentFeedbackLoopDynamicStateFeaturesEXT[1].attachmentFeedbackLoopDynamicState))
3176	{
3177		TCU_FAIL("Mismatch between VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT");
3178	}
3179	return tcu::TestStatus::pass("Querying succeeded");
3180}
3181
3182tcu::TestStatus testPhysicalDeviceFeatureMutableDescriptorTypeFeaturesEXT (Context& context)
3183{
3184	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3185	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3186	const InstanceDriver&		vki				(instance.getDriver());
3187	const int					count			= 2u;
3188	TestLog&					log				= context.getTestContext().getLog();
3189	VkPhysicalDeviceFeatures2	extFeatures;
3190	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3191
3192	VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT	deviceMutableDescriptorTypeFeaturesEXT[count];
3193	const bool											isMutableDescriptorTypeFeaturesEXT = checkExtension(properties, "VK_EXT_mutable_descriptor_type");
3194
3195	for (int ndx = 0; ndx < count; ++ndx)
3196	{
3197		deMemset(&deviceMutableDescriptorTypeFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT));
3198		deviceMutableDescriptorTypeFeaturesEXT[ndx].sType = isMutableDescriptorTypeFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3199		deviceMutableDescriptorTypeFeaturesEXT[ndx].pNext = DE_NULL;
3200
3201		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3202		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3203		extFeatures.pNext = &deviceMutableDescriptorTypeFeaturesEXT[ndx];
3204
3205		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3206	}
3207
3208	if (isMutableDescriptorTypeFeaturesEXT)
3209		log << TestLog::Message << deviceMutableDescriptorTypeFeaturesEXT[0] << TestLog::EndMessage;
3210
3211	if (isMutableDescriptorTypeFeaturesEXT &&
3212		(deviceMutableDescriptorTypeFeaturesEXT[0].mutableDescriptorType != deviceMutableDescriptorTypeFeaturesEXT[1].mutableDescriptorType))
3213	{
3214		TCU_FAIL("Mismatch between VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT");
3215	}
3216	return tcu::TestStatus::pass("Querying succeeded");
3217}
3218
3219tcu::TestStatus testPhysicalDeviceFeatureDepthClipControlFeaturesEXT (Context& context)
3220{
3221	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3222	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3223	const InstanceDriver&		vki				(instance.getDriver());
3224	const int					count			= 2u;
3225	TestLog&					log				= context.getTestContext().getLog();
3226	VkPhysicalDeviceFeatures2	extFeatures;
3227	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3228
3229	VkPhysicalDeviceDepthClipControlFeaturesEXT	deviceDepthClipControlFeaturesEXT[count];
3230	const bool									isDepthClipControlFeaturesEXT = checkExtension(properties, "VK_EXT_depth_clip_control");
3231
3232	for (int ndx = 0; ndx < count; ++ndx)
3233	{
3234		deMemset(&deviceDepthClipControlFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDepthClipControlFeaturesEXT));
3235		deviceDepthClipControlFeaturesEXT[ndx].sType = isDepthClipControlFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3236		deviceDepthClipControlFeaturesEXT[ndx].pNext = DE_NULL;
3237
3238		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3239		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3240		extFeatures.pNext = &deviceDepthClipControlFeaturesEXT[ndx];
3241
3242		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3243	}
3244
3245	if (isDepthClipControlFeaturesEXT)
3246		log << TestLog::Message << deviceDepthClipControlFeaturesEXT[0] << TestLog::EndMessage;
3247
3248	if (isDepthClipControlFeaturesEXT &&
3249		(deviceDepthClipControlFeaturesEXT[0].depthClipControl != deviceDepthClipControlFeaturesEXT[1].depthClipControl))
3250	{
3251		TCU_FAIL("Mismatch between VkPhysicalDeviceDepthClipControlFeaturesEXT");
3252	}
3253	return tcu::TestStatus::pass("Querying succeeded");
3254}
3255
3256tcu::TestStatus testPhysicalDeviceFeatureVertexInputDynamicStateFeaturesEXT (Context& context)
3257{
3258	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3259	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3260	const InstanceDriver&		vki				(instance.getDriver());
3261	const int					count			= 2u;
3262	TestLog&					log				= context.getTestContext().getLog();
3263	VkPhysicalDeviceFeatures2	extFeatures;
3264	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3265
3266	VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT	deviceVertexInputDynamicStateFeaturesEXT[count];
3267	const bool											isVertexInputDynamicStateFeaturesEXT = checkExtension(properties, "VK_EXT_vertex_input_dynamic_state");
3268
3269	for (int ndx = 0; ndx < count; ++ndx)
3270	{
3271		deMemset(&deviceVertexInputDynamicStateFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT));
3272		deviceVertexInputDynamicStateFeaturesEXT[ndx].sType = isVertexInputDynamicStateFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3273		deviceVertexInputDynamicStateFeaturesEXT[ndx].pNext = DE_NULL;
3274
3275		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3276		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3277		extFeatures.pNext = &deviceVertexInputDynamicStateFeaturesEXT[ndx];
3278
3279		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3280	}
3281
3282	if (isVertexInputDynamicStateFeaturesEXT)
3283		log << TestLog::Message << deviceVertexInputDynamicStateFeaturesEXT[0] << TestLog::EndMessage;
3284
3285	if (isVertexInputDynamicStateFeaturesEXT &&
3286		(deviceVertexInputDynamicStateFeaturesEXT[0].vertexInputDynamicState != deviceVertexInputDynamicStateFeaturesEXT[1].vertexInputDynamicState))
3287	{
3288		TCU_FAIL("Mismatch between VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT");
3289	}
3290	return tcu::TestStatus::pass("Querying succeeded");
3291}
3292
3293tcu::TestStatus testPhysicalDeviceFeatureColorWriteEnableFeaturesEXT (Context& context)
3294{
3295	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3296	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3297	const InstanceDriver&		vki				(instance.getDriver());
3298	const int					count			= 2u;
3299	TestLog&					log				= context.getTestContext().getLog();
3300	VkPhysicalDeviceFeatures2	extFeatures;
3301	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3302
3303	VkPhysicalDeviceColorWriteEnableFeaturesEXT	deviceColorWriteEnableFeaturesEXT[count];
3304	const bool									isColorWriteEnableFeaturesEXT = checkExtension(properties, "VK_EXT_color_write_enable");
3305
3306	for (int ndx = 0; ndx < count; ++ndx)
3307	{
3308		deMemset(&deviceColorWriteEnableFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceColorWriteEnableFeaturesEXT));
3309		deviceColorWriteEnableFeaturesEXT[ndx].sType = isColorWriteEnableFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3310		deviceColorWriteEnableFeaturesEXT[ndx].pNext = DE_NULL;
3311
3312		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3313		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3314		extFeatures.pNext = &deviceColorWriteEnableFeaturesEXT[ndx];
3315
3316		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3317	}
3318
3319	if (isColorWriteEnableFeaturesEXT)
3320		log << TestLog::Message << deviceColorWriteEnableFeaturesEXT[0] << TestLog::EndMessage;
3321
3322	if (isColorWriteEnableFeaturesEXT &&
3323		(deviceColorWriteEnableFeaturesEXT[0].colorWriteEnable != deviceColorWriteEnableFeaturesEXT[1].colorWriteEnable))
3324	{
3325		TCU_FAIL("Mismatch between VkPhysicalDeviceColorWriteEnableFeaturesEXT");
3326	}
3327	return tcu::TestStatus::pass("Querying succeeded");
3328}
3329
3330tcu::TestStatus testPhysicalDeviceFeatureSynchronization2Features (Context& context)
3331{
3332	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3333	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3334	const InstanceDriver&		vki				(instance.getDriver());
3335	const int					count			= 2u;
3336	TestLog&					log				= context.getTestContext().getLog();
3337	VkPhysicalDeviceFeatures2	extFeatures;
3338	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3339
3340	VkPhysicalDeviceSynchronization2Features	deviceSynchronization2Features[count];
3341	const bool									isSynchronization2Features = checkExtension(properties, "VK_KHR_synchronization2") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
3342
3343	for (int ndx = 0; ndx < count; ++ndx)
3344	{
3345		deMemset(&deviceSynchronization2Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSynchronization2Features));
3346		deviceSynchronization2Features[ndx].sType = isSynchronization2Features ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
3347		deviceSynchronization2Features[ndx].pNext = DE_NULL;
3348
3349		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3350		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3351		extFeatures.pNext = &deviceSynchronization2Features[ndx];
3352
3353		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3354	}
3355
3356	if (isSynchronization2Features)
3357		log << TestLog::Message << deviceSynchronization2Features[0] << TestLog::EndMessage;
3358
3359	if (isSynchronization2Features &&
3360		(deviceSynchronization2Features[0].synchronization2 != deviceSynchronization2Features[1].synchronization2))
3361	{
3362		TCU_FAIL("Mismatch between VkPhysicalDeviceSynchronization2Features");
3363	}
3364	return tcu::TestStatus::pass("Querying succeeded");
3365}
3366
3367tcu::TestStatus testPhysicalDeviceFeatureHostImageCopyFeaturesEXT (Context& context)
3368{
3369	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3370	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3371	const InstanceDriver&		vki				(instance.getDriver());
3372	const int					count			= 2u;
3373	TestLog&					log				= context.getTestContext().getLog();
3374	VkPhysicalDeviceFeatures2	extFeatures;
3375	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3376
3377	VkPhysicalDeviceHostImageCopyFeaturesEXT	deviceHostImageCopyFeaturesEXT[count];
3378	const bool									isHostImageCopyFeaturesEXT = checkExtension(properties, "VK_EXT_host_image_copy");
3379
3380	for (int ndx = 0; ndx < count; ++ndx)
3381	{
3382		deMemset(&deviceHostImageCopyFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceHostImageCopyFeaturesEXT));
3383		deviceHostImageCopyFeaturesEXT[ndx].sType = isHostImageCopyFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3384		deviceHostImageCopyFeaturesEXT[ndx].pNext = DE_NULL;
3385
3386		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3387		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3388		extFeatures.pNext = &deviceHostImageCopyFeaturesEXT[ndx];
3389
3390		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3391	}
3392
3393	if (isHostImageCopyFeaturesEXT)
3394		log << TestLog::Message << deviceHostImageCopyFeaturesEXT[0] << TestLog::EndMessage;
3395
3396	if (isHostImageCopyFeaturesEXT &&
3397		(deviceHostImageCopyFeaturesEXT[0].hostImageCopy != deviceHostImageCopyFeaturesEXT[1].hostImageCopy))
3398	{
3399		TCU_FAIL("Mismatch between VkPhysicalDeviceHostImageCopyFeaturesEXT");
3400	}
3401	return tcu::TestStatus::pass("Querying succeeded");
3402}
3403
3404tcu::TestStatus testPhysicalDeviceFeaturePrimitivesGeneratedQueryFeaturesEXT (Context& context)
3405{
3406	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3407	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3408	const InstanceDriver&		vki				(instance.getDriver());
3409	const int					count			= 2u;
3410	TestLog&					log				= context.getTestContext().getLog();
3411	VkPhysicalDeviceFeatures2	extFeatures;
3412	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3413
3414	VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT	devicePrimitivesGeneratedQueryFeaturesEXT[count];
3415	const bool											isPrimitivesGeneratedQueryFeaturesEXT = checkExtension(properties, "VK_EXT_primitives_generated_query");
3416
3417	for (int ndx = 0; ndx < count; ++ndx)
3418	{
3419		deMemset(&devicePrimitivesGeneratedQueryFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT));
3420		devicePrimitivesGeneratedQueryFeaturesEXT[ndx].sType = isPrimitivesGeneratedQueryFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3421		devicePrimitivesGeneratedQueryFeaturesEXT[ndx].pNext = DE_NULL;
3422
3423		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3424		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3425		extFeatures.pNext = &devicePrimitivesGeneratedQueryFeaturesEXT[ndx];
3426
3427		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3428	}
3429
3430	if (isPrimitivesGeneratedQueryFeaturesEXT)
3431		log << TestLog::Message << devicePrimitivesGeneratedQueryFeaturesEXT[0] << TestLog::EndMessage;
3432
3433	if (isPrimitivesGeneratedQueryFeaturesEXT &&
3434		(devicePrimitivesGeneratedQueryFeaturesEXT[0].primitivesGeneratedQuery != devicePrimitivesGeneratedQueryFeaturesEXT[1].primitivesGeneratedQuery ||
3435		 devicePrimitivesGeneratedQueryFeaturesEXT[0].primitivesGeneratedQueryWithRasterizerDiscard != devicePrimitivesGeneratedQueryFeaturesEXT[1].primitivesGeneratedQueryWithRasterizerDiscard ||
3436		 devicePrimitivesGeneratedQueryFeaturesEXT[0].primitivesGeneratedQueryWithNonZeroStreams != devicePrimitivesGeneratedQueryFeaturesEXT[1].primitivesGeneratedQueryWithNonZeroStreams))
3437	{
3438		TCU_FAIL("Mismatch between VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT");
3439	}
3440	return tcu::TestStatus::pass("Querying succeeded");
3441}
3442
3443tcu::TestStatus testPhysicalDeviceFeatureLegacyDitheringFeaturesEXT (Context& context)
3444{
3445	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3446	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3447	const InstanceDriver&		vki				(instance.getDriver());
3448	const int					count			= 2u;
3449	TestLog&					log				= context.getTestContext().getLog();
3450	VkPhysicalDeviceFeatures2	extFeatures;
3451	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3452
3453	VkPhysicalDeviceLegacyDitheringFeaturesEXT	deviceLegacyDitheringFeaturesEXT[count];
3454	const bool									isLegacyDitheringFeaturesEXT = checkExtension(properties, "VK_EXT_legacy_dithering");
3455
3456	for (int ndx = 0; ndx < count; ++ndx)
3457	{
3458		deMemset(&deviceLegacyDitheringFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceLegacyDitheringFeaturesEXT));
3459		deviceLegacyDitheringFeaturesEXT[ndx].sType = isLegacyDitheringFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3460		deviceLegacyDitheringFeaturesEXT[ndx].pNext = DE_NULL;
3461
3462		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3463		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3464		extFeatures.pNext = &deviceLegacyDitheringFeaturesEXT[ndx];
3465
3466		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3467	}
3468
3469	if (isLegacyDitheringFeaturesEXT)
3470		log << TestLog::Message << deviceLegacyDitheringFeaturesEXT[0] << TestLog::EndMessage;
3471
3472	if (isLegacyDitheringFeaturesEXT &&
3473		(deviceLegacyDitheringFeaturesEXT[0].legacyDithering != deviceLegacyDitheringFeaturesEXT[1].legacyDithering))
3474	{
3475		TCU_FAIL("Mismatch between VkPhysicalDeviceLegacyDitheringFeaturesEXT");
3476	}
3477	return tcu::TestStatus::pass("Querying succeeded");
3478}
3479
3480tcu::TestStatus testPhysicalDeviceFeatureMultisampledRenderToSingleSampledFeaturesEXT (Context& context)
3481{
3482	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3483	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3484	const InstanceDriver&		vki				(instance.getDriver());
3485	const int					count			= 2u;
3486	TestLog&					log				= context.getTestContext().getLog();
3487	VkPhysicalDeviceFeatures2	extFeatures;
3488	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3489
3490	VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT	deviceMultisampledRenderToSingleSampledFeaturesEXT[count];
3491	const bool														isMultisampledRenderToSingleSampledFeaturesEXT = checkExtension(properties, "VK_EXT_multisampled_render_to_single_sampled");
3492
3493	for (int ndx = 0; ndx < count; ++ndx)
3494	{
3495		deMemset(&deviceMultisampledRenderToSingleSampledFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT));
3496		deviceMultisampledRenderToSingleSampledFeaturesEXT[ndx].sType = isMultisampledRenderToSingleSampledFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3497		deviceMultisampledRenderToSingleSampledFeaturesEXT[ndx].pNext = DE_NULL;
3498
3499		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3500		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3501		extFeatures.pNext = &deviceMultisampledRenderToSingleSampledFeaturesEXT[ndx];
3502
3503		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3504	}
3505
3506	if (isMultisampledRenderToSingleSampledFeaturesEXT)
3507		log << TestLog::Message << deviceMultisampledRenderToSingleSampledFeaturesEXT[0] << TestLog::EndMessage;
3508
3509	if (isMultisampledRenderToSingleSampledFeaturesEXT &&
3510		(deviceMultisampledRenderToSingleSampledFeaturesEXT[0].multisampledRenderToSingleSampled != deviceMultisampledRenderToSingleSampledFeaturesEXT[1].multisampledRenderToSingleSampled))
3511	{
3512		TCU_FAIL("Mismatch between VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT");
3513	}
3514	return tcu::TestStatus::pass("Querying succeeded");
3515}
3516
3517tcu::TestStatus testPhysicalDeviceFeaturePipelineProtectedAccessFeaturesEXT (Context& context)
3518{
3519	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3520	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3521	const InstanceDriver&		vki				(instance.getDriver());
3522	const int					count			= 2u;
3523	TestLog&					log				= context.getTestContext().getLog();
3524	VkPhysicalDeviceFeatures2	extFeatures;
3525	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3526
3527	VkPhysicalDevicePipelineProtectedAccessFeaturesEXT	devicePipelineProtectedAccessFeaturesEXT[count];
3528	const bool											isPipelineProtectedAccessFeaturesEXT = checkExtension(properties, "VK_EXT_pipeline_protected_access");
3529
3530	for (int ndx = 0; ndx < count; ++ndx)
3531	{
3532		deMemset(&devicePipelineProtectedAccessFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePipelineProtectedAccessFeaturesEXT));
3533		devicePipelineProtectedAccessFeaturesEXT[ndx].sType = isPipelineProtectedAccessFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3534		devicePipelineProtectedAccessFeaturesEXT[ndx].pNext = DE_NULL;
3535
3536		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3537		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3538		extFeatures.pNext = &devicePipelineProtectedAccessFeaturesEXT[ndx];
3539
3540		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3541	}
3542
3543	if (isPipelineProtectedAccessFeaturesEXT)
3544		log << TestLog::Message << devicePipelineProtectedAccessFeaturesEXT[0] << TestLog::EndMessage;
3545
3546	if (isPipelineProtectedAccessFeaturesEXT &&
3547		(devicePipelineProtectedAccessFeaturesEXT[0].pipelineProtectedAccess != devicePipelineProtectedAccessFeaturesEXT[1].pipelineProtectedAccess))
3548	{
3549		TCU_FAIL("Mismatch between VkPhysicalDevicePipelineProtectedAccessFeaturesEXT");
3550	}
3551	return tcu::TestStatus::pass("Querying succeeded");
3552}
3553
3554tcu::TestStatus testPhysicalDeviceFeatureYcbcr2Plane444FormatsFeaturesEXT (Context& context)
3555{
3556	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3557	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3558	const InstanceDriver&		vki				(instance.getDriver());
3559	const int					count			= 2u;
3560	TestLog&					log				= context.getTestContext().getLog();
3561	VkPhysicalDeviceFeatures2	extFeatures;
3562	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3563
3564	VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT	deviceYcbcr2Plane444FormatsFeaturesEXT[count];
3565	const bool											isYcbcr2Plane444FormatsFeaturesEXT = checkExtension(properties, "VK_EXT_ycbcr_2plane_444_formats");
3566
3567	for (int ndx = 0; ndx < count; ++ndx)
3568	{
3569		deMemset(&deviceYcbcr2Plane444FormatsFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT));
3570		deviceYcbcr2Plane444FormatsFeaturesEXT[ndx].sType = isYcbcr2Plane444FormatsFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3571		deviceYcbcr2Plane444FormatsFeaturesEXT[ndx].pNext = DE_NULL;
3572
3573		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3574		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3575		extFeatures.pNext = &deviceYcbcr2Plane444FormatsFeaturesEXT[ndx];
3576
3577		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3578	}
3579
3580	if (isYcbcr2Plane444FormatsFeaturesEXT)
3581		log << TestLog::Message << deviceYcbcr2Plane444FormatsFeaturesEXT[0] << TestLog::EndMessage;
3582
3583	if (isYcbcr2Plane444FormatsFeaturesEXT &&
3584		(deviceYcbcr2Plane444FormatsFeaturesEXT[0].ycbcr2plane444Formats != deviceYcbcr2Plane444FormatsFeaturesEXT[1].ycbcr2plane444Formats))
3585	{
3586		TCU_FAIL("Mismatch between VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT");
3587	}
3588	return tcu::TestStatus::pass("Querying succeeded");
3589}
3590
3591tcu::TestStatus testPhysicalDeviceFeatureProvokingVertexFeaturesEXT (Context& context)
3592{
3593	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3594	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3595	const InstanceDriver&		vki				(instance.getDriver());
3596	const int					count			= 2u;
3597	TestLog&					log				= context.getTestContext().getLog();
3598	VkPhysicalDeviceFeatures2	extFeatures;
3599	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3600
3601	VkPhysicalDeviceProvokingVertexFeaturesEXT	deviceProvokingVertexFeaturesEXT[count];
3602	const bool									isProvokingVertexFeaturesEXT = checkExtension(properties, "VK_EXT_provoking_vertex");
3603
3604	for (int ndx = 0; ndx < count; ++ndx)
3605	{
3606		deMemset(&deviceProvokingVertexFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceProvokingVertexFeaturesEXT));
3607		deviceProvokingVertexFeaturesEXT[ndx].sType = isProvokingVertexFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3608		deviceProvokingVertexFeaturesEXT[ndx].pNext = DE_NULL;
3609
3610		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3611		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3612		extFeatures.pNext = &deviceProvokingVertexFeaturesEXT[ndx];
3613
3614		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3615	}
3616
3617	if (isProvokingVertexFeaturesEXT)
3618		log << TestLog::Message << deviceProvokingVertexFeaturesEXT[0] << TestLog::EndMessage;
3619
3620	if (isProvokingVertexFeaturesEXT &&
3621		(deviceProvokingVertexFeaturesEXT[0].provokingVertexLast != deviceProvokingVertexFeaturesEXT[1].provokingVertexLast ||
3622		 deviceProvokingVertexFeaturesEXT[0].transformFeedbackPreservesProvokingVertex != deviceProvokingVertexFeaturesEXT[1].transformFeedbackPreservesProvokingVertex))
3623	{
3624		TCU_FAIL("Mismatch between VkPhysicalDeviceProvokingVertexFeaturesEXT");
3625	}
3626	return tcu::TestStatus::pass("Querying succeeded");
3627}
3628
3629tcu::TestStatus testPhysicalDeviceFeatureDescriptorBufferFeaturesEXT (Context& context)
3630{
3631	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3632	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3633	const InstanceDriver&		vki				(instance.getDriver());
3634	const int					count			= 2u;
3635	TestLog&					log				= context.getTestContext().getLog();
3636	VkPhysicalDeviceFeatures2	extFeatures;
3637	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3638
3639	VkPhysicalDeviceDescriptorBufferFeaturesEXT	deviceDescriptorBufferFeaturesEXT[count];
3640	const bool									isDescriptorBufferFeaturesEXT = checkExtension(properties, "VK_EXT_descriptor_buffer");
3641
3642	for (int ndx = 0; ndx < count; ++ndx)
3643	{
3644		deMemset(&deviceDescriptorBufferFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDescriptorBufferFeaturesEXT));
3645		deviceDescriptorBufferFeaturesEXT[ndx].sType = isDescriptorBufferFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3646		deviceDescriptorBufferFeaturesEXT[ndx].pNext = DE_NULL;
3647
3648		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3649		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3650		extFeatures.pNext = &deviceDescriptorBufferFeaturesEXT[ndx];
3651
3652		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3653	}
3654
3655	if (isDescriptorBufferFeaturesEXT)
3656		log << TestLog::Message << deviceDescriptorBufferFeaturesEXT[0] << TestLog::EndMessage;
3657
3658	if (isDescriptorBufferFeaturesEXT &&
3659		(deviceDescriptorBufferFeaturesEXT[0].descriptorBuffer != deviceDescriptorBufferFeaturesEXT[1].descriptorBuffer ||
3660		 deviceDescriptorBufferFeaturesEXT[0].descriptorBufferCaptureReplay != deviceDescriptorBufferFeaturesEXT[1].descriptorBufferCaptureReplay ||
3661		 deviceDescriptorBufferFeaturesEXT[0].descriptorBufferImageLayoutIgnored != deviceDescriptorBufferFeaturesEXT[1].descriptorBufferImageLayoutIgnored ||
3662		 deviceDescriptorBufferFeaturesEXT[0].descriptorBufferPushDescriptors != deviceDescriptorBufferFeaturesEXT[1].descriptorBufferPushDescriptors))
3663	{
3664		TCU_FAIL("Mismatch between VkPhysicalDeviceDescriptorBufferFeaturesEXT");
3665	}
3666	return tcu::TestStatus::pass("Querying succeeded");
3667}
3668
3669tcu::TestStatus testPhysicalDeviceFeatureShaderIntegerDotProductFeatures (Context& context)
3670{
3671	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3672	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3673	const InstanceDriver&		vki				(instance.getDriver());
3674	const int					count			= 2u;
3675	TestLog&					log				= context.getTestContext().getLog();
3676	VkPhysicalDeviceFeatures2	extFeatures;
3677	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3678
3679	VkPhysicalDeviceShaderIntegerDotProductFeatures	deviceShaderIntegerDotProductFeatures[count];
3680	const bool										isShaderIntegerDotProductFeatures = checkExtension(properties, "VK_KHR_shader_integer_dot_product") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
3681
3682	for (int ndx = 0; ndx < count; ++ndx)
3683	{
3684		deMemset(&deviceShaderIntegerDotProductFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderIntegerDotProductFeatures));
3685		deviceShaderIntegerDotProductFeatures[ndx].sType = isShaderIntegerDotProductFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
3686		deviceShaderIntegerDotProductFeatures[ndx].pNext = DE_NULL;
3687
3688		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3689		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3690		extFeatures.pNext = &deviceShaderIntegerDotProductFeatures[ndx];
3691
3692		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3693	}
3694
3695	if (isShaderIntegerDotProductFeatures)
3696		log << TestLog::Message << deviceShaderIntegerDotProductFeatures[0] << TestLog::EndMessage;
3697
3698	if (isShaderIntegerDotProductFeatures &&
3699		(deviceShaderIntegerDotProductFeatures[0].shaderIntegerDotProduct != deviceShaderIntegerDotProductFeatures[1].shaderIntegerDotProduct))
3700	{
3701		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderIntegerDotProductFeatures");
3702	}
3703	return tcu::TestStatus::pass("Querying succeeded");
3704}
3705
3706tcu::TestStatus testPhysicalDeviceFeatureFragmentShaderBarycentricFeaturesKHR (Context& context)
3707{
3708	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3709	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3710	const InstanceDriver&		vki				(instance.getDriver());
3711	const int					count			= 2u;
3712	TestLog&					log				= context.getTestContext().getLog();
3713	VkPhysicalDeviceFeatures2	extFeatures;
3714	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3715
3716	VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR	deviceFragmentShaderBarycentricFeaturesKHR[count];
3717	const bool												isFragmentShaderBarycentricFeaturesKHR = checkExtension(properties, "VK_KHR_fragment_shader_barycentric");
3718
3719	for (int ndx = 0; ndx < count; ++ndx)
3720	{
3721		deMemset(&deviceFragmentShaderBarycentricFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR));
3722		deviceFragmentShaderBarycentricFeaturesKHR[ndx].sType = isFragmentShaderBarycentricFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
3723		deviceFragmentShaderBarycentricFeaturesKHR[ndx].pNext = DE_NULL;
3724
3725		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3726		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3727		extFeatures.pNext = &deviceFragmentShaderBarycentricFeaturesKHR[ndx];
3728
3729		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3730	}
3731
3732	if (isFragmentShaderBarycentricFeaturesKHR)
3733		log << TestLog::Message << deviceFragmentShaderBarycentricFeaturesKHR[0] << TestLog::EndMessage;
3734
3735	if (isFragmentShaderBarycentricFeaturesKHR &&
3736		(deviceFragmentShaderBarycentricFeaturesKHR[0].fragmentShaderBarycentric != deviceFragmentShaderBarycentricFeaturesKHR[1].fragmentShaderBarycentric))
3737	{
3738		TCU_FAIL("Mismatch between VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR");
3739	}
3740	return tcu::TestStatus::pass("Querying succeeded");
3741}
3742
3743tcu::TestStatus testPhysicalDeviceFeatureRGBA10X6FormatsFeaturesEXT (Context& context)
3744{
3745	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3746	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3747	const InstanceDriver&		vki				(instance.getDriver());
3748	const int					count			= 2u;
3749	TestLog&					log				= context.getTestContext().getLog();
3750	VkPhysicalDeviceFeatures2	extFeatures;
3751	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3752
3753	VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT	deviceRGBA10X6FormatsFeaturesEXT[count];
3754	const bool									isRGBA10X6FormatsFeaturesEXT = checkExtension(properties, "VK_EXT_rgba10x6_formats");
3755
3756	for (int ndx = 0; ndx < count; ++ndx)
3757	{
3758		deMemset(&deviceRGBA10X6FormatsFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT));
3759		deviceRGBA10X6FormatsFeaturesEXT[ndx].sType = isRGBA10X6FormatsFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3760		deviceRGBA10X6FormatsFeaturesEXT[ndx].pNext = DE_NULL;
3761
3762		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3763		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3764		extFeatures.pNext = &deviceRGBA10X6FormatsFeaturesEXT[ndx];
3765
3766		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3767	}
3768
3769	if (isRGBA10X6FormatsFeaturesEXT)
3770		log << TestLog::Message << deviceRGBA10X6FormatsFeaturesEXT[0] << TestLog::EndMessage;
3771
3772	if (isRGBA10X6FormatsFeaturesEXT &&
3773		(deviceRGBA10X6FormatsFeaturesEXT[0].formatRgba10x6WithoutYCbCrSampler != deviceRGBA10X6FormatsFeaturesEXT[1].formatRgba10x6WithoutYCbCrSampler))
3774	{
3775		TCU_FAIL("Mismatch between VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT");
3776	}
3777	return tcu::TestStatus::pass("Querying succeeded");
3778}
3779
3780tcu::TestStatus testPhysicalDeviceFeatureDynamicRenderingFeatures (Context& context)
3781{
3782	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3783	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3784	const InstanceDriver&		vki				(instance.getDriver());
3785	const int					count			= 2u;
3786	TestLog&					log				= context.getTestContext().getLog();
3787	VkPhysicalDeviceFeatures2	extFeatures;
3788	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3789
3790	VkPhysicalDeviceDynamicRenderingFeatures	deviceDynamicRenderingFeatures[count];
3791	const bool									isDynamicRenderingFeatures = checkExtension(properties, "VK_KHR_dynamic_rendering") || context.contextSupports(vk::ApiVersion(0, 1, 3, 0));
3792
3793	for (int ndx = 0; ndx < count; ++ndx)
3794	{
3795		deMemset(&deviceDynamicRenderingFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDynamicRenderingFeatures));
3796		deviceDynamicRenderingFeatures[ndx].sType = isDynamicRenderingFeatures ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES : VK_STRUCTURE_TYPE_MAX_ENUM;
3797		deviceDynamicRenderingFeatures[ndx].pNext = DE_NULL;
3798
3799		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3800		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3801		extFeatures.pNext = &deviceDynamicRenderingFeatures[ndx];
3802
3803		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3804	}
3805
3806	if (isDynamicRenderingFeatures)
3807		log << TestLog::Message << deviceDynamicRenderingFeatures[0] << TestLog::EndMessage;
3808
3809	if (isDynamicRenderingFeatures &&
3810		(deviceDynamicRenderingFeatures[0].dynamicRendering != deviceDynamicRenderingFeatures[1].dynamicRendering))
3811	{
3812		TCU_FAIL("Mismatch between VkPhysicalDeviceDynamicRenderingFeatures");
3813	}
3814	return tcu::TestStatus::pass("Querying succeeded");
3815}
3816
3817tcu::TestStatus testPhysicalDeviceFeatureImageViewMinLodFeaturesEXT (Context& context)
3818{
3819	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3820	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3821	const InstanceDriver&		vki				(instance.getDriver());
3822	const int					count			= 2u;
3823	TestLog&					log				= context.getTestContext().getLog();
3824	VkPhysicalDeviceFeatures2	extFeatures;
3825	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3826
3827	VkPhysicalDeviceImageViewMinLodFeaturesEXT	deviceImageViewMinLodFeaturesEXT[count];
3828	const bool									isImageViewMinLodFeaturesEXT = checkExtension(properties, "VK_EXT_image_view_min_lod");
3829
3830	for (int ndx = 0; ndx < count; ++ndx)
3831	{
3832		deMemset(&deviceImageViewMinLodFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImageViewMinLodFeaturesEXT));
3833		deviceImageViewMinLodFeaturesEXT[ndx].sType = isImageViewMinLodFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3834		deviceImageViewMinLodFeaturesEXT[ndx].pNext = DE_NULL;
3835
3836		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3837		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3838		extFeatures.pNext = &deviceImageViewMinLodFeaturesEXT[ndx];
3839
3840		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3841	}
3842
3843	if (isImageViewMinLodFeaturesEXT)
3844		log << TestLog::Message << deviceImageViewMinLodFeaturesEXT[0] << TestLog::EndMessage;
3845
3846	if (isImageViewMinLodFeaturesEXT &&
3847		(deviceImageViewMinLodFeaturesEXT[0].minLod != deviceImageViewMinLodFeaturesEXT[1].minLod))
3848	{
3849		TCU_FAIL("Mismatch between VkPhysicalDeviceImageViewMinLodFeaturesEXT");
3850	}
3851	return tcu::TestStatus::pass("Querying succeeded");
3852}
3853
3854tcu::TestStatus testPhysicalDeviceFeatureRasterizationOrderAttachmentAccessFeaturesEXT (Context& context)
3855{
3856	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3857	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3858	const InstanceDriver&		vki				(instance.getDriver());
3859	const int					count			= 2u;
3860	TestLog&					log				= context.getTestContext().getLog();
3861	VkPhysicalDeviceFeatures2	extFeatures;
3862	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3863
3864	VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT	deviceRasterizationOrderAttachmentAccessFeaturesEXT[count];
3865	const bool														isRasterizationOrderAttachmentAccessFeaturesEXT = checkExtension(properties, "VK_EXT_rasterization_order_attachment_access");
3866
3867	for (int ndx = 0; ndx < count; ++ndx)
3868	{
3869		deMemset(&deviceRasterizationOrderAttachmentAccessFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT));
3870		deviceRasterizationOrderAttachmentAccessFeaturesEXT[ndx].sType = isRasterizationOrderAttachmentAccessFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3871		deviceRasterizationOrderAttachmentAccessFeaturesEXT[ndx].pNext = DE_NULL;
3872
3873		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3874		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3875		extFeatures.pNext = &deviceRasterizationOrderAttachmentAccessFeaturesEXT[ndx];
3876
3877		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3878	}
3879
3880	if (isRasterizationOrderAttachmentAccessFeaturesEXT)
3881		log << TestLog::Message << deviceRasterizationOrderAttachmentAccessFeaturesEXT[0] << TestLog::EndMessage;
3882
3883	if (isRasterizationOrderAttachmentAccessFeaturesEXT &&
3884		(deviceRasterizationOrderAttachmentAccessFeaturesEXT[0].rasterizationOrderColorAttachmentAccess != deviceRasterizationOrderAttachmentAccessFeaturesEXT[1].rasterizationOrderColorAttachmentAccess ||
3885		 deviceRasterizationOrderAttachmentAccessFeaturesEXT[0].rasterizationOrderDepthAttachmentAccess != deviceRasterizationOrderAttachmentAccessFeaturesEXT[1].rasterizationOrderDepthAttachmentAccess ||
3886		 deviceRasterizationOrderAttachmentAccessFeaturesEXT[0].rasterizationOrderStencilAttachmentAccess != deviceRasterizationOrderAttachmentAccessFeaturesEXT[1].rasterizationOrderStencilAttachmentAccess))
3887	{
3888		TCU_FAIL("Mismatch between VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT");
3889	}
3890	return tcu::TestStatus::pass("Querying succeeded");
3891}
3892
3893tcu::TestStatus testPhysicalDeviceFeatureGraphicsPipelineLibraryFeaturesEXT (Context& context)
3894{
3895	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3896	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3897	const InstanceDriver&		vki				(instance.getDriver());
3898	const int					count			= 2u;
3899	TestLog&					log				= context.getTestContext().getLog();
3900	VkPhysicalDeviceFeatures2	extFeatures;
3901	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3902
3903	VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT	deviceGraphicsPipelineLibraryFeaturesEXT[count];
3904	const bool											isGraphicsPipelineLibraryFeaturesEXT = checkExtension(properties, "VK_EXT_graphics_pipeline_library");
3905
3906	for (int ndx = 0; ndx < count; ++ndx)
3907	{
3908		deMemset(&deviceGraphicsPipelineLibraryFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT));
3909		deviceGraphicsPipelineLibraryFeaturesEXT[ndx].sType = isGraphicsPipelineLibraryFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3910		deviceGraphicsPipelineLibraryFeaturesEXT[ndx].pNext = DE_NULL;
3911
3912		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3913		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3914		extFeatures.pNext = &deviceGraphicsPipelineLibraryFeaturesEXT[ndx];
3915
3916		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3917	}
3918
3919	if (isGraphicsPipelineLibraryFeaturesEXT)
3920		log << TestLog::Message << deviceGraphicsPipelineLibraryFeaturesEXT[0] << TestLog::EndMessage;
3921
3922	if (isGraphicsPipelineLibraryFeaturesEXT &&
3923		(deviceGraphicsPipelineLibraryFeaturesEXT[0].graphicsPipelineLibrary != deviceGraphicsPipelineLibraryFeaturesEXT[1].graphicsPipelineLibrary))
3924	{
3925		TCU_FAIL("Mismatch between VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT");
3926	}
3927	return tcu::TestStatus::pass("Querying succeeded");
3928}
3929
3930tcu::TestStatus testPhysicalDeviceFeatureShaderModuleIdentifierFeaturesEXT (Context& context)
3931{
3932	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3933	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3934	const InstanceDriver&		vki				(instance.getDriver());
3935	const int					count			= 2u;
3936	TestLog&					log				= context.getTestContext().getLog();
3937	VkPhysicalDeviceFeatures2	extFeatures;
3938	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3939
3940	VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT	deviceShaderModuleIdentifierFeaturesEXT[count];
3941	const bool											isShaderModuleIdentifierFeaturesEXT = checkExtension(properties, "VK_EXT_shader_module_identifier");
3942
3943	for (int ndx = 0; ndx < count; ++ndx)
3944	{
3945		deMemset(&deviceShaderModuleIdentifierFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT));
3946		deviceShaderModuleIdentifierFeaturesEXT[ndx].sType = isShaderModuleIdentifierFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3947		deviceShaderModuleIdentifierFeaturesEXT[ndx].pNext = DE_NULL;
3948
3949		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3950		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3951		extFeatures.pNext = &deviceShaderModuleIdentifierFeaturesEXT[ndx];
3952
3953		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3954	}
3955
3956	if (isShaderModuleIdentifierFeaturesEXT)
3957		log << TestLog::Message << deviceShaderModuleIdentifierFeaturesEXT[0] << TestLog::EndMessage;
3958
3959	if (isShaderModuleIdentifierFeaturesEXT &&
3960		(deviceShaderModuleIdentifierFeaturesEXT[0].shaderModuleIdentifier != deviceShaderModuleIdentifierFeaturesEXT[1].shaderModuleIdentifier))
3961	{
3962		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT");
3963	}
3964	return tcu::TestStatus::pass("Querying succeeded");
3965}
3966
3967tcu::TestStatus testPhysicalDeviceFeatureImageCompressionControlFeaturesEXT (Context& context)
3968{
3969	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
3970	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
3971	const InstanceDriver&		vki				(instance.getDriver());
3972	const int					count			= 2u;
3973	TestLog&					log				= context.getTestContext().getLog();
3974	VkPhysicalDeviceFeatures2	extFeatures;
3975	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
3976
3977	VkPhysicalDeviceImageCompressionControlFeaturesEXT	deviceImageCompressionControlFeaturesEXT[count];
3978	const bool											isImageCompressionControlFeaturesEXT = checkExtension(properties, "VK_EXT_image_compression_control");
3979
3980	for (int ndx = 0; ndx < count; ++ndx)
3981	{
3982		deMemset(&deviceImageCompressionControlFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImageCompressionControlFeaturesEXT));
3983		deviceImageCompressionControlFeaturesEXT[ndx].sType = isImageCompressionControlFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
3984		deviceImageCompressionControlFeaturesEXT[ndx].pNext = DE_NULL;
3985
3986		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
3987		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
3988		extFeatures.pNext = &deviceImageCompressionControlFeaturesEXT[ndx];
3989
3990		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
3991	}
3992
3993	if (isImageCompressionControlFeaturesEXT)
3994		log << TestLog::Message << deviceImageCompressionControlFeaturesEXT[0] << TestLog::EndMessage;
3995
3996	if (isImageCompressionControlFeaturesEXT &&
3997		(deviceImageCompressionControlFeaturesEXT[0].imageCompressionControl != deviceImageCompressionControlFeaturesEXT[1].imageCompressionControl))
3998	{
3999		TCU_FAIL("Mismatch between VkPhysicalDeviceImageCompressionControlFeaturesEXT");
4000	}
4001	return tcu::TestStatus::pass("Querying succeeded");
4002}
4003
4004tcu::TestStatus testPhysicalDeviceFeatureImageCompressionControlSwapchainFeaturesEXT (Context& context)
4005{
4006	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4007	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4008	const InstanceDriver&		vki				(instance.getDriver());
4009	const int					count			= 2u;
4010	TestLog&					log				= context.getTestContext().getLog();
4011	VkPhysicalDeviceFeatures2	extFeatures;
4012	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4013
4014	VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT	deviceImageCompressionControlSwapchainFeaturesEXT[count];
4015	const bool													isImageCompressionControlSwapchainFeaturesEXT = checkExtension(properties, "VK_EXT_image_compression_control_swapchain");
4016
4017	for (int ndx = 0; ndx < count; ++ndx)
4018	{
4019		deMemset(&deviceImageCompressionControlSwapchainFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT));
4020		deviceImageCompressionControlSwapchainFeaturesEXT[ndx].sType = isImageCompressionControlSwapchainFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4021		deviceImageCompressionControlSwapchainFeaturesEXT[ndx].pNext = DE_NULL;
4022
4023		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4024		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4025		extFeatures.pNext = &deviceImageCompressionControlSwapchainFeaturesEXT[ndx];
4026
4027		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4028	}
4029
4030	if (isImageCompressionControlSwapchainFeaturesEXT)
4031		log << TestLog::Message << deviceImageCompressionControlSwapchainFeaturesEXT[0] << TestLog::EndMessage;
4032
4033	if (isImageCompressionControlSwapchainFeaturesEXT &&
4034		(deviceImageCompressionControlSwapchainFeaturesEXT[0].imageCompressionControlSwapchain != deviceImageCompressionControlSwapchainFeaturesEXT[1].imageCompressionControlSwapchain))
4035	{
4036		TCU_FAIL("Mismatch between VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT");
4037	}
4038	return tcu::TestStatus::pass("Querying succeeded");
4039}
4040
4041tcu::TestStatus testPhysicalDeviceFeatureSubpassMergeFeedbackFeaturesEXT (Context& context)
4042{
4043	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4044	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4045	const InstanceDriver&		vki				(instance.getDriver());
4046	const int					count			= 2u;
4047	TestLog&					log				= context.getTestContext().getLog();
4048	VkPhysicalDeviceFeatures2	extFeatures;
4049	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4050
4051	VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT	deviceSubpassMergeFeedbackFeaturesEXT[count];
4052	const bool										isSubpassMergeFeedbackFeaturesEXT = checkExtension(properties, "VK_EXT_subpass_merge_feedback");
4053
4054	for (int ndx = 0; ndx < count; ++ndx)
4055	{
4056		deMemset(&deviceSubpassMergeFeedbackFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT));
4057		deviceSubpassMergeFeedbackFeaturesEXT[ndx].sType = isSubpassMergeFeedbackFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4058		deviceSubpassMergeFeedbackFeaturesEXT[ndx].pNext = DE_NULL;
4059
4060		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4061		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4062		extFeatures.pNext = &deviceSubpassMergeFeedbackFeaturesEXT[ndx];
4063
4064		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4065	}
4066
4067	if (isSubpassMergeFeedbackFeaturesEXT)
4068		log << TestLog::Message << deviceSubpassMergeFeedbackFeaturesEXT[0] << TestLog::EndMessage;
4069
4070	if (isSubpassMergeFeedbackFeaturesEXT &&
4071		(deviceSubpassMergeFeedbackFeaturesEXT[0].subpassMergeFeedback != deviceSubpassMergeFeedbackFeaturesEXT[1].subpassMergeFeedback))
4072	{
4073		TCU_FAIL("Mismatch between VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT");
4074	}
4075	return tcu::TestStatus::pass("Querying succeeded");
4076}
4077
4078tcu::TestStatus testPhysicalDeviceFeatureOpacityMicromapFeaturesEXT (Context& context)
4079{
4080	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4081	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4082	const InstanceDriver&		vki				(instance.getDriver());
4083	const int					count			= 2u;
4084	TestLog&					log				= context.getTestContext().getLog();
4085	VkPhysicalDeviceFeatures2	extFeatures;
4086	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4087
4088	VkPhysicalDeviceOpacityMicromapFeaturesEXT	deviceOpacityMicromapFeaturesEXT[count];
4089	const bool									isOpacityMicromapFeaturesEXT = checkExtension(properties, "VK_EXT_opacity_micromap");
4090
4091	for (int ndx = 0; ndx < count; ++ndx)
4092	{
4093		deMemset(&deviceOpacityMicromapFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceOpacityMicromapFeaturesEXT));
4094		deviceOpacityMicromapFeaturesEXT[ndx].sType = isOpacityMicromapFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4095		deviceOpacityMicromapFeaturesEXT[ndx].pNext = DE_NULL;
4096
4097		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4098		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4099		extFeatures.pNext = &deviceOpacityMicromapFeaturesEXT[ndx];
4100
4101		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4102	}
4103
4104	if (isOpacityMicromapFeaturesEXT)
4105		log << TestLog::Message << deviceOpacityMicromapFeaturesEXT[0] << TestLog::EndMessage;
4106
4107	if (isOpacityMicromapFeaturesEXT &&
4108		(deviceOpacityMicromapFeaturesEXT[0].micromap != deviceOpacityMicromapFeaturesEXT[1].micromap ||
4109		 deviceOpacityMicromapFeaturesEXT[0].micromapCaptureReplay != deviceOpacityMicromapFeaturesEXT[1].micromapCaptureReplay ||
4110		 deviceOpacityMicromapFeaturesEXT[0].micromapHostCommands != deviceOpacityMicromapFeaturesEXT[1].micromapHostCommands))
4111	{
4112		TCU_FAIL("Mismatch between VkPhysicalDeviceOpacityMicromapFeaturesEXT");
4113	}
4114	return tcu::TestStatus::pass("Querying succeeded");
4115}
4116
4117tcu::TestStatus testPhysicalDeviceFeaturePipelinePropertiesFeaturesEXT (Context& context)
4118{
4119	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4120	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4121	const InstanceDriver&		vki				(instance.getDriver());
4122	const int					count			= 2u;
4123	TestLog&					log				= context.getTestContext().getLog();
4124	VkPhysicalDeviceFeatures2	extFeatures;
4125	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4126
4127	VkPhysicalDevicePipelinePropertiesFeaturesEXT	devicePipelinePropertiesFeaturesEXT[count];
4128	const bool										isPipelinePropertiesFeaturesEXT = checkExtension(properties, "VK_EXT_pipeline_properties");
4129
4130	for (int ndx = 0; ndx < count; ++ndx)
4131	{
4132		deMemset(&devicePipelinePropertiesFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePipelinePropertiesFeaturesEXT));
4133		devicePipelinePropertiesFeaturesEXT[ndx].sType = isPipelinePropertiesFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4134		devicePipelinePropertiesFeaturesEXT[ndx].pNext = DE_NULL;
4135
4136		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4137		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4138		extFeatures.pNext = &devicePipelinePropertiesFeaturesEXT[ndx];
4139
4140		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4141	}
4142
4143	if (isPipelinePropertiesFeaturesEXT)
4144		log << TestLog::Message << devicePipelinePropertiesFeaturesEXT[0] << TestLog::EndMessage;
4145
4146	if (isPipelinePropertiesFeaturesEXT &&
4147		(devicePipelinePropertiesFeaturesEXT[0].pipelinePropertiesIdentifier != devicePipelinePropertiesFeaturesEXT[1].pipelinePropertiesIdentifier))
4148	{
4149		TCU_FAIL("Mismatch between VkPhysicalDevicePipelinePropertiesFeaturesEXT");
4150	}
4151	return tcu::TestStatus::pass("Querying succeeded");
4152}
4153
4154tcu::TestStatus testPhysicalDeviceFeatureNonSeamlessCubeMapFeaturesEXT (Context& context)
4155{
4156	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4157	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4158	const InstanceDriver&		vki				(instance.getDriver());
4159	const int					count			= 2u;
4160	TestLog&					log				= context.getTestContext().getLog();
4161	VkPhysicalDeviceFeatures2	extFeatures;
4162	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4163
4164	VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT	deviceNonSeamlessCubeMapFeaturesEXT[count];
4165	const bool										isNonSeamlessCubeMapFeaturesEXT = checkExtension(properties, "VK_EXT_non_seamless_cube_map");
4166
4167	for (int ndx = 0; ndx < count; ++ndx)
4168	{
4169		deMemset(&deviceNonSeamlessCubeMapFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT));
4170		deviceNonSeamlessCubeMapFeaturesEXT[ndx].sType = isNonSeamlessCubeMapFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4171		deviceNonSeamlessCubeMapFeaturesEXT[ndx].pNext = DE_NULL;
4172
4173		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4174		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4175		extFeatures.pNext = &deviceNonSeamlessCubeMapFeaturesEXT[ndx];
4176
4177		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4178	}
4179
4180	if (isNonSeamlessCubeMapFeaturesEXT)
4181		log << TestLog::Message << deviceNonSeamlessCubeMapFeaturesEXT[0] << TestLog::EndMessage;
4182
4183	if (isNonSeamlessCubeMapFeaturesEXT &&
4184		(deviceNonSeamlessCubeMapFeaturesEXT[0].nonSeamlessCubeMap != deviceNonSeamlessCubeMapFeaturesEXT[1].nonSeamlessCubeMap))
4185	{
4186		TCU_FAIL("Mismatch between VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT");
4187	}
4188	return tcu::TestStatus::pass("Querying succeeded");
4189}
4190
4191tcu::TestStatus testPhysicalDeviceFeaturePipelineRobustnessFeaturesEXT (Context& context)
4192{
4193	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4194	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4195	const InstanceDriver&		vki				(instance.getDriver());
4196	const int					count			= 2u;
4197	TestLog&					log				= context.getTestContext().getLog();
4198	VkPhysicalDeviceFeatures2	extFeatures;
4199	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4200
4201	VkPhysicalDevicePipelineRobustnessFeaturesEXT	devicePipelineRobustnessFeaturesEXT[count];
4202	const bool										isPipelineRobustnessFeaturesEXT = checkExtension(properties, "VK_EXT_pipeline_robustness");
4203
4204	for (int ndx = 0; ndx < count; ++ndx)
4205	{
4206		deMemset(&devicePipelineRobustnessFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePipelineRobustnessFeaturesEXT));
4207		devicePipelineRobustnessFeaturesEXT[ndx].sType = isPipelineRobustnessFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4208		devicePipelineRobustnessFeaturesEXT[ndx].pNext = DE_NULL;
4209
4210		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4211		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4212		extFeatures.pNext = &devicePipelineRobustnessFeaturesEXT[ndx];
4213
4214		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4215	}
4216
4217	if (isPipelineRobustnessFeaturesEXT)
4218		log << TestLog::Message << devicePipelineRobustnessFeaturesEXT[0] << TestLog::EndMessage;
4219
4220	if (isPipelineRobustnessFeaturesEXT &&
4221		(devicePipelineRobustnessFeaturesEXT[0].pipelineRobustness != devicePipelineRobustnessFeaturesEXT[1].pipelineRobustness))
4222	{
4223		TCU_FAIL("Mismatch between VkPhysicalDevicePipelineRobustnessFeaturesEXT");
4224	}
4225	return tcu::TestStatus::pass("Querying succeeded");
4226}
4227
4228tcu::TestStatus testPhysicalDeviceFeatureAmigoProfilingFeaturesSEC (Context& context)
4229{
4230	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4231	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4232	const InstanceDriver&		vki				(instance.getDriver());
4233	const int					count			= 2u;
4234	TestLog&					log				= context.getTestContext().getLog();
4235	VkPhysicalDeviceFeatures2	extFeatures;
4236	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4237
4238	VkPhysicalDeviceAmigoProfilingFeaturesSEC	deviceAmigoProfilingFeaturesSEC[count];
4239	const bool									isAmigoProfilingFeaturesSEC = checkExtension(properties, "VK_SEC_amigo_profiling");
4240
4241	for (int ndx = 0; ndx < count; ++ndx)
4242	{
4243		deMemset(&deviceAmigoProfilingFeaturesSEC[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceAmigoProfilingFeaturesSEC));
4244		deviceAmigoProfilingFeaturesSEC[ndx].sType = isAmigoProfilingFeaturesSEC ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC : VK_STRUCTURE_TYPE_MAX_ENUM;
4245		deviceAmigoProfilingFeaturesSEC[ndx].pNext = DE_NULL;
4246
4247		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4248		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4249		extFeatures.pNext = &deviceAmigoProfilingFeaturesSEC[ndx];
4250
4251		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4252	}
4253
4254	if (isAmigoProfilingFeaturesSEC)
4255		log << TestLog::Message << deviceAmigoProfilingFeaturesSEC[0] << TestLog::EndMessage;
4256
4257	if (isAmigoProfilingFeaturesSEC &&
4258		(deviceAmigoProfilingFeaturesSEC[0].amigoProfiling != deviceAmigoProfilingFeaturesSEC[1].amigoProfiling))
4259	{
4260		TCU_FAIL("Mismatch between VkPhysicalDeviceAmigoProfilingFeaturesSEC");
4261	}
4262	return tcu::TestStatus::pass("Querying succeeded");
4263}
4264
4265tcu::TestStatus testPhysicalDeviceFeatureAttachmentFeedbackLoopLayoutFeaturesEXT (Context& context)
4266{
4267	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4268	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4269	const InstanceDriver&		vki				(instance.getDriver());
4270	const int					count			= 2u;
4271	TestLog&					log				= context.getTestContext().getLog();
4272	VkPhysicalDeviceFeatures2	extFeatures;
4273	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4274
4275	VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT	deviceAttachmentFeedbackLoopLayoutFeaturesEXT[count];
4276	const bool												isAttachmentFeedbackLoopLayoutFeaturesEXT = checkExtension(properties, "VK_EXT_attachment_feedback_loop_layout");
4277
4278	for (int ndx = 0; ndx < count; ++ndx)
4279	{
4280		deMemset(&deviceAttachmentFeedbackLoopLayoutFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT));
4281		deviceAttachmentFeedbackLoopLayoutFeaturesEXT[ndx].sType = isAttachmentFeedbackLoopLayoutFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4282		deviceAttachmentFeedbackLoopLayoutFeaturesEXT[ndx].pNext = DE_NULL;
4283
4284		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4285		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4286		extFeatures.pNext = &deviceAttachmentFeedbackLoopLayoutFeaturesEXT[ndx];
4287
4288		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4289	}
4290
4291	if (isAttachmentFeedbackLoopLayoutFeaturesEXT)
4292		log << TestLog::Message << deviceAttachmentFeedbackLoopLayoutFeaturesEXT[0] << TestLog::EndMessage;
4293
4294	if (isAttachmentFeedbackLoopLayoutFeaturesEXT &&
4295		(deviceAttachmentFeedbackLoopLayoutFeaturesEXT[0].attachmentFeedbackLoopLayout != deviceAttachmentFeedbackLoopLayoutFeaturesEXT[1].attachmentFeedbackLoopLayout))
4296	{
4297		TCU_FAIL("Mismatch between VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT");
4298	}
4299	return tcu::TestStatus::pass("Querying succeeded");
4300}
4301
4302tcu::TestStatus testPhysicalDeviceFeatureDepthClampZeroOneFeaturesEXT (Context& context)
4303{
4304	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4305	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4306	const InstanceDriver&		vki				(instance.getDriver());
4307	const int					count			= 2u;
4308	TestLog&					log				= context.getTestContext().getLog();
4309	VkPhysicalDeviceFeatures2	extFeatures;
4310	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4311
4312	VkPhysicalDeviceDepthClampZeroOneFeaturesEXT	deviceDepthClampZeroOneFeaturesEXT[count];
4313	const bool										isDepthClampZeroOneFeaturesEXT = checkExtension(properties, "VK_EXT_depth_clamp_zero_one");
4314
4315	for (int ndx = 0; ndx < count; ++ndx)
4316	{
4317		deMemset(&deviceDepthClampZeroOneFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDepthClampZeroOneFeaturesEXT));
4318		deviceDepthClampZeroOneFeaturesEXT[ndx].sType = isDepthClampZeroOneFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4319		deviceDepthClampZeroOneFeaturesEXT[ndx].pNext = DE_NULL;
4320
4321		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4322		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4323		extFeatures.pNext = &deviceDepthClampZeroOneFeaturesEXT[ndx];
4324
4325		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4326	}
4327
4328	if (isDepthClampZeroOneFeaturesEXT)
4329		log << TestLog::Message << deviceDepthClampZeroOneFeaturesEXT[0] << TestLog::EndMessage;
4330
4331	if (isDepthClampZeroOneFeaturesEXT &&
4332		(deviceDepthClampZeroOneFeaturesEXT[0].depthClampZeroOne != deviceDepthClampZeroOneFeaturesEXT[1].depthClampZeroOne))
4333	{
4334		TCU_FAIL("Mismatch between VkPhysicalDeviceDepthClampZeroOneFeaturesEXT");
4335	}
4336	return tcu::TestStatus::pass("Querying succeeded");
4337}
4338
4339tcu::TestStatus testPhysicalDeviceFeatureAddressBindingReportFeaturesEXT (Context& context)
4340{
4341	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4342	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4343	const InstanceDriver&		vki				(instance.getDriver());
4344	const int					count			= 2u;
4345	TestLog&					log				= context.getTestContext().getLog();
4346	VkPhysicalDeviceFeatures2	extFeatures;
4347	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4348
4349	VkPhysicalDeviceAddressBindingReportFeaturesEXT	deviceAddressBindingReportFeaturesEXT[count];
4350	const bool										isAddressBindingReportFeaturesEXT = checkExtension(properties, "VK_EXT_device_address_binding_report");
4351
4352	for (int ndx = 0; ndx < count; ++ndx)
4353	{
4354		deMemset(&deviceAddressBindingReportFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceAddressBindingReportFeaturesEXT));
4355		deviceAddressBindingReportFeaturesEXT[ndx].sType = isAddressBindingReportFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4356		deviceAddressBindingReportFeaturesEXT[ndx].pNext = DE_NULL;
4357
4358		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4359		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4360		extFeatures.pNext = &deviceAddressBindingReportFeaturesEXT[ndx];
4361
4362		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4363	}
4364
4365	if (isAddressBindingReportFeaturesEXT)
4366		log << TestLog::Message << deviceAddressBindingReportFeaturesEXT[0] << TestLog::EndMessage;
4367
4368	if (isAddressBindingReportFeaturesEXT &&
4369		(deviceAddressBindingReportFeaturesEXT[0].reportAddressBinding != deviceAddressBindingReportFeaturesEXT[1].reportAddressBinding))
4370	{
4371		TCU_FAIL("Mismatch between VkPhysicalDeviceAddressBindingReportFeaturesEXT");
4372	}
4373	return tcu::TestStatus::pass("Querying succeeded");
4374}
4375
4376tcu::TestStatus testPhysicalDeviceFeatureFaultFeaturesEXT (Context& context)
4377{
4378	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4379	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4380	const InstanceDriver&		vki				(instance.getDriver());
4381	const int					count			= 2u;
4382	TestLog&					log				= context.getTestContext().getLog();
4383	VkPhysicalDeviceFeatures2	extFeatures;
4384	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4385
4386	VkPhysicalDeviceFaultFeaturesEXT	deviceFaultFeaturesEXT[count];
4387	const bool							isFaultFeaturesEXT = checkExtension(properties, "VK_EXT_device_fault");
4388
4389	for (int ndx = 0; ndx < count; ++ndx)
4390	{
4391		deMemset(&deviceFaultFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceFaultFeaturesEXT));
4392		deviceFaultFeaturesEXT[ndx].sType = isFaultFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4393		deviceFaultFeaturesEXT[ndx].pNext = DE_NULL;
4394
4395		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4396		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4397		extFeatures.pNext = &deviceFaultFeaturesEXT[ndx];
4398
4399		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4400	}
4401
4402	if (isFaultFeaturesEXT)
4403		log << TestLog::Message << deviceFaultFeaturesEXT[0] << TestLog::EndMessage;
4404
4405	if (isFaultFeaturesEXT &&
4406		(deviceFaultFeaturesEXT[0].deviceFault != deviceFaultFeaturesEXT[1].deviceFault ||
4407		 deviceFaultFeaturesEXT[0].deviceFaultVendorBinary != deviceFaultFeaturesEXT[1].deviceFaultVendorBinary))
4408	{
4409		TCU_FAIL("Mismatch between VkPhysicalDeviceFaultFeaturesEXT");
4410	}
4411	return tcu::TestStatus::pass("Querying succeeded");
4412}
4413
4414tcu::TestStatus testPhysicalDeviceFeaturePipelineLibraryGroupHandlesFeaturesEXT (Context& context)
4415{
4416	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4417	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4418	const InstanceDriver&		vki				(instance.getDriver());
4419	const int					count			= 2u;
4420	TestLog&					log				= context.getTestContext().getLog();
4421	VkPhysicalDeviceFeatures2	extFeatures;
4422	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4423
4424	VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT	devicePipelineLibraryGroupHandlesFeaturesEXT[count];
4425	const bool												isPipelineLibraryGroupHandlesFeaturesEXT = checkExtension(properties, "VK_EXT_pipeline_library_group_handles");
4426
4427	for (int ndx = 0; ndx < count; ++ndx)
4428	{
4429		deMemset(&devicePipelineLibraryGroupHandlesFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT));
4430		devicePipelineLibraryGroupHandlesFeaturesEXT[ndx].sType = isPipelineLibraryGroupHandlesFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4431		devicePipelineLibraryGroupHandlesFeaturesEXT[ndx].pNext = DE_NULL;
4432
4433		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4434		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4435		extFeatures.pNext = &devicePipelineLibraryGroupHandlesFeaturesEXT[ndx];
4436
4437		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4438	}
4439
4440	if (isPipelineLibraryGroupHandlesFeaturesEXT)
4441		log << TestLog::Message << devicePipelineLibraryGroupHandlesFeaturesEXT[0] << TestLog::EndMessage;
4442
4443	if (isPipelineLibraryGroupHandlesFeaturesEXT &&
4444		(devicePipelineLibraryGroupHandlesFeaturesEXT[0].pipelineLibraryGroupHandles != devicePipelineLibraryGroupHandlesFeaturesEXT[1].pipelineLibraryGroupHandles))
4445	{
4446		TCU_FAIL("Mismatch between VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT");
4447	}
4448	return tcu::TestStatus::pass("Querying succeeded");
4449}
4450
4451tcu::TestStatus testPhysicalDeviceFeatureDynamicRenderingUnusedAttachmentsFeaturesEXT (Context& context)
4452{
4453	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4454	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4455	const InstanceDriver&		vki				(instance.getDriver());
4456	const int					count			= 2u;
4457	TestLog&					log				= context.getTestContext().getLog();
4458	VkPhysicalDeviceFeatures2	extFeatures;
4459	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4460
4461	VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT	deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[count];
4462	const bool														isDynamicRenderingUnusedAttachmentsFeaturesEXT = checkExtension(properties, "VK_EXT_dynamic_rendering_unused_attachments");
4463
4464	for (int ndx = 0; ndx < count; ++ndx)
4465	{
4466		deMemset(&deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT));
4467		deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[ndx].sType = isDynamicRenderingUnusedAttachmentsFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4468		deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[ndx].pNext = DE_NULL;
4469
4470		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4471		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4472		extFeatures.pNext = &deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[ndx];
4473
4474		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4475	}
4476
4477	if (isDynamicRenderingUnusedAttachmentsFeaturesEXT)
4478		log << TestLog::Message << deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[0] << TestLog::EndMessage;
4479
4480	if (isDynamicRenderingUnusedAttachmentsFeaturesEXT &&
4481		(deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[0].dynamicRenderingUnusedAttachments != deviceDynamicRenderingUnusedAttachmentsFeaturesEXT[1].dynamicRenderingUnusedAttachments))
4482	{
4483		TCU_FAIL("Mismatch between VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT");
4484	}
4485	return tcu::TestStatus::pass("Querying succeeded");
4486}
4487
4488tcu::TestStatus testPhysicalDeviceFeatureSwapchainMaintenance1FeaturesEXT (Context& context)
4489{
4490	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4491	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4492	const InstanceDriver&		vki				(instance.getDriver());
4493	const int					count			= 2u;
4494	TestLog&					log				= context.getTestContext().getLog();
4495	VkPhysicalDeviceFeatures2	extFeatures;
4496	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4497
4498	VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT	deviceSwapchainMaintenance1FeaturesEXT[count];
4499	const bool											isSwapchainMaintenance1FeaturesEXT = checkExtension(properties, "VK_EXT_swapchain_maintenance1");
4500
4501	for (int ndx = 0; ndx < count; ++ndx)
4502	{
4503		deMemset(&deviceSwapchainMaintenance1FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT));
4504		deviceSwapchainMaintenance1FeaturesEXT[ndx].sType = isSwapchainMaintenance1FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4505		deviceSwapchainMaintenance1FeaturesEXT[ndx].pNext = DE_NULL;
4506
4507		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4508		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4509		extFeatures.pNext = &deviceSwapchainMaintenance1FeaturesEXT[ndx];
4510
4511		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4512	}
4513
4514	if (isSwapchainMaintenance1FeaturesEXT)
4515		log << TestLog::Message << deviceSwapchainMaintenance1FeaturesEXT[0] << TestLog::EndMessage;
4516
4517	if (isSwapchainMaintenance1FeaturesEXT &&
4518		(deviceSwapchainMaintenance1FeaturesEXT[0].swapchainMaintenance1 != deviceSwapchainMaintenance1FeaturesEXT[1].swapchainMaintenance1))
4519	{
4520		TCU_FAIL("Mismatch between VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT");
4521	}
4522	return tcu::TestStatus::pass("Querying succeeded");
4523}
4524
4525tcu::TestStatus testPhysicalDeviceFeatureDepthBiasControlFeaturesEXT (Context& context)
4526{
4527	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4528	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4529	const InstanceDriver&		vki				(instance.getDriver());
4530	const int					count			= 2u;
4531	TestLog&					log				= context.getTestContext().getLog();
4532	VkPhysicalDeviceFeatures2	extFeatures;
4533	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4534
4535	VkPhysicalDeviceDepthBiasControlFeaturesEXT	deviceDepthBiasControlFeaturesEXT[count];
4536	const bool									isDepthBiasControlFeaturesEXT = checkExtension(properties, "VK_EXT_depth_bias_control");
4537
4538	for (int ndx = 0; ndx < count; ++ndx)
4539	{
4540		deMemset(&deviceDepthBiasControlFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDepthBiasControlFeaturesEXT));
4541		deviceDepthBiasControlFeaturesEXT[ndx].sType = isDepthBiasControlFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4542		deviceDepthBiasControlFeaturesEXT[ndx].pNext = DE_NULL;
4543
4544		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4545		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4546		extFeatures.pNext = &deviceDepthBiasControlFeaturesEXT[ndx];
4547
4548		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4549	}
4550
4551	if (isDepthBiasControlFeaturesEXT)
4552		log << TestLog::Message << deviceDepthBiasControlFeaturesEXT[0] << TestLog::EndMessage;
4553
4554	if (isDepthBiasControlFeaturesEXT &&
4555		(deviceDepthBiasControlFeaturesEXT[0].depthBiasControl != deviceDepthBiasControlFeaturesEXT[1].depthBiasControl ||
4556		 deviceDepthBiasControlFeaturesEXT[0].leastRepresentableValueForceUnormRepresentation != deviceDepthBiasControlFeaturesEXT[1].leastRepresentableValueForceUnormRepresentation ||
4557		 deviceDepthBiasControlFeaturesEXT[0].floatRepresentation != deviceDepthBiasControlFeaturesEXT[1].floatRepresentation ||
4558		 deviceDepthBiasControlFeaturesEXT[0].depthBiasExact != deviceDepthBiasControlFeaturesEXT[1].depthBiasExact))
4559	{
4560		TCU_FAIL("Mismatch between VkPhysicalDeviceDepthBiasControlFeaturesEXT");
4561	}
4562	return tcu::TestStatus::pass("Querying succeeded");
4563}
4564
4565tcu::TestStatus testPhysicalDeviceFeatureRayTracingPositionFetchFeaturesKHR (Context& context)
4566{
4567	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4568	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4569	const InstanceDriver&		vki				(instance.getDriver());
4570	const int					count			= 2u;
4571	TestLog&					log				= context.getTestContext().getLog();
4572	VkPhysicalDeviceFeatures2	extFeatures;
4573	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4574
4575	VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR	deviceRayTracingPositionFetchFeaturesKHR[count];
4576	const bool											isRayTracingPositionFetchFeaturesKHR = checkExtension(properties, "VK_KHR_ray_tracing_position_fetch");
4577
4578	for (int ndx = 0; ndx < count; ++ndx)
4579	{
4580		deMemset(&deviceRayTracingPositionFetchFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR));
4581		deviceRayTracingPositionFetchFeaturesKHR[ndx].sType = isRayTracingPositionFetchFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
4582		deviceRayTracingPositionFetchFeaturesKHR[ndx].pNext = DE_NULL;
4583
4584		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4585		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4586		extFeatures.pNext = &deviceRayTracingPositionFetchFeaturesKHR[ndx];
4587
4588		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4589	}
4590
4591	if (isRayTracingPositionFetchFeaturesKHR)
4592		log << TestLog::Message << deviceRayTracingPositionFetchFeaturesKHR[0] << TestLog::EndMessage;
4593
4594	if (isRayTracingPositionFetchFeaturesKHR &&
4595		(deviceRayTracingPositionFetchFeaturesKHR[0].rayTracingPositionFetch != deviceRayTracingPositionFetchFeaturesKHR[1].rayTracingPositionFetch))
4596	{
4597		TCU_FAIL("Mismatch between VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR");
4598	}
4599	return tcu::TestStatus::pass("Querying succeeded");
4600}
4601
4602tcu::TestStatus testPhysicalDeviceFeatureShaderObjectFeaturesEXT (Context& context)
4603{
4604	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4605	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4606	const InstanceDriver&		vki				(instance.getDriver());
4607	const int					count			= 2u;
4608	TestLog&					log				= context.getTestContext().getLog();
4609	VkPhysicalDeviceFeatures2	extFeatures;
4610	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4611
4612	VkPhysicalDeviceShaderObjectFeaturesEXT	deviceShaderObjectFeaturesEXT[count];
4613	const bool								isShaderObjectFeaturesEXT = checkExtension(properties, "VK_EXT_shader_object");
4614
4615	for (int ndx = 0; ndx < count; ++ndx)
4616	{
4617		deMemset(&deviceShaderObjectFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderObjectFeaturesEXT));
4618		deviceShaderObjectFeaturesEXT[ndx].sType = isShaderObjectFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4619		deviceShaderObjectFeaturesEXT[ndx].pNext = DE_NULL;
4620
4621		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4622		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4623		extFeatures.pNext = &deviceShaderObjectFeaturesEXT[ndx];
4624
4625		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4626	}
4627
4628	if (isShaderObjectFeaturesEXT)
4629		log << TestLog::Message << deviceShaderObjectFeaturesEXT[0] << TestLog::EndMessage;
4630
4631	if (isShaderObjectFeaturesEXT &&
4632		(deviceShaderObjectFeaturesEXT[0].shaderObject != deviceShaderObjectFeaturesEXT[1].shaderObject))
4633	{
4634		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderObjectFeaturesEXT");
4635	}
4636	return tcu::TestStatus::pass("Querying succeeded");
4637}
4638
4639tcu::TestStatus testPhysicalDeviceFeatureShaderTileImageFeaturesEXT (Context& context)
4640{
4641	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4642	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4643	const InstanceDriver&		vki				(instance.getDriver());
4644	const int					count			= 2u;
4645	TestLog&					log				= context.getTestContext().getLog();
4646	VkPhysicalDeviceFeatures2	extFeatures;
4647	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4648
4649	VkPhysicalDeviceShaderTileImageFeaturesEXT	deviceShaderTileImageFeaturesEXT[count];
4650	const bool									isShaderTileImageFeaturesEXT = checkExtension(properties, "VK_EXT_shader_tile_image");
4651
4652	for (int ndx = 0; ndx < count; ++ndx)
4653	{
4654		deMemset(&deviceShaderTileImageFeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderTileImageFeaturesEXT));
4655		deviceShaderTileImageFeaturesEXT[ndx].sType = isShaderTileImageFeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
4656		deviceShaderTileImageFeaturesEXT[ndx].pNext = DE_NULL;
4657
4658		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4659		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4660		extFeatures.pNext = &deviceShaderTileImageFeaturesEXT[ndx];
4661
4662		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4663	}
4664
4665	if (isShaderTileImageFeaturesEXT)
4666		log << TestLog::Message << deviceShaderTileImageFeaturesEXT[0] << TestLog::EndMessage;
4667
4668	if (isShaderTileImageFeaturesEXT &&
4669		(deviceShaderTileImageFeaturesEXT[0].shaderTileImageColorReadAccess != deviceShaderTileImageFeaturesEXT[1].shaderTileImageColorReadAccess ||
4670		 deviceShaderTileImageFeaturesEXT[0].shaderTileImageDepthReadAccess != deviceShaderTileImageFeaturesEXT[1].shaderTileImageDepthReadAccess ||
4671		 deviceShaderTileImageFeaturesEXT[0].shaderTileImageStencilReadAccess != deviceShaderTileImageFeaturesEXT[1].shaderTileImageStencilReadAccess))
4672	{
4673		TCU_FAIL("Mismatch between VkPhysicalDeviceShaderTileImageFeaturesEXT");
4674	}
4675	return tcu::TestStatus::pass("Querying succeeded");
4676}
4677
4678tcu::TestStatus testPhysicalDeviceFeatureCooperativeMatrixFeaturesKHR (Context& context)
4679{
4680	const VkPhysicalDevice		physicalDevice	= context.getPhysicalDevice();
4681	const CustomInstance		instance		(createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
4682	const InstanceDriver&		vki				(instance.getDriver());
4683	const int					count			= 2u;
4684	TestLog&					log				= context.getTestContext().getLog();
4685	VkPhysicalDeviceFeatures2	extFeatures;
4686	vector<VkExtensionProperties> properties	= enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
4687
4688	VkPhysicalDeviceCooperativeMatrixFeaturesKHR	deviceCooperativeMatrixFeaturesKHR[count];
4689	const bool										isCooperativeMatrixFeaturesKHR = checkExtension(properties, "VK_KHR_cooperative_matrix");
4690
4691	for (int ndx = 0; ndx < count; ++ndx)
4692	{
4693		deMemset(&deviceCooperativeMatrixFeaturesKHR[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceCooperativeMatrixFeaturesKHR));
4694		deviceCooperativeMatrixFeaturesKHR[ndx].sType = isCooperativeMatrixFeaturesKHR ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR : VK_STRUCTURE_TYPE_MAX_ENUM;
4695		deviceCooperativeMatrixFeaturesKHR[ndx].pNext = DE_NULL;
4696
4697		deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
4698		extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
4699		extFeatures.pNext = &deviceCooperativeMatrixFeaturesKHR[ndx];
4700
4701		vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
4702	}
4703
4704	if (isCooperativeMatrixFeaturesKHR)
4705		log << TestLog::Message << deviceCooperativeMatrixFeaturesKHR[0] << TestLog::EndMessage;
4706
4707	if (isCooperativeMatrixFeaturesKHR &&
4708		(deviceCooperativeMatrixFeaturesKHR[0].cooperativeMatrix != deviceCooperativeMatrixFeaturesKHR[1].cooperativeMatrix ||
4709		 deviceCooperativeMatrixFeaturesKHR[0].cooperativeMatrixRobustBufferAccess != deviceCooperativeMatrixFeaturesKHR[1].cooperativeMatrixRobustBufferAccess))
4710	{
4711		TCU_FAIL("Mismatch between VkPhysicalDeviceCooperativeMatrixFeaturesKHR");
4712	}
4713	return tcu::TestStatus::pass("Querying succeeded");
4714}
4715
4716tcu::TestStatus createDeviceWithPromoted11Structures (Context& context)
4717{
4718	if (!context.contextSupports(vk::ApiVersion(0, 1, 1, 0)))
4719		TCU_THROW(NotSupportedError, "Vulkan 1.1 is not supported");
4720
4721	const PlatformInterface&		platformInterface	= context.getPlatformInterface();
4722	const CustomInstance			instance			(createCustomInstanceFromContext(context));
4723	const InstanceDriver&			instanceDriver		(instance.getDriver());
4724	const VkPhysicalDevice			physicalDevice		= chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
4725	const deUint32					queueFamilyIndex	= 0;
4726	const deUint32					queueCount			= 1;
4727	const deUint32					queueIndex			= 0;
4728	const float						queuePriority		= 1.0f;
4729
4730	const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
4731
4732	const VkDeviceQueueCreateInfo	deviceQueueCreateInfo =
4733	{
4734		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
4735		DE_NULL,
4736		(VkDeviceQueueCreateFlags)0u,
4737		queueFamilyIndex,						//queueFamilyIndex;
4738		queueCount,								//queueCount;
4739		&queuePriority,							//pQueuePriorities;
4740	};
4741
4742	VkPhysicalDevice16BitStorageFeatures device16BitStorageFeatures = initVulkanStructure();
4743	VkPhysicalDeviceMultiviewFeatures deviceMultiviewFeatures = initVulkanStructure(&device16BitStorageFeatures);
4744	VkPhysicalDeviceVariablePointerFeatures deviceVariablePointersFeatures = initVulkanStructure(&deviceMultiviewFeatures);
4745	VkPhysicalDeviceProtectedMemoryFeatures deviceProtectedMemoryFeatures = initVulkanStructure(&deviceVariablePointersFeatures);
4746	VkPhysicalDeviceSamplerYcbcrConversionFeatures deviceSamplerYcbcrConversionFeatures = initVulkanStructure(&deviceProtectedMemoryFeatures);
4747	VkPhysicalDeviceShaderDrawParameterFeatures deviceShaderDrawParametersFeatures = initVulkanStructure(&deviceSamplerYcbcrConversionFeatures);
4748	VkPhysicalDeviceFeatures2 extFeatures = initVulkanStructure(&deviceShaderDrawParametersFeatures);
4749
4750	instanceDriver.getPhysicalDeviceFeatures2 (physicalDevice, &extFeatures);
4751
4752	const VkDeviceCreateInfo		deviceCreateInfo =
4753	{
4754		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,	//sType;
4755		&extFeatures,							//pNext;
4756		(VkDeviceCreateFlags)0u,
4757		1,										//queueRecordCount;
4758		&deviceQueueCreateInfo,					//pRequestedQueues;
4759		0,										//layerCount;
4760		DE_NULL,								//ppEnabledLayerNames;
4761		0,										//extensionCount;
4762		DE_NULL,								//ppEnabledExtensionNames;
4763		DE_NULL,								//pEnabledFeatures;
4764	};
4765
4766	const Unique<VkDevice>			device			(createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
4767	const DeviceDriver				deviceDriver	(platformInterface, instance, device.get(), context.getUsedApiVersion());
4768	const VkQueue					queue			= getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
4769
4770	VK_CHECK(deviceDriver.queueWaitIdle(queue));
4771
4772	return tcu::TestStatus::pass("Pass");
4773}
4774
4775tcu::TestStatus createDeviceWithPromoted12Structures (Context& context)
4776{
4777	if (!context.contextSupports(vk::ApiVersion(0, 1, 2, 0)))
4778		TCU_THROW(NotSupportedError, "Vulkan 1.2 is not supported");
4779
4780	const PlatformInterface&		platformInterface	= context.getPlatformInterface();
4781	const CustomInstance			instance			(createCustomInstanceFromContext(context));
4782	const InstanceDriver&			instanceDriver		(instance.getDriver());
4783	const VkPhysicalDevice			physicalDevice		= chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
4784	const deUint32					queueFamilyIndex	= 0;
4785	const deUint32					queueCount			= 1;
4786	const deUint32					queueIndex			= 0;
4787	const float						queuePriority		= 1.0f;
4788
4789	const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
4790
4791	const VkDeviceQueueCreateInfo	deviceQueueCreateInfo =
4792	{
4793		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
4794		DE_NULL,
4795		(VkDeviceQueueCreateFlags)0u,
4796		queueFamilyIndex,						//queueFamilyIndex;
4797		queueCount,								//queueCount;
4798		&queuePriority,							//pQueuePriorities;
4799	};
4800
4801	VkPhysicalDevice8BitStorageFeatures device8BitStorageFeatures = initVulkanStructure();
4802	VkPhysicalDeviceShaderAtomicInt64Features deviceShaderAtomicInt64Features = initVulkanStructure(&device8BitStorageFeatures);
4803	VkPhysicalDeviceShaderFloat16Int8Features deviceShaderFloat16Int8Features = initVulkanStructure(&deviceShaderAtomicInt64Features);
4804	VkPhysicalDeviceDescriptorIndexingFeatures deviceDescriptorIndexingFeatures = initVulkanStructure(&deviceShaderFloat16Int8Features);
4805	VkPhysicalDeviceScalarBlockLayoutFeatures deviceScalarBlockLayoutFeatures = initVulkanStructure(&deviceDescriptorIndexingFeatures);
4806	VkPhysicalDeviceVulkanMemoryModelFeatures deviceVulkanMemoryModelFeatures = initVulkanStructure(&deviceScalarBlockLayoutFeatures);
4807	VkPhysicalDeviceImagelessFramebufferFeatures deviceImagelessFramebufferFeatures = initVulkanStructure(&deviceVulkanMemoryModelFeatures);
4808	VkPhysicalDeviceUniformBufferStandardLayoutFeatures deviceUniformBufferStandardLayoutFeatures = initVulkanStructure(&deviceImagelessFramebufferFeatures);
4809	VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures deviceShaderSubgroupExtendedTypesFeatures = initVulkanStructure(&deviceUniformBufferStandardLayoutFeatures);
4810	VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures deviceSeparateDepthStencilLayoutsFeatures = initVulkanStructure(&deviceShaderSubgroupExtendedTypesFeatures);
4811	VkPhysicalDeviceHostQueryResetFeatures deviceHostQueryResetFeatures = initVulkanStructure(&deviceSeparateDepthStencilLayoutsFeatures);
4812	VkPhysicalDeviceTimelineSemaphoreFeatures deviceTimelineSemaphoreFeatures = initVulkanStructure(&deviceHostQueryResetFeatures);
4813	VkPhysicalDeviceBufferDeviceAddressFeatures deviceBufferDeviceAddressFeatures = initVulkanStructure(&deviceTimelineSemaphoreFeatures);
4814	VkPhysicalDeviceFeatures2 extFeatures = initVulkanStructure(&deviceBufferDeviceAddressFeatures);
4815
4816	instanceDriver.getPhysicalDeviceFeatures2 (physicalDevice, &extFeatures);
4817
4818	const VkDeviceCreateInfo		deviceCreateInfo =
4819	{
4820		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,	//sType;
4821		&extFeatures,							//pNext;
4822		(VkDeviceCreateFlags)0u,
4823		1,										//queueRecordCount;
4824		&deviceQueueCreateInfo,					//pRequestedQueues;
4825		0,										//layerCount;
4826		DE_NULL,								//ppEnabledLayerNames;
4827		0,										//extensionCount;
4828		DE_NULL,								//ppEnabledExtensionNames;
4829		DE_NULL,								//pEnabledFeatures;
4830	};
4831
4832	const Unique<VkDevice>			device			(createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
4833	const DeviceDriver				deviceDriver	(platformInterface, instance, device.get(), context.getUsedApiVersion());
4834	const VkQueue					queue			= getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
4835
4836	VK_CHECK(deviceDriver.queueWaitIdle(queue));
4837
4838	return tcu::TestStatus::pass("Pass");
4839}
4840
4841tcu::TestStatus createDeviceWithPromoted13Structures (Context& context)
4842{
4843	if (!context.contextSupports(vk::ApiVersion(0, 1, 3, 0)))
4844		TCU_THROW(NotSupportedError, "Vulkan 1.3 is not supported");
4845
4846	const PlatformInterface&		platformInterface	= context.getPlatformInterface();
4847	const CustomInstance			instance			(createCustomInstanceFromContext(context));
4848	const InstanceDriver&			instanceDriver		(instance.getDriver());
4849	const VkPhysicalDevice			physicalDevice		= chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
4850	const deUint32					queueFamilyIndex	= 0;
4851	const deUint32					queueCount			= 1;
4852	const deUint32					queueIndex			= 0;
4853	const float						queuePriority		= 1.0f;
4854
4855	const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
4856
4857	const VkDeviceQueueCreateInfo	deviceQueueCreateInfo =
4858	{
4859		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
4860		DE_NULL,
4861		(VkDeviceQueueCreateFlags)0u,
4862		queueFamilyIndex,						//queueFamilyIndex;
4863		queueCount,								//queueCount;
4864		&queuePriority,							//pQueuePriorities;
4865	};
4866
4867	VkPhysicalDeviceShaderTerminateInvocationFeatures deviceShaderTerminateInvocationFeatures = initVulkanStructure();
4868	VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures deviceShaderDemoteToHelperInvocationFeatures = initVulkanStructure(&deviceShaderTerminateInvocationFeatures);
4869	VkPhysicalDevicePrivateDataFeatures devicePrivateDataFeatures = initVulkanStructure(&deviceShaderDemoteToHelperInvocationFeatures);
4870	VkPhysicalDevicePipelineCreationCacheControlFeatures devicePipelineCreationCacheControlFeatures = initVulkanStructure(&devicePrivateDataFeatures);
4871	VkPhysicalDeviceSynchronization2Features deviceSynchronization2Features = initVulkanStructure(&devicePipelineCreationCacheControlFeatures);
4872	VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures deviceZeroInitializeWorkgroupMemoryFeatures = initVulkanStructure(&deviceSynchronization2Features);
4873	VkPhysicalDeviceImageRobustnessFeatures deviceImageRobustnessFeatures = initVulkanStructure(&deviceZeroInitializeWorkgroupMemoryFeatures);
4874	VkPhysicalDeviceSubgroupSizeControlFeatures deviceSubgroupSizeControlFeatures = initVulkanStructure(&deviceImageRobustnessFeatures);
4875	VkPhysicalDeviceInlineUniformBlockFeatures deviceInlineUniformBlockFeatures = initVulkanStructure(&deviceSubgroupSizeControlFeatures);
4876	VkPhysicalDeviceTextureCompressionASTCHDRFeatures deviceTextureCompressionASTCHDRFeatures = initVulkanStructure(&deviceInlineUniformBlockFeatures);
4877	VkPhysicalDeviceDynamicRenderingFeatures deviceDynamicRenderingFeatures = initVulkanStructure(&deviceTextureCompressionASTCHDRFeatures);
4878	VkPhysicalDeviceShaderIntegerDotProductFeatures deviceShaderIntegerDotProductFeatures = initVulkanStructure(&deviceDynamicRenderingFeatures);
4879	VkPhysicalDeviceMaintenance4Features deviceMaintenance4Features = initVulkanStructure(&deviceShaderIntegerDotProductFeatures);
4880	VkPhysicalDeviceFeatures2 extFeatures = initVulkanStructure(&deviceMaintenance4Features);
4881
4882	instanceDriver.getPhysicalDeviceFeatures2 (physicalDevice, &extFeatures);
4883
4884	const VkDeviceCreateInfo		deviceCreateInfo =
4885	{
4886		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,	//sType;
4887		&extFeatures,							//pNext;
4888		(VkDeviceCreateFlags)0u,
4889		1,										//queueRecordCount;
4890		&deviceQueueCreateInfo,					//pRequestedQueues;
4891		0,										//layerCount;
4892		DE_NULL,								//ppEnabledLayerNames;
4893		0,										//extensionCount;
4894		DE_NULL,								//ppEnabledExtensionNames;
4895		DE_NULL,								//pEnabledFeatures;
4896	};
4897
4898	const Unique<VkDevice>			device			(createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
4899	const DeviceDriver				deviceDriver	(platformInterface, instance, device.get(), context.getUsedApiVersion());
4900	const VkQueue					queue			= getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
4901
4902	VK_CHECK(deviceDriver.queueWaitIdle(queue));
4903
4904	return tcu::TestStatus::pass("Pass");
4905}
4906
4907void addSeparateFeatureTests (tcu::TestCaseGroup* testGroup)
4908{
4909	addFunctionCase(testGroup, "private_data_features", testPhysicalDeviceFeaturePrivateDataFeatures);
4910	addFunctionCase(testGroup, "variable_pointers_features", testPhysicalDeviceFeatureVariablePointersFeatures);
4911	addFunctionCase(testGroup, "multiview_features", testPhysicalDeviceFeatureMultiviewFeatures);
4912	addFunctionCase(testGroup, "present_id_features_khr", testPhysicalDeviceFeaturePresentIdFeaturesKHR);
4913	addFunctionCase(testGroup, "present_wait_features_khr", testPhysicalDeviceFeaturePresentWaitFeaturesKHR);
4914	addFunctionCase(testGroup, "16_bit_storage_features", testPhysicalDeviceFeature16BitStorageFeatures);
4915	addFunctionCase(testGroup, "shader_subgroup_extended_types_features", testPhysicalDeviceFeatureShaderSubgroupExtendedTypesFeatures);
4916	addFunctionCase(testGroup, "sampler_ycbcr_conversion_features", testPhysicalDeviceFeatureSamplerYcbcrConversionFeatures);
4917	addFunctionCase(testGroup, "protected_memory_features", testPhysicalDeviceFeatureProtectedMemoryFeatures);
4918	addFunctionCase(testGroup, "blend_operation_advanced_features_ext", testPhysicalDeviceFeatureBlendOperationAdvancedFeaturesEXT);
4919	addFunctionCase(testGroup, "multi_draw_features_ext", testPhysicalDeviceFeatureMultiDrawFeaturesEXT);
4920	addFunctionCase(testGroup, "inline_uniform_block_features", testPhysicalDeviceFeatureInlineUniformBlockFeatures);
4921	addFunctionCase(testGroup, "maintenance4_features", testPhysicalDeviceFeatureMaintenance4Features);
4922	addFunctionCase(testGroup, "maintenance5_features_khr", testPhysicalDeviceFeatureMaintenance5FeaturesKHR);
4923	addFunctionCase(testGroup, "shader_draw_parameters_features", testPhysicalDeviceFeatureShaderDrawParametersFeatures);
4924	addFunctionCase(testGroup, "shader_float16_int8_features", testPhysicalDeviceFeatureShaderFloat16Int8Features);
4925	addFunctionCase(testGroup, "host_query_reset_features", testPhysicalDeviceFeatureHostQueryResetFeatures);
4926	addFunctionCase(testGroup, "global_priority_query_features_khr", testPhysicalDeviceFeatureGlobalPriorityQueryFeaturesKHR);
4927	addFunctionCase(testGroup, "device_memory_report_features_ext", testPhysicalDeviceFeatureDeviceMemoryReportFeaturesEXT);
4928	addFunctionCase(testGroup, "descriptor_indexing_features", testPhysicalDeviceFeatureDescriptorIndexingFeatures);
4929	addFunctionCase(testGroup, "timeline_semaphore_features", testPhysicalDeviceFeatureTimelineSemaphoreFeatures);
4930	addFunctionCase(testGroup, "8_bit_storage_features", testPhysicalDeviceFeature8BitStorageFeatures);
4931	addFunctionCase(testGroup, "conditional_rendering_features_ext", testPhysicalDeviceFeatureConditionalRenderingFeaturesEXT);
4932	addFunctionCase(testGroup, "vulkan_memory_model_features", testPhysicalDeviceFeatureVulkanMemoryModelFeatures);
4933	addFunctionCase(testGroup, "shader_atomic_int64_features", testPhysicalDeviceFeatureShaderAtomicInt64Features);
4934	addFunctionCase(testGroup, "shader_atomic_float_features_ext", testPhysicalDeviceFeatureShaderAtomicFloatFeaturesEXT);
4935	addFunctionCase(testGroup, "shader_atomic_float2_features_ext", testPhysicalDeviceFeatureShaderAtomicFloat2FeaturesEXT);
4936	addFunctionCase(testGroup, "vertex_attribute_divisor_features_ext", testPhysicalDeviceFeatureVertexAttributeDivisorFeaturesEXT);
4937	addFunctionCase(testGroup, "astc_decode_features_ext", testPhysicalDeviceFeatureASTCDecodeFeaturesEXT);
4938	addFunctionCase(testGroup, "transform_feedback_features_ext", testPhysicalDeviceFeatureTransformFeedbackFeaturesEXT);
4939	addFunctionCase(testGroup, "mesh_shader_features_ext", testPhysicalDeviceFeatureMeshShaderFeaturesEXT);
4940	addFunctionCase(testGroup, "acceleration_structure_features_khr", testPhysicalDeviceFeatureAccelerationStructureFeaturesKHR);
4941	addFunctionCase(testGroup, "ray_tracing_pipeline_features_khr", testPhysicalDeviceFeatureRayTracingPipelineFeaturesKHR);
4942	addFunctionCase(testGroup, "ray_query_features_khr", testPhysicalDeviceFeatureRayQueryFeaturesKHR);
4943	addFunctionCase(testGroup, "ray_tracing_maintenance1_features_khr", testPhysicalDeviceFeatureRayTracingMaintenance1FeaturesKHR);
4944	addFunctionCase(testGroup, "fragment_density_map_features_ext", testPhysicalDeviceFeatureFragmentDensityMapFeaturesEXT);
4945	addFunctionCase(testGroup, "fragment_density_map2_features_ext", testPhysicalDeviceFeatureFragmentDensityMap2FeaturesEXT);
4946	addFunctionCase(testGroup, "scalar_block_layout_features", testPhysicalDeviceFeatureScalarBlockLayoutFeatures);
4947	addFunctionCase(testGroup, "uniform_buffer_standard_layout_features", testPhysicalDeviceFeatureUniformBufferStandardLayoutFeatures);
4948	addFunctionCase(testGroup, "depth_clip_enable_features_ext", testPhysicalDeviceFeatureDepthClipEnableFeaturesEXT);
4949	addFunctionCase(testGroup, "memory_priority_features_ext", testPhysicalDeviceFeatureMemoryPriorityFeaturesEXT);
4950	addFunctionCase(testGroup, "pageable_device_local_memory_features_ext", testPhysicalDeviceFeaturePageableDeviceLocalMemoryFeaturesEXT);
4951	addFunctionCase(testGroup, "buffer_device_address_features", testPhysicalDeviceFeatureBufferDeviceAddressFeatures);
4952	addFunctionCase(testGroup, "buffer_device_address_features_ext", testPhysicalDeviceFeatureBufferDeviceAddressFeaturesEXT);
4953	addFunctionCase(testGroup, "imageless_framebuffer_features", testPhysicalDeviceFeatureImagelessFramebufferFeatures);
4954	addFunctionCase(testGroup, "texture_compression_astchdr_features", testPhysicalDeviceFeatureTextureCompressionASTCHDRFeatures);
4955	addFunctionCase(testGroup, "ycbcr_image_arrays_features_ext", testPhysicalDeviceFeatureYcbcrImageArraysFeaturesEXT);
4956	addFunctionCase(testGroup, "performance_query_features_khr", testPhysicalDeviceFeaturePerformanceQueryFeaturesKHR);
4957	addFunctionCase(testGroup, "shader_clock_features_khr", testPhysicalDeviceFeatureShaderClockFeaturesKHR);
4958	addFunctionCase(testGroup, "index_type_uint8_features_ext", testPhysicalDeviceFeatureIndexTypeUint8FeaturesEXT);
4959	addFunctionCase(testGroup, "fragment_shader_interlock_features_ext", testPhysicalDeviceFeatureFragmentShaderInterlockFeaturesEXT);
4960	addFunctionCase(testGroup, "separate_depth_stencil_layouts_features", testPhysicalDeviceFeatureSeparateDepthStencilLayoutsFeatures);
4961	addFunctionCase(testGroup, "primitive_topology_list_restart_features_ext", testPhysicalDeviceFeaturePrimitiveTopologyListRestartFeaturesEXT);
4962	addFunctionCase(testGroup, "pipeline_executable_properties_features_khr", testPhysicalDeviceFeaturePipelineExecutablePropertiesFeaturesKHR);
4963	addFunctionCase(testGroup, "shader_demote_to_helper_invocation_features", testPhysicalDeviceFeatureShaderDemoteToHelperInvocationFeatures);
4964	addFunctionCase(testGroup, "texel_buffer_alignment_features_ext", testPhysicalDeviceFeatureTexelBufferAlignmentFeaturesEXT);
4965	addFunctionCase(testGroup, "subgroup_size_control_features", testPhysicalDeviceFeatureSubgroupSizeControlFeatures);
4966	addFunctionCase(testGroup, "line_rasterization_features_ext", testPhysicalDeviceFeatureLineRasterizationFeaturesEXT);
4967	addFunctionCase(testGroup, "pipeline_creation_cache_control_features", testPhysicalDeviceFeaturePipelineCreationCacheControlFeatures);
4968	addFunctionCase(testGroup, "vulkan11_features", testPhysicalDeviceFeatureVulkan11Features);
4969	addFunctionCase(testGroup, "vulkan12_features", testPhysicalDeviceFeatureVulkan12Features);
4970	addFunctionCase(testGroup, "vulkan13_features", testPhysicalDeviceFeatureVulkan13Features);
4971	addFunctionCase(testGroup, "custom_border_color_features_ext", testPhysicalDeviceFeatureCustomBorderColorFeaturesEXT);
4972	addFunctionCase(testGroup, "border_color_swizzle_features_ext", testPhysicalDeviceFeatureBorderColorSwizzleFeaturesEXT);
4973	addFunctionCase(testGroup, "extended_dynamic_state_features_ext", testPhysicalDeviceFeatureExtendedDynamicStateFeaturesEXT);
4974	addFunctionCase(testGroup, "extended_dynamic_state2_features_ext", testPhysicalDeviceFeatureExtendedDynamicState2FeaturesEXT);
4975	addFunctionCase(testGroup, "extended_dynamic_state3_features_ext", testPhysicalDeviceFeatureExtendedDynamicState3FeaturesEXT);
4976	addFunctionCase(testGroup, "zero_initialize_workgroup_memory_features", testPhysicalDeviceFeatureZeroInitializeWorkgroupMemoryFeatures);
4977	addFunctionCase(testGroup, "shader_subgroup_uniform_control_flow_features_khr", testPhysicalDeviceFeatureShaderSubgroupUniformControlFlowFeaturesKHR);
4978	addFunctionCase(testGroup, "robustness2_features_ext", testPhysicalDeviceFeatureRobustness2FeaturesEXT);
4979	addFunctionCase(testGroup, "image_robustness_features", testPhysicalDeviceFeatureImageRobustnessFeatures);
4980	addFunctionCase(testGroup, "workgroup_memory_explicit_layout_features_khr", testPhysicalDeviceFeatureWorkgroupMemoryExplicitLayoutFeaturesKHR);
4981	addFunctionCase(testGroup, "portability_subset_features_khr", testPhysicalDeviceFeaturePortabilitySubsetFeaturesKHR);
4982	addFunctionCase(testGroup, "4444_formats_features_ext", testPhysicalDeviceFeature4444FormatsFeaturesEXT);
4983	addFunctionCase(testGroup, "shader_image_atomic_int64_features_ext", testPhysicalDeviceFeatureShaderImageAtomicInt64FeaturesEXT);
4984	addFunctionCase(testGroup, "fragment_shading_rate_features_khr", testPhysicalDeviceFeatureFragmentShadingRateFeaturesKHR);
4985	addFunctionCase(testGroup, "shader_terminate_invocation_features", testPhysicalDeviceFeatureShaderTerminateInvocationFeatures);
4986	addFunctionCase(testGroup, "image_2d_view_of_3d_features_ext", testPhysicalDeviceFeatureImage2DViewOf3DFeaturesEXT);
4987	addFunctionCase(testGroup, "image_sliced_view_of_3d_features_ext", testPhysicalDeviceFeatureImageSlicedViewOf3DFeaturesEXT);
4988	addFunctionCase(testGroup, "attachment_feedback_loop_dynamic_state_features_ext", testPhysicalDeviceFeatureAttachmentFeedbackLoopDynamicStateFeaturesEXT);
4989	addFunctionCase(testGroup, "mutable_descriptor_type_features_ext", testPhysicalDeviceFeatureMutableDescriptorTypeFeaturesEXT);
4990	addFunctionCase(testGroup, "depth_clip_control_features_ext", testPhysicalDeviceFeatureDepthClipControlFeaturesEXT);
4991	addFunctionCase(testGroup, "vertex_input_dynamic_state_features_ext", testPhysicalDeviceFeatureVertexInputDynamicStateFeaturesEXT);
4992	addFunctionCase(testGroup, "color_write_enable_features_ext", testPhysicalDeviceFeatureColorWriteEnableFeaturesEXT);
4993	addFunctionCase(testGroup, "synchronization2_features", testPhysicalDeviceFeatureSynchronization2Features);
4994	addFunctionCase(testGroup, "host_image_copy_features_ext", testPhysicalDeviceFeatureHostImageCopyFeaturesEXT);
4995	addFunctionCase(testGroup, "primitives_generated_query_features_ext", testPhysicalDeviceFeaturePrimitivesGeneratedQueryFeaturesEXT);
4996	addFunctionCase(testGroup, "legacy_dithering_features_ext", testPhysicalDeviceFeatureLegacyDitheringFeaturesEXT);
4997	addFunctionCase(testGroup, "multisampled_render_to_single_sampled_features_ext", testPhysicalDeviceFeatureMultisampledRenderToSingleSampledFeaturesEXT);
4998	addFunctionCase(testGroup, "pipeline_protected_access_features_ext", testPhysicalDeviceFeaturePipelineProtectedAccessFeaturesEXT);
4999	addFunctionCase(testGroup, "ycbcr2_plane444_formats_features_ext", testPhysicalDeviceFeatureYcbcr2Plane444FormatsFeaturesEXT);
5000	addFunctionCase(testGroup, "provoking_vertex_features_ext", testPhysicalDeviceFeatureProvokingVertexFeaturesEXT);
5001	addFunctionCase(testGroup, "descriptor_buffer_features_ext", testPhysicalDeviceFeatureDescriptorBufferFeaturesEXT);
5002	addFunctionCase(testGroup, "shader_integer_dot_product_features", testPhysicalDeviceFeatureShaderIntegerDotProductFeatures);
5003	addFunctionCase(testGroup, "fragment_shader_barycentric_features_khr", testPhysicalDeviceFeatureFragmentShaderBarycentricFeaturesKHR);
5004	addFunctionCase(testGroup, "rgba10_x6_formats_features_ext", testPhysicalDeviceFeatureRGBA10X6FormatsFeaturesEXT);
5005	addFunctionCase(testGroup, "dynamic_rendering_features", testPhysicalDeviceFeatureDynamicRenderingFeatures);
5006	addFunctionCase(testGroup, "image_view_min_lod_features_ext", testPhysicalDeviceFeatureImageViewMinLodFeaturesEXT);
5007	addFunctionCase(testGroup, "rasterization_order_attachment_access_features_ext", testPhysicalDeviceFeatureRasterizationOrderAttachmentAccessFeaturesEXT);
5008	addFunctionCase(testGroup, "graphics_pipeline_library_features_ext", testPhysicalDeviceFeatureGraphicsPipelineLibraryFeaturesEXT);
5009	addFunctionCase(testGroup, "shader_module_identifier_features_ext", testPhysicalDeviceFeatureShaderModuleIdentifierFeaturesEXT);
5010	addFunctionCase(testGroup, "image_compression_control_features_ext", testPhysicalDeviceFeatureImageCompressionControlFeaturesEXT);
5011	addFunctionCase(testGroup, "image_compression_control_swapchain_features_ext", testPhysicalDeviceFeatureImageCompressionControlSwapchainFeaturesEXT);
5012	addFunctionCase(testGroup, "subpass_merge_feedback_features_ext", testPhysicalDeviceFeatureSubpassMergeFeedbackFeaturesEXT);
5013	addFunctionCase(testGroup, "opacity_micromap_features_ext", testPhysicalDeviceFeatureOpacityMicromapFeaturesEXT);
5014	addFunctionCase(testGroup, "pipeline_properties_features_ext", testPhysicalDeviceFeaturePipelinePropertiesFeaturesEXT);
5015	addFunctionCase(testGroup, "non_seamless_cube_map_features_ext", testPhysicalDeviceFeatureNonSeamlessCubeMapFeaturesEXT);
5016	addFunctionCase(testGroup, "pipeline_robustness_features_ext", testPhysicalDeviceFeaturePipelineRobustnessFeaturesEXT);
5017	addFunctionCase(testGroup, "amigo_profiling_features_sec", testPhysicalDeviceFeatureAmigoProfilingFeaturesSEC);
5018	addFunctionCase(testGroup, "attachment_feedback_loop_layout_features_ext", testPhysicalDeviceFeatureAttachmentFeedbackLoopLayoutFeaturesEXT);
5019	addFunctionCase(testGroup, "depth_clamp_zero_one_features_ext", testPhysicalDeviceFeatureDepthClampZeroOneFeaturesEXT);
5020	addFunctionCase(testGroup, "address_binding_report_features_ext", testPhysicalDeviceFeatureAddressBindingReportFeaturesEXT);
5021	addFunctionCase(testGroup, "fault_features_ext", testPhysicalDeviceFeatureFaultFeaturesEXT);
5022	addFunctionCase(testGroup, "pipeline_library_group_handles_features_ext", testPhysicalDeviceFeaturePipelineLibraryGroupHandlesFeaturesEXT);
5023	addFunctionCase(testGroup, "dynamic_rendering_unused_attachments_features_ext", testPhysicalDeviceFeatureDynamicRenderingUnusedAttachmentsFeaturesEXT);
5024	addFunctionCase(testGroup, "swapchain_maintenance1_features_ext", testPhysicalDeviceFeatureSwapchainMaintenance1FeaturesEXT);
5025	addFunctionCase(testGroup, "depth_bias_control_features_ext", testPhysicalDeviceFeatureDepthBiasControlFeaturesEXT);
5026	addFunctionCase(testGroup, "ray_tracing_position_fetch_features_khr", testPhysicalDeviceFeatureRayTracingPositionFetchFeaturesKHR);
5027	addFunctionCase(testGroup, "shader_object_features_ext", testPhysicalDeviceFeatureShaderObjectFeaturesEXT);
5028	addFunctionCase(testGroup, "shader_tile_image_features_ext", testPhysicalDeviceFeatureShaderTileImageFeaturesEXT);
5029	addFunctionCase(testGroup, "cooperative_matrix_features_khr", testPhysicalDeviceFeatureCooperativeMatrixFeaturesKHR);
5030	addFunctionCase(testGroup, "create_device_with_promoted11_structures", createDeviceWithPromoted11Structures);
5031	addFunctionCase(testGroup, "create_device_with_promoted12_structures", createDeviceWithPromoted12Structures);
5032	addFunctionCase(testGroup, "create_device_with_promoted13_structures", createDeviceWithPromoted13Structures);
5033}
5034
5035