112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos/*-------------------------------------------------------------------------
2846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * Vulkan Conformance Tests
3846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * ------------------------
412edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *
5846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * Copyright (c) 2015 Google Inc.
612edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *
7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
1012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1212edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
1812edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *
1912edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *//*!
2012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * \file
2112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos * \brief Vulkan test case base classes
2212edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos *//*--------------------------------------------------------------------*/
2312edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos
2412edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos#include "vktTestCase.hpp"
2512edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos
2632675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkRef.hpp"
274b11ca9132ae388bc41f83a8fceaff3791314769Jarkko Pöyry#include "vkRefUtil.hpp"
2832675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkQueryUtil.hpp"
2932675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkDeviceUtil.hpp"
30bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry#include "vkMemUtil.hpp"
3132675035be2a05886457025598f90c131d83c670Pyry Haulos#include "vkPlatform.hpp"
32501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos#include "vkDebugReportUtil.hpp"
33501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
34501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos#include "tcuCommandLine.hpp"
3532675035be2a05886457025598f90c131d83c670Pyry Haulos
3625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos#include "deSTLUtil.hpp"
3732675035be2a05886457025598f90c131d83c670Pyry Haulos#include "deMemory.h"
3832675035be2a05886457025598f90c131d83c670Pyry Haulos
3912edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulosnamespace vkt
4012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos{
4112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos
4232675035be2a05886457025598f90c131d83c670Pyry Haulos// Default device utilities
4332675035be2a05886457025598f90c131d83c670Pyry Haulos
4432675035be2a05886457025598f90c131d83c670Pyry Haulosusing std::vector;
45501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosusing std::string;
4632675035be2a05886457025598f90c131d83c670Pyry Haulosusing namespace vk;
4732675035be2a05886457025598f90c131d83c670Pyry Haulos
4825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosnamespace
4925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{
5025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
51501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosvector<string> getValidationLayers (const vector<VkLayerProperties>& supportedLayers)
52501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{
53501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	static const char*	s_magicLayer		= "VK_LAYER_LUNARG_standard_validation";
54501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	static const char*	s_defaultLayers[]	=
55501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	{
56501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_GOOGLE_threading",
57501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_LUNARG_parameter_validation",
58501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_LUNARG_device_limits",
59501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_LUNARG_object_tracker",
60501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_LUNARG_image",
61501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_LUNARG_core_validation",
62501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_LUNARG_swapchain",
63501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		"VK_LAYER_GOOGLE_unique_objects"
64501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	};
65501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
66501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	vector<string>		enabledLayers;
67501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
68501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	if (isLayerSupported(supportedLayers, RequiredLayer(s_magicLayer)))
69501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		enabledLayers.push_back(s_magicLayer);
70501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	else
71501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	{
72501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_defaultLayers); ++ndx)
73501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		{
74501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos			if (isLayerSupported(supportedLayers, RequiredLayer(s_defaultLayers[ndx])))
75501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos				enabledLayers.push_back(s_defaultLayers[ndx]);
76501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		}
77501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	}
78501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
79501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	return enabledLayers;
80501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos}
81501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
82501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosvector<string> getValidationLayers (const PlatformInterface& vkp)
83501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{
84501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	return getValidationLayers(enumerateInstanceLayerProperties(vkp));
85501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos}
86501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
87501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosvector<string> getValidationLayers (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
88501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{
89501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice));
90501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos}
91501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
92ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwavector<string> filterExtensions(const vector<VkExtensionProperties>& deviceExtensions)
93501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{
94501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	vector<string>	enabledExtensions;
95ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	const char*		extensionGroups[] =
96ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	{
97ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa		"VK_KHR_",
986f1adef8acaca9616e2ae0774566471b146d42b1Arkadiusz Sarwa		"VK_EXT_",
996f1adef8acaca9616e2ae0774566471b146d42b1Arkadiusz Sarwa		"VK_KHX_"
100ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	};
101ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa
102ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	for (size_t deviceExtNdx = 0; deviceExtNdx < deviceExtensions.size(); deviceExtNdx++)
103ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	{
104ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa		for (int extGroupNdx = 0; extGroupNdx < DE_LENGTH_OF_ARRAY(extensionGroups); extGroupNdx++)
105ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa		{
106ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa			if (deStringBeginsWith(deviceExtensions[deviceExtNdx].extensionName, extensionGroups[extGroupNdx]))
107ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa				enabledExtensions.push_back(deviceExtensions[deviceExtNdx].extensionName);
108ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa		}
109ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	}
110ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa
111ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	return enabledExtensions;
112ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa}
113ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa
1140dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz SarwaMove<VkInstance> createInstance (const PlatformInterface& vkp, const vector<string>& enabledExtensions, const tcu::CommandLine& cmdLine)
115ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa{
116ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	const bool							isValidationEnabled	= cmdLine.isValidationEnabled();
117ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa	vector<string>						enabledLayers;
118501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
119501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	if (isValidationEnabled)
120501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	{
121ab0ecfcb88c3150cc063a0fff14bca7cf5f33853Arkadiusz Sarwa		if (!isDebugReportSupported(vkp))
122501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos			TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
123501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
124501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		enabledLayers = getValidationLayers(vkp);
125501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		if (enabledLayers.empty())
126501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos			TCU_THROW(NotSupportedError, "No validation layers found");
127501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	}
128501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
129501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	return createDefaultInstance(vkp, enabledLayers, enabledExtensions);
130501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos}
131501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
132fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyrystatic deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
13332675035be2a05886457025598f90c131d83c670Pyry Haulos{
1343d2071b82061ee418aa87064333069281133eddaPyry Haulos	const vector<VkQueueFamilyProperties>	queueProps	= getPhysicalDeviceQueueFamilyProperties(vkInstance, physicalDevice);
13532675035be2a05886457025598f90c131d83c670Pyry Haulos
13632675035be2a05886457025598f90c131d83c670Pyry Haulos	for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
13732675035be2a05886457025598f90c131d83c670Pyry Haulos	{
13832675035be2a05886457025598f90c131d83c670Pyry Haulos		if ((queueProps[queueNdx].queueFlags & requiredCaps) == requiredCaps)
13932675035be2a05886457025598f90c131d83c670Pyry Haulos			return (deUint32)queueNdx;
14032675035be2a05886457025598f90c131d83c670Pyry Haulos	}
14132675035be2a05886457025598f90c131d83c670Pyry Haulos
14232675035be2a05886457025598f90c131d83c670Pyry Haulos	TCU_THROW(NotSupportedError, "No matching queue found");
14332675035be2a05886457025598f90c131d83c670Pyry Haulos}
14432675035be2a05886457025598f90c131d83c670Pyry Haulos
14525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry HaulosMove<VkDevice> createDefaultDevice (const InstanceInterface&			vki,
14625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos									VkPhysicalDevice					physicalDevice,
14725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos									deUint32							queueIndex,
14825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos									const VkPhysicalDeviceFeatures2KHR&	enabledFeatures,
14925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos									const vector<string>&				enabledExtensions,
15025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos									const tcu::CommandLine&				cmdLine)
15132675035be2a05886457025598f90c131d83c670Pyry Haulos{
15232675035be2a05886457025598f90c131d83c670Pyry Haulos	VkDeviceQueueCreateInfo		queueInfo;
15332675035be2a05886457025598f90c131d83c670Pyry Haulos	VkDeviceCreateInfo			deviceInfo;
154501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	vector<string>				enabledLayers;
155501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	vector<const char*>			layerPtrs;
156ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	vector<const char*>			extensionPtrs;
15766ccd764e687029f326b3eb6e30e1815e63e3c32Dae Kim	const float					queuePriority	= 1.0f;
15832675035be2a05886457025598f90c131d83c670Pyry Haulos
159f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos	deMemset(&queueInfo,	0, sizeof(queueInfo));
160f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos	deMemset(&deviceInfo,	0, sizeof(deviceInfo));
161f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos
162501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	if (cmdLine.isValidationEnabled())
163501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	{
164501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		enabledLayers = getValidationLayers(vki, physicalDevice);
165501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		if (enabledLayers.empty())
166501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos			TCU_THROW(NotSupportedError, "No validation layers found");
167501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	}
168501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
169501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	layerPtrs.resize(enabledLayers.size());
170501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
171501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
172501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos		layerPtrs[ndx] = enabledLayers[ndx].c_str();
173501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos
174ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	extensionPtrs.resize(enabledExtensions.size());
175ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos
176ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	for (size_t ndx = 0; ndx < enabledExtensions.size(); ++ndx)
177ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos		extensionPtrs[ndx] = enabledExtensions[ndx].c_str();
178ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos
17925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	// VK_KHR_get_physical_device_propeties2 is used if enabledFeatures.pNext != 0
18025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
18168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	queueInfo.sType							= VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
18225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	queueInfo.pNext							= enabledFeatures.pNext ? &enabledFeatures : DE_NULL;
18368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	queueInfo.flags							= (VkDeviceQueueCreateFlags)0u;
18468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	queueInfo.queueFamilyIndex				= queueIndex;
18568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	queueInfo.queueCount					= 1u;
18666ccd764e687029f326b3eb6e30e1815e63e3c32Dae Kim	queueInfo.pQueuePriorities				= &queuePriority;
18768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
18868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	deviceInfo.sType						= VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
18968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	deviceInfo.pNext						= DE_NULL;
19068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	deviceInfo.queueCreateInfoCount			= 1u;
19168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	deviceInfo.pQueueCreateInfos			= &queueInfo;
192ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	deviceInfo.enabledExtensionCount		= (deUint32)extensionPtrs.size();
193ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	deviceInfo.ppEnabledExtensionNames		= (extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]);
194501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	deviceInfo.enabledLayerCount			= (deUint32)layerPtrs.size();
195501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos	deviceInfo.ppEnabledLayerNames			= (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]);
19625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	deviceInfo.pEnabledFeatures				= enabledFeatures.pNext ? DE_NULL : &enabledFeatures.features;
197f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos
198f263eb0791c3290b7d10847a7d7282cf67f51440Pyry Haulos	return createDevice(vki, physicalDevice, &deviceInfo);
19932675035be2a05886457025598f90c131d83c670Pyry Haulos};
20032675035be2a05886457025598f90c131d83c670Pyry Haulos
20125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosbool isPhysicalDeviceFeatures2Supported (const vector<string>& instanceExtensions)
20225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{
20325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	return de::contains(instanceExtensions.begin(), instanceExtensions.end(), "VK_KHR_get_physical_device_properties2");
20425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos}
20525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
20625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosstruct DeviceFeatures
20725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{
20825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	VkPhysicalDeviceFeatures2KHR						coreFeatures;
20925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR	samplerYCbCrConversionFeatures;
21025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
21125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	DeviceFeatures (const InstanceInterface&	vki,
21225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos					VkPhysicalDevice			physicalDevice,
21325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos					const vector<string>&		instanceExtensions,
21425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos					const vector<string>&		deviceExtensions)
21525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	{
21625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		void**	curExtPoint		= &coreFeatures.pNext;
21725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
21825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deMemset(&coreFeatures, 0, sizeof(coreFeatures));
21925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deMemset(&samplerYCbCrConversionFeatures, 0, sizeof(samplerYCbCrConversionFeatures));
22025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
22125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		coreFeatures.sType						= VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
22225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		samplerYCbCrConversionFeatures.sType	= VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR;
22325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
22425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		if (isPhysicalDeviceFeatures2Supported(instanceExtensions))
22525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		{
22625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos			if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_sampler_ycbcr_conversion"))
22725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos			{
22825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos				*curExtPoint = &samplerYCbCrConversionFeatures;
22925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos				curExtPoint = &samplerYCbCrConversionFeatures.pNext;
23025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos			}
23125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
23225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos			vki.getPhysicalDeviceFeatures2KHR(physicalDevice, &coreFeatures);
23325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		}
23425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		else
23525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos			coreFeatures.features = getPhysicalDeviceFeatures(vki, physicalDevice);
23625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
23725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		// Disable robustness by default, as it has an impact on performance on some HW.
23825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		coreFeatures.features.robustBufferAccess = false;
23925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	}
24025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos};
24125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
24225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos} // anonymous
24325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
24432675035be2a05886457025598f90c131d83c670Pyry Haulosclass DefaultDevice
24532675035be2a05886457025598f90c131d83c670Pyry Haulos{
24632675035be2a05886457025598f90c131d83c670Pyry Haulospublic:
247689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos										DefaultDevice					(const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine);
248689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos										~DefaultDevice					(void);
24932675035be2a05886457025598f90c131d83c670Pyry Haulos
25025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	VkInstance							getInstance						(void) const	{ return *m_instance;								}
25125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const InstanceInterface&			getInstanceInterface			(void) const	{ return m_instanceInterface;						}
25225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const vector<string>&				getInstanceExtensions			(void) const	{ return m_instanceExtensions;						}
253b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos
25425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	VkPhysicalDevice					getPhysicalDevice				(void) const	{ return m_physicalDevice;							}
25525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const VkPhysicalDeviceFeatures&		getDeviceFeatures				(void) const	{ return m_deviceFeatures.coreFeatures.features;	}
25625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const VkPhysicalDeviceFeatures2KHR&	getDeviceFeatures2				(void) const	{ return m_deviceFeatures.coreFeatures;				}
25725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	VkDevice							getDevice						(void) const	{ return *m_device;									}
25825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const DeviceInterface&				getDeviceInterface				(void) const	{ return m_deviceInterface;							}
25925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const VkPhysicalDeviceProperties&	getDeviceProperties				(void) const	{ return m_deviceProperties;						}
26025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const vector<string>&				getDeviceExtensions				(void) const	{ return m_deviceExtensions;						}
261b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos
26225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	deUint32							getUniversalQueueFamilyIndex	(void) const	{ return m_universalQueueFamilyIndex;				}
263689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	VkQueue								getUniversalQueue				(void) const;
26432675035be2a05886457025598f90c131d83c670Pyry Haulos
26532675035be2a05886457025598f90c131d83c670Pyry Haulosprivate:
266b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim	static VkPhysicalDeviceFeatures		filterDefaultDeviceFeatures		(const VkPhysicalDeviceFeatures& deviceFeatures);
267b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim
2680dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa	const vector<string>				m_instanceExtensions;
269689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const Unique<VkInstance>			m_instance;
270689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const InstanceDriver				m_instanceInterface;
271b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos
272689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const VkPhysicalDevice				m_physicalDevice;
273b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos
274689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const deUint32						m_universalQueueFamilyIndex;
275ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	const vector<string>				m_deviceExtensions;
27625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const DeviceFeatures				m_deviceFeatures;
27725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	const VkPhysicalDeviceProperties	m_deviceProperties;
278b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos
279689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const Unique<VkDevice>				m_device;
280689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const DeviceDriver					m_deviceInterface;
28132675035be2a05886457025598f90c131d83c670Pyry Haulos};
28232675035be2a05886457025598f90c131d83c670Pyry Haulos
28332675035be2a05886457025598f90c131d83c670Pyry HaulosDefaultDevice::DefaultDevice (const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine)
2840dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa	: m_instanceExtensions			(filterExtensions(enumerateInstanceExtensionProperties(vkPlatform, DE_NULL)))
2850dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa	, m_instance					(createInstance(vkPlatform, m_instanceExtensions, cmdLine))
286fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyry	, m_instanceInterface			(vkPlatform, *m_instance)
287fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyry	, m_physicalDevice				(chooseDevice(m_instanceInterface, *m_instance, cmdLine))
2886d38a140551eb9f1ded273a40c93d55428efefc2Pyry Haulos	, m_universalQueueFamilyIndex	(findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT))
2890dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwa	, m_deviceExtensions			(filterExtensions(enumerateDeviceExtensionProperties(m_instanceInterface, m_physicalDevice, DE_NULL)))
29025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	, m_deviceFeatures				(m_instanceInterface, m_physicalDevice, m_instanceExtensions, m_deviceExtensions)
29125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	, m_deviceProperties			(getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice))
29225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	, m_device						(createDefaultDevice(m_instanceInterface,
29325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos														 m_physicalDevice,
29425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos														 m_universalQueueFamilyIndex,
29525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos														 m_deviceFeatures.coreFeatures,
29625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos														 m_deviceExtensions,
29725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos														 cmdLine))
298fa8d8350fe202ecc4697be1d08f2047c90e91332Jarkko Pöyry	, m_deviceInterface				(m_instanceInterface, *m_device)
29932675035be2a05886457025598f90c131d83c670Pyry Haulos{
30032675035be2a05886457025598f90c131d83c670Pyry Haulos}
30132675035be2a05886457025598f90c131d83c670Pyry Haulos
30232675035be2a05886457025598f90c131d83c670Pyry HaulosDefaultDevice::~DefaultDevice (void)
30332675035be2a05886457025598f90c131d83c670Pyry Haulos{
30432675035be2a05886457025598f90c131d83c670Pyry Haulos}
30532675035be2a05886457025598f90c131d83c670Pyry Haulos
30632675035be2a05886457025598f90c131d83c670Pyry HaulosVkQueue DefaultDevice::getUniversalQueue (void) const
30732675035be2a05886457025598f90c131d83c670Pyry Haulos{
30855dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi	return getDeviceQueue(m_deviceInterface, *m_device, m_universalQueueFamilyIndex, 0);
30932675035be2a05886457025598f90c131d83c670Pyry Haulos}
31032675035be2a05886457025598f90c131d83c670Pyry Haulos
31125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosnamespace
312b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim{
313b615f4616905bb2d90f3f42f402cc285c6490571Dae Kim
314bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry// Allocator utilities
315bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry
316bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyryvk::Allocator* createAllocator (DefaultDevice* device)
317bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry{
318bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry	const VkPhysicalDeviceMemoryProperties memoryProperties = vk::getPhysicalDeviceMemoryProperties(device->getInstanceInterface(), device->getPhysicalDevice());
319bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry
320bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry	// \todo [2015-07-24 jarkko] support allocator selection/configuration from command line (or compile time)
321bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry	return new SimpleAllocator(device->getDeviceInterface(), device->getDevice(), memoryProperties);
322bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry}
323bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry
32425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos} // anonymous
32525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
32632675035be2a05886457025598f90c131d83c670Pyry Haulos// Context
32732675035be2a05886457025598f90c131d83c670Pyry Haulos
32832675035be2a05886457025598f90c131d83c670Pyry HaulosContext::Context (tcu::TestContext&							testCtx,
32932675035be2a05886457025598f90c131d83c670Pyry Haulos				  const vk::PlatformInterface&				platformInterface,
33032675035be2a05886457025598f90c131d83c670Pyry Haulos				  vk::ProgramCollection<vk::ProgramBinary>&	progCollection)
33132675035be2a05886457025598f90c131d83c670Pyry Haulos	: m_testCtx				(testCtx)
33232675035be2a05886457025598f90c131d83c670Pyry Haulos	, m_platformInterface	(platformInterface)
33332675035be2a05886457025598f90c131d83c670Pyry Haulos	, m_progCollection		(progCollection)
33432675035be2a05886457025598f90c131d83c670Pyry Haulos	, m_device				(new DefaultDevice(m_platformInterface, testCtx.getCommandLine()))
335bd0311e17f335ca7e184f35e2d2ca1c826364039Jarkko Pöyry	, m_allocator			(createAllocator(m_device.get()))
33632675035be2a05886457025598f90c131d83c670Pyry Haulos{
33732675035be2a05886457025598f90c131d83c670Pyry Haulos}
33832675035be2a05886457025598f90c131d83c670Pyry Haulos
33932675035be2a05886457025598f90c131d83c670Pyry HaulosContext::~Context (void)
34032675035be2a05886457025598f90c131d83c670Pyry Haulos{
34132675035be2a05886457025598f90c131d83c670Pyry Haulos}
34232675035be2a05886457025598f90c131d83c670Pyry Haulos
3430dbda1aa0f2399e03025db46c44e0ecce3d42c25Arkadiusz Sarwaconst vector<string>&					Context::getInstanceExtensions			(void) const { return m_device->getInstanceExtensions();		}
344fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkInstance							Context::getInstance					(void) const { return m_device->getInstance();					}
345fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::InstanceInterface&			Context::getInstanceInterface			(void) const { return m_device->getInstanceInterface();			}
346fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkPhysicalDevice					Context::getPhysicalDevice				(void) const { return m_device->getPhysicalDevice();			}
347fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::VkPhysicalDeviceFeatures&		Context::getDeviceFeatures				(void) const { return m_device->getDeviceFeatures();			}
34825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosconst vk::VkPhysicalDeviceFeatures2KHR&	Context::getDeviceFeatures2				(void) const { return m_device->getDeviceFeatures2();			}
349fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::VkPhysicalDeviceProperties&	Context::getDeviceProperties			(void) const { return m_device->getDeviceProperties();			}
350ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulosconst vector<string>&					Context::getDeviceExtensions			(void) const { return m_device->getDeviceExtensions();			}
351fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkDevice							Context::getDevice						(void) const { return m_device->getDevice();					}
352fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosconst vk::DeviceInterface&				Context::getDeviceInterface				(void) const { return m_device->getDeviceInterface();			}
353fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry HaulosdeUint32								Context::getUniversalQueueFamilyIndex	(void) const { return m_device->getUniversalQueueFamilyIndex();	}
354fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::VkQueue								Context::getUniversalQueue				(void) const { return m_device->getUniversalQueue();			}
355fc34a38f2fb20de82fc00a44c6fb778b9046d48bPyry Haulosvk::Allocator&							Context::getDefaultAllocator			(void) const { return *m_allocator;								}
35632675035be2a05886457025598f90c131d83c670Pyry Haulos
35732675035be2a05886457025598f90c131d83c670Pyry Haulos// TestCase
35832675035be2a05886457025598f90c131d83c670Pyry Haulos
3597485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid TestCase::initPrograms (SourceCollections&) const
36012edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos{
36112edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos}
36212edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos
36312edbd9c94d5380368146b99cfdf24b811c5f46bPyry Haulos} // vkt
364