Home | History | Annotate | Download | only in api
      1 /*-------------------------------------------------------------------------
      2  * Vulkan Conformance Tests
      3  * ------------------------
      4  *
      5  * Copyright (c) 2015 Google Inc.
      6  *
      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
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     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.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Device Initialization Tests
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "vktApiDeviceInitializationTests.hpp"
     25 #include "vktTestCaseUtil.hpp"
     26 
     27 #include "vkDefs.hpp"
     28 #include "vkPlatform.hpp"
     29 #include "vkStrUtil.hpp"
     30 #include "vkRef.hpp"
     31 #include "vkRefUtil.hpp"
     32 #include "vkQueryUtil.hpp"
     33 #include "vkMemUtil.hpp"
     34 #include "vkDeviceUtil.hpp"
     35 #include "vkApiVersion.hpp"
     36 
     37 #include "tcuTestLog.hpp"
     38 #include "tcuResultCollector.hpp"
     39 
     40 #include "deUniquePtr.hpp"
     41 #include "deStringUtil.hpp"
     42 
     43 #include <vector>
     44 
     45 namespace vkt
     46 {
     47 namespace api
     48 {
     49 
     50 namespace
     51 {
     52 
     53 using namespace vk;
     54 using namespace std;
     55 using std::vector;
     56 using tcu::TestLog;
     57 
     58 tcu::TestStatus createInstanceTest (Context& context)
     59 {
     60 	tcu::TestLog&				log						= context.getTestContext().getLog();
     61 	tcu::ResultCollector		resultCollector			(log);
     62 	const char*					appNames[]				= { "appName", DE_NULL, "",  "app, name", "app(\"name\"", "app~!@#$%^&*()_+name", "app\nName", "app\r\nName" };
     63 	const char*					engineNames[]			= { "engineName", DE_NULL, "",  "engine. name", "engine\"(name)", "eng~!@#$%^&*()_+name", "engine\nName", "engine\r\nName" };
     64 	const int                   patchNumbers[]          = { 0, 1, 2, 3, 4, 5, 13, 4094, 4095 };
     65 	const deUint32				appVersions[]			= { 0, 1, (deUint32)-1 };
     66 	const deUint32				engineVersions[]		= { 0, 1, (deUint32)-1 };
     67 	const PlatformInterface&	platformInterface		= context.getPlatformInterface();
     68 	vector<VkApplicationInfo>	appInfos;
     69 
     70 	// test over appName
     71 	for (int appNameNdx = 0; appNameNdx < DE_LENGTH_OF_ARRAY(appNames); appNameNdx++)
     72 	{
     73 		const VkApplicationInfo appInfo =
     74 		{
     75 			VK_STRUCTURE_TYPE_APPLICATION_INFO,		// VkStructureType				sType;
     76 			DE_NULL,								// const void*					pNext;
     77 			appNames[appNameNdx],					// const char*					pAppName;
     78 			0u,										// deUint32						appVersion;
     79 			"engineName",							// const char*					pEngineName;
     80 			0u,										// deUint32						engineVersion;
     81 			VK_API_VERSION,							// deUint32						apiVersion;
     82 		};
     83 
     84 		appInfos.push_back(appInfo);
     85 	}
     86 
     87 	// test over engineName
     88 	for (int engineNameNdx = 0; engineNameNdx < DE_LENGTH_OF_ARRAY(engineNames); engineNameNdx++)
     89 	{
     90 		const VkApplicationInfo appInfo =
     91 		{
     92 			VK_STRUCTURE_TYPE_APPLICATION_INFO,		// VkStructureType				sType;
     93 			DE_NULL,								// const void*					pNext;
     94 			"appName",								// const char*					pAppName;
     95 			0u,										// deUint32						appVersion;
     96 			engineNames[engineNameNdx],				// const char*					pEngineName;
     97 			0u,										// deUint32						engineVersion;
     98 			VK_API_VERSION,							// deUint32						apiVersion;
     99 		};
    100 
    101 		appInfos.push_back(appInfo);
    102 	}
    103 
    104 	// test over appVersion
    105 	for (int appVersionNdx = 0; appVersionNdx < DE_LENGTH_OF_ARRAY(appVersions); appVersionNdx++)
    106 	{
    107 		const VkApplicationInfo appInfo =
    108 		{
    109 			VK_STRUCTURE_TYPE_APPLICATION_INFO,		// VkStructureType				sType;
    110 			DE_NULL,								// const void*					pNext;
    111 			"appName",								// const char*					pAppName;
    112 			appVersions[appVersionNdx],				// deUint32						appVersion;
    113 			"engineName",							// const char*					pEngineName;
    114 			0u,										// deUint32						engineVersion;
    115 			VK_API_VERSION,							// deUint32						apiVersion;
    116 		};
    117 
    118 		appInfos.push_back(appInfo);
    119 	}
    120 
    121 	// test over engineVersion
    122 	for (int engineVersionNdx = 0; engineVersionNdx < DE_LENGTH_OF_ARRAY(engineVersions); engineVersionNdx++)
    123 	{
    124 		const VkApplicationInfo appInfo =
    125 		{
    126 			VK_STRUCTURE_TYPE_APPLICATION_INFO,		// VkStructureType				sType;
    127 			DE_NULL,								// const void*					pNext;
    128 			"appName",								// const char*					pAppName;
    129 			0u,										// deUint32						appVersion;
    130 			"engineName",							// const char*					pEngineName;
    131 			engineVersions[engineVersionNdx],		// deUint32						engineVersion;
    132 			VK_API_VERSION,							// deUint32						apiVersion;
    133 		};
    134 
    135 		appInfos.push_back(appInfo);
    136 	}
    137 	// patch component of api version checking (should be ignored by implementation)
    138 	for (int patchVersion = 0; patchVersion < DE_LENGTH_OF_ARRAY(patchNumbers); patchVersion++)
    139 	{
    140 		const VkApplicationInfo appInfo =
    141 		{
    142 			VK_STRUCTURE_TYPE_APPLICATION_INFO,					// VkStructureType				sType;
    143 			DE_NULL,											// const void*					pNext;
    144 			"appName",											// const char*					pAppName;
    145 			0u,													// deUint32						appVersion;
    146 			"engineName",										// const char*					pEngineName;
    147 			0u,													// deUint32						engineVersion;
    148 			VK_MAKE_VERSION(1, 0, patchNumbers[patchVersion]),	// deUint32						apiVersion;
    149 		};
    150 
    151 		appInfos.push_back(appInfo);
    152 	}
    153 	// run the tests!
    154 	for (size_t appInfoNdx = 0; appInfoNdx < appInfos.size(); ++appInfoNdx)
    155 	{
    156 		const VkApplicationInfo&		appInfo					= appInfos[appInfoNdx];
    157 		const VkInstanceCreateInfo		instanceCreateInfo		=
    158 		{
    159 			VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,	// VkStructureType				sType;
    160 			DE_NULL,								// const void*					pNext;
    161 			(VkInstanceCreateFlags)0u,				// VkInstanceCreateFlags		flags;
    162 			&appInfo,								// const VkApplicationInfo*		pAppInfo;
    163 			0u,										// deUint32						layerCount;
    164 			DE_NULL,								// const char*const*			ppEnabledLayernames;
    165 			0u,										// deUint32						extensionCount;
    166 			DE_NULL,								// const char*const*			ppEnabledExtensionNames;
    167 		};
    168 
    169 		log << TestLog::Message << "Creating instance with appInfo: " << appInfo << TestLog::EndMessage;
    170 
    171 		try
    172 		{
    173 			const Unique<VkInstance> instance(createInstance(platformInterface, &instanceCreateInfo));
    174 			log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
    175 		}
    176 		catch (const vk::Error& err)
    177 		{
    178 			resultCollector.fail("Failed, Error code: " + de::toString(err.getMessage()));
    179 		}
    180 	}
    181 
    182 	return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
    183 }
    184 
    185 tcu::TestStatus createInstanceWithInvalidApiVersionTest (Context& context)
    186 {
    187 	tcu::TestLog&				log					= context.getTestContext().getLog();
    188 	tcu::ResultCollector		resultCollector		(log);
    189 	const PlatformInterface&	platformInterface	= context.getPlatformInterface();
    190 	const ApiVersion			apiVersion			= unpackVersion(VK_API_VERSION);
    191 	const deUint32				invalidMajorVersion	= (1 << 10) - 1;
    192 	const deUint32				invalidMinorVersion	= (1 << 10) - 1;
    193 	vector<ApiVersion>			invalidApiVersions;
    194 
    195 	invalidApiVersions.push_back(ApiVersion(invalidMajorVersion, apiVersion.minorNum, apiVersion.patchNum));
    196 	invalidApiVersions.push_back(ApiVersion(apiVersion.majorNum, invalidMinorVersion, apiVersion.patchNum));
    197 
    198 	for (size_t apiVersionNdx = 0; apiVersionNdx < invalidApiVersions.size(); apiVersionNdx++)
    199 	{
    200 		const VkApplicationInfo appInfo					=
    201 		{
    202 			VK_STRUCTURE_TYPE_APPLICATION_INFO,			// VkStructureType				sType;
    203 			DE_NULL,									// const void*					pNext;
    204 			"appName",									// const char*					pAppName;
    205 			0u,											// deUint32						appVersion;
    206 			"engineName",								// const char*					pEngineName;
    207 			0u,											// deUint32						engineVersion;
    208 			pack(invalidApiVersions[apiVersionNdx]),	// deUint32						apiVersion;
    209 		};
    210 		const VkInstanceCreateInfo instanceCreateInfo	=
    211 		{
    212 			VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,		// VkStructureType				sType;
    213 			DE_NULL,									// const void*					pNext;
    214 			(VkInstanceCreateFlags)0u,					// VkInstanceCreateFlags		flags;
    215 			&appInfo,									// const VkApplicationInfo*		pAppInfo;
    216 			0u,											// deUint32						layerCount;
    217 			DE_NULL,									// const char*const*			ppEnabledLayernames;
    218 			0u,											// deUint32						extensionCount;
    219 			DE_NULL,									// const char*const*			ppEnabledExtensionNames;
    220 		};
    221 
    222 
    223 		log << TestLog::Message
    224 			<<"VK_API_VERSION defined in vulkan.h: " << apiVersion
    225 			<< ", api version used to create instance: " << invalidApiVersions[apiVersionNdx]
    226 			<< TestLog::EndMessage;
    227 
    228 		{
    229 			VkInstance		instance	= (VkInstance)0;
    230 			const VkResult	result		= platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
    231 			const bool		gotInstance	= !!instance;
    232 
    233 			if (instance)
    234 			{
    235 				const InstanceDriver	instanceIface	(platformInterface, instance);
    236 				instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
    237 			}
    238 
    239 			if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
    240 			{
    241 				TCU_CHECK(!gotInstance);
    242 				log << TestLog::Message << "Pass, instance creation with invalid apiVersion is rejected" << TestLog::EndMessage;
    243 			}
    244 			else
    245 				resultCollector.fail("Fail, instance creation with invalid apiVersion is not rejected");
    246 		}
    247 	}
    248 
    249 	return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
    250 }
    251 
    252 tcu::TestStatus createInstanceWithNullApplicationInfoTest (Context& context)
    253 {
    254 	tcu::TestLog&				log						= context.getTestContext().getLog();
    255 	tcu::ResultCollector		resultCollector			(log);
    256 	const PlatformInterface&	platformInterface		= context.getPlatformInterface();
    257 
    258 	const VkInstanceCreateInfo		instanceCreateInfo		=
    259 	{
    260 		VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,	// VkStructureType				sType;
    261 		DE_NULL,								// const void*					pNext;
    262 		(VkInstanceCreateFlags)0u,				// VkInstanceCreateFlags		flags;
    263 		DE_NULL,								// const VkApplicationInfo*		pAppInfo;
    264 		0u,										// deUint32						layerCount;
    265 		DE_NULL,								// const char*const*			ppEnabledLayernames;
    266 		0u,										// deUint32						extensionCount;
    267 		DE_NULL,								// const char*const*			ppEnabledExtensionNames;
    268 	};
    269 
    270 	log << TestLog::Message << "Creating instance with NULL pApplicationInfo" << TestLog::EndMessage;
    271 
    272 	try
    273 	{
    274 		const Unique<VkInstance> instance(createInstance(platformInterface, &instanceCreateInfo));
    275 		log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
    276 	}
    277 	catch (const vk::Error& err)
    278 	{
    279 		resultCollector.fail("Failed, Error code: " + de::toString(err.getMessage()));
    280 	}
    281 
    282 	return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
    283 }
    284 
    285 tcu::TestStatus createInstanceWithUnsupportedExtensionsTest (Context& context)
    286 {
    287 	tcu::TestLog&						log						= context.getTestContext().getLog();
    288 	const PlatformInterface&			platformInterface		= context.getPlatformInterface();
    289 	const char*							enabledExtensions[]		= {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION"};
    290 	const VkApplicationInfo				appInfo					=
    291 	{
    292 		VK_STRUCTURE_TYPE_APPLICATION_INFO,						// VkStructureType				sType;
    293 		DE_NULL,												// const void*					pNext;
    294 		"appName",												// const char*					pAppName;
    295 		0u,														// deUint32						appVersion;
    296 		"engineName",											// const char*					pEngineName;
    297 		0u,														// deUint32						engineVersion;
    298 		VK_API_VERSION,											// deUint32						apiVersion;
    299 	};
    300 	const VkInstanceCreateInfo			instanceCreateInfo		=
    301 	{
    302 		VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,					// VkStructureType				sType;
    303 		DE_NULL,												// const void*					pNext;
    304 		(VkInstanceCreateFlags)0u,								// VkInstanceCreateFlags		flags;
    305 		&appInfo,												// const VkApplicationInfo*		pAppInfo;
    306 		0u,														// deUint32						layerCount;
    307 		DE_NULL,												// const char*const*			ppEnabledLayernames;
    308 		DE_LENGTH_OF_ARRAY(enabledExtensions),					// deUint32						extensionCount;
    309 		enabledExtensions,										// const char*const*			ppEnabledExtensionNames;
    310 	};
    311 
    312 	log << TestLog::Message << "Enabled extensions are: " << TestLog::EndMessage;
    313 
    314 	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(enabledExtensions); ndx++)
    315 		log << TestLog::Message << enabledExtensions[ndx] <<  TestLog::EndMessage;
    316 
    317 	{
    318 		VkInstance		instance	= (VkInstance)0;
    319 		const VkResult	result		= platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
    320 		const bool		gotInstance	= !!instance;
    321 
    322 		if (instance)
    323 		{
    324 			const InstanceDriver	instanceIface	(platformInterface, instance);
    325 			instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
    326 		}
    327 
    328 		if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
    329 		{
    330 			TCU_CHECK(!gotInstance);
    331 			return tcu::TestStatus::pass("Pass, creating instance with unsupported extension was rejected.");
    332 		}
    333 		else
    334 			return tcu::TestStatus::fail("Fail, creating instance with unsupported extensions succeeded.");
    335 	}
    336 }
    337 
    338 tcu::TestStatus createDeviceTest (Context& context)
    339 {
    340 	const PlatformInterface&		platformInterface		= context.getPlatformInterface();
    341 	const Unique<VkInstance>		instance				(createDefaultInstance(platformInterface));
    342 	const InstanceDriver			instanceDriver			(platformInterface, instance.get());
    343 	const VkPhysicalDevice			physicalDevice			= chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
    344 	const deUint32					queueFamilyIndex		= 0;
    345 	const deUint32					queueCount				= 1;
    346 	const deUint32					queueIndex				= 0;
    347 	const float						queuePriority			= 1.0f;
    348 	const VkDeviceQueueCreateInfo	deviceQueueCreateInfo	=
    349 	{
    350 		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
    351 		DE_NULL,
    352 		(VkDeviceQueueCreateFlags)0u,
    353 		queueFamilyIndex,						//queueFamilyIndex;
    354 		queueCount,								//queueCount;
    355 		&queuePriority,							//pQueuePriorities;
    356 	};
    357 	const VkDeviceCreateInfo		deviceCreateInfo	=
    358 	{
    359 		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,	//sType;
    360 		DE_NULL,								//pNext;
    361 		(VkDeviceCreateFlags)0u,
    362 		1,										//queueRecordCount;
    363 		&deviceQueueCreateInfo,					//pRequestedQueues;
    364 		0,										//layerCount;
    365 		DE_NULL,								//ppEnabledLayerNames;
    366 		0,										//extensionCount;
    367 		DE_NULL,								//ppEnabledExtensionNames;
    368 		DE_NULL,								//pEnabledFeatures;
    369 	};
    370 
    371 	const Unique<VkDevice>			device					(createDevice(instanceDriver, physicalDevice, &deviceCreateInfo));
    372 	const DeviceDriver				deviceDriver			(instanceDriver, device.get());
    373 	VkQueue							queue;
    374 
    375 	deviceDriver.getDeviceQueue(device.get(), queueFamilyIndex, queueIndex, &queue);
    376 	VK_CHECK(deviceDriver.queueWaitIdle(queue));
    377 
    378 	return tcu::TestStatus::pass("Pass");
    379 }
    380 
    381 tcu::TestStatus createMultipleDevicesTest (Context& context)
    382 {
    383 	tcu::TestLog&										log						= context.getTestContext().getLog();
    384 	tcu::ResultCollector								resultCollector			(log);
    385 	const int											numDevices				= 5;
    386 	const PlatformInterface&							platformInterface		= context.getPlatformInterface();
    387 	const Unique<VkInstance>							instance				(createDefaultInstance(platformInterface));
    388 	const InstanceDriver								instanceDriver			(platformInterface, instance.get());
    389 	const VkPhysicalDevice								physicalDevice			= chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
    390 	const deUint32										queueFamilyIndex		= 0;
    391 	const deUint32										queueCount				= 1;
    392 	const deUint32										queueIndex				= 0;
    393 	const float											queuePriority			= 1.0f;
    394 	const VkDeviceQueueCreateInfo						deviceQueueCreateInfo	=
    395 	{
    396 		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
    397 		DE_NULL,
    398 		(VkDeviceQueueCreateFlags)0u,					//flags;
    399 		queueFamilyIndex,								//queueFamilyIndex;
    400 		queueCount,										//queueCount;
    401 		&queuePriority,									//pQueuePriorities;
    402 	};
    403 	const VkDeviceCreateInfo							deviceCreateInfo		=
    404 	{
    405 		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,			//sType;
    406 		DE_NULL,										//pNext;
    407 		(VkDeviceCreateFlags)0u,
    408 		1,												//queueRecordCount;
    409 		&deviceQueueCreateInfo,							//pRequestedQueues;
    410 		0,												//layerCount;
    411 		DE_NULL,										//ppEnabledLayerNames;
    412 		0,												//extensionCount;
    413 		DE_NULL,										//ppEnabledExtensionNames;
    414 		DE_NULL,										//pEnabledFeatures;
    415 	};
    416 	vector<VkDevice>									devices(numDevices, (VkDevice)DE_NULL);
    417 
    418 	try
    419 	{
    420 		for (int deviceNdx = 0; deviceNdx < numDevices; deviceNdx++)
    421 		{
    422 			const VkResult result = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &devices[deviceNdx]);
    423 
    424 			if (result != VK_SUCCESS)
    425 			{
    426 				resultCollector.fail("Failed to create Device No." + de::toString(deviceNdx) + ", Error Code: " + de::toString(result));
    427 				break;
    428 			}
    429 
    430 			{
    431 				const DeviceDriver	deviceDriver(instanceDriver, devices[deviceNdx]);
    432 				VkQueue				queue;
    433 
    434 				DE_ASSERT(queueIndex < queueCount);
    435 				deviceDriver.getDeviceQueue(devices[deviceNdx], queueFamilyIndex, queueIndex, &queue);
    436 				VK_CHECK(deviceDriver.queueWaitIdle(queue));
    437 			}
    438 		}
    439 	}
    440 	catch (const vk::Error& error)
    441 	{
    442 		resultCollector.fail(de::toString(error.getError()));
    443 	}
    444 	catch (...)
    445 	{
    446 		for (int deviceNdx = (int)devices.size()-1; deviceNdx >= 0; deviceNdx--)
    447 		{
    448 			if (devices[deviceNdx] != (VkDevice)DE_NULL)
    449 			{
    450 				DeviceDriver deviceDriver(instanceDriver, devices[deviceNdx]);
    451 				deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
    452 			}
    453 		}
    454 
    455 		throw;
    456 	}
    457 
    458 	for (int deviceNdx = (int)devices.size()-1; deviceNdx >= 0; deviceNdx--)
    459 	{
    460 		if (devices[deviceNdx] != (VkDevice)DE_NULL)
    461 		{
    462 			DeviceDriver deviceDriver(instanceDriver, devices[deviceNdx]);
    463 			deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
    464 		}
    465 	}
    466 
    467 	return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
    468 }
    469 
    470 tcu::TestStatus createDeviceWithUnsupportedExtensionsTest (Context& context)
    471 {
    472 	tcu::TestLog&					log						= context.getTestContext().getLog();
    473 	const PlatformInterface&		platformInterface		= context.getPlatformInterface();
    474 	const Unique<VkInstance>		instance				(createDefaultInstance(platformInterface));
    475 	const InstanceDriver			instanceDriver			(platformInterface, instance.get());
    476 	const char*						enabledExtensions[]		= {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION", "VK_DONT_SUPPORT_ME"};
    477 	const VkPhysicalDevice			physicalDevice			= chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
    478 	const float						queuePriority			= 1.0f;
    479 	const VkDeviceQueueCreateInfo	deviceQueueCreateInfo	=
    480 	{
    481 		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
    482 		DE_NULL,
    483 		(VkDeviceQueueCreateFlags)0u,
    484 		0,										//queueFamiliIndex;
    485 		1,										//queueCount;
    486 		&queuePriority,							//pQueuePriorities;
    487 	};
    488 	const VkDeviceCreateInfo		deviceCreateInfo		=
    489 	{
    490 		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,	//sType;
    491 		DE_NULL,								//pNext;
    492 		(VkDeviceCreateFlags)0u,
    493 		1,										//queueRecordCount;
    494 		&deviceQueueCreateInfo,					//pRequestedQueues;
    495 		0,										//layerCount;
    496 		DE_NULL,								//ppEnabledLayerNames;
    497 		DE_LENGTH_OF_ARRAY(enabledExtensions),	//extensionCount;
    498 		enabledExtensions,						//ppEnabledExtensionNames;
    499 		DE_NULL,								//pEnabledFeatures;
    500 	};
    501 
    502 	log << TestLog::Message << "Enabled extensions are: " << TestLog::EndMessage;
    503 
    504 	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(enabledExtensions); ndx++)
    505 		log << TestLog::Message << enabledExtensions[ndx] <<  TestLog::EndMessage;
    506 
    507 	{
    508 		VkDevice		device		= (VkDevice)0;
    509 		const VkResult	result		= instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &device);
    510 		const bool		gotDevice	= !!device;
    511 
    512 		if (device)
    513 		{
    514 			const DeviceDriver	deviceIface	(instanceDriver, device);
    515 			deviceIface.destroyDevice(device, DE_NULL/*pAllocator*/);
    516 		}
    517 
    518 		if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
    519 		{
    520 			TCU_CHECK(!gotDevice);
    521 			return tcu::TestStatus::pass("Pass, create device with unsupported extension is rejected.");
    522 		}
    523 		else
    524 			return tcu::TestStatus::fail("Fail, create device with unsupported extension but succeed.");
    525 	}
    526 }
    527 
    528 deUint32 getGlobalMaxQueueCount(const vector<VkQueueFamilyProperties>& queueFamilyProperties)
    529 {
    530 	deUint32 maxQueueCount = 0;
    531 
    532 	for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < (deUint32)queueFamilyProperties.size(); queueFamilyNdx++)
    533 	{
    534 		maxQueueCount = de::max(maxQueueCount, queueFamilyProperties[queueFamilyNdx].queueCount);
    535 	}
    536 
    537 	return maxQueueCount;
    538 }
    539 
    540 tcu::TestStatus createDeviceWithVariousQueueCountsTest (Context& context)
    541 {
    542 	tcu::TestLog&							log						= context.getTestContext().getLog();
    543 	const int								queueCountDiff			= 1;
    544 	const PlatformInterface&				platformInterface		= context.getPlatformInterface();
    545 	const Unique<VkInstance>				instance				(createDefaultInstance(platformInterface));
    546 	const InstanceDriver					instanceDriver			(platformInterface, instance.get());
    547 	const VkPhysicalDevice					physicalDevice			= chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
    548 	const vector<VkQueueFamilyProperties>	queueFamilyProperties	= getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
    549 	const vector<float>						queuePriorities			(getGlobalMaxQueueCount(queueFamilyProperties), 1.0f);
    550 	vector<VkDeviceQueueCreateInfo>			deviceQueueCreateInfos;
    551 
    552 	for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < (deUint32)queueFamilyProperties.size(); queueFamilyNdx++)
    553 	{
    554 		const deUint32 maxQueueCount = queueFamilyProperties[queueFamilyNdx].queueCount;
    555 
    556 		for (deUint32 queueCount = 1; queueCount <= maxQueueCount; queueCount += queueCountDiff)
    557 		{
    558 			const VkDeviceQueueCreateInfo queueCreateInfo =
    559 			{
    560 				VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
    561 				DE_NULL,
    562 				(VkDeviceQueueCreateFlags)0u,
    563 				queueFamilyNdx,
    564 				queueCount,
    565 				queuePriorities.data()
    566 			};
    567 
    568 			deviceQueueCreateInfos.push_back(queueCreateInfo);
    569 		}
    570 	}
    571 
    572 	for (size_t testNdx = 0; testNdx < deviceQueueCreateInfos.size(); testNdx++)
    573 	{
    574 		const VkDeviceQueueCreateInfo&	queueCreateInfo		= deviceQueueCreateInfos[testNdx];
    575 		const VkDeviceCreateInfo		deviceCreateInfo	=
    576 		{
    577 			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,	//sType;
    578 			DE_NULL,								//pNext;
    579 			(VkDeviceCreateFlags)0u,
    580 			1,										//queueRecordCount;
    581 			&queueCreateInfo,						//pRequestedQueues;
    582 			0,										//layerCount;
    583 			DE_NULL,								//ppEnabledLayerNames;
    584 			0,										//extensionCount;
    585 			DE_NULL,								//ppEnabledExtensionNames;
    586 			DE_NULL,								//pEnabledFeatures;
    587 		};
    588 		const Unique<VkDevice>			device				(createDevice(instanceDriver, physicalDevice, &deviceCreateInfo));
    589 		const DeviceDriver				deviceDriver		(instanceDriver, device.get());
    590 		const deUint32					queueFamilyIndex	= deviceCreateInfo.pQueueCreateInfos->queueFamilyIndex;
    591 		const deUint32					queueCount			= deviceCreateInfo.pQueueCreateInfos->queueCount;
    592 
    593 		for (deUint32 queueIndex = 0; queueIndex < queueCount; queueIndex++)
    594 		{
    595 			VkQueue		queue;
    596 			VkResult	result;
    597 
    598 			deviceDriver.getDeviceQueue(device.get(), queueFamilyIndex, queueIndex, &queue);
    599 			TCU_CHECK(!!queue);
    600 
    601 			result = deviceDriver.queueWaitIdle(queue);
    602 			if (result != VK_SUCCESS)
    603 			{
    604 				log << TestLog::Message
    605 					<< "vkQueueWaitIdle failed"
    606 					<< ",  queueIndex = " << queueIndex
    607 					<< ", queueCreateInfo " << queueCreateInfo
    608 					<< ", Error Code: " << result
    609 					<< TestLog::EndMessage;
    610 				return tcu::TestStatus::fail("Fail");
    611 			}
    612 		}
    613 	}
    614 	return tcu::TestStatus::pass("Pass");
    615 }
    616 
    617 } // anonymous
    618 
    619 tcu::TestCaseGroup* createDeviceInitializationTests (tcu::TestContext& testCtx)
    620 {
    621 	de::MovePtr<tcu::TestCaseGroup>	deviceInitializationTests (new tcu::TestCaseGroup(testCtx, "device_init", "Device Initialization Tests"));
    622 
    623 	addFunctionCase(deviceInitializationTests.get(), "create_instance_name_version",			"", createInstanceTest);
    624 	addFunctionCase(deviceInitializationTests.get(), "create_instance_invalid_api_version",		"", createInstanceWithInvalidApiVersionTest);
    625 	addFunctionCase(deviceInitializationTests.get(), "create_instance_null_appinfo",		    "", createInstanceWithNullApplicationInfoTest);
    626 	addFunctionCase(deviceInitializationTests.get(), "create_instance_unsupported_extensions",	"", createInstanceWithUnsupportedExtensionsTest);
    627 	addFunctionCase(deviceInitializationTests.get(), "create_device",							"", createDeviceTest);
    628 	addFunctionCase(deviceInitializationTests.get(), "create_multiple_devices",					"", createMultipleDevicesTest);
    629 	addFunctionCase(deviceInitializationTests.get(), "create_device_unsupported_extensions",	"", createDeviceWithUnsupportedExtensionsTest);
    630 	addFunctionCase(deviceInitializationTests.get(), "create_device_various_queue_counts",		"", createDeviceWithVariousQueueCountsTest);
    631 
    632 	return deviceInitializationTests.release();
    633 }
    634 
    635 } // api
    636 } // vkt
    637