1cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos/*-------------------------------------------------------------------------
2cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * Vulkan Conformance Tests
3cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * ------------------------
4cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *
5cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * Copyright (c) 2016 Google Inc.
6cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry 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
10cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
12cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry 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.
18cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *
19cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *//*!
20cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * \file
21cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * \brief VkSurface Tests
22cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *//*--------------------------------------------------------------------*/
23cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
24cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vktWsiSurfaceTests.hpp"
25cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
26cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vktTestCaseUtil.hpp"
27cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vktTestGroupUtil.hpp"
28cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
29cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkDefs.hpp"
30cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkPlatform.hpp"
31cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkStrUtil.hpp"
32cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkRef.hpp"
33cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkRefUtil.hpp"
34cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkQueryUtil.hpp"
35cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkMemUtil.hpp"
36cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkDeviceUtil.hpp"
37cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkPrograms.hpp"
38cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkTypeUtil.hpp"
39cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkWsiPlatform.hpp"
40cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkWsiUtil.hpp"
41f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos#include "vkAllocationCallbackUtil.hpp"
42cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
43cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuTestLog.hpp"
44cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuFormatUtil.hpp"
45cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuPlatform.hpp"
46cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuResultCollector.hpp"
47cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
48cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "deUniquePtr.hpp"
49cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "deStringUtil.hpp"
50cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosnamespace vk
528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosinline bool operator!= (const VkSurfaceFormatKHR& a, const VkSurfaceFormatKHR& b)
558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
568f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	return (a.format != b.format) || (a.colorSpace != b.colorSpace);
578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
588f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosinline bool operator== (const VkSurfaceFormatKHR& a, const VkSurfaceFormatKHR& b)
608f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
618f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	return !(a != b);
628f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
638f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
648f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} // vk
658f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
66cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosnamespace vkt
67cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
68cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosnamespace wsi
69cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
70cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
71cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosnamespace
72cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
73cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
74cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing namespace vk;
75cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing namespace vk::wsi;
76cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
77cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing tcu::TestLog;
78cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing tcu::Maybe;
79cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing tcu::UVec2;
80cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosusing de::MovePtr;
828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosusing de::UniquePtr;
838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
84cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing std::string;
85cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing std::vector;
86cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
87cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosenum
88cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
89cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC	= 0xffffffff
90cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos};
91cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostypedef vector<VkExtensionProperties> Extensions;
93cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosvoid checkAllSupported (const Extensions& supportedExtensions, const vector<string>& requiredExtensions)
958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
968f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (vector<string>::const_iterator requiredExtName = requiredExtensions.begin();
978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		 requiredExtName != requiredExtensions.end();
98cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		 ++requiredExtName)
99cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
100cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		if (!isExtensionSupported(supportedExtensions, RequiredExtension(*requiredExtName)))
101cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos			TCU_THROW(NotSupportedError, (*requiredExtName + " is not supported").c_str());
102cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
103cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
104cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
105f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry HaulosMove<VkInstance> createInstanceWithWsi (const PlatformInterface&		vkp,
106f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos										const Extensions&				supportedExtensions,
107f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos										Type							wsiType,
108f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos										const VkAllocationCallbacks*	pAllocator	= DE_NULL)
109cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
110cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	vector<string>	extensions;
111cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
112cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	extensions.push_back("VK_KHR_surface");
113cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	extensions.push_back(getExtensionName(wsiType));
114cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
1158f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	checkAllSupported(supportedExtensions, extensions);
116cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
117f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	return createDefaultInstance(vkp, vector<string>(), extensions, pAllocator);
118cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
119cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
1208f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstruct InstanceHelper
121cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
1228f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkExtensionProperties>	supportedExtensions;
1238f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	Unique<VkInstance>					instance;
1248f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceDriver				vki;
1258f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
126f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
1278f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		: supportedExtensions	(enumerateInstanceExtensionProperties(context.getPlatformInterface(),
1288f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																	  DE_NULL))
1298f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		, instance				(createInstanceWithWsi(context.getPlatformInterface(),
1308f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos													   supportedExtensions,
131f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos													   wsiType,
132f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos													   pAllocator))
1338f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		, vki					(context.getPlatformInterface(), *instance)
1348f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{}
1358f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos};
136cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
1378f00a90c1c60fe87327de7670ca817c5a42957faPyry HaulosMovePtr<Display> createDisplay (const vk::Platform&	platform,
1388f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos								const Extensions&	supportedExtensions,
1398f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos								Type				wsiType)
1408f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
141cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	try
142cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
1438f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return MovePtr<Display>(platform.createWsiDisplay(wsiType));
144cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
1458f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	catch (const tcu::NotSupportedError& e)
146cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
1478f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))))
1488f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		{
1498f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			// If VK_KHR_{platform}_surface was supported, vk::Platform implementation
1508f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			// must support creating native display & window for that WSI type.
1518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			throw tcu::TestError(e.getMessage());
1528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		}
1538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		else
1548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			throw;
1558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
1568f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
1578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
1588f00a90c1c60fe87327de7670ca817c5a42957faPyry HaulosMovePtr<Window> createWindow (const Display& display, const Maybe<UVec2>& initialSize)
1598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
1608f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	try
1618f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
1628f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return MovePtr<Window>(display.createWindow(initialSize));
1638f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
1648f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	catch (const tcu::NotSupportedError& e)
1658f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
1668f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		// See createDisplay - assuming that wsi::Display was supported platform port
1678f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		// should also support creating a window.
1688f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		throw tcu::TestError(e.getMessage());
169cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
1708f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
1718f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
1728f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstruct NativeObjects
1738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
1748f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const UniquePtr<Display>	display;
1758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const UniquePtr<Window>		window;
1768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
1778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	NativeObjects (Context&				context,
1788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				   const Extensions&	supportedExtensions,
1798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				   Type					wsiType,
1808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				   const Maybe<UVec2>&	initialWindowSize = tcu::nothing<UVec2>())
1818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		: display	(createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), supportedExtensions, wsiType))
1828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		, window	(createWindow(*display, initialWindowSize))
1838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{}
1848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos};
1858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
1868f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostcu::TestStatus createSurfaceTest (Context& context, Type wsiType)
1878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
1888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper		instHelper	(context, wsiType);
1898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const NativeObjects			native		(context, instHelper.supportedExtensions, wsiType);
1908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const Unique<VkSurfaceKHR>	surface		(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
191cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
192cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return tcu::TestStatus::pass("Creating surface succeeded");
193cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
194cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
195f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulostcu::TestStatus createSurfaceCustomAllocatorTest (Context& context, Type wsiType)
196f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos{
197f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	AllocationCallbackRecorder	allocationRecorder	(getSystemAllocator());
198f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	tcu::TestLog&				log					= context.getTestContext().getLog();
199f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
200f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	{
201f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		const InstanceHelper		instHelper	(context, wsiType, allocationRecorder.getCallbacks());
202f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		const NativeObjects			native		(context, instHelper.supportedExtensions, wsiType);
203f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		const Unique<VkSurfaceKHR>	surface		(createSurface(instHelper.vki,
204f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos															   *instHelper.instance,
205f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos															   wsiType,
206f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos															   *native.display,
207f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos															   *native.window,
208f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos															   allocationRecorder.getCallbacks()));
209f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
210f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		if (!validateAndLog(log,
211f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos							allocationRecorder,
212f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos							(1u<<VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)		|
213f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos							(1u<<VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE)))
214f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			return tcu::TestStatus::fail("Detected invalid system allocation callback");
215f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	}
216f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
217f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	if (!validateAndLog(log, allocationRecorder, 0u))
218f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		return tcu::TestStatus::fail("Detected invalid system allocation callback");
219f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
220f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	if (allocationRecorder.getRecordsBegin() == allocationRecorder.getRecordsEnd())
221f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks were not used");
222f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	else
223f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		return tcu::TestStatus::pass("Creating surface succeeded using custom allocator");
224f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos}
225f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
226f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulostcu::TestStatus createSurfaceSimulateOOMTest (Context& context, Type wsiType)
227f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos{
228f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	tcu::TestLog&	log	= context.getTestContext().getLog();
229f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
230f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	for (deUint32 numPassingAllocs = 0; numPassingAllocs <= 1024u; ++numPassingAllocs)
231f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	{
232f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		AllocationCallbackRecorder	allocationRecorder	(getSystemAllocator());
233f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		DeterministicFailAllocator	failingAllocator	(allocationRecorder.getCallbacks(), numPassingAllocs);
234f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		bool						gotOOM				= false;
235f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
236f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		log << TestLog::Message << "Testing with " << numPassingAllocs << " first allocations succeeding" << TestLog::EndMessage;
237f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
238f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		try
239f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		{
240f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			const InstanceHelper		instHelper	(context, wsiType, failingAllocator.getCallbacks());
241f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			const NativeObjects			native		(context, instHelper.supportedExtensions, wsiType);
242f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			const Unique<VkSurfaceKHR>	surface		(createSurface(instHelper.vki,
243f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos																   *instHelper.instance,
244f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos																   wsiType,
245f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos																   *native.display,
246f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos																   *native.window,
247f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos																   failingAllocator.getCallbacks()));
248f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
249f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			if (!validateAndLog(log,
250f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos								allocationRecorder,
251f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos								(1u<<VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)		|
252f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos								(1u<<VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE)))
253f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos				return tcu::TestStatus::fail("Detected invalid system allocation callback");
254f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		}
255f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		catch (const OutOfMemoryError& e)
256f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		{
257f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			log << TestLog::Message << "Got " << e.getError() << TestLog::EndMessage;
258f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			gotOOM = true;
259f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		}
260f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
261f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		if (!validateAndLog(log, allocationRecorder, 0u))
262f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			return tcu::TestStatus::fail("Detected invalid system allocation callback");
263f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
264f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		if (!gotOOM)
265f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		{
266f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			log << TestLog::Message << "Creating surface succeeded!" << TestLog::EndMessage;
267f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
268f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			if (numPassingAllocs == 0)
269f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos				return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks were not used");
270f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos			else
271f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos				return tcu::TestStatus::pass("OOM simulation completed");
272f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos		}
273f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	}
274f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
275f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Creating surface did not succeed, callback limit exceeded");
276f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos}
277f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos
278cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry HaulosdeUint32 getNumQueueFamilies (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
279cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
280cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	deUint32	numFamilies		= 0;
281cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
282cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	vki.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numFamilies, DE_NULL);
283cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
284cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return numFamilies;
285cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
286cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
287cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus querySurfaceSupportTest (Context& context, Type wsiType)
288cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
2898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::TestLog&					log						= context.getTestContext().getLog();
2908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::ResultCollector			results					(log);
2918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper			instHelper				(context, wsiType);
2938f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const NativeObjects				native					(context, instHelper.supportedExtensions, wsiType);
2948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const Unique<VkSurfaceKHR>		surface					(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
2958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkPhysicalDevice>	physicalDevices			= enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
296cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
297cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	// On Android surface must be supported by all devices and queue families
2988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const bool						expectSupportedOnAll	= wsiType == TYPE_ANDROID;
299cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
3008f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
301cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
3028f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const VkPhysicalDevice		physicalDevice		= physicalDevices[deviceNdx];
3038f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const deUint32				numQueueFamilies	= getNumQueueFamilies(instHelper.vki, physicalDevice);
304cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
3058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < numQueueFamilies; ++queueFamilyNdx)
306cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		{
3078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			const VkBool32	isSupported		= getPhysicalDeviceSurfaceSupport(instHelper.vki, physicalDevice, queueFamilyNdx, *surface);
308cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
3098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			log << TestLog::Message << "Device " << deviceNdx << ", queue family " << queueFamilyNdx << ": "
3108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos									<< (isSupported == VK_FALSE ? "NOT " : "") << "supported"
3118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				<< TestLog::EndMessage;
312cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
3138f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			if (expectSupportedOnAll && !isSupported)
3148f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				results.fail("Surface must be supported by all devices and queue families");
315cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		}
316cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
3178f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3188f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
319cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
320cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
321cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosbool isSupportedByAnyQueue (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface)
322cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
323cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	const deUint32	numQueueFamilies	= getNumQueueFamilies(vki, physicalDevice);
324cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
325cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < numQueueFamilies; ++queueFamilyNdx)
326cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
327cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		if (getPhysicalDeviceSurfaceSupport(vki, physicalDevice, queueFamilyNdx, surface) != VK_FALSE)
328cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos			return true;
329cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
330cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
331cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return false;
332cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
333cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
334cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosvoid validateSurfaceCapabilities (tcu::ResultCollector& results, const VkSurfaceCapabilitiesKHR& capabilities)
335cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
336cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.minImageCount > 0,
337cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "minImageCount must be larger than 0");
338cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
339cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.minImageExtent.width > 0 &&
340cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  capabilities.minImageExtent.height > 0,
341cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "minImageExtent dimensions must be larger than 0");
342cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
343cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.maxImageExtent.width > 0 &&
344cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  capabilities.maxImageExtent.height > 0,
345cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "maxImageExtent dimensions must be larger than 0");
346cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
347cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.minImageExtent.width <= capabilities.maxImageExtent.width &&
348cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  capabilities.minImageExtent.height <= capabilities.maxImageExtent.height,
349cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "maxImageExtent must be larger or equal to minImageExtent");
350cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
351cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	if (capabilities.currentExtent.width != SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC ||
352cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		capabilities.currentExtent.height != SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC)
353cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
354cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		results.check(capabilities.currentExtent.width > 0 &&
355cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos					  capabilities.currentExtent.height > 0,
356cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos					  "currentExtent dimensions must be larger than 0");
357cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
358cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		results.check(de::inRange(capabilities.currentExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width) &&
3593d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos					  de::inRange(capabilities.currentExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height),
360cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos					  "currentExtent is not in supported extent limits");
361cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
362cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
363cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.maxImageArrayLayers > 0,
364cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "maxImageArrayLayers must be larger than 0");
365cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
366cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check((capabilities.supportedUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0,
367cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT must be set in supportedUsageFlags");
368cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
369cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.supportedTransforms != 0,
370cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "At least one transform must be supported");
371cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
372cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(dePop32(capabilities.currentTransform) != 0,
373cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "Invalid currentTransform");
374cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
375cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check((capabilities.supportedTransforms & capabilities.currentTransform) != 0,
376cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "currentTransform is not supported by surface");
377cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
378cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	results.check(capabilities.supportedCompositeAlpha != 0,
379cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos				  "At least one alpha mode must be supported");
380cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
381cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
382cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus querySurfaceCapabilitiesTest (Context& context, Type wsiType)
383cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
3848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::TestLog&					log						= context.getTestContext().getLog();
3858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::ResultCollector			results					(log);
386cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
3878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper			instHelper				(context, wsiType);
3888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const NativeObjects				native					(context, instHelper.supportedExtensions, wsiType);
3898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const Unique<VkSurfaceKHR>		surface					(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
3908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkPhysicalDevice>	physicalDevices			= enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
3918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
393cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
3948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface))
3958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		{
3968f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			const VkSurfaceCapabilitiesKHR	capabilities	= getPhysicalDeviceSurfaceCapabilities(instHelper.vki,
3978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																								   physicalDevices[deviceNdx],
3988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																								   *surface);
3998f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4008f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			log << TestLog::Message << "Device " << deviceNdx << ": " << capabilities << TestLog::EndMessage;
4018f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4028f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			validateSurfaceCapabilities(results, capabilities);
4038f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		}
4048f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		// else skip query as surface is not supported by the device
4058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
406cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
4078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
4088f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
4098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosvoid validateSurfaceFormats (tcu::ResultCollector& results, Type wsiType, const vector<VkSurfaceFormatKHR>& formats)
4118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
4128f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const VkSurfaceFormatKHR*	requiredFormats		= DE_NULL;
4138f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	size_t						numRequiredFormats	= 0;
4148f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4158f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	if (wsiType == TYPE_ANDROID)
4168f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
4178f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		static const VkSurfaceFormatKHR s_androidFormats[] =
418cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		{
4198f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			{ VK_FORMAT_R8G8B8A8_UNORM,			VK_COLORSPACE_SRGB_NONLINEAR_KHR	},
4208f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			{ VK_FORMAT_R8G8B8A8_SRGB,			VK_COLORSPACE_SRGB_NONLINEAR_KHR	},
4218f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			{ VK_FORMAT_R5G6B5_UNORM_PACK16,	VK_COLORSPACE_SRGB_NONLINEAR_KHR	}
4228f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		};
423cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
4248f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		requiredFormats		= &s_androidFormats[0];
4258f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		numRequiredFormats	= DE_LENGTH_OF_ARRAY(s_androidFormats);
4268f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
427cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
4288f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (size_t ndx = 0; ndx < numRequiredFormats; ++ndx)
4298f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
4308f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const VkSurfaceFormatKHR&	requiredFormat	= requiredFormats[ndx];
431cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
4328f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		if (!de::contains(formats.begin(), formats.end(), requiredFormat))
4338f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			results.fail(de::toString(requiredFormat) + " not supported");
4348f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
4358f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
4368f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4378f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostcu::TestStatus querySurfaceFormatsTest (Context& context, Type wsiType)
4388f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
4398f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::TestLog&					log				= context.getTestContext().getLog();
4408f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::ResultCollector			results			(log);
4418f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4428f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper			instHelper		(context, wsiType);
4438f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const NativeObjects				native			(context, instHelper.supportedExtensions, wsiType);
4448f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const Unique<VkSurfaceKHR>		surface			(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
4458f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkPhysicalDevice>	physicalDevices	= enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
4468f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4478f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
4488f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
4498f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface))
4508f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		{
4518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			const vector<VkSurfaceFormatKHR>	formats	= getPhysicalDeviceSurfaceFormats(instHelper.vki,
4528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																						  physicalDevices[deviceNdx],
4538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																						  *surface);
4548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			log << TestLog::Message << "Device " << deviceNdx << ": " << tcu::formatArray(formats.begin(), formats.end()) << TestLog::EndMessage;
456cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
4578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			validateSurfaceFormats(results, wsiType, formats);
458cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		}
4598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		// else skip query as surface is not supported by the device
460cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
4618f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4628f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
4638f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
4648f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4658f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosvoid validateSurfacePresentModes (tcu::ResultCollector& results, Type wsiType, const vector<VkPresentModeKHR>& modes)
4668f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
4678f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	results.check(de::contains(modes.begin(), modes.end(), VK_PRESENT_MODE_FIFO_KHR),
4688f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				  "VK_PRESENT_MODE_FIFO_KHR is not supported");
4698f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4708f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	if (wsiType == TYPE_ANDROID)
4718f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		results.check(de::contains(modes.begin(), modes.end(), VK_PRESENT_MODE_MAILBOX_KHR),
4728f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos					  "VK_PRESENT_MODE_MAILBOX_KHR is not supported");
4738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
4748f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostcu::TestStatus querySurfacePresentModesTest (Context& context, Type wsiType)
4768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
4778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::TestLog&					log				= context.getTestContext().getLog();
4788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	tcu::ResultCollector			results			(log);
4798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper			instHelper		(context, wsiType);
4818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const NativeObjects				native			(context, instHelper.supportedExtensions, wsiType);
4828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const Unique<VkSurfaceKHR>		surface			(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
4838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkPhysicalDevice>	physicalDevices	= enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
4848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
486cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
4878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface))
4888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		{
4898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			const vector<VkPresentModeKHR>	modes	= getPhysicalDeviceSurfacePresentModes(instHelper.vki, physicalDevices[deviceNdx], *surface);
4908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			log << TestLog::Message << "Device " << deviceNdx << ": " << tcu::formatArray(modes.begin(), modes.end()) << TestLog::EndMessage;
4928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4938f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			validateSurfacePresentModes(results, wsiType, modes);
4948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		}
4958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		// else skip query as surface is not supported by the device
496cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
4978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
4988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
499cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
500cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
501cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus createSurfaceInitialSizeTest (Context& context, Type wsiType)
502cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
503cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	tcu::TestLog&					log				= context.getTestContext().getLog();
504cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	tcu::ResultCollector			results			(log);
5058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5068f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper			instHelper		(context, wsiType);
5078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5088f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const UniquePtr<Display>		nativeDisplay	(createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(),
5098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																   instHelper.supportedExtensions,
5108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																   wsiType));
5118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5128f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkPhysicalDevice>	physicalDevices	= enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
513cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	const UVec2						sizes[]			=
514cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
515cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		UVec2(64, 64),
516cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		UVec2(124, 119),
517cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		UVec2(256, 512)
518cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	};
519cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
520cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	DE_ASSERT(getPlatformProperties(wsiType).features & PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE);
521cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
5228f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes); ++sizeNdx)
523cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
5248f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const UVec2&				testSize		= sizes[sizeNdx];
5258f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const UniquePtr<Window>		nativeWindow	(createWindow(*nativeDisplay, tcu::just(testSize)));
5268f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const Unique<VkSurfaceKHR>	surface			(createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
527cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
5288f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
529cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		{
5308f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface))
531cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos			{
5328f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				const VkSurfaceCapabilitiesKHR	capabilities	= getPhysicalDeviceSurfaceCapabilities(instHelper.vki, physicalDevices[deviceNdx], *surface);
5338f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5348f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				// \note Assumes that surface size is NOT set by swapchain if initial window size is honored by platform
5358f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				results.check(capabilities.currentExtent.width == testSize.x() &&
5368f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos								capabilities.currentExtent.height == testSize.y(),
5378f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos								"currentExtent " + de::toString(capabilities.currentExtent) + " doesn't match requested size " + de::toString(testSize));
538cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos			}
539cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		}
540cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
541cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
542cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
543cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
544cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
545cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus resizeSurfaceTest (Context& context, Type wsiType)
546cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
547cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	tcu::TestLog&					log				= context.getTestContext().getLog();
548cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	tcu::ResultCollector			results			(log);
5498f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5508f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const InstanceHelper			instHelper		(context, wsiType);
5518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const UniquePtr<Display>		nativeDisplay	(createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(),
5538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																   instHelper.supportedExtensions,
5548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																   wsiType));
5558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	UniquePtr<Window>				nativeWindow	(createWindow(*nativeDisplay, tcu::nothing<UVec2>()));
5568f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
5578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const vector<VkPhysicalDevice>	physicalDevices	= enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
5588f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	const Unique<VkSurfaceKHR>		surface			(createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
5598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
560cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	const UVec2						sizes[]			=
561cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
562cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		UVec2(64, 64),
563cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		UVec2(124, 119),
564cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		UVec2(256, 512)
565cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	};
566cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
567cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	DE_ASSERT(getPlatformProperties(wsiType).features & PlatformProperties::FEATURE_RESIZE_WINDOW);
568cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
5698f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes); ++sizeNdx)
570cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	{
5718f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		const UVec2		testSize	= sizes[sizeNdx];
572cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
5738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		try
574cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		{
5758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			nativeWindow->resize(testSize);
5768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		}
5778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		catch (const tcu::Exception& e)
5788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		{
5798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			// Make sure all exception types result in a test failure
5808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			results.fail(e.getMessage());
5818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		}
582cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
5838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
5848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		{
5858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface))
586cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos			{
5878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				const VkSurfaceCapabilitiesKHR	capabilities	= getPhysicalDeviceSurfaceCapabilities(instHelper.vki, physicalDevices[deviceNdx], *surface);
588cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
5898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				// \note Assumes that surface size is NOT set by swapchain if initial window size is honored by platform
5908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos				results.check(capabilities.currentExtent.width == testSize.x() &&
5918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos								capabilities.currentExtent.height == testSize.y(),
5928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos								"currentExtent " + de::toString(capabilities.currentExtent) + " doesn't match requested size " + de::toString(testSize));
593cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos			}
594cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		}
595cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	}
596cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
597cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
598cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
599cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
600cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} // anonymous
601cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
602cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosvoid createSurfaceTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType)
603cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
604cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	const PlatformProperties&	platformProperties	= getPlatformProperties(wsiType);
605cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
606f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "create",					"Create surface",						createSurfaceTest,					wsiType);
607f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "create_custom_allocator",	"Create surface with custom allocator",	createSurfaceCustomAllocatorTest,	wsiType);
608f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "create_simulate_oom",		"Create surface with simulating OOM",	createSurfaceSimulateOOMTest,		wsiType);
609f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "query_support",				"Query surface support",				querySurfaceSupportTest,			wsiType);
610f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "query_capabilities",		"Query surface capabilities",			querySurfaceCapabilitiesTest,		wsiType);
611f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "query_formats",				"Query surface formats",				querySurfaceFormatsTest,			wsiType);
612f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos	addFunctionCase(testGroup, "query_present_modes",		"Query surface present modes",			querySurfacePresentModesTest,		wsiType);
613cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
614cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	if ((platformProperties.features & PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE) != 0)
615cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		addFunctionCase(testGroup, "initial_size",	"Create surface with initial window size set",	createSurfaceInitialSizeTest,	wsiType);
616cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
617cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	if ((platformProperties.features & PlatformProperties::FEATURE_RESIZE_WINDOW) != 0)
618cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos		addFunctionCase(testGroup, "resize",		"Resize window and surface",					resizeSurfaceTest,				wsiType);
619cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
620cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
621cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} // wsi
622cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} // vkt
623