112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos/*-------------------------------------------------------------------------
212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * Vulkan CTS Framework
312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * --------------------
412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * Copyright (c) 2016 Google Inc.
612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry 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
1012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry 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.
1812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *
1912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *//*!
2012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * \file
2112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos * \brief Windowing System Integration (WSI) Utilities.
2212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos *//*--------------------------------------------------------------------*/
2312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
2412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "vkWsiUtil.hpp"
2512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "deArrayUtil.hpp"
2612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "deMemory.h"
2712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
2812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include <limits>
2912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
3012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosnamespace vk
3112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
3212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosnamespace wsi
3312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
3412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
3512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos//! Get canonical WSI name that should be used for example in test case and group names.
3612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosconst char* getName (Type wsiType)
3712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
3812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	static const char* const s_names[] =
3912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
4012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"xlib",
4112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"xcb",
4212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"wayland",
4312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"mir",
4412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"android",
4512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"win32",
4612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	};
4712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return de::getSizedArrayElement<TYPE_LAST>(s_names, wsiType);
4812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
4912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
5012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosconst char* getExtensionName (Type wsiType)
5112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
5212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	static const char* const s_extNames[] =
5312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
5412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_xlib_surface",
5512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_xcb_surface",
5612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_wayland_surface",
5712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_mir_surface",
5812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_android_surface",
5912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		"VK_KHR_win32_surface",
6012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	};
6112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return de::getSizedArrayElement<TYPE_LAST>(s_extNames, wsiType);
6212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
6312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
6412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosconst PlatformProperties& getPlatformProperties (Type wsiType)
6512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
6612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	// \note These are declared here (rather than queried through vk::Platform for example)
6712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	//		 on purpose. The behavior of a platform is partly defined by the platform spec,
6812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	//		 and partly by WSI extensions, and platform ports should not need to override
6912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	//		 that definition.
7012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
7112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	const deUint32	noDisplayLimit	= std::numeric_limits<deUint32>::max();
7212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	const deUint32	noWindowLimit	= std::numeric_limits<deUint32>::max();
7312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
7412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	static const PlatformProperties s_properties[] =
7512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
7612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_xlib_surface
7712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
7812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
7912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
8012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
8112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
8212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
8312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_xcb_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_wayland_surface
9112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos			0u,
9312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE,
9412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
9512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
9612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
9712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_mir_surface
9812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
9912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
10012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE,
10112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
10212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
10312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
10412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_android_surface
10512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
10612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE,
10788ae848c85a938be0cb7c82a879bb66a495d0c7bPyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE,
10812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			1u,
10912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			1u, // Only one window available
11012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
11112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		// VK_KHR_win32_surface
11212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
11312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
11412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
11512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noDisplayLimit,
11612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			noWindowLimit,
11712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		},
11812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	};
11912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
12012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return de::getSizedArrayElement<TYPE_LAST>(s_properties, wsiType);
12112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
12212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
12312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosVkResult createSurface (const InstanceInterface&		vki,
12412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						VkInstance						instance,
12512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						Type							wsiType,
12612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						const Display&					nativeDisplay,
12712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						const Window&					nativeWindow,
12812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						const VkAllocationCallbacks*	pAllocator,
12912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos						VkSurfaceKHR*					pSurface)
13012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
13112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	// Update this function if you add more WSI implementations
13212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	DE_STATIC_ASSERT(TYPE_LAST == 6);
13312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
13412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	switch (wsiType)
13512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
13612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_XLIB:
13712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
13812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XlibDisplayInterface&			xlibDisplay		= dynamic_cast<const XlibDisplayInterface&>(nativeDisplay);
13912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XlibWindowInterface&			xlibWindow		= dynamic_cast<const XlibWindowInterface&>(nativeWindow);
14012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkXlibSurfaceCreateInfoKHR	createInfo		=
14112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
14212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
14312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
14412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkXlibSurfaceCreateFlagsKHR)0,
14512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xlibDisplay.getNative(),
14612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xlibWindow.getNative()
14712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
14812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
14912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createXlibSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
15012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
15112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
15212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_XCB:
15312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
15412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XcbDisplayInterface&			xcbDisplay		= dynamic_cast<const XcbDisplayInterface&>(nativeDisplay);
15512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const XcbWindowInterface&			xcbWindow		= dynamic_cast<const XcbWindowInterface&>(nativeWindow);
15612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkXcbSurfaceCreateInfoKHR		createInfo		=
15712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
15812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
15912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
16012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkXcbSurfaceCreateFlagsKHR)0,
16112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xcbDisplay.getNative(),
16212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				xcbWindow.getNative()
16312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
16412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
16512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createXcbSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
16612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
16712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
16812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_WAYLAND:
16912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
17012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const WaylandDisplayInterface&		waylandDisplay	= dynamic_cast<const WaylandDisplayInterface&>(nativeDisplay);
17112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const WaylandWindowInterface&		waylandWindow	= dynamic_cast<const WaylandWindowInterface&>(nativeWindow);
17212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkWaylandSurfaceCreateInfoKHR	createInfo		=
17312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
17412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,
17512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
17612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkWaylandSurfaceCreateFlagsKHR)0,
17712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				waylandDisplay.getNative(),
17812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				waylandWindow.getNative()
17912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
18012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
18112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createWaylandSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
18212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
18312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
18412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_MIR:
18512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
18612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const MirDisplayInterface&			mirDisplay		= dynamic_cast<const MirDisplayInterface&>(nativeDisplay);
18712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const MirWindowInterface&			mirWindow		= dynamic_cast<const MirWindowInterface&>(nativeWindow);
18812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkMirSurfaceCreateInfoKHR		createInfo		=
18912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
19012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR,
19112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
19212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkXcbSurfaceCreateFlagsKHR)0,
19312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				mirDisplay.getNative(),
19412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				mirWindow.getNative()
19512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
19612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
19712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createMirSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
19812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
19912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
20012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_ANDROID:
20112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
20212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const AndroidWindowInterface&		androidWindow	= dynamic_cast<const AndroidWindowInterface&>(nativeWindow);
20312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkAndroidSurfaceCreateInfoKHR	createInfo		=
20412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
20512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,
20612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
20712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkAndroidSurfaceCreateFlagsKHR)0,
20812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				androidWindow.getNative()
20912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
21012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
21112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createAndroidSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
21212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
21312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
21412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		case TYPE_WIN32:
21512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
21612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const Win32DisplayInterface&		win32Display	= dynamic_cast<const Win32DisplayInterface&>(nativeDisplay);
21712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const Win32WindowInterface&			win32Window		= dynamic_cast<const Win32WindowInterface&>(nativeWindow);
21812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			const VkWin32SurfaceCreateInfoKHR	createInfo		=
21912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
22012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
22112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				DE_NULL,
22212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				(VkWin32SurfaceCreateFlagsKHR)0,
22312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				win32Display.getNative(),
22412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				win32Window.getNative()
22512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			};
22612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
22712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return vki.createWin32SurfaceKHR(instance, &createInfo, pAllocator, pSurface);
22812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
22912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
23012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		default:
23112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			DE_FATAL("Unknown WSI type");
23212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			return VK_ERROR_SURFACE_LOST_KHR;
23312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	}
23412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
23512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
23612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosMove<VkSurfaceKHR> createSurface (const InstanceInterface&		vki,
23712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  VkInstance					instance,
23812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  Type							wsiType,
23912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  const Display&				nativeDisplay,
24012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  const Window&					nativeWindow,
24112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos								  const VkAllocationCallbacks*	pAllocator)
24212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
24312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VkSurfaceKHR object = 0;
24412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VK_CHECK(createSurface(vki, instance, wsiType, nativeDisplay, nativeWindow, pAllocator, &object));
24512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return Move<VkSurfaceKHR>(check<VkSurfaceKHR>(object), Deleter<VkSurfaceKHR>(vki, instance, pAllocator));
24612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
24712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
248cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry HaulosVkBool32 getPhysicalDeviceSurfaceSupport (const InstanceInterface&	vki,
249cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos										  VkPhysicalDevice			physicalDevice,
250cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos										  deUint32					queueFamilyIndex,
251cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos										  VkSurfaceKHR				surface)
252cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{
253cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	VkBool32 result = 0;
254cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
255cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, &result));
256cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
257cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos	return result;
258cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}
259cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos
26012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosVkSurfaceCapabilitiesKHR getPhysicalDeviceSurfaceCapabilities (const InstanceInterface&		vki,
26112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos															   VkPhysicalDevice				physicalDevice,
26212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos															   VkSurfaceKHR					surface)
26312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
26412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VkSurfaceCapabilitiesKHR capabilities;
26512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
26612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	deMemset(&capabilities, 0, sizeof(capabilities));
26712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
26812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &capabilities));
26912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
27012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	return capabilities;
27112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
27212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
2738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstd::vector<VkSurfaceFormatKHR> getPhysicalDeviceSurfaceFormats (const InstanceInterface&		vki,
2748f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																 VkPhysicalDevice				physicalDevice,
2758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																 VkSurfaceKHR					surface)
2768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
2778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	deUint32	numFormats	= 0;
2788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &numFormats, DE_NULL));
2808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	if (numFormats > 0)
2828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
2838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		std::vector<VkSurfaceFormatKHR>	formats	(numFormats);
2848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		VK_CHECK(vki.getPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &numFormats, &formats[0]));
2868f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return formats;
2888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
2898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	else
2908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return std::vector<VkSurfaceFormatKHR>();
2918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
2928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2938f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstd::vector<VkPresentModeKHR> getPhysicalDeviceSurfacePresentModes (const InstanceInterface&		vki,
2948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																	VkPhysicalDevice				physicalDevice,
2958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos																	VkSurfaceKHR					surface)
2968f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{
2978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	deUint32	numModes	= 0;
2988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
2998f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	VK_CHECK(vki.getPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &numModes, DE_NULL));
3008f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3018f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	if (numModes > 0)
3028f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	{
3038f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		std::vector<VkPresentModeKHR>	modes	(numModes);
3048f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		VK_CHECK(vki.getPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &numModes, &modes[0]));
3068f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return modes;
3088f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	}
3098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos	else
3108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos		return std::vector<VkPresentModeKHR>();
3118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}
3128f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos
3138e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulosstd::vector<VkImage> getSwapchainImages (const DeviceInterface&			vkd,
314653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos										 VkDevice						device,
315653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos										 VkSwapchainKHR					swapchain)
3168e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos{
3178e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos	deUint32	numImages	= 0;
3188e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos
3198e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos	VK_CHECK(vkd.getSwapchainImagesKHR(device, swapchain, &numImages, DE_NULL));
3208e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos
3218e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos	if (numImages > 0)
3228e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos	{
3238e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos		std::vector<VkImage>	images	(numImages);
3248e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos
3258e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos		VK_CHECK(vkd.getSwapchainImagesKHR(device, swapchain, &numImages, &images[0]));
3268e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos
3278e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos		return images;
3288e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos	}
3298e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos	else
3308e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos		return std::vector<VkImage>();
3318e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos}
3328e1cce4ba720300676a239cb264795c9ea301cbcPyry Haulos
33312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos} // wsi
33412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos} // vk
335