vkWsiUtil.cpp revision 8f00a90c1c60fe87327de7670ca817c5a42957fa
112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos/*-------------------------------------------------------------------------
212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * Vulkan CTS Framework
312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * --------------------
412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * Copyright (c) 2016 Google Inc.
612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * Permission is hereby granted, free of charge, to any person obtaining a
812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * copy of this software and/or associated documentation files (the
912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * "Materials"), to deal in the Materials without restriction, including
1012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * without limitation the rights to use, copy, modify, merge, publish,
1112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * distribute, sublicense, and/or sell copies of the Materials, and to
1212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * permit persons to whom the Materials are furnished to do so, subject to
1312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * the following conditions:
1412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
1512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * The above copyright notice(s) and this permission notice shall be
1612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * included in all copies or substantial portions of the Materials.
1712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
1812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
2212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
2512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
2612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *//*!
2712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * \file
2812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * \brief Windowing System Integration (WSI) Utilities.
2912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *//*--------------------------------------------------------------------*/
3012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
3112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "vkWsiUtil.hpp"
3212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "deArrayUtil.hpp"
3312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "deMemory.h"
3412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
3512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include <limits>
3612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
3712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosnamespace vk
3812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
3912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosnamespace wsi
4012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
4112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
4212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos//! Get canonical WSI name that should be used for example in test case and group names.
4312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosconst char* getName (Type wsiType)
4412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
4512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	static const char* const s_names[] =
4612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
4712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"xlib",
4812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"xcb",
4912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"wayland",
5012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"mir",
5112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"android",
5212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"win32",
5312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	};
5412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return de::getSizedArrayElement<TYPE_LAST>(s_names, wsiType);
5512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
5612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
5712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosconst char* getExtensionName (Type wsiType)
5812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
5912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	static const char* const s_extNames[] =
6012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
6112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_xlib_surface",
6212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_xcb_surface",
6312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_wayland_surface",
6412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_mir_surface",
6512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_android_surface",
6612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_win32_surface",
6712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	};
6812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return de::getSizedArrayElement<TYPE_LAST>(s_extNames, wsiType);
6912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
7012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
7112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosconst PlatformProperties& getPlatformProperties (Type wsiType)
7212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
7312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	// \note These are declared here (rather than queried through vk::Platform for example)
7412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	//		 on purpose. The behavior of a platform is partly defined by the platform spec,
7512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	//		 and partly by WSI extensions, and platform ports should not need to override
7612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	//		 that definition.
7712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
7812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	const deUint32	noDisplayLimit	= std::numeric_limits<deUint32>::max();
7912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	const deUint32	noWindowLimit	= std::numeric_limits<deUint32>::max();
8012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
8112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	static const PlatformProperties s_properties[] =
8212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
8312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_xlib_surface
8412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
8512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
8612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
8712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
8812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
8912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
9012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_xcb_surface
9112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
9212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
9312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
9412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
9512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
9612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
9712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_wayland_surface
9812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
998f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			0u,
10012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE,
10112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
10212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
10312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
10412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_mir_surface
10512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
10612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
10712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE,
10812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
10912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
11012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
11112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_android_surface
11212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
11312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE,
11412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
11512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			1u,
11612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			1u, // Only one window available
11712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
11812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_win32_surface
11912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
12012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
12112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
12212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
12312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
12412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
12512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	};
12612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
12712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return de::getSizedArrayElement<TYPE_LAST>(s_properties, wsiType);
12812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
12912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
13012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosVkResult createSurface (const InstanceInterface&		vki,
13112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						VkInstance						instance,
13212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						Type							wsiType,
13312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						const Display&					nativeDisplay,
13412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						const Window&					nativeWindow,
13512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						const VkAllocationCallbacks*	pAllocator,
13612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						VkSurfaceKHR*					pSurface)
13712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
13812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	// Update this function if you add more WSI implementations
13912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	DE_STATIC_ASSERT(TYPE_LAST == 6);
14012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
14112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	switch (wsiType)
14212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
14312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_XLIB:
14412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
14512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XlibDisplayInterface&			xlibDisplay		= dynamic_cast<const XlibDisplayInterface&>(nativeDisplay);
14612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XlibWindowInterface&			xlibWindow		= dynamic_cast<const XlibWindowInterface&>(nativeWindow);
14712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkXlibSurfaceCreateInfoKHR	createInfo		=
14812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
14912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
15012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
15112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkXlibSurfaceCreateFlagsKHR)0,
15212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xlibDisplay.getNative(),
15312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xlibWindow.getNative()
15412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
15512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
15612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createXlibSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
15712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
15812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
15912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_XCB:
16012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
16112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XcbDisplayInterface&			xcbDisplay		= dynamic_cast<const XcbDisplayInterface&>(nativeDisplay);
16212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XcbWindowInterface&			xcbWindow		= dynamic_cast<const XcbWindowInterface&>(nativeWindow);
16312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkXcbSurfaceCreateInfoKHR		createInfo		=
16412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
16512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
16612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
16712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkXcbSurfaceCreateFlagsKHR)0,
16812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xcbDisplay.getNative(),
16912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xcbWindow.getNative()
17012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
17112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
17212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createXcbSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
17312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
17412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
17512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_WAYLAND:
17612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
17712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const WaylandDisplayInterface&		waylandDisplay	= dynamic_cast<const WaylandDisplayInterface&>(nativeDisplay);
17812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const WaylandWindowInterface&		waylandWindow	= dynamic_cast<const WaylandWindowInterface&>(nativeWindow);
17912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkWaylandSurfaceCreateInfoKHR	createInfo		=
18012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
18112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,
18212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
18312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkWaylandSurfaceCreateFlagsKHR)0,
18412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				waylandDisplay.getNative(),
18512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				waylandWindow.getNative()
18612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
18712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
18812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createWaylandSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
18912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
19012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
19112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_MIR:
19212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
19312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const MirDisplayInterface&			mirDisplay		= dynamic_cast<const MirDisplayInterface&>(nativeDisplay);
19412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const MirWindowInterface&			mirWindow		= dynamic_cast<const MirWindowInterface&>(nativeWindow);
19512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkMirSurfaceCreateInfoKHR		createInfo		=
19612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
19712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR,
19812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
19912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkXcbSurfaceCreateFlagsKHR)0,
20012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				mirDisplay.getNative(),
20112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				mirWindow.getNative()
20212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
20312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
20412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createMirSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
20512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
20612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
20712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_ANDROID:
20812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
20912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const AndroidWindowInterface&		androidWindow	= dynamic_cast<const AndroidWindowInterface&>(nativeWindow);
21012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkAndroidSurfaceCreateInfoKHR	createInfo		=
21112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
21212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,
21312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
21412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkAndroidSurfaceCreateFlagsKHR)0,
21512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				androidWindow.getNative()
21612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
21712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
21812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createAndroidSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
21912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
22012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
22112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_WIN32:
22212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
22312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const Win32DisplayInterface&		win32Display	= dynamic_cast<const Win32DisplayInterface&>(nativeDisplay);
22412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const Win32WindowInterface&			win32Window		= dynamic_cast<const Win32WindowInterface&>(nativeWindow);
22512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkWin32SurfaceCreateInfoKHR	createInfo		=
22612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
22712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
22812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
22912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkWin32SurfaceCreateFlagsKHR)0,
23012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				win32Display.getNative(),
23112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				win32Window.getNative()
23212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
23312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
23412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createWin32SurfaceKHR(instance, &createInfo, pAllocator, pSurface);
23512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
23612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
23712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		default:
23812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			DE_FATAL("Unknown WSI type");
23912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return VK_ERROR_SURFACE_LOST_KHR;
24012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	}
24112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
24212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
24312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosMove<VkSurfaceKHR> createSurface (const InstanceInterface&		vki,
24412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  VkInstance					instance,
24512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  Type							wsiType,
24612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  const Display&				nativeDisplay,
24712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  const Window&					nativeWindow,
24812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  const VkAllocationCallbacks*	pAllocator)
24912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
25012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VkSurfaceKHR object = 0;
25112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VK_CHECK(createSurface(vki, instance, wsiType, nativeDisplay, nativeWindow, pAllocator, &object));
25212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return Move<VkSurfaceKHR>(check<VkSurfaceKHR>(object), Deleter<VkSurfaceKHR>(vki, instance, pAllocator));
25312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
25412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
255cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry HaulosVkBool32 getPhysicalDeviceSurfaceSupport (const InstanceInterface&	vki,
256cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos										  VkPhysicalDevice			physicalDevice,
257cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos										  deUint32					queueFamilyIndex,
258cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos										  VkSurfaceKHR				surface)
259cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
260cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	VkBool32 result = 0;
261cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
262cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, &result));
263cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
264cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return result;
265cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
266cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
26712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosVkSurfaceCapabilitiesKHR getPhysicalDeviceSurfaceCapabilities (const InstanceInterface&		vki,
26812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos															   VkPhysicalDevice				physicalDevice,
26912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos															   VkSurfaceKHR					surface)
27012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
27112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VkSurfaceCapabilitiesKHR capabilities;
27212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
27312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	deMemset(&capabilities, 0, sizeof(capabilities));
27412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
27512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &capabilities));
27612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
27712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return capabilities;
27812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
27912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
2808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstd::vector<VkSurfaceFormatKHR> getPhysicalDeviceSurfaceFormats (const InstanceInterface&		vki,
2818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																 VkPhysicalDevice				physicalDevice,
2828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																 VkSurfaceKHR					surface)
2838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
2848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	deUint32	numFormats	= 0;
2858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2868f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &numFormats, DE_NULL));
2878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	if (numFormats > 0)
2898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
2908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		std::vector<VkSurfaceFormatKHR>	formats	(numFormats);
2918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		VK_CHECK(vki.getPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &numFormats, &formats[0]));
2938f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return formats;
2958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
2968f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	else
2978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return std::vector<VkSurfaceFormatKHR>();
2988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
2998f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3008f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstd::vector<VkPresentModeKHR> getPhysicalDeviceSurfacePresentModes (const InstanceInterface&		vki,
3018f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																	VkPhysicalDevice				physicalDevice,
3028f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																	VkSurfaceKHR					surface)
3038f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
3048f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	deUint32	numModes	= 0;
3058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3068f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &numModes, DE_NULL));
3078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3088f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	if (numModes > 0)
3098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
3108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		std::vector<VkPresentModeKHR>	modes	(numModes);
3118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3128f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		VK_CHECK(vki.getPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &numModes, &modes[0]));
3138f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3148f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return modes;
3158f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
3168f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	else
3178f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return std::vector<VkPresentModeKHR>();
3188f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
3198f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
32012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos} // wsi
32112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos} // vk
322