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