1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 Google Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Device Initialization Tests
22 *//*--------------------------------------------------------------------*/
24 #include "vktApiDeviceInitializationTests.hpp"
25 #include "vktTestCaseUtil.hpp"
26 #include "vktCustomInstancesDevices.hpp"
29 #include "vkPlatform.hpp"
30 #include "vkStrUtil.hpp"
32 #include "vkRefUtil.hpp"
33 #include "vkQueryUtil.hpp"
34 #include "vkMemUtil.hpp"
35 #include "vkDeviceUtil.hpp"
36 #include "vkApiVersion.hpp"
37 #include "vkAllocationCallbackUtil.hpp"
38 #include "vkDeviceFeatures.hpp"
39 #include "vkSafetyCriticalUtil.hpp"
41 #include "tcuTestLog.hpp"
42 #include "tcuResultCollector.hpp"
43 #include "tcuCommandLine.hpp"
45 #include "deUniquePtr.hpp"
46 #include "deStringUtil.hpp"
66 tcu::TestStatus createInstanceTest (Context& context)
68 tcu::TestLog& log = context.getTestContext().getLog();
69 tcu::ResultCollector resultCollector (log);
70 const char* appNames[] = { "appName", DE_NULL, "", "app, name", "app(\"name\"", "app~!@#$%^&*()_+name", "app\nName", "app\r\nName" };
71 const char* engineNames[] = { "engineName", DE_NULL, "", "engine. name", "engine\"(name)", "eng~!@#$%^&*()_+name", "engine\nName", "engine\r\nName" };
72 const int patchNumbers[] = { 0, 1, 2, 3, 4, 5, 13, 4094, 4095 };
73 const deUint32 appVersions[] = { 0, 1, (deUint32)-1 };
74 const deUint32 engineVersions[] = { 0, 1, (deUint32)-1 };
75 const deUint32 apiVersion = context.getUsedApiVersion();
76 vector<VkApplicationInfo> appInfos;
79 for (int appNameNdx = 0; appNameNdx < DE_LENGTH_OF_ARRAY(appNames); appNameNdx++)
81 const VkApplicationInfo appInfo =
83 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
84 DE_NULL, // const void* pNext;
85 appNames[appNameNdx], // const char* pAppName;
86 0u, // deUint32 appVersion;
87 "engineName", // const char* pEngineName;
88 0u, // deUint32 engineVersion;
89 apiVersion, // deUint32 apiVersion;
92 appInfos.push_back(appInfo);
95 // test over engineName
96 for (int engineNameNdx = 0; engineNameNdx < DE_LENGTH_OF_ARRAY(engineNames); engineNameNdx++)
98 const VkApplicationInfo appInfo =
100 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
101 DE_NULL, // const void* pNext;
102 "appName", // const char* pAppName;
103 0u, // deUint32 appVersion;
104 engineNames[engineNameNdx], // const char* pEngineName;
105 0u, // deUint32 engineVersion;
106 apiVersion, // deUint32 apiVersion;
109 appInfos.push_back(appInfo);
112 // test over appVersion
113 for (int appVersionNdx = 0; appVersionNdx < DE_LENGTH_OF_ARRAY(appVersions); appVersionNdx++)
115 const VkApplicationInfo appInfo =
117 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
118 DE_NULL, // const void* pNext;
119 "appName", // const char* pAppName;
120 appVersions[appVersionNdx], // deUint32 appVersion;
121 "engineName", // const char* pEngineName;
122 0u, // deUint32 engineVersion;
123 apiVersion, // deUint32 apiVersion;
126 appInfos.push_back(appInfo);
129 // test over engineVersion
130 for (int engineVersionNdx = 0; engineVersionNdx < DE_LENGTH_OF_ARRAY(engineVersions); engineVersionNdx++)
132 const VkApplicationInfo appInfo =
134 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
135 DE_NULL, // const void* pNext;
136 "appName", // const char* pAppName;
137 0u, // deUint32 appVersion;
138 "engineName", // const char* pEngineName;
139 engineVersions[engineVersionNdx], // deUint32 engineVersion;
140 apiVersion, // deUint32 apiVersion;
143 appInfos.push_back(appInfo);
146 const deUint32 variantNum = unpackVersion(apiVersion).variantNum;
147 const deUint32 majorNum = unpackVersion(apiVersion).majorNum;
148 const deUint32 minorNum = unpackVersion(apiVersion).minorNum;
150 // patch component of api version checking (should be ignored by implementation)
151 for (int patchVersion = 0; patchVersion < DE_LENGTH_OF_ARRAY(patchNumbers); patchVersion++)
153 const VkApplicationInfo appInfo =
155 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
156 DE_NULL, // const void* pNext;
157 "appName", // const char* pAppName;
158 0u, // deUint32 appVersion;
159 "engineName", // const char* pEngineName;
160 0u, // deUint32 engineVersion;
161 VK_MAKE_API_VERSION(variantNum, majorNum, minorNum, patchNumbers[patchVersion]), // deUint32 apiVersion;
164 appInfos.push_back(appInfo);
167 // test when apiVersion is 0
169 const VkApplicationInfo appInfo =
171 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
172 DE_NULL, // const void* pNext;
173 "appName", // const char* pAppName;
174 0u, // deUint32 appVersion;
175 "engineName", // const char* pEngineName;
176 0u, // deUint32 engineVersion;
177 0u, // deUint32 apiVersion;
180 appInfos.push_back(appInfo);
184 for (size_t appInfoNdx = 0; appInfoNdx < appInfos.size(); ++appInfoNdx)
186 const VkApplicationInfo& appInfo = appInfos[appInfoNdx];
187 const VkInstanceCreateInfo instanceCreateInfo =
189 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
190 DE_NULL, // const void* pNext;
191 (VkInstanceCreateFlags)0u, // VkInstanceCreateFlags flags;
192 &appInfo, // const VkApplicationInfo* pAppInfo;
193 0u, // deUint32 layerCount;
194 DE_NULL, // const char*const* ppEnabledLayernames;
195 0u, // deUint32 extensionCount;
196 DE_NULL, // const char*const* ppEnabledExtensionNames;
199 log << TestLog::Message << "Creating instance with appInfo: " << appInfo << TestLog::EndMessage;
203 CustomInstance instance = createCustomInstanceFromInfo(context, &instanceCreateInfo);
204 log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
206 catch (const vk::Error& err)
208 resultCollector.fail("Failed, Error code: " + de::toString(err.getMessage()));
212 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
215 tcu::TestStatus createInstanceWithInvalidApiVersionTest (Context& context)
217 tcu::TestLog& log = context.getTestContext().getLog();
218 tcu::ResultCollector resultCollector (log);
219 const PlatformInterface& platformInterface = context.getPlatformInterface();
221 deUint32 instanceApiVersion = 0u;
222 platformInterface.enumerateInstanceVersion(&instanceApiVersion);
224 const ApiVersion apiVersion = unpackVersion(instanceApiVersion);
226 const deUint32 invalidApiVariant = (1 << 3) - 1;
227 const deUint32 invalidMajorVersion = (1 << 7) - 1;
228 const deUint32 invalidMinorVersion = (1 << 10) - 1;
229 vector<ApiVersion> invalidApiVersions;
231 invalidApiVersions.push_back(ApiVersion(invalidApiVariant, invalidMajorVersion, apiVersion.minorNum, apiVersion.patchNum));
232 invalidApiVersions.push_back(ApiVersion(apiVersion.variantNum, invalidMajorVersion, apiVersion.minorNum, apiVersion.patchNum));
233 invalidApiVersions.push_back(ApiVersion(apiVersion.variantNum, apiVersion.majorNum, invalidMinorVersion, apiVersion.patchNum));
234 #ifdef CTS_USES_VULKANSC
235 invalidApiVersions.push_back(ApiVersion(invalidApiVariant, apiVersion.majorNum, apiVersion.minorNum, apiVersion.patchNum));
236 invalidApiVersions.push_back(ApiVersion(0, apiVersion.majorNum, apiVersion.minorNum, apiVersion.patchNum));
237 #endif // CTS_USES_VULKANSC
239 for (size_t apiVersionNdx = 0; apiVersionNdx < invalidApiVersions.size(); apiVersionNdx++)
241 const VkApplicationInfo appInfo =
243 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
244 DE_NULL, // const void* pNext;
245 "appName", // const char* pAppName;
246 0u, // deUint32 appVersion;
247 "engineName", // const char* pEngineName;
248 0u, // deUint32 engineVersion;
249 pack(invalidApiVersions[apiVersionNdx]), // deUint32 apiVersion;
251 const VkInstanceCreateInfo instanceCreateInfo =
253 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
254 DE_NULL, // const void* pNext;
255 (VkInstanceCreateFlags)0u, // VkInstanceCreateFlags flags;
256 &appInfo, // const VkApplicationInfo* pAppInfo;
257 0u, // deUint32 layerCount;
258 DE_NULL, // const char*const* ppEnabledLayernames;
259 0u, // deUint32 extensionCount;
260 DE_NULL, // const char*const* ppEnabledExtensionNames;
263 log << TestLog::Message
264 << "API version reported by enumerateInstanceVersion: " << apiVersion
265 << ", api version used to create instance: " << invalidApiVersions[apiVersionNdx]
266 << TestLog::EndMessage;
269 UncheckedInstance instance;
270 const VkResult result = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
272 #ifdef CTS_USES_VULKANSC
273 if (invalidApiVersions[apiVersionNdx].variantNum == apiVersion.variantNum)
275 if (apiVersion.majorNum == 1 && apiVersion.minorNum == 0)
277 if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
279 TCU_CHECK(!static_cast<bool>(instance));
280 log << TestLog::Message << "Pass, instance creation with invalid apiVersion is rejected" << TestLog::EndMessage;
283 resultCollector.fail("Fail, instance creation with invalid apiVersion is not rejected");
285 else if (apiVersion.majorNum == 1 && apiVersion.minorNum >= 1)
286 #endif // CTS_USES_VULKANSC
288 if (result == VK_SUCCESS)
290 TCU_CHECK(static_cast<bool>(instance));
291 log << TestLog::Message << "Pass, instance creation with nonstandard apiVersion succeeds for "
292 << ((apiVersion.variantNum == 0) ? "Vulkan 1.1" : "Vulkan SC when api variant is correct") << TestLog::EndMessage;
294 else if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
296 std::ostringstream message;
297 message << "Fail, instance creation must not return VK_ERROR_INCOMPATIBLE_DRIVER for "
298 << ((apiVersion.variantNum == 0) ? "Vulkan 1.1" : "Vulkan SC when api variant is correct");
299 resultCollector.fail(message.str().c_str());
303 std::ostringstream message;
304 message << "Fail, createInstance failed with " << result;
305 resultCollector.fail(message.str().c_str());
308 #ifdef CTS_USES_VULKANSC
309 else if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
311 TCU_CHECK(!static_cast<bool>(instance));
312 log << TestLog::Message << "Pass, instance creation with invalid apiVersion is rejected" << TestLog::EndMessage;
315 resultCollector.fail("Fail, instance creation with invalid apiVersion is not rejected");
316 #endif // CTS_USES_VULKANSC
320 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
323 tcu::TestStatus createInstanceWithNullApplicationInfoTest (Context& context)
325 tcu::TestLog& log = context.getTestContext().getLog();
326 tcu::ResultCollector resultCollector (log);
328 const VkInstanceCreateInfo instanceCreateInfo =
330 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
331 DE_NULL, // const void* pNext;
332 (VkInstanceCreateFlags)0u, // VkInstanceCreateFlags flags;
333 DE_NULL, // const VkApplicationInfo* pAppInfo;
334 0u, // deUint32 layerCount;
335 DE_NULL, // const char*const* ppEnabledLayernames;
336 0u, // deUint32 extensionCount;
337 DE_NULL, // const char*const* ppEnabledExtensionNames;
340 log << TestLog::Message << "Creating instance with NULL pApplicationInfo" << TestLog::EndMessage;
344 CustomInstance instance = createCustomInstanceFromInfo(context, &instanceCreateInfo);
345 log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
347 catch (const vk::Error& err)
349 resultCollector.fail("Failed, Error code: " + de::toString(err.getMessage()));
352 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
355 tcu::TestStatus createInstanceWithUnsupportedExtensionsTest (Context& context)
357 tcu::TestLog& log = context.getTestContext().getLog();
358 const char* enabledExtensions[] = {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION"};
359 const deUint32 apiVersion = context.getUsedApiVersion();
360 const VkApplicationInfo appInfo =
362 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
363 DE_NULL, // const void* pNext;
364 "appName", // const char* pAppName;
365 0u, // deUint32 appVersion;
366 "engineName", // const char* pEngineName;
367 0u, // deUint32 engineVersion;
368 apiVersion, // deUint32 apiVersion;
371 const VkInstanceCreateInfo instanceCreateInfo =
373 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
374 DE_NULL, // const void* pNext;
375 (VkInstanceCreateFlags)0u, // VkInstanceCreateFlags flags;
376 &appInfo, // const VkApplicationInfo* pAppInfo;
377 0u, // deUint32 layerCount;
378 DE_NULL, // const char*const* ppEnabledLayernames;
379 DE_LENGTH_OF_ARRAY(enabledExtensions), // deUint32 extensionCount;
380 enabledExtensions, // const char*const* ppEnabledExtensionNames;
383 log << TestLog::Message << "Enabled extensions are: " << TestLog::EndMessage;
385 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(enabledExtensions); ndx++)
386 log << TestLog::Message << enabledExtensions[ndx] << TestLog::EndMessage;
389 UncheckedInstance instance;
390 const VkResult result = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
392 if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
394 TCU_CHECK(!static_cast<bool>(instance));
395 return tcu::TestStatus::pass("Pass, creating instance with unsupported extension was rejected.");
398 return tcu::TestStatus::fail("Fail, creating instance with unsupported extensions succeeded.");
404 UTF8ABUSE_LONGNAME = 0,
406 UTF8ABUSE_OVERLONGNUL,
414 string getUTF8AbuseString (int index)
418 case UTF8ABUSE_LONGNAME:
419 // Generate a long name.
421 std::string longname;
422 longname.resize(65535, 'k');
426 case UTF8ABUSE_BADNAMES:
427 // Various illegal code points in utf-8
429 "Illegal bytes in UTF-8: "
430 "\xc0 \xc1 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff"
431 "illegal surrogates: \xed\xad\xbf \xed\xbe\x80");
433 case UTF8ABUSE_OVERLONGNUL:
434 // Zero encoded as overlong, not exactly legal but often supported to differentiate from terminating zero
435 return string("UTF-8 encoded nul \xC0\x80 (should not end name)");
437 case UTF8ABUSE_OVERLONG:
438 // Some overlong encodings
440 "UTF-8 overlong \xF0\x82\x82\xAC \xfc\x83\xbf\xbf\xbf\xbf \xf8\x87\xbf\xbf\xbf "
443 case UTF8ABUSE_ZALGO:
444 // Internet "zalgo" meme "bleeding text"
446 "\x56\xcc\xb5\xcc\x85\xcc\x94\xcc\x88\xcd\x8a\xcc\x91\xcc\x88\xcd\x91\xcc\x83\xcd\x82"
447 "\xcc\x83\xcd\x90\xcc\x8a\xcc\x92\xcc\x92\xcd\x8b\xcc\x94\xcd\x9d\xcc\x98\xcc\xab\xcc"
448 "\xae\xcc\xa9\xcc\xad\xcc\x97\xcc\xb0\x75\xcc\xb6\xcc\xbe\xcc\x80\xcc\x82\xcc\x84\xcd"
449 "\x84\xcc\x90\xcd\x86\xcc\x9a\xcd\x84\xcc\x9b\xcd\x86\xcd\x92\xcc\x9a\xcd\x99\xcd\x99"
450 "\xcc\xbb\xcc\x98\xcd\x8e\xcd\x88\xcd\x9a\xcc\xa6\xcc\x9c\xcc\xab\xcc\x99\xcd\x94\xcd"
451 "\x99\xcd\x95\xcc\xa5\xcc\xab\xcd\x89\x6c\xcc\xb8\xcc\x8e\xcc\x8b\xcc\x8b\xcc\x9a\xcc"
452 "\x8e\xcd\x9d\xcc\x80\xcc\xa1\xcc\xad\xcd\x9c\xcc\xba\xcc\x96\xcc\xb3\xcc\xa2\xcd\x8e"
453 "\xcc\xa2\xcd\x96\x6b\xcc\xb8\xcc\x84\xcd\x81\xcc\xbf\xcc\x8d\xcc\x89\xcc\x85\xcc\x92"
454 "\xcc\x84\xcc\x90\xcd\x81\xcc\x93\xcd\x90\xcd\x92\xcd\x9d\xcc\x84\xcd\x98\xcd\x9d\xcd"
455 "\xa0\xcd\x91\xcc\x94\xcc\xb9\xcd\x93\xcc\xa5\xcd\x87\xcc\xad\xcc\xa7\xcd\x96\xcd\x99"
456 "\xcc\x9d\xcc\xbc\xcd\x96\xcd\x93\xcc\x9d\xcc\x99\xcc\xa8\xcc\xb1\xcd\x85\xcc\xba\xcc"
457 "\xa7\x61\xcc\xb8\xcc\x8e\xcc\x81\xcd\x90\xcd\x84\xcd\x8c\xcc\x8c\xcc\x85\xcd\x86\xcc"
458 "\x84\xcd\x84\xcc\x90\xcc\x84\xcc\x8d\xcd\x99\xcd\x8d\xcc\xb0\xcc\xa3\xcc\xa6\xcd\x89"
459 "\xcd\x8d\xcd\x87\xcc\x98\xcd\x8d\xcc\xa4\xcd\x9a\xcd\x8e\xcc\xab\xcc\xb9\xcc\xac\xcc"
460 "\xa2\xcd\x87\xcc\xa0\xcc\xb3\xcd\x89\xcc\xb9\xcc\xa7\xcc\xa6\xcd\x89\xcd\x95\x6e\xcc"
461 "\xb8\xcd\x8a\xcc\x8a\xcd\x82\xcc\x9b\xcd\x81\xcd\x90\xcc\x85\xcc\x9b\xcd\x80\xcd\x91"
462 "\xcd\x9b\xcc\x81\xcd\x81\xcc\x9a\xcc\xb3\xcd\x9c\xcc\x9e\xcc\x9d\xcd\x99\xcc\xa2\xcd"
463 "\x93\xcd\x96\xcc\x97\xff");
465 case UTF8ABUSE_CHINESE:
466 // Some Chinese glyphs.
467 // "English equivalent: The devil is in the details", https://en.wikiquote.org/wiki/Chinese_proverbs
469 "\xe8\xaf\xbb\xe4\xb9\xa6\xe9\xa1\xbb\xe7\x94\xa8\xe6\x84\x8f\xef\xbc\x8c\xe4\xb8\x80"
470 "\xe5\xad\x97\xe5\x80\xbc\xe5\x8d\x83\xe9\x87\x91\x20");
473 DE_ASSERT(index == UTF8ABUSE_EMPTY);
474 // Also try an empty string.
479 tcu::TestStatus createInstanceWithExtensionNameAbuseTest (Context& context)
481 const char* extensionList[1] = { 0 };
482 const deUint32 apiVersion = context.getUsedApiVersion();
483 deUint32 failCount = 0;
485 for (int i = 0; i < UTF8ABUSE_MAX; i++)
487 string abuseString = getUTF8AbuseString(i);
488 extensionList[0] = abuseString.c_str();
490 const VkApplicationInfo appInfo =
492 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
493 DE_NULL, // const void* pNext;
494 "appName", // const char* pAppName;
495 0u, // deUint32 appVersion;
496 "engineName", // const char* pEngineName;
497 0u, // deUint32 engineVersion;
498 apiVersion, // deUint32 apiVersion;
501 const VkInstanceCreateInfo instanceCreateInfo =
503 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
504 DE_NULL, // const void* pNext;
505 (VkInstanceCreateFlags)0u, // VkInstanceCreateFlags flags;
506 &appInfo, // const VkApplicationInfo* pAppInfo;
507 0u, // deUint32 layerCount;
508 DE_NULL, // const char*const* ppEnabledLayernames;
509 1u, // deUint32 extensionCount;
510 extensionList, // const char*const* ppEnabledExtensionNames;
514 UncheckedInstance instance;
515 const VkResult result = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
517 if (result != VK_ERROR_EXTENSION_NOT_PRESENT)
520 TCU_CHECK(!static_cast<bool>(instance));
525 return tcu::TestStatus::fail("Fail, creating instances with unsupported extensions succeeded.");
527 return tcu::TestStatus::pass("Pass, creating instances with unsupported extensions were rejected.");
530 tcu::TestStatus createInstanceWithLayerNameAbuseTest (Context& context)
532 const PlatformInterface& platformInterface = context.getPlatformInterface();
533 const char* layerList[1] = { 0 };
534 const deUint32 apiVersion = context.getUsedApiVersion();
535 deUint32 failCount = 0;
537 for (int i = 0; i < UTF8ABUSE_MAX; i++)
539 string abuseString = getUTF8AbuseString(i);
540 layerList[0] = abuseString.c_str();
542 const VkApplicationInfo appInfo =
544 VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType;
545 DE_NULL, // const void* pNext;
546 "appName", // const char* pAppName;
547 0u, // deUint32 appVersion;
548 "engineName", // const char* pEngineName;
549 0u, // deUint32 engineVersion;
550 apiVersion, // deUint32 apiVersion;
553 const VkInstanceCreateInfo instanceCreateInfo =
555 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
556 DE_NULL, // const void* pNext;
557 (VkInstanceCreateFlags)0u, // VkInstanceCreateFlags flags;
558 &appInfo, // const VkApplicationInfo* pAppInfo;
559 1u, // deUint32 layerCount;
560 layerList, // const char*const* ppEnabledLayernames;
561 0u, // deUint32 extensionCount;
562 DE_NULL, // const char*const* ppEnabledExtensionNames;
566 VkInstance instance = (VkInstance)0;
567 const VkResult result = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
568 const bool gotInstance = !!instance;
572 const InstanceDriver instanceIface(platformInterface, instance);
573 instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
576 if (result != VK_ERROR_LAYER_NOT_PRESENT)
579 TCU_CHECK(!gotInstance);
584 return tcu::TestStatus::fail("Fail, creating instances with unsupported layers succeeded.");
586 return tcu::TestStatus::pass("Pass, creating instances with unsupported layers were rejected.");
589 #ifndef CTS_USES_VULKANSC
590 tcu::TestStatus enumerateDevicesAllocLeakTest(Context& context)
592 // enumeratePhysicalDevices uses instance-provided allocator
593 // and this test checks if all alocated memory is freed
595 typedef AllocationCallbackRecorder::RecordIterator RecordIterator;
597 DeterministicFailAllocator objAllocator (getSystemAllocator(), DeterministicFailAllocator::MODE_DO_NOT_COUNT, 0);
598 AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128);
599 const auto instance = createCustomInstanceFromContext(context, recorder.getCallbacks(), true);
600 const auto& vki = instance.getDriver();
601 vector<VkPhysicalDevice> devices (enumeratePhysicalDevices(vki, instance));
602 RecordIterator recordToCheck (recorder.getRecordsEnd());
606 devices = enumeratePhysicalDevices(vki, instance);
608 catch (const vk::OutOfMemoryError& e)
610 if (e.getError() != VK_ERROR_OUT_OF_HOST_MEMORY)
611 return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Got out of memory error - leaks in enumeratePhysicalDevices not tested.");
614 // make sure that same number of allocations and frees was done
615 deInt32 allocationRecords (0);
616 RecordIterator lastRecordToCheck (recorder.getRecordsEnd());
617 while (recordToCheck != lastRecordToCheck)
619 const AllocationCallbackRecord& record = *recordToCheck;
622 case AllocationCallbackRecord::TYPE_ALLOCATION:
625 case AllocationCallbackRecord::TYPE_FREE:
626 if (record.data.free.mem != DE_NULL)
635 if (allocationRecords)
636 return tcu::TestStatus::fail("enumeratePhysicalDevices leaked memory");
637 return tcu::TestStatus::pass("Ok");
639 #endif // CTS_USES_VULKANSC
641 tcu::TestStatus createDeviceTest (Context& context)
643 const PlatformInterface& platformInterface = context.getPlatformInterface();
644 const CustomInstance instance (createCustomInstanceFromContext(context));
645 const InstanceDriver& instanceDriver (instance.getDriver());
646 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
647 const deUint32 queueFamilyIndex = 0;
648 const deUint32 queueCount = 1;
649 const deUint32 queueIndex = 0;
650 const float queuePriority = 1.0f;
652 const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
654 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
656 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
658 (VkDeviceQueueCreateFlags)0u,
659 queueFamilyIndex, //queueFamilyIndex;
660 queueCount, //queueCount;
661 &queuePriority, //pQueuePriorities;
664 void* pNext = DE_NULL;
665 #ifdef CTS_USES_VULKANSC
666 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
667 memReservationInfo.pNext = pNext;
668 pNext = &memReservationInfo;
670 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
671 sc10Features.pNext = pNext;
672 pNext = &sc10Features;
673 #endif // CTS_USES_VULKANSC
675 const VkDeviceCreateInfo deviceCreateInfo =
677 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
679 (VkDeviceCreateFlags)0u,
680 1, //queueRecordCount;
681 &deviceQueueCreateInfo, //pRequestedQueues;
683 DE_NULL, //ppEnabledLayerNames;
685 DE_NULL, //ppEnabledExtensionNames;
686 DE_NULL, //pEnabledFeatures;
689 const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
690 const DeviceDriver deviceDriver (platformInterface, instance, device.get());
691 const VkQueue queue = getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
693 VK_CHECK(deviceDriver.queueWaitIdle(queue));
695 return tcu::TestStatus::pass("Pass");
698 tcu::TestStatus createMultipleDevicesTest (Context& context)
700 tcu::TestLog& log = context.getTestContext().getLog();
701 tcu::ResultCollector resultCollector (log);
702 #ifndef CTS_USES_VULKANSC
703 const int numDevices = 5;
705 const int numDevices = 2;
706 #endif // CTS_USES_VULKANSC
708 const PlatformInterface& platformInterface = context.getPlatformInterface();
710 vector<CustomInstance> instances;
711 vector<VkDevice> devices(numDevices, (VkDevice)DE_NULL);
715 for (int deviceNdx = 0; deviceNdx < numDevices; deviceNdx++)
717 instances.emplace_back(createCustomInstanceFromContext(context));
719 const InstanceDriver& instanceDriver (instances.back().getDriver());
720 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instances.back(), context.getTestContext().getCommandLine());
721 const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
722 const deUint32 queueFamilyIndex = 0;
723 const deUint32 queueCount = 1;
724 const deUint32 queueIndex = 0;
725 const float queuePriority = 1.0f;
726 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
728 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
730 (VkDeviceQueueCreateFlags)0u, //flags;
731 queueFamilyIndex, //queueFamilyIndex;
732 queueCount, //queueCount;
733 &queuePriority, //pQueuePriorities;
736 void* pNext = DE_NULL;
737 #ifdef CTS_USES_VULKANSC
738 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
739 memReservationInfo.pNext = pNext;
740 pNext = &memReservationInfo;
742 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
743 sc10Features.pNext = pNext;
744 pNext = &sc10Features;
745 #endif // CTS_USES_VULKANSC
747 const VkDeviceCreateInfo deviceCreateInfo =
749 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
751 (VkDeviceCreateFlags)0u,
752 1, //queueRecordCount;
753 &deviceQueueCreateInfo, //pRequestedQueues;
755 DE_NULL, //ppEnabledLayerNames;
757 DE_NULL, //ppEnabledExtensionNames;
758 DE_NULL, //pEnabledFeatures;
761 const VkResult result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &devices[deviceNdx]);
763 if (result != VK_SUCCESS)
765 resultCollector.fail("Failed to create Device No." + de::toString(deviceNdx) + ", Error Code: " + de::toString(result));
770 const DeviceDriver deviceDriver (platformInterface, instances.back(), devices[deviceNdx]);
771 const VkQueue queue = getDeviceQueue(deviceDriver, devices[deviceNdx], queueFamilyIndex, queueIndex);
773 VK_CHECK(deviceDriver.queueWaitIdle(queue));
777 catch (const vk::Error& error)
779 resultCollector.fail(de::toString(error.getError()));
783 for (int deviceNdx = (int)devices.size()-1; deviceNdx >= 0; deviceNdx--)
785 if (devices[deviceNdx] != (VkDevice)DE_NULL)
787 DeviceDriver deviceDriver(platformInterface, instances[deviceNdx], devices[deviceNdx]);
788 deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
795 for (int deviceNdx = (int)devices.size()-1; deviceNdx >= 0; deviceNdx--)
797 if (devices[deviceNdx] != (VkDevice)DE_NULL)
799 DeviceDriver deviceDriver(platformInterface, instances[deviceNdx], devices[deviceNdx]);
800 deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
804 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
807 tcu::TestStatus createDeviceWithUnsupportedExtensionsTest (Context& context)
809 tcu::TestLog& log = context.getTestContext().getLog();
810 const PlatformInterface& platformInterface = context.getPlatformInterface();
811 const CustomInstance instance (createCustomInstanceFromContext(context, DE_NULL, false));
812 const InstanceDriver& instanceDriver (instance.getDriver());
813 const char* enabledExtensions[] = {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION", "VK_DONT_SUPPORT_ME"};
814 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
815 const float queuePriority = 1.0f;
816 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
818 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
820 (VkDeviceQueueCreateFlags)0u,
821 0, //queueFamilyIndex;
823 &queuePriority, //pQueuePriorities;
826 void* pNext = DE_NULL;
827 #ifdef CTS_USES_VULKANSC
828 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
829 memReservationInfo.pNext = pNext;
830 pNext = &memReservationInfo;
832 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
833 sc10Features.pNext = pNext;
834 pNext = &sc10Features;
835 #endif // CTS_USES_VULKANSC
837 const VkDeviceCreateInfo deviceCreateInfo =
839 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
841 (VkDeviceCreateFlags)0u,
842 1, //queueRecordCount;
843 &deviceQueueCreateInfo, //pRequestedQueues;
845 DE_NULL, //ppEnabledLayerNames;
846 DE_LENGTH_OF_ARRAY(enabledExtensions), //extensionCount;
847 enabledExtensions, //ppEnabledExtensionNames;
848 DE_NULL, //pEnabledFeatures;
851 log << TestLog::Message << "Enabled extensions are: " << TestLog::EndMessage;
853 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(enabledExtensions); ndx++)
854 log << TestLog::Message << enabledExtensions[ndx] << TestLog::EndMessage;
857 VkDevice device = (VkDevice)0;
858 const VkResult result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &device);
859 const bool gotDevice = !!device;
863 const DeviceDriver deviceIface (platformInterface, instance, device);
864 deviceIface.destroyDevice(device, DE_NULL/*pAllocator*/);
867 if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
869 TCU_CHECK(!gotDevice);
870 return tcu::TestStatus::pass("Pass, create device with unsupported extension is rejected.");
873 return tcu::TestStatus::fail("Fail, create device with unsupported extension but succeed.");
877 deUint32 getGlobalMaxQueueCount(const vector<VkQueueFamilyProperties>& queueFamilyProperties)
879 deUint32 maxQueueCount = 0;
881 for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < (deUint32)queueFamilyProperties.size(); queueFamilyNdx++)
883 maxQueueCount = de::max(maxQueueCount, queueFamilyProperties[queueFamilyNdx].queueCount);
886 return maxQueueCount;
889 tcu::TestStatus createDeviceWithVariousQueueCountsTest (Context& context)
891 tcu::TestLog& log = context.getTestContext().getLog();
892 const int queueCountDiff = 1;
893 const PlatformInterface& platformInterface = context.getPlatformInterface();
894 const CustomInstance instance (createCustomInstanceFromContext(context));
895 const InstanceDriver& instanceDriver (instance.getDriver());
896 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
897 const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
898 const vector<float> queuePriorities (getGlobalMaxQueueCount(queueFamilyProperties), 1.0f);
899 vector<VkDeviceQueueCreateInfo> deviceQueueCreateInfos;
901 for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < (deUint32)queueFamilyProperties.size(); queueFamilyNdx++)
903 const deUint32 maxQueueCount = queueFamilyProperties[queueFamilyNdx].queueCount;
905 for (deUint32 queueCount = 1; queueCount <= maxQueueCount; queueCount += queueCountDiff)
907 const VkDeviceQueueCreateInfo queueCreateInfo =
909 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
911 (VkDeviceQueueCreateFlags)0u,
914 queuePriorities.data()
917 deviceQueueCreateInfos.push_back(queueCreateInfo);
921 for (size_t testNdx = 0; testNdx < deviceQueueCreateInfos.size(); testNdx++)
923 const VkDeviceQueueCreateInfo& queueCreateInfo = deviceQueueCreateInfos[testNdx];
924 void* pNext = DE_NULL;
925 #ifdef CTS_USES_VULKANSC
926 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
927 memReservationInfo.pNext = pNext;
928 pNext = &memReservationInfo;
930 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
931 sc10Features.pNext = pNext;
932 pNext = &sc10Features;
933 #endif // CTS_USES_VULKANSC
935 const VkDeviceCreateInfo deviceCreateInfo =
937 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
939 (VkDeviceCreateFlags)0u,
940 1, //queueRecordCount;
941 &queueCreateInfo, //pRequestedQueues;
943 DE_NULL, //ppEnabledLayerNames;
945 DE_NULL, //ppEnabledExtensionNames;
946 DE_NULL, //pEnabledFeatures;
949 const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
950 const DeviceDriver deviceDriver (platformInterface, instance, device.get());
951 const deUint32 queueFamilyIndex = deviceCreateInfo.pQueueCreateInfos->queueFamilyIndex;
952 const deUint32 queueCount = deviceCreateInfo.pQueueCreateInfos->queueCount;
954 for (deUint32 queueIndex = 0; queueIndex < queueCount; queueIndex++)
956 const VkQueue queue = getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
961 result = deviceDriver.queueWaitIdle(queue);
962 if (result != VK_SUCCESS)
964 log << TestLog::Message
965 << "vkQueueWaitIdle failed"
966 << ", queueIndex = " << queueIndex
967 << ", queueCreateInfo " << queueCreateInfo
968 << ", Error Code: " << result
969 << TestLog::EndMessage;
970 return tcu::TestStatus::fail("Fail");
974 return tcu::TestStatus::pass("Pass");
977 void checkGlobalPrioritySupport (Context& context, bool useKhrGlobalPriority)
979 const std::string extName = (useKhrGlobalPriority ? "VK_KHR_global_priority" : "VK_EXT_global_priority");
980 context.requireDeviceFunctionality(extName);
983 tcu::TestStatus createDeviceWithGlobalPriorityTest (Context& context, bool useKhrGlobalPriority)
985 tcu::TestLog& log = context.getTestContext().getLog();
986 const PlatformInterface& platformInterface = context.getPlatformInterface();
987 const auto& instanceDriver = context.getInstanceInterface();
988 const auto instance = context.getInstance();
989 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
990 const vector<float> queuePriorities (1, 1.0f);
991 const VkQueueGlobalPriorityEXT globalPriorities[] = { VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT, VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT, VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT, VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT };
993 #ifndef CTS_USES_VULKANSC
994 deUint32 queueFamilyPropertyCount = ~0u;
996 instanceDriver.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertyCount, DE_NULL);
997 TCU_CHECK(queueFamilyPropertyCount > 0);
999 std::vector<VkQueueFamilyProperties2> queueFamilyProperties2 (queueFamilyPropertyCount);
1000 std::vector<VkQueueFamilyGlobalPriorityPropertiesKHR> globalPriorityProperties (queueFamilyPropertyCount);
1002 if (useKhrGlobalPriority)
1004 for (deUint32 ndx = 0; ndx < queueFamilyPropertyCount; ndx++)
1006 globalPriorityProperties[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR;
1007 globalPriorityProperties[ndx].pNext = DE_NULL;
1008 queueFamilyProperties2[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
1009 queueFamilyProperties2[ndx].pNext = &globalPriorityProperties[ndx];
1012 instanceDriver.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertyCount, queueFamilyProperties2.data());
1013 TCU_CHECK((size_t)queueFamilyPropertyCount == queueFamilyProperties2.size());
1016 std::vector<const char*> enabledExtensions = { "VK_EXT_global_priority" };
1017 if (useKhrGlobalPriority)
1018 enabledExtensions = { "VK_KHR_global_priority" };
1020 VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT globalPriorityQueryFeatures
1022 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT, //sType;
1024 VK_TRUE //globalPriorityQuery;
1027 (void)useKhrGlobalPriority;
1028 std::vector<const char*> enabledExtensions = { "VK_EXT_global_priority" };
1029 #endif // CTS_USES_VULKANSC
1031 if (!context.contextSupports(vk::ApiVersion(0, 1, 1, 0)))
1033 enabledExtensions.emplace_back("VK_KHR_get_physical_device_properties2");
1036 for (VkQueueGlobalPriorityEXT globalPriority : globalPriorities)
1038 const VkDeviceQueueGlobalPriorityCreateInfoEXT queueGlobalPriority =
1040 VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, //sType;
1042 globalPriority //globalPriority;
1045 const VkDeviceQueueCreateInfo queueCreateInfo =
1047 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, //sType;
1048 &queueGlobalPriority, //pNext;
1049 (VkDeviceQueueCreateFlags)0u, //flags;
1050 0, //queueFamilyIndex;
1052 queuePriorities.data() //pQueuePriorities;
1055 void* pNext = DE_NULL;
1056 #ifdef CTS_USES_VULKANSC
1057 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
1058 memReservationInfo.pNext = pNext;
1059 pNext = &memReservationInfo;
1061 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
1062 sc10Features.pNext = pNext;
1063 pNext = &sc10Features;
1065 pNext = useKhrGlobalPriority ? &globalPriorityQueryFeatures : DE_NULL;
1066 #endif // CTS_USES_VULKANSC
1068 const VkDeviceCreateInfo deviceCreateInfo =
1070 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
1072 (VkDeviceCreateFlags)0u, //flags;
1073 1, //queueRecordCount;
1074 &queueCreateInfo, //pRequestedQueues;
1076 DE_NULL, //ppEnabledLayerNames;
1077 (deUint32)enabledExtensions.size(), //extensionCount;
1078 enabledExtensions.data(), //ppEnabledExtensionNames;
1079 DE_NULL, //pEnabledFeatures;
1082 const bool mayBeDenied = globalPriority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT;
1083 #ifndef CTS_USES_VULKANSC
1084 const bool mustFail = useKhrGlobalPriority && (globalPriority < globalPriorityProperties[0].priorities[0] || globalPriority > globalPriorityProperties[0].priorities[globalPriorityProperties[0].priorityCount - 1]);
1085 #endif // CTS_USES_VULKANSC
1089 const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
1090 const DeviceDriver deviceDriver (platformInterface, instance, device.get());
1091 const deUint32 queueFamilyIndex = deviceCreateInfo.pQueueCreateInfos->queueFamilyIndex;
1092 const VkQueue queue = getDeviceQueue(deviceDriver, *device, queueFamilyIndex, 0);
1097 result = deviceDriver.queueWaitIdle(queue);
1098 if (result == VK_ERROR_NOT_PERMITTED_EXT && mayBeDenied)
1103 #ifndef CTS_USES_VULKANSC
1104 if (result == VK_ERROR_INITIALIZATION_FAILED && mustFail)
1111 log << TestLog::Message
1112 << "device creation must fail but not"
1113 << ", globalPriority = " << globalPriority
1114 << ", queueCreateInfo " << queueCreateInfo
1115 << TestLog::EndMessage;
1116 return tcu::TestStatus::fail("Fail");
1118 #endif // CTS_USES_VULKANSC
1120 if (result != VK_SUCCESS)
1122 log << TestLog::Message
1123 << "vkQueueWaitIdle failed"
1124 << ", globalPriority = " << globalPriority
1125 << ", queueCreateInfo " << queueCreateInfo
1126 << ", Error Code: " << result
1127 << TestLog::EndMessage;
1128 return tcu::TestStatus::fail("Fail");
1131 catch (const Error& error)
1133 if ((error.getError() == VK_ERROR_NOT_PERMITTED_EXT && mayBeDenied)
1134 #ifndef CTS_USES_VULKANSC
1135 || (error.getError() == VK_ERROR_INITIALIZATION_FAILED && mustFail)
1136 #endif // CTS_USES_VULKANSC
1143 log << TestLog::Message
1144 << "exception thrown " << error.getMessage()
1145 << ", globalPriority = " << globalPriority
1146 << ", queueCreateInfo " << queueCreateInfo
1147 << ", Error Code: " << error.getError()
1148 << TestLog::EndMessage;
1149 return tcu::TestStatus::fail("Fail");
1154 return tcu::TestStatus::pass("Pass");
1157 #ifndef CTS_USES_VULKANSC
1158 void checkGlobalPriorityQuerySupport (Context& context, bool useKhrGlobalPriority)
1160 const std::string extName = (useKhrGlobalPriority ? "VK_KHR_global_priority" : "VK_EXT_global_priority_query");
1161 context.requireDeviceFunctionality(extName);
1164 deBool isValidGlobalPriority(VkQueueGlobalPriorityEXT priority)
1167 case VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT:
1168 case VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT:
1169 case VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT:
1170 case VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT:
1177 void checkGlobalPriorityProperties(const VkQueueFamilyGlobalPriorityPropertiesEXT& properties)
1179 TCU_CHECK(properties.priorityCount > 0);
1180 TCU_CHECK(properties.priorityCount <= VK_MAX_GLOBAL_PRIORITY_SIZE_KHR);
1181 TCU_CHECK(isValidGlobalPriority(properties.priorities[0]));
1183 for (deUint32 ndx = 1; ndx < properties.priorityCount; ndx++)
1185 TCU_CHECK(isValidGlobalPriority(properties.priorities[ndx]));
1186 TCU_CHECK(properties.priorities[ndx] == (properties.priorities[ndx - 1] << 1));
1189 #endif // CTS_USES_VULKANSC
1191 #ifndef CTS_USES_VULKANSC
1192 tcu::TestStatus createDeviceWithQueriedGlobalPriorityTest (Context& context, bool useKhrGlobalPriority)
1194 tcu::TestLog& log = context.getTestContext().getLog();
1195 const PlatformInterface& platformInterface = context.getPlatformInterface();
1196 const auto& instanceDriver = context.getInstanceInterface();
1197 const auto instance = context.getInstance();
1198 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
1199 const VkQueueGlobalPriorityEXT globalPriorities[] = { VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT, VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT, VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT, VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT };
1200 const vector<float> queuePriorities (1, 1.0f);
1201 deUint32 queueFamilyPropertyCount = ~0u;
1203 instanceDriver.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertyCount, DE_NULL);
1204 TCU_CHECK(queueFamilyPropertyCount > 0);
1206 std::vector<VkQueueFamilyProperties2> queueFamilyProperties2 (queueFamilyPropertyCount);
1207 std::vector<VkQueueFamilyGlobalPriorityPropertiesEXT> globalPriorityProperties (queueFamilyPropertyCount);
1209 for (deUint32 ndx = 0; ndx < queueFamilyPropertyCount; ndx++)
1211 globalPriorityProperties[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT;
1212 globalPriorityProperties[ndx].pNext = DE_NULL;
1213 queueFamilyProperties2[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
1214 queueFamilyProperties2[ndx].pNext = &globalPriorityProperties[ndx];
1217 instanceDriver.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertyCount, queueFamilyProperties2.data());
1218 TCU_CHECK((size_t)queueFamilyPropertyCount == queueFamilyProperties2.size());
1220 std::vector<const char*> enabledExtensions = { "VK_EXT_global_priority", "VK_EXT_global_priority_query" };
1221 if (useKhrGlobalPriority)
1222 enabledExtensions = { "VK_KHR_global_priority" };
1224 if (!context.contextSupports(vk::ApiVersion(0, 1, 1, 0)))
1226 enabledExtensions.emplace_back("VK_KHR_get_physical_device_properties2");
1229 for (deUint32 ndx = 0; ndx < queueFamilyPropertyCount; ndx++)
1231 checkGlobalPriorityProperties(globalPriorityProperties[ndx]);
1233 for (VkQueueGlobalPriorityEXT globalPriority : globalPriorities)
1235 const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT globalPriorityQueryFeatures =
1237 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT, //sType;
1239 VK_TRUE //globalPriorityQuery;
1241 const VkDeviceQueueGlobalPriorityCreateInfoEXT queueGlobalPriorityCreateInfo =
1243 VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, //sType;
1245 globalPriority, //globalPriority;
1247 const VkDeviceQueueCreateInfo queueCreateInfo =
1249 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, //sType;
1250 &queueGlobalPriorityCreateInfo, //pNext;
1251 (VkDeviceQueueCreateFlags)0u, //flags;
1252 ndx, //queueFamilyIndex;
1254 queuePriorities.data() //pQueuePriorities;
1256 const VkDeviceCreateInfo deviceCreateInfo =
1258 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
1259 &globalPriorityQueryFeatures, //pNext;
1260 (VkDeviceCreateFlags)0u, //flags;
1261 1, //queueRecordCount;
1262 &queueCreateInfo, //pRequestedQueues;
1264 DE_NULL, //ppEnabledLayerNames;
1265 (deUint32)enabledExtensions.size(), //extensionCount;
1266 enabledExtensions.data(), //ppEnabledExtensionNames;
1267 DE_NULL, //pEnabledFeatures;
1269 const bool mayBeDenied = globalPriority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT;
1270 const bool mustFail = globalPriority < globalPriorityProperties[ndx].priorities[0] || globalPriority > globalPriorityProperties[ndx].priorities[globalPriorityProperties[ndx].priorityCount - 1];
1274 const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
1275 const DeviceDriver deviceDriver (platformInterface, instance, device.get());
1276 const VkQueue queue = getDeviceQueue(deviceDriver, *device, ndx, 0);
1282 log << TestLog::Message
1283 << "device creation must fail but not"
1284 << ", globalPriority = " << globalPriority
1285 << ", queueCreateInfo " << queueCreateInfo
1286 << TestLog::EndMessage;
1287 return tcu::TestStatus::fail("Fail");
1290 catch (const Error& error)
1292 if (mustFail || (error.getError() == VK_ERROR_NOT_PERMITTED_EXT && mayBeDenied))
1298 log << TestLog::Message
1299 << "exception thrown " << error.getMessage()
1300 << ", globalPriority = " << globalPriority
1301 << ", queueCreateInfo " << queueCreateInfo
1302 << ", Error Code: " << error.getError()
1303 << TestLog::EndMessage;
1304 return tcu::TestStatus::fail("Fail");
1310 return tcu::TestStatus::pass("Pass");
1312 #endif // CTS_USES_VULKANSC
1314 tcu::TestStatus createDeviceFeatures2Test (Context& context)
1316 const PlatformInterface& vkp = context.getPlatformInterface();
1317 const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
1318 const InstanceDriver& vki (instance.getDriver());
1319 const VkPhysicalDevice physicalDevice = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
1320 const deUint32 queueFamilyIndex = 0;
1321 const deUint32 queueCount = 1;
1322 const deUint32 queueIndex = 0;
1323 const float queuePriority = 1.0f;
1324 const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
1326 VkPhysicalDeviceFeatures2 enabledFeatures;
1327 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
1329 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
1331 (VkDeviceQueueCreateFlags)0u,
1337 void* pNext = &enabledFeatures;
1338 #ifdef CTS_USES_VULKANSC
1339 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
1340 memReservationInfo.pNext = pNext;
1341 pNext = &memReservationInfo;
1343 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
1344 sc10Features.pNext = pNext;
1345 pNext = &sc10Features;
1346 #endif // CTS_USES_VULKANSC
1348 const VkDeviceCreateInfo deviceCreateInfo =
1350 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
1352 (VkDeviceCreateFlags)0u,
1354 &deviceQueueCreateInfo,
1362 // Populate enabledFeatures
1363 enabledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1364 enabledFeatures.pNext = DE_NULL;
1366 vki.getPhysicalDeviceFeatures2(physicalDevice, &enabledFeatures);
1369 const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceCreateInfo));
1370 const DeviceDriver vkd (vkp, instance, device.get());
1371 const VkQueue queue = getDeviceQueue(vkd, *device, queueFamilyIndex, queueIndex);
1373 VK_CHECK(vkd.queueWaitIdle(queue));
1376 return tcu::TestStatus::pass("Pass");
1385 #define FEATURE_ITEM(STRUCT, MEMBER) {#MEMBER, DE_OFFSET_OF(STRUCT, MEMBER)}
1386 // This macro is used to avoid the "out of array bounds" compiler warnings/errors in the checkFeatures function.
1387 #define SAFE_OFFSET(LIMITING_STRUCT, STRUCT, MEMBER) std::min(static_cast<deUint32>(sizeof(LIMITING_STRUCT) - sizeof(VkBool32)), DE_OFFSET_OF(STRUCT, MEMBER))
1389 template<typename StructType>
1390 void checkFeatures (const PlatformInterface& vkp,
1391 const VkInstance& instance,
1392 const InstanceDriver& instanceDriver,
1393 const VkPhysicalDevice physicalDevice,
1395 const Feature features[],
1396 const StructType* supportedFeatures,
1397 const deUint32 queueFamilyIndex,
1398 const deUint32 queueCount,
1399 const float queuePriority,
1401 tcu::ResultCollector& resultCollector,
1402 const vector<const char*>* extensionNames,
1403 const VkPhysicalDeviceFeatures& defaultPhysicalDeviceFeatures,
1404 #ifdef CTS_USES_VULKANSC
1405 VkDeviceObjectReservationCreateInfo memReservationStatMax,
1406 #endif // CTS_USES_VULKANSC
1410 struct StructureBase
1412 VkStructureType sType;
1416 for (int featureNdx = 0; featureNdx < numFeatures; featureNdx++)
1418 // Test only features that are not supported.
1419 if (*(((VkBool32*)((deUint8*)(supportedFeatures) + features[featureNdx].offset))))
1422 StructType structCopy;
1423 deMemset(&structCopy, 0, sizeof(StructType));
1425 auto* structBase = reinterpret_cast<StructureBase*>(&structCopy);
1426 VkStructureType structureType = reinterpret_cast<const StructureBase*>(supportedFeatures)->sType;
1427 structBase->sType = structureType;
1428 structBase->pNext = DE_NULL;
1430 VkPhysicalDeviceFeatures physicalDeviceFeaturesCopy = defaultPhysicalDeviceFeatures;
1432 // Some features require that other feature(s) are also enabled.
1434 if (structureType == vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES)
1436 DE_ASSERT((std::is_same<VkPhysicalDeviceVulkan11Features, StructType>::value));
1437 // If multiviewGeometryShader is enabled then multiview must also be enabled.
1438 // If multiviewTessellationShader is enabled then multiview must also be enabled.
1439 if (features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceVulkan11Features, multiviewGeometryShader) ||
1440 features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceVulkan11Features, multiviewTessellationShader))
1442 auto* memberPtr = reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceVulkan11Features, multiview));
1443 *memberPtr = VK_TRUE;
1446 // If variablePointers is enabled then variablePointersStorageBuffer must also be enabled.
1447 if (features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceVulkan11Features, variablePointers))
1449 auto* memberPtr = reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceVulkan11Features, variablePointersStorageBuffer));
1450 *memberPtr = VK_TRUE;
1453 #ifndef CTS_USES_VULKANSC
1454 // If rayTracingPipelineShaderGroupHandleCaptureReplayMixed is VK_TRUE, rayTracingPipelineShaderGroupHandleCaptureReplay must also be VK_TRUE.
1455 else if (structureType == vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR &&
1456 features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceRayTracingPipelineFeaturesKHR, rayTracingPipelineShaderGroupHandleCaptureReplayMixed))
1458 DE_ASSERT((std::is_same<VkPhysicalDeviceRayTracingPipelineFeaturesKHR, StructType>::value));
1459 auto* memberPtr = reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, rayTracingPipelineShaderGroupHandleCaptureReplay));
1460 *memberPtr = VK_TRUE;
1462 #endif // CTS_USES_VULKANSC
1463 else if (structureType == vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES)
1465 DE_ASSERT((std::is_same<VkPhysicalDeviceMultiviewFeatures, StructType>::value));
1466 // If multiviewGeometryShader is enabled then multiview must also be enabled.
1467 // If multiviewTessellationShader is enabled then multiview must also be enabled.
1468 if (features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceMultiviewFeatures, multiviewGeometryShader) ||
1469 features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceMultiviewFeatures, multiviewTessellationShader))
1471 auto* memberPtr = reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceMultiviewFeatures, multiview));
1472 *memberPtr = VK_TRUE;
1475 else if (structureType == vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT)
1477 DE_ASSERT((std::is_same<VkPhysicalDeviceRobustness2FeaturesEXT, StructType>::value));
1478 // If robustBufferAccess2 is enabled then robustBufferAccess must also be enabled.
1479 if (features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceRobustness2FeaturesEXT, robustBufferAccess2))
1481 physicalDeviceFeaturesCopy.robustBufferAccess = true;
1484 else if (structureType == vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT)
1486 DE_ASSERT((std::is_same<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT, StructType>::value));
1487 // If sparseImageInt64Atomics is enabled, shaderImageInt64Atomics must be enabled.
1488 if (features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT, sparseImageInt64Atomics))
1490 auto* memberPtr = reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT, shaderImageInt64Atomics));
1491 *memberPtr = VK_TRUE;
1494 else if (structureType == vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT)
1496 DE_ASSERT((std::is_same<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, StructType>::value));
1497 // If sparseImageFloat32Atomics is enabled, shaderImageFloat32Atomics must be enabled.
1498 if (features[featureNdx].offset ==
1499 DE_OFFSET_OF(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, sparseImageFloat32Atomics)) {
1500 auto *memberPtr = reinterpret_cast<VkBool32 *>(reinterpret_cast<deUint8 *>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, shaderImageFloat32Atomics));
1501 *memberPtr = VK_TRUE;
1504 // If sparseImageFloat32AtomicAdd is enabled, shaderImageFloat32AtomicAdd must be enabled.
1505 if (features[featureNdx].offset ==
1506 DE_OFFSET_OF(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, sparseImageFloat32AtomicAdd)) {
1507 auto *memberPtr = reinterpret_cast<VkBool32 *>(reinterpret_cast<deUint8 *>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, shaderImageFloat32AtomicAdd));
1508 *memberPtr = VK_TRUE;
1511 #ifndef CTS_USES_VULKANSC
1512 else if (structureType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT)
1514 DE_ASSERT((std::is_same<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT, StructType>::value));
1515 // If sparseImageFloat32AtomicMinMax is enabled, shaderImageFloat32AtomicMinMax must be enabled.
1516 if (features[featureNdx].offset == DE_OFFSET_OF(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT, sparseImageFloat32AtomicMinMax))
1518 auto* memberPtr = reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + SAFE_OFFSET(StructType, VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT, shaderImageFloat32AtomicMinMax));
1519 *memberPtr = VK_TRUE;
1522 #endif // CTS_USES_VULKANSC
1524 // Enable the feature we're testing.
1525 *reinterpret_cast<VkBool32*>(reinterpret_cast<deUint8*>(&structCopy) + features[featureNdx].offset) = VK_TRUE;
1527 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
1529 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
1531 (VkDeviceQueueCreateFlags)0u, // flags
1532 queueFamilyIndex, // queueFamilyIndex
1533 queueCount, // queueCount
1534 &queuePriority // pQueuePriorities
1536 VkPhysicalDeviceFeatures2 deviceFeatures2 =
1538 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, // sType
1539 &structCopy, // pNext
1540 physicalDeviceFeaturesCopy // features
1543 void* pNext = &deviceFeatures2;
1544 #ifdef CTS_USES_VULKANSC
1545 VkDeviceObjectReservationCreateInfo memReservationInfo = isSubProcess? memReservationStatMax : resetDeviceObjectReservationCreateInfo();
1546 memReservationInfo.pNext = pNext;
1547 pNext = &memReservationInfo;
1549 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
1550 sc10Features.pNext = pNext;
1551 pNext = &sc10Features;
1553 DE_UNREF(isSubProcess);
1554 #endif // CTS_USES_VULKANSC
1556 const VkDeviceCreateInfo deviceCreateInfo =
1558 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
1560 (VkDeviceCreateFlags)0u, // flags
1561 1, // queueCreateInfoCount
1562 &deviceQueueCreateInfo, // pQueueCreateInfos
1563 0u, // enabledLayerCount
1564 DE_NULL, // ppEnabledLayerNames
1565 static_cast<deUint32>(extensionNames == DE_NULL ? 0 : extensionNames->size()), // enabledExtensionCount
1566 extensionNames == DE_NULL ? DE_NULL : extensionNames->data(), // ppEnabledExtensionNames
1567 DE_NULL // pEnabledFeatures
1570 VkDevice device = (VkDevice)DE_NULL;
1571 const VkResult res = createUncheckedDevice(false, instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL, &device);
1573 if (res != VK_ERROR_FEATURE_NOT_PRESENT)
1576 resultCollector.fail("Not returning VK_ERROR_FEATURE_NOT_PRESENT when creating device with feature "
1577 + de::toString(features[featureNdx].name) + ", which was reported as unsupported.");
1579 if (device != (VkDevice)DE_NULL)
1581 DeviceDriver deviceDriver(vkp, instance, device);
1582 deviceDriver.destroyDevice(device, DE_NULL);
1587 vector<string> removeExtensions (const vector<string>& a, const vector<const char*>& b)
1590 set<string> removeExts (b.begin(), b.end());
1592 for (const auto & aIter : a)
1594 if (!de::contains(removeExts, aIter))
1595 res.push_back(aIter);
1601 tcu::TestStatus createDeviceWithUnsupportedFeaturesTest (Context& context)
1603 const PlatformInterface& vkp = context.getPlatformInterface();
1604 tcu::TestLog& log = context.getTestContext().getLog();
1605 tcu::ResultCollector resultCollector (log);
1606 const CustomInstance instance (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
1607 const InstanceDriver& instanceDriver (instance.getDriver());
1608 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
1609 const deUint32 queueFamilyIndex = 0;
1610 const deUint32 queueCount = 1;
1611 const float queuePriority = 1.0f;
1612 const DeviceFeatures deviceFeaturesAll (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
1613 const VkPhysicalDeviceFeatures2 deviceFeatures2 = deviceFeaturesAll.getCoreFeatures2();
1614 const VkPhysicalDeviceFeatures deviceFeatures = deviceFeatures2.features;
1615 const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
1617 // Test features listed in VkPhysicalDeviceFeatures structure
1619 static const Feature features[] =
1621 // robustBufferAccess is removed, because it's always supported.
1622 FEATURE_ITEM(VkPhysicalDeviceFeatures, fullDrawIndexUint32),
1623 FEATURE_ITEM(VkPhysicalDeviceFeatures, imageCubeArray),
1624 FEATURE_ITEM(VkPhysicalDeviceFeatures, independentBlend),
1625 FEATURE_ITEM(VkPhysicalDeviceFeatures, geometryShader),
1626 FEATURE_ITEM(VkPhysicalDeviceFeatures, tessellationShader),
1627 FEATURE_ITEM(VkPhysicalDeviceFeatures, sampleRateShading),
1628 FEATURE_ITEM(VkPhysicalDeviceFeatures, dualSrcBlend),
1629 FEATURE_ITEM(VkPhysicalDeviceFeatures, logicOp),
1630 FEATURE_ITEM(VkPhysicalDeviceFeatures, multiDrawIndirect),
1631 FEATURE_ITEM(VkPhysicalDeviceFeatures, drawIndirectFirstInstance),
1632 FEATURE_ITEM(VkPhysicalDeviceFeatures, depthClamp),
1633 FEATURE_ITEM(VkPhysicalDeviceFeatures, depthBiasClamp),
1634 FEATURE_ITEM(VkPhysicalDeviceFeatures, fillModeNonSolid),
1635 FEATURE_ITEM(VkPhysicalDeviceFeatures, depthBounds),
1636 FEATURE_ITEM(VkPhysicalDeviceFeatures, wideLines),
1637 FEATURE_ITEM(VkPhysicalDeviceFeatures, largePoints),
1638 FEATURE_ITEM(VkPhysicalDeviceFeatures, alphaToOne),
1639 FEATURE_ITEM(VkPhysicalDeviceFeatures, multiViewport),
1640 FEATURE_ITEM(VkPhysicalDeviceFeatures, samplerAnisotropy),
1641 FEATURE_ITEM(VkPhysicalDeviceFeatures, textureCompressionETC2),
1642 FEATURE_ITEM(VkPhysicalDeviceFeatures, textureCompressionASTC_LDR),
1643 FEATURE_ITEM(VkPhysicalDeviceFeatures, textureCompressionBC),
1644 FEATURE_ITEM(VkPhysicalDeviceFeatures, occlusionQueryPrecise),
1645 FEATURE_ITEM(VkPhysicalDeviceFeatures, pipelineStatisticsQuery),
1646 FEATURE_ITEM(VkPhysicalDeviceFeatures, vertexPipelineStoresAndAtomics),
1647 FEATURE_ITEM(VkPhysicalDeviceFeatures, fragmentStoresAndAtomics),
1648 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderTessellationAndGeometryPointSize),
1649 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderImageGatherExtended),
1650 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderStorageImageExtendedFormats),
1651 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderStorageImageMultisample),
1652 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderStorageImageReadWithoutFormat),
1653 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderStorageImageWriteWithoutFormat),
1654 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderUniformBufferArrayDynamicIndexing),
1655 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderSampledImageArrayDynamicIndexing),
1656 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderStorageBufferArrayDynamicIndexing),
1657 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderStorageImageArrayDynamicIndexing),
1658 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderClipDistance),
1659 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderCullDistance),
1660 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderFloat64),
1661 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderInt64),
1662 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderInt16),
1663 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderResourceResidency),
1664 FEATURE_ITEM(VkPhysicalDeviceFeatures, shaderResourceMinLod),
1665 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseBinding),
1666 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidencyBuffer),
1667 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidencyImage2D),
1668 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidencyImage3D),
1669 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidency2Samples),
1670 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidency4Samples),
1671 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidency8Samples),
1672 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidency16Samples),
1673 FEATURE_ITEM(VkPhysicalDeviceFeatures, sparseResidencyAliased),
1674 FEATURE_ITEM(VkPhysicalDeviceFeatures, variableMultisampleRate),
1675 FEATURE_ITEM(VkPhysicalDeviceFeatures, inheritedQueries)
1678 for (const auto& feature : features)
1680 // Test only features that are not supported.
1681 if (*(((VkBool32*)((deUint8*)(&deviceFeatures) + feature.offset))))
1684 VkPhysicalDeviceFeatures enabledFeatures = deviceFeatures;
1685 *((VkBool32*)((deUint8*)(&enabledFeatures) + feature.offset)) = VK_TRUE;
1687 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
1689 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
1691 (VkDeviceQueueCreateFlags)0u,
1697 void* pNext = DE_NULL;
1698 #ifdef CTS_USES_VULKANSC
1699 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
1700 memReservationInfo.pNext = pNext;
1701 pNext = &memReservationInfo;
1703 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
1704 sc10Features.pNext = pNext;
1705 pNext = &sc10Features;
1706 #endif // CTS_USES_VULKANSC
1708 const VkDeviceCreateInfo deviceCreateInfo =
1710 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
1712 (VkDeviceCreateFlags)0u,
1714 &deviceQueueCreateInfo,
1722 VkDevice device = DE_NULL;
1723 const VkResult res = createUncheckedDevice(false, instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL, &device);
1725 if (res != VK_ERROR_FEATURE_NOT_PRESENT)
1727 resultCollector.fail("Not returning VK_ERROR_FEATURE_NOT_PRESENT when creating device with feature "
1728 + de::toString(feature.name) + ", which was reported as unsupported.");
1731 if (device != DE_NULL)
1733 DeviceDriver deviceDriver(vkp, instance, device);
1734 deviceDriver.destroyDevice(device, DE_NULL);
1739 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
1742 #include "vkDeviceFeatureTest.inl"
1744 tcu::TestStatus createDeviceQueue2Test (Context& context)
1746 if (!context.contextSupports(vk::ApiVersion(0, 1, 1, 0)))
1747 TCU_THROW(NotSupportedError, "Vulkan 1.1 is not supported");
1749 const PlatformInterface& platformInterface = context.getPlatformInterface();
1750 const CustomInstance instance (createCustomInstanceFromContext(context));
1751 const InstanceDriver& instanceDriver (instance.getDriver());
1752 const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
1753 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1754 const deUint32 queueCount = 1;
1755 const deUint32 queueIndex = 0;
1756 const float queuePriority = 1.0f;
1758 VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeature =
1760 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, // VkStructureType sType;
1761 DE_NULL, // void* pNext;
1762 VK_FALSE // VkBool32 protectedMemory;
1765 VkPhysicalDeviceFeatures2 features2;
1766 deMemset(&features2, 0, sizeof(features2));
1767 features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1768 features2.pNext = &protectedMemoryFeature;
1770 instanceDriver.getPhysicalDeviceFeatures2(physicalDevice, &features2);
1771 if (protectedMemoryFeature.protectedMemory == VK_FALSE)
1772 TCU_THROW(NotSupportedError, "Protected memory feature is not supported");
1774 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
1776 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType;
1777 DE_NULL, // const void* pNext;
1778 VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, // VkDeviceQueueCreateFlags flags;
1779 queueFamilyIndex, // deUint32 queueFamilyIndex;
1780 queueCount, // deUint32 queueCount;
1781 &queuePriority, // const float* pQueuePriorities;
1784 void* pNext = &features2;
1785 #ifdef CTS_USES_VULKANSC
1786 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
1787 memReservationInfo.pNext = pNext;
1788 pNext = &memReservationInfo;
1790 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
1791 sc10Features.pNext = pNext;
1792 pNext = &sc10Features;
1793 #endif // CTS_USES_VULKANSC
1795 const VkDeviceCreateInfo deviceCreateInfo =
1797 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType;
1798 pNext, // const void* pNext;
1799 (VkDeviceCreateFlags)0u, // VkDeviceCreateFlags flags;
1800 1, // deUint32 queueCreateInfoCount;
1801 &deviceQueueCreateInfo, // const VkDeviceQueueCreateInfo* pQueueCreateInfos;
1802 0, // deUint32 enabledLayerCount;
1803 DE_NULL, // const char* const* ppEnabledLayerNames;
1804 0, // deUint32 enabledExtensionCount;
1805 DE_NULL, // const char* const* ppEnabledExtensionNames;
1806 DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
1809 const VkDeviceQueueInfo2 deviceQueueInfo2 =
1811 VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2, // VkStructureType sType;
1812 DE_NULL, // const void* pNext;
1813 VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, // VkDeviceQueueCreateFlags flags;
1814 queueFamilyIndex, // deUint32 queueFamilyIndex;
1815 queueIndex, // deUint32 queueIndex;
1819 const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
1820 const DeviceDriver deviceDriver (platformInterface, instance, device.get());
1821 const VkQueue queue2 = getDeviceQueue2(deviceDriver, *device, &deviceQueueInfo2);
1823 VK_CHECK(deviceDriver.queueWaitIdle(queue2));
1826 return tcu::TestStatus::pass("Pass");
1829 map<deUint32, VkQueueFamilyProperties> findQueueFamiliesWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
1831 const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vkInstance, physicalDevice);
1832 map<deUint32, VkQueueFamilyProperties> queueFamilies;
1834 for (deUint32 queueNdx = 0; queueNdx < static_cast<deUint32>(queueProps.size()); queueNdx++)
1836 const VkQueueFamilyProperties& queueFamilyProperties = queueProps[queueNdx];
1838 if ((queueFamilyProperties.queueFlags & requiredCaps) == requiredCaps)
1839 queueFamilies[queueNdx] = queueFamilyProperties;
1842 if (queueFamilies.empty())
1843 TCU_THROW(NotSupportedError, "No matching queue found");
1845 return queueFamilies;
1848 void checkProtectedMemorySupport (Context& context)
1850 if (!context.contextSupports(vk::ApiVersion(0, 1, 1, 0)))
1851 TCU_THROW(NotSupportedError, "Vulkan 1.1 is not supported");
1853 const InstanceInterface& instanceDriver = context.getInstanceInterface();
1854 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
1856 VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeature =
1858 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, // VkStructureType sType;
1859 DE_NULL, // void* pNext;
1860 VK_FALSE // VkBool32 protectedMemory;
1863 VkPhysicalDeviceFeatures2 features2;
1864 deMemset(&features2, 0, sizeof(features2));
1865 features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1866 features2.pNext = &protectedMemoryFeature;
1868 instanceDriver.getPhysicalDeviceFeatures2(physicalDevice, &features2);
1869 if (protectedMemoryFeature.protectedMemory == VK_FALSE)
1870 TCU_THROW(NotSupportedError, "Protected memory feature is not supported");
1873 Move<VkDevice> createProtectedDeviceWithQueueConfig (Context& context, const std::vector<VkDeviceQueueCreateInfo>& queueCreateInfos, bool dumpExtraInfo=false)
1875 const PlatformInterface& platformInterface = context.getPlatformInterface();
1876 const VkInstance instance = context.getInstance();
1877 const InstanceInterface& instanceDriver = context.getInstanceInterface();
1878 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
1882 tcu::TestLog& log = context.getTestContext().getLog();
1884 log << tcu::TestLog::Message << "Creating VkDevice with the following Queue configuration:" << tcu::TestLog::EndMessage;
1886 for (size_t idx = 0; idx < queueCreateInfos.size(); idx++)
1888 const VkDeviceQueueCreateInfo& queueCreateInfo = queueCreateInfos[idx];
1890 log << tcu::TestLog::Message << "QueueCreateInfo " << idx << ": "
1891 << "flags: " << queueCreateInfo.flags << " "
1892 << "family: " << queueCreateInfo.queueFamilyIndex << " "
1893 << "count: " << queueCreateInfo.queueCount
1894 << tcu::TestLog::EndMessage;
1898 // Protected memory features availability should be already checked at this point.
1899 VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeature =
1901 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, // VkStructureType sType;
1902 DE_NULL, // void* pNext;
1903 VK_TRUE // VkBool32 protectedMemory;
1906 VkPhysicalDeviceFeatures2 features2;
1907 deMemset(&features2, 0, sizeof(features2));
1908 features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1909 features2.pNext = &protectedMemoryFeature;
1911 #ifdef CTS_USES_VULKANSC
1912 void* pNext = DE_NULL;
1914 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
1915 memReservationInfo.pNext = pNext;
1916 pNext = &memReservationInfo;
1918 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
1919 sc10Features.pNext = pNext;
1920 pNext = &sc10Features;
1921 #endif // CTS_USES_VULKANSC
1923 const VkDeviceCreateInfo deviceCreateInfo =
1925 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType;
1926 #ifdef CTS_USES_VULKANSC
1927 &sc10Features, // const void* pNext;
1929 &features2, // const void* pNext;
1930 #endif // CTS_USES_VULKANSC
1931 (VkDeviceCreateFlags)0u, // VkDeviceCreateFlags flags;
1932 (deUint32)queueCreateInfos.size(), // deUint32 queueCreateInfoCount;
1933 queueCreateInfos.data(), // const VkDeviceQueueCreateInfo* pQueueCreateInfos;
1934 0, // deUint32 enabledLayerCount;
1935 DE_NULL, // const char* const* ppEnabledLayerNames;
1936 0, // deUint32 enabledExtensionCount;
1937 DE_NULL, // const char* const* ppEnabledExtensionNames;
1938 DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
1941 return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo);
1944 VkQueue getDeviceQueue2WithOptions (const DeviceDriver& deviceDriver, const VkDevice device, VkDeviceQueueCreateFlags flags, deUint32 queueFamilyIndex, deUint32 queueIndex)
1946 VkDeviceQueueInfo2 queueInfo2 =
1948 VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2, // VkStructureType sType;
1949 DE_NULL, // const void* pNext;
1950 flags, // VkDeviceQueueCreateFlags flags;
1951 queueFamilyIndex, // deUint32 queueFamilyIndex;
1952 queueIndex, // deUint32 queueIndex;
1955 return getDeviceQueue2(deviceDriver, device, &queueInfo2);
1958 struct QueueCreationInfo
1960 deUint32 familyIndex;
1961 VkDeviceQueueCreateFlags flags;
1965 bool runQueueCreationTestCombination (Context& context, tcu::ResultCollector& results, const std::vector<QueueCreationInfo>& testCombination, bool dumpExtraInfo=false)
1967 deUint32 sumQueueCount = 0u;
1968 for (const QueueCreationInfo& info : testCombination)
1970 sumQueueCount += info.count;
1973 // Have an array of queue priorities which can be used when creating the queues (it is always greater or equal to the number of queues for a given VkDeviceQueueCreateInfo).
1974 const vector<float> queuePriorities (sumQueueCount, 1.0f);
1975 vector<VkDeviceQueueCreateInfo> queueCreateInfo;
1977 for (const QueueCreationInfo& info : testCombination)
1979 const VkDeviceQueueCreateInfo queueInfo =
1981 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType;
1982 DE_NULL, // const void* pNext;
1983 info.flags, // VkDeviceQueueCreateFlags flags;
1984 info.familyIndex, // deUint32 queueFamilyIndex;
1985 info.count, // deUint32 queueCount;
1986 queuePriorities.data(), // const float* pQueuePriorities;
1988 queueCreateInfo.push_back(queueInfo);
1991 const PlatformInterface& platformInterface = context.getPlatformInterface();
1992 const VkInstance instance = context.getInstance();
1994 const Unique<VkDevice> device (createProtectedDeviceWithQueueConfig(context, queueCreateInfo, dumpExtraInfo));
1995 const DeviceDriver deviceDriver (platformInterface, instance, *device);
1997 for (const QueueCreationInfo& info : testCombination)
1999 // Query Queues (based on the test configuration)
2000 for (deUint32 queueIdx = 0; queueIdx < info.count; queueIdx++)
2002 const string message = "(queueFamilyIndex: " + de::toString(info.familyIndex) + ", flags: " + de::toString(info.flags) + ", queue Index: " + de::toString(queueIdx) + ")";
2003 const VkQueue queue = getDeviceQueue2WithOptions(deviceDriver, *device, info.flags, info.familyIndex, queueIdx);
2005 if (queue != DE_NULL)
2007 VK_CHECK(deviceDriver.queueWaitIdle(queue));
2008 results.addResult(QP_TEST_RESULT_PASS, "Found Queue. " + message);
2010 results.fail("Unable to access the Queue. " + message);
2014 return results.getResult() == QP_TEST_RESULT_PASS;
2017 tcu::TestStatus createDeviceQueue2WithTwoQueuesSmokeTest (Context& context)
2019 const bool dumpExtraInfo = true;
2021 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2022 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2023 tcu::TestLog& log = context.getTestContext().getLog();
2025 vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
2027 // Find the first protected-capabale queue with a queueCount >= 2 and use it for testing (smoke test)
2028 constexpr deUint32 MAX_DEUINT32 = std::numeric_limits<deUint32>::max();
2029 deUint32 queueFamilyIndex = MAX_DEUINT32;
2030 const VkQueueFlags requiredCaps = VK_QUEUE_PROTECTED_BIT;
2031 const deUint32 requiredQueueCount = 2;
2033 for (deUint32 queueNdx = 0; queueNdx < queueFamilyProperties.size(); queueNdx++)
2035 if ((queueFamilyProperties[queueNdx].queueFlags & requiredCaps) == requiredCaps && queueFamilyProperties[queueNdx].queueCount >= requiredQueueCount)
2037 queueFamilyIndex = queueNdx;
2042 if (queueFamilyIndex == MAX_DEUINT32)
2043 TCU_THROW(NotSupportedError, "Unable to find a queue family that is protected-capable and supports more than one queue.");
2046 log << tcu::TestLog::Message << "Selected VkQueueFamilyProperties index: " << queueFamilyIndex << tcu::TestLog::EndMessage;
2048 // Use the previously selected queue family index to create 1 protected-capable and 1 unprotected queue.
2049 const QueueCreationInfo protectedQueueConfig = { queueFamilyIndex, VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, 1 };
2050 const QueueCreationInfo unprotectedQueueConfig = { queueFamilyIndex, (VkDeviceQueueCreateFlags)0u, 1 };
2052 tcu::ResultCollector results (log);
2053 const std::vector<QueueCreationInfo> testCombination = { protectedQueueConfig, unprotectedQueueConfig };
2054 bool success = runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2057 return tcu::TestStatus::pass("All Queues were queried correctly.");
2059 return tcu::TestStatus(results.getResult(), results.getMessage());
2062 tcu::TestStatus createDeviceQueue2WithAllProtectedQueues (Context& context)
2064 const bool dumpExtraInfo = true;
2066 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2067 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2069 // Select only protected-capable queue families
2070 map<deUint32, VkQueueFamilyProperties> queueFamilyProperties = findQueueFamiliesWithCaps(instanceDriver, physicalDevice, VK_QUEUE_PROTECTED_BIT);
2072 bool success = true;
2073 tcu::ResultCollector results (context.getTestContext().getLog());
2075 // For each protected-capable queue family, create a device with the max number of queues available and all queues created as protected-capable.
2076 for (const pair<deUint32, VkQueueFamilyProperties> queueFamilyProperty : queueFamilyProperties)
2078 const deUint32 queueFamilyIndex = queueFamilyProperty.first;
2079 const deUint32 queueCount = queueFamilyProperty.second.queueCount;
2081 const QueueCreationInfo protectedQueueConfig = { queueFamilyIndex, VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, queueCount };
2082 const vector<QueueCreationInfo> testCombination = { protectedQueueConfig };
2084 // Run current confugurations.
2085 success = success && runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2089 return tcu::TestStatus::pass("All queues were queried correctly.");
2091 return tcu::TestStatus(results.getResult(), results.getMessage());
2094 tcu::TestStatus createDeviceQueue2WithAllUnprotectedQueues (Context& context)
2096 const bool dumpExtraInfo = true;
2098 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2099 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2101 // Select all queue families with or without protected bit
2102 map<deUint32, VkQueueFamilyProperties> queueFamilyProperties = findQueueFamiliesWithCaps(instanceDriver, physicalDevice, 0);
2104 bool success = true;
2105 tcu::ResultCollector results (context.getTestContext().getLog());
2107 // For each Queue Family create the max number of unprotected Queues.
2108 for (const pair<deUint32, VkQueueFamilyProperties> queueFamilyProperty : queueFamilyProperties)
2110 const deUint32 queueFamilyIndex = queueFamilyProperty.first;
2111 const deUint32 queueCount = queueFamilyProperty.second.queueCount;
2113 const QueueCreationInfo unprotectedQueueConfig = { queueFamilyIndex, (VkDeviceQueueCreateFlags)0u, queueCount };
2114 const vector<QueueCreationInfo> testCombination = { unprotectedQueueConfig };
2116 // Run current confugurations.
2117 success = success && runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2121 return tcu::TestStatus::pass("All Queues were queried correctly.");
2123 return tcu::TestStatus(results.getResult(), results.getMessage());
2126 typedef vector<QueueCreationInfo> DeviceQueueConfig;
2127 typedef map<deUint32, vector<DeviceQueueConfig> > QueueFamilyConfigurations;
2129 QueueFamilyConfigurations buildQueueConfigurations (const map<deUint32, VkQueueFamilyProperties>& queueFamilyProperties)
2131 QueueFamilyConfigurations queuesPerFamily;
2133 // Build up the queue creation combinations (N protected and M unprotected queues where N+M == queueFamily.queueCount)
2134 // on each protected-capable queue family
2135 for (const pair<deUint32, VkQueueFamilyProperties> queueFamily : queueFamilyProperties)
2137 const deUint32 queueFamilyIndex = queueFamily.first;
2138 const VkQueueFamilyProperties queueFamilyProperty = queueFamily.second;
2139 const deUint32 allowedQueueCount = queueFamilyProperty.queueCount;
2141 for (deUint32 splitCount = 0; splitCount <= allowedQueueCount; splitCount++)
2143 const deUint32 protectedQueuesCount = allowedQueueCount - splitCount;
2144 const deUint32 unprotectedQueuesCount = splitCount;
2146 vector<QueueCreationInfo> testCombination = { };
2148 if (protectedQueuesCount)
2149 testCombination.push_back({ queueFamilyIndex, VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, protectedQueuesCount });
2151 if (unprotectedQueuesCount)
2152 testCombination.push_back({ queueFamilyIndex, (VkDeviceQueueCreateFlags)0u, unprotectedQueuesCount });
2154 queuesPerFamily[queueFamilyIndex].push_back(testCombination);
2158 return queuesPerFamily;
2161 tcu::TestStatus createDeviceQueue2WithNProtectedAndMUnprotectedQueues (Context& context)
2163 const bool dumpExtraInfo = true;
2165 tcu::TestLog& log = context.getTestContext().getLog();
2166 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2167 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2169 // Select only protected-capable queue families
2170 map<deUint32, VkQueueFamilyProperties> queueFamilyProperties = findQueueFamiliesWithCaps(instanceDriver, physicalDevice, VK_QUEUE_PROTECTED_BIT);
2172 // Build all protected-unprotected splits per queue family.
2173 QueueFamilyConfigurations queuesPerFamily = buildQueueConfigurations(queueFamilyProperties);
2174 vector<DeviceQueueConfig> queueCreateCombinations;
2176 // Transform configurations to a simple vector
2177 for (const auto& item : queuesPerFamily)
2179 const vector<DeviceQueueConfig>& queueConfigs = item.second;
2181 std::copy(queueConfigs.begin(), queueConfigs.end(), std::back_inserter(queueCreateCombinations));
2186 for (const vector<QueueCreationInfo>& testCombination : queueCreateCombinations)
2188 ostringstream queuesInfo;
2189 for (const QueueCreationInfo& queueInfo : testCombination)
2191 queuesInfo << "(Queue family: " << queueInfo.familyIndex << ", flags: " << queueInfo.flags << ", count: " << queueInfo.count << ")";
2194 log << tcu::TestLog::Message << "Test Combination: " << queuesInfo.str() << tcu::TestLog::EndMessage;
2198 bool success = true;
2199 tcu::ResultCollector results (log);
2201 // Based on the protected-unprotected queue combinations, run each test case.
2202 for (const vector<QueueCreationInfo>& testCombination : queueCreateCombinations)
2204 success = success && runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2207 // Run the test cases also in reverse order (so the unprotected queue creation info is at the start of the VkDeviceQueueCreateInfo vector).
2208 for (vector<QueueCreationInfo>& testCombination : queueCreateCombinations)
2210 std::reverse(testCombination.begin(), testCombination.end());
2212 success = success && runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2216 return tcu::TestStatus::pass("All Queues were queried correctly.");
2218 return tcu::TestStatus(results.getResult(), results.getMessage());
2221 tcu::TestStatus createDeviceQueue2WithMultipleQueueCombinations (Context& context)
2223 const bool dumpExtraInfo = true;
2225 tcu::TestLog& log = context.getTestContext().getLog();
2226 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2227 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2229 // Select only protected-capable queue families.
2230 map<deUint32, VkQueueFamilyProperties> queueFamilyProperties = findQueueFamiliesWithCaps(instanceDriver, physicalDevice, VK_QUEUE_PROTECTED_BIT);
2232 // Build all protected-unprotected splits per queue family.
2233 QueueFamilyConfigurations queuesPerFamily = buildQueueConfigurations(queueFamilyProperties);
2235 // Build up all combinations of queue families from the previous mapping.
2236 vector<DeviceQueueConfig> queueCreateCombinations;
2238 vector<deUint32> itemIndices (queuesPerFamily.size(), 0u);
2240 // Calculate the max number of combinations.
2241 auto multiplyConfigCounts = [](deUint32& count, const typename QueueFamilyConfigurations::value_type& item) { return count * item.second.size(); };
2242 const deUint32 itemCount = accumulate(queuesPerFamily.begin(), queuesPerFamily.end(), 1u, multiplyConfigCounts);
2244 for (deUint32 count = 0u; count < itemCount; count++)
2246 DeviceQueueConfig testCombination;
2248 // Select queue configurations from each family
2249 for (deUint32 ndx = 0u; ndx < static_cast<deUint32>(itemIndices.size()); ndx++)
2251 const auto& familyConfigurations = queuesPerFamily[ndx];
2252 const DeviceQueueConfig& targetQueueConfig = familyConfigurations[ itemIndices[ndx] ];
2254 std::copy(targetQueueConfig.begin(), targetQueueConfig.end(), std::back_inserter(testCombination));
2257 queueCreateCombinations.push_back(testCombination);
2259 // Increment the indices.
2260 for (deUint32 ndx = 0u; ndx < static_cast<deUint32>(itemIndices.size()); ndx++)
2263 if (itemIndices[ndx] < queuesPerFamily[ndx].size())
2268 // "overflow" happened in the given index, restart from zero and increment the next item index (restart loop).
2269 itemIndices[ndx] = 0;
2276 for (const vector<QueueCreationInfo>& testCombination : queueCreateCombinations)
2278 ostringstream queuesInfo;
2279 for (const QueueCreationInfo& queueInfo : testCombination)
2281 queuesInfo << "(Queue family: " << queueInfo.familyIndex << ", flags: " << queueInfo.flags << ", count: " << queueInfo.count << ")";
2284 log << tcu::TestLog::Message << "Test Combination: " << queuesInfo.str() << tcu::TestLog::EndMessage;
2288 bool success = true;
2289 tcu::ResultCollector results (log);
2291 // Based on the protected-unprotected queue combinations above run each test case.
2292 for (const DeviceQueueConfig& testCombination : queueCreateCombinations)
2294 success = success && runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2297 // Run the test cases also in reverse queue order (so the unprotected queue creation info is at the start of the VkDeviceQueueCreateInfo vector).
2298 for (DeviceQueueConfig& testCombination : queueCreateCombinations)
2300 std::reverse(testCombination.begin(), testCombination.end());
2302 success = success && runQueueCreationTestCombination(context, results, testCombination, dumpExtraInfo);
2306 return tcu::TestStatus::pass("All Queues were queried correctly.");
2308 return tcu::TestStatus(results.getResult(), results.getMessage());
2311 tcu::TestStatus createDeviceQueue2WithAllFamilies (Context& context)
2313 const bool dumpExtraInfo = true;
2315 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2316 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2318 // Get all queue families
2319 map<deUint32, VkQueueFamilyProperties> queueFamilyProperties = findQueueFamiliesWithCaps(instanceDriver, physicalDevice, (VkDeviceQueueCreateFlags)0u);
2321 // Create test configuration where for each queue family the maximum number of queues are created.
2322 vector<QueueCreationInfo> queueConfigurations;
2323 for (const pair<deUint32, VkQueueFamilyProperties> queueFamilyProperty : queueFamilyProperties)
2325 const deUint32 queueFamilyIndex = queueFamilyProperty.first;
2326 const deUint32 queueCount = queueFamilyProperty.second.queueCount;
2328 const QueueCreationInfo queueConfig = { queueFamilyIndex, (VkDeviceQueueCreateFlags)0u, queueCount };
2330 queueConfigurations.push_back(queueConfig);
2333 tcu::ResultCollector results (context.getTestContext().getLog());
2335 // Execute test to see if it possible to have all queue families created at the same time.
2336 bool success = runQueueCreationTestCombination(context, results, queueConfigurations, dumpExtraInfo);
2339 return tcu::TestStatus::pass("All Queues were queried correctly.");
2341 return tcu::TestStatus(results.getResult(), results.getMessage());
2344 tcu::TestStatus createDeviceQueue2WithAllFamiliesProtected (Context& context)
2346 const bool dumpExtraInfo = true;
2348 const InstanceInterface& instanceDriver = context.getInstanceInterface();
2349 const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
2351 // Get all queue families
2352 map<deUint32, VkQueueFamilyProperties> queueFamilyProperties = findQueueFamiliesWithCaps(instanceDriver, physicalDevice, (VkDeviceQueueCreateFlags)0u);
2354 // Create test configuration where for each queue family the maximum number of queues are created.
2355 // If a queue supports protected memory then create a protected-capable queue.
2356 vector<QueueCreationInfo> queueConfigurations;
2357 for (const pair<deUint32, VkQueueFamilyProperties> queueFamilyProperty : queueFamilyProperties)
2359 const deUint32 queueFamilyIndex = queueFamilyProperty.first;
2360 const deUint32 queueCount = queueFamilyProperty.second.queueCount;
2362 VkDeviceQueueCreateFlags useFlags = (VkDeviceQueueCreateFlags)0u;
2363 if ((queueFamilyProperty.second.queueFlags & VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT) == VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT)
2364 useFlags |= VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT;
2366 const QueueCreationInfo queueConfig = { queueFamilyIndex, useFlags, queueCount };
2368 queueConfigurations.push_back(queueConfig);
2371 tcu::ResultCollector results (context.getTestContext().getLog());
2373 // Execute test to see if it possible to have all queue families created at the same time.
2374 bool success = runQueueCreationTestCombination(context, results, queueConfigurations, dumpExtraInfo);
2377 return tcu::TestStatus::pass("All Queues were queried correctly.");
2379 return tcu::TestStatus(results.getResult(), results.getMessage());
2382 #ifndef CTS_USES_VULKANSC
2383 // Allocation tracking utilities
2388 void* alignedStartAddress;
2389 char* actualStartAddress;
2390 size_t requestedSizeBytes;
2391 size_t actualSizeBytes;
2392 VkSystemAllocationScope allocScope;
2397 , wasAllocated (false)
2398 , alignedStartAddress (DE_NULL)
2399 , actualStartAddress (DE_NULL)
2400 , requestedSizeBytes (0)
2401 , actualSizeBytes (0)
2402 , allocScope (VK_SYSTEM_ALLOCATION_SCOPE_COMMAND)
2406 // Global vector to track allocations. This will be resized before each test and emptied after
2407 // However, we have to globally define it so the allocation callback functions work properly
2408 std::vector<AllocTrack> g_allocatedVector;
2409 bool g_intentionalFailEnabled = false;
2410 deUint32 g_intenionalFailIndex = 0;
2411 deUint32 g_intenionalFailCount = 0;
2412 size_t g_allocationsCount = 0;
2414 void freeAllocTracker(void)
2416 g_allocatedVector.clear();
2417 g_allocationsCount = 0;
2420 void initAllocTracker (size_t size, deUint32 intentionalFailIndex = (deUint32)~0)
2422 if (g_allocatedVector.size() > 0)
2425 g_allocatedVector.resize(size);
2427 if (intentionalFailIndex != (deUint32)~0)
2429 g_intentionalFailEnabled = true;
2430 g_intenionalFailIndex = intentionalFailIndex;
2431 g_intenionalFailCount = 0;
2435 g_intentionalFailEnabled = false;
2436 g_intenionalFailIndex = 0;
2437 g_intenionalFailCount = 0;
2440 g_allocationsCount = 0;
2443 bool isAllocTrackerEmpty ()
2445 bool success = true;
2446 bool wasAllocated = false;
2448 for (deUint32 vectorIdx = 0; vectorIdx < g_allocatedVector.size(); vectorIdx++)
2450 if (g_allocatedVector[vectorIdx].active)
2452 else if (!wasAllocated && g_allocatedVector[vectorIdx].wasAllocated)
2453 wasAllocated = true;
2456 if (!g_intentionalFailEnabled && !wasAllocated)
2462 VKAPI_ATTR void *VKAPI_CALL allocCallbackFunc (void *pUserData, size_t size, size_t alignment, VkSystemAllocationScope allocationScope)
2464 if (g_intentionalFailEnabled)
2465 if (++g_intenionalFailCount >= g_intenionalFailIndex)
2468 for (deUint32 vectorIdx = 0; vectorIdx < g_allocatedVector.size(); vectorIdx++)
2470 if (!g_allocatedVector[vectorIdx].active)
2472 g_allocatedVector[vectorIdx].requestedSizeBytes = size;
2473 g_allocatedVector[vectorIdx].actualSizeBytes = size + (alignment - 1);
2474 g_allocatedVector[vectorIdx].alignedStartAddress = DE_NULL;
2475 g_allocatedVector[vectorIdx].actualStartAddress = new char[g_allocatedVector[vectorIdx].actualSizeBytes];
2477 if (g_allocatedVector[vectorIdx].actualStartAddress != DE_NULL)
2479 deUint64 addr = (deUint64)g_allocatedVector[vectorIdx].actualStartAddress;
2480 addr += (alignment - 1);
2481 addr &= ~(alignment - 1);
2482 g_allocatedVector[vectorIdx].alignedStartAddress = (void *)addr;
2483 g_allocatedVector[vectorIdx].allocScope = allocationScope;
2484 g_allocatedVector[vectorIdx].userData = (deUint64)pUserData;
2485 g_allocatedVector[vectorIdx].active = true;
2486 g_allocatedVector[vectorIdx].wasAllocated = true;
2489 g_allocationsCount++;
2490 return g_allocatedVector[vectorIdx].alignedStartAddress;
2496 VKAPI_ATTR void VKAPI_CALL freeCallbackFunc (void *pUserData, void *pMemory)
2498 DE_UNREF(pUserData);
2500 for (deUint32 vectorIdx = 0; vectorIdx < g_allocatedVector.size(); vectorIdx++)
2502 if (g_allocatedVector[vectorIdx].active && g_allocatedVector[vectorIdx].alignedStartAddress == pMemory)
2504 delete[] g_allocatedVector[vectorIdx].actualStartAddress;
2505 g_allocatedVector[vectorIdx].active = false;
2511 VKAPI_ATTR void *VKAPI_CALL reallocCallbackFunc (void *pUserData, void *pOriginal, size_t size, size_t alignment, VkSystemAllocationScope allocationScope)
2513 if (pOriginal != DE_NULL)
2515 for (deUint32 vectorIdx = 0; vectorIdx < g_allocatedVector.size(); vectorIdx++)
2517 if (g_allocatedVector[vectorIdx].active && g_allocatedVector[vectorIdx].alignedStartAddress == pOriginal)
2521 freeCallbackFunc(pUserData, pOriginal);
2524 else if (size < g_allocatedVector[vectorIdx].requestedSizeBytes)
2528 void *pNew = allocCallbackFunc(pUserData, size, alignment, allocationScope);
2530 if (pNew != DE_NULL)
2532 size_t copySize = size;
2534 if (g_allocatedVector[vectorIdx].requestedSizeBytes < size)
2535 copySize = g_allocatedVector[vectorIdx].requestedSizeBytes;
2537 memcpy(pNew, pOriginal, copySize);
2538 freeCallbackFunc(pUserData, pOriginal);
2547 return allocCallbackFunc(pUserData, size, alignment, allocationScope);
2550 tcu::TestStatus createInstanceDeviceIntentionalAllocFail (Context& context)
2552 const PlatformInterface& vkp = context.getPlatformInterface();
2553 const deUint32 chosenDevice = context.getTestContext().getCommandLine().getVKDeviceId() - 1;
2554 VkInstance instance = DE_NULL;
2555 VkDevice device = DE_NULL;
2556 deUint32 physicalDeviceCount = 0;
2557 deUint32 queueFamilyCount = 0;
2558 deUint32 queueFamilyIndex = 0;
2559 const float queuePriority = 0.0f;
2560 const VkAllocationCallbacks allocationCallbacks =
2562 DE_NULL, // userData
2563 allocCallbackFunc, // pfnAllocation
2564 reallocCallbackFunc, // pfnReallocation
2565 freeCallbackFunc, // pfnFree
2566 DE_NULL, // pfnInternalAllocation
2567 DE_NULL // pfnInternalFree
2569 const VkApplicationInfo appInfo =
2571 VK_STRUCTURE_TYPE_APPLICATION_INFO, // sType
2573 "appName", // pApplicationName
2574 0u, // applicationVersion
2575 "engineName", // pEngineName
2576 0u, // engineVersion
2577 VK_API_VERSION_1_0 // apiVersion
2580 const VkInstanceCreateInfo instanceCreateInfo =
2582 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
2584 (VkInstanceCreateFlags)0u, // flags
2585 &appInfo, // pApplicationInfo
2586 0u, // enabledLayerCount
2587 DE_NULL, // ppEnabledLayerNames
2588 0u, // enabledExtensionCount
2589 DE_NULL // ppEnabledExtensionNames
2592 deUint32 failIndex = 0;
2593 VkResult result = VK_SUCCESS;
2594 size_t max_allowed_alloc = 0;
2598 if (max_allowed_alloc == 0)
2600 if (result != VK_SUCCESS)
2601 return tcu::TestStatus::fail("Could not create instance and device");
2603 initAllocTracker(99999);
2607 initAllocTracker(max_allowed_alloc, failIndex++);
2609 if (failIndex >= static_cast<deUint32>(max_allowed_alloc))
2610 return tcu::TestStatus::fail("Out of retries, could not create instance and device");
2613 // if the number of allocations the driver makes is large, we may end up
2614 // taking more than the watchdog timeout. touch here to avoid spurious
2616 if (failIndex % 128 == 0)
2617 context.getTestContext().touchWatchdog();
2619 result = vkp.createInstance(&instanceCreateInfo, &allocationCallbacks, &instance);
2621 if (result == VK_ERROR_OUT_OF_HOST_MEMORY)
2623 if (!isAllocTrackerEmpty())
2624 return tcu::TestStatus::fail("Allocations still remain, failed on index " + de::toString(failIndex));
2629 else if (result != VK_SUCCESS)
2630 return tcu::TestStatus::fail("createInstance returned " + de::toString(result));
2632 const InstanceDriver instanceDriver (vkp, instance);
2633 const InstanceInterface& vki (instanceDriver);
2635 result = vki.enumeratePhysicalDevices(instance, &physicalDeviceCount, DE_NULL);
2637 if (result == VK_ERROR_OUT_OF_HOST_MEMORY)
2639 vki.destroyInstance(instance, &allocationCallbacks);
2641 if (!isAllocTrackerEmpty())
2642 return tcu::TestStatus::fail("Allocations still remain, failed on index " + de::toString(failIndex));
2647 else if (result != VK_SUCCESS)
2648 return tcu::TestStatus::fail("enumeratePhysicalDevices returned " + de::toString(result));
2650 vector<VkPhysicalDevice> physicalDevices(physicalDeviceCount);
2652 result = vki.enumeratePhysicalDevices(instance, &physicalDeviceCount, physicalDevices.data());
2654 if (result == VK_ERROR_OUT_OF_HOST_MEMORY)
2656 vki.destroyInstance(instance, &allocationCallbacks);
2658 if (!isAllocTrackerEmpty())
2659 return tcu::TestStatus::fail("Allocations still remain, failed on index " + de::toString(failIndex));
2664 else if (result != VK_SUCCESS)
2665 return tcu::TestStatus::fail("enumeratePhysicalDevices returned " + de::toString(result));
2667 vki.getPhysicalDeviceQueueFamilyProperties(physicalDevices[chosenDevice], &queueFamilyCount, DE_NULL);
2669 if (queueFamilyCount == 0u)
2670 return tcu::TestStatus::fail("getPhysicalDeviceQueueFamilyProperties returned zero queue families");
2672 vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
2674 vki.getPhysicalDeviceQueueFamilyProperties(physicalDevices[chosenDevice], &queueFamilyCount, queueFamilies.data());
2676 if (queueFamilyCount == 0u)
2677 return tcu::TestStatus::fail("getPhysicalDeviceQueueFamilyProperties returned zero queue families");
2679 for (deUint32 i = 0; i < queueFamilyCount; i++)
2681 if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
2683 queueFamilyIndex = i;
2688 const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
2690 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
2692 (VkDeviceQueueCreateFlags)0u, // flags
2693 queueFamilyIndex, // queueFamilyIndex
2695 &queuePriority // pQueuePriorities
2698 void* pNext = DE_NULL;
2699 #ifdef CTS_USES_VULKANSC
2700 VkDeviceObjectReservationCreateInfo memReservationInfo = context.getTestContext().getCommandLine().isSubProcess() ? context.getResourceInterface()->getStatMax() : resetDeviceObjectReservationCreateInfo();
2701 memReservationInfo.pNext = pNext;
2702 pNext = &memReservationInfo;
2704 VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features();
2705 sc10Features.pNext = pNext;
2706 pNext = &sc10Features;
2707 #endif // CTS_USES_VULKANSC
2709 const VkDeviceCreateInfo deviceCreateInfo =
2711 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
2713 (VkDeviceCreateFlags)0u, // flags
2714 1u, // queueCreateInfoCount
2715 &deviceQueueCreateInfo, // pQueueCreateInfos
2716 0u, // enabledLayerCount
2717 DE_NULL, // ppEnabledLayerNames
2718 0u, // enabledExtensionCount
2719 DE_NULL, // ppEnabledExtensionNames
2720 DE_NULL // pEnabledFeatures
2723 result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vki, physicalDevices[chosenDevice], &deviceCreateInfo, &allocationCallbacks, &device);
2725 if (result == VK_ERROR_OUT_OF_HOST_MEMORY)
2727 vki.destroyInstance(instance, &allocationCallbacks);
2729 if (!isAllocTrackerEmpty())
2730 return tcu::TestStatus::fail("Allocations still remain, failed on index " + de::toString(failIndex));
2735 else if (result != VK_SUCCESS)
2736 return tcu::TestStatus::fail("VkCreateDevice returned " + de::toString(result));
2738 DeviceDriver(vkp, instance, device).destroyDevice(device, &allocationCallbacks);
2739 vki.destroyInstance(instance, &allocationCallbacks);
2740 if (max_allowed_alloc == 0)
2742 max_allowed_alloc = g_allocationsCount + 100;
2743 result = VK_ERROR_OUT_OF_HOST_MEMORY;
2747 while (result == VK_ERROR_OUT_OF_HOST_MEMORY);
2749 return tcu::TestStatus::pass("Pass");
2752 #endif // CTS_USES_VULKANSC
2756 static inline void addFunctionCaseInNewSubgroup (
2757 tcu::TestContext& testCtx,
2758 tcu::TestCaseGroup* group,
2759 const std::string& subgroupName,
2760 const std::string& subgroupDescription,
2761 FunctionInstance0::Function testFunc)
2763 de::MovePtr<tcu::TestCaseGroup> subgroup(new tcu::TestCaseGroup(testCtx, subgroupName.c_str(), subgroupDescription.c_str()));
2764 addFunctionCase(subgroup.get(), "basic", "", testFunc);
2765 group->addChild(subgroup.release());
2768 static inline void addFunctionCaseInNewSubgroup (
2769 tcu::TestContext& testCtx,
2770 tcu::TestCaseGroup* group,
2771 const std::string& subgroupName,
2772 const std::string& subgroupDescription,
2773 FunctionSupport0::Function checkSupport,
2774 FunctionInstance0::Function testFunc)
2776 de::MovePtr<tcu::TestCaseGroup> subgroup(new tcu::TestCaseGroup(testCtx, subgroupName.c_str(), subgroupDescription.c_str()));
2777 addFunctionCase(subgroup.get(), "basic", "", checkSupport, testFunc);
2778 group->addChild(subgroup.release());
2781 template<typename Arg0>
2782 static void addFunctionCaseInNewSubgroup (
2783 tcu::TestContext& testCtx,
2784 tcu::TestCaseGroup* group,
2785 const std::string& subgroupName,
2786 const std::string& subgroupDescription,
2787 typename FunctionSupport1<Arg0>::Function checkSupport,
2788 typename FunctionInstance1<Arg0>::Function testFunc,
2791 de::MovePtr<tcu::TestCaseGroup> subgroup(new tcu::TestCaseGroup(testCtx, subgroupName.c_str(), subgroupDescription.c_str()));
2792 subgroup->addChild(createFunctionCase<Arg0>(testCtx, tcu::NODETYPE_SELF_VALIDATE, "basic", "", checkSupport, testFunc, arg0));
2793 group->addChild(subgroup.release());
2796 tcu::TestCaseGroup* createDeviceInitializationTests (tcu::TestContext& testCtx)
2798 de::MovePtr<tcu::TestCaseGroup> deviceInitializationTests (new tcu::TestCaseGroup(testCtx, "device_init", "Device Initialization Tests"));
2800 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_name_version", "", createInstanceTest);
2801 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_invalid_api_version", "", createInstanceWithInvalidApiVersionTest);
2802 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_null_appinfo", "", createInstanceWithNullApplicationInfoTest);
2803 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_unsupported_extensions", "", createInstanceWithUnsupportedExtensionsTest);
2804 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_extension_name_abuse", "", createInstanceWithExtensionNameAbuseTest);
2805 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_layer_name_abuse", "", createInstanceWithLayerNameAbuseTest);
2806 #ifndef CTS_USES_VULKANSC
2807 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "enumerate_devices_alloc_leak", "", enumerateDevicesAllocLeakTest);
2808 #endif // CTS_USES_VULKANSC
2809 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device", "", createDeviceTest);
2810 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_multiple_devices", "", createMultipleDevicesTest);
2811 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_unsupported_extensions", "", createDeviceWithUnsupportedExtensionsTest);
2812 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_various_queue_counts", "", createDeviceWithVariousQueueCountsTest);
2813 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_global_priority", "", checkGlobalPrioritySupport, createDeviceWithGlobalPriorityTest, false);
2814 #ifndef CTS_USES_VULKANSC
2815 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_global_priority_khr", "", checkGlobalPrioritySupport, createDeviceWithGlobalPriorityTest, true);
2816 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_global_priority_query", "", checkGlobalPriorityQuerySupport, createDeviceWithQueriedGlobalPriorityTest, false);
2817 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_global_priority_query_khr", "", checkGlobalPriorityQuerySupport, createDeviceWithQueriedGlobalPriorityTest, true);
2818 #endif // CTS_USES_VULKANSC
2819 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_features2", "", createDeviceFeatures2Test);
2821 de::MovePtr<tcu::TestCaseGroup> subgroup(new tcu::TestCaseGroup(testCtx, "create_device_unsupported_features", ""));
2822 addFunctionCase(subgroup.get(), "core", "", createDeviceWithUnsupportedFeaturesTest);
2823 addSeparateUnsupportedFeatureTests(subgroup.get());
2824 deviceInitializationTests->addChild(subgroup.release());
2826 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2", "", createDeviceQueue2Test);
2827 #ifndef CTS_USES_VULKANSC
2828 // Removed because in main process this test does not really create any instance nor device and functions creating it always return VK_SUCCESS
2829 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_instance_device_intentional_alloc_fail", "", createInstanceDeviceIntentionalAllocFail);
2830 #endif // CTS_USES_VULKANSC
2832 // Tests using a single Queue Family when creating a device.
2833 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_two_queues", "", checkProtectedMemorySupport, createDeviceQueue2WithTwoQueuesSmokeTest);
2834 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_all_protected", "", checkProtectedMemorySupport, createDeviceQueue2WithAllProtectedQueues);
2835 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_all_unprotected", "", checkProtectedMemorySupport, createDeviceQueue2WithAllUnprotectedQueues);
2836 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_split", "", checkProtectedMemorySupport, createDeviceQueue2WithNProtectedAndMUnprotectedQueues);
2838 // Tests using multiple Queue Families when creating a device.
2839 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_all_families", "", checkProtectedMemorySupport, createDeviceQueue2WithAllFamilies);
2840 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_all_families_protected", "", checkProtectedMemorySupport, createDeviceQueue2WithAllFamiliesProtected);
2841 addFunctionCaseInNewSubgroup(testCtx, deviceInitializationTests.get(), "create_device_queue2_all_combinations", "", checkProtectedMemorySupport, createDeviceQueue2WithMultipleQueueCombinations);
2843 return deviceInitializationTests.release();