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