1 /*-------------------------------------------------------------------------
5 * Copyright (c) 2016 Google Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Windowing System Integration (WSI) Utilities.
22 *//*--------------------------------------------------------------------*/
24 #include "vkWsiUtil.hpp"
25 #include "deArrayUtil.hpp"
35 //! Get canonical WSI name that should be used for example in test case and group names.
36 const char* getName (Type wsiType)
38 static const char* const s_names[] =
47 return de::getSizedArrayElement<TYPE_LAST>(s_names, wsiType);
50 const char* getExtensionName (Type wsiType)
52 static const char* const s_extNames[] =
54 "VK_KHR_xlib_surface",
56 "VK_KHR_wayland_surface",
58 "VK_KHR_android_surface",
59 "VK_KHR_win32_surface",
61 return de::getSizedArrayElement<TYPE_LAST>(s_extNames, wsiType);
64 const PlatformProperties& getPlatformProperties (Type wsiType)
66 // \note These are declared here (rather than queried through vk::Platform for example)
67 // on purpose. The behavior of a platform is partly defined by the platform spec,
68 // and partly by WSI extensions, and platform ports should not need to override
71 const deUint32 noDisplayLimit = std::numeric_limits<deUint32>::max();
72 const deUint32 noWindowLimit = std::numeric_limits<deUint32>::max();
74 static const PlatformProperties s_properties[] =
76 // VK_KHR_xlib_surface
78 PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
79 PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
85 PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
86 PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
90 // VK_KHR_wayland_surface
93 PlatformProperties::SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE,
99 PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
100 PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE,
104 // VK_KHR_android_surface
106 PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE,
107 PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE,
109 1u, // Only one window available
111 // VK_KHR_win32_surface
113 PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
114 PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
120 return de::getSizedArrayElement<TYPE_LAST>(s_properties, wsiType);
123 VkResult createSurface (const InstanceInterface& vki,
126 const Display& nativeDisplay,
127 const Window& nativeWindow,
128 const VkAllocationCallbacks* pAllocator,
129 VkSurfaceKHR* pSurface)
131 // Update this function if you add more WSI implementations
132 DE_STATIC_ASSERT(TYPE_LAST == 6);
138 const XlibDisplayInterface& xlibDisplay = dynamic_cast<const XlibDisplayInterface&>(nativeDisplay);
139 const XlibWindowInterface& xlibWindow = dynamic_cast<const XlibWindowInterface&>(nativeWindow);
140 const VkXlibSurfaceCreateInfoKHR createInfo =
142 VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
144 (VkXlibSurfaceCreateFlagsKHR)0,
145 xlibDisplay.getNative(),
146 xlibWindow.getNative()
149 return vki.createXlibSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
154 const XcbDisplayInterface& xcbDisplay = dynamic_cast<const XcbDisplayInterface&>(nativeDisplay);
155 const XcbWindowInterface& xcbWindow = dynamic_cast<const XcbWindowInterface&>(nativeWindow);
156 const VkXcbSurfaceCreateInfoKHR createInfo =
158 VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
160 (VkXcbSurfaceCreateFlagsKHR)0,
161 xcbDisplay.getNative(),
162 xcbWindow.getNative()
165 return vki.createXcbSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
170 const WaylandDisplayInterface& waylandDisplay = dynamic_cast<const WaylandDisplayInterface&>(nativeDisplay);
171 const WaylandWindowInterface& waylandWindow = dynamic_cast<const WaylandWindowInterface&>(nativeWindow);
172 const VkWaylandSurfaceCreateInfoKHR createInfo =
174 VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,
176 (VkWaylandSurfaceCreateFlagsKHR)0,
177 waylandDisplay.getNative(),
178 waylandWindow.getNative()
181 return vki.createWaylandSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
186 const MirDisplayInterface& mirDisplay = dynamic_cast<const MirDisplayInterface&>(nativeDisplay);
187 const MirWindowInterface& mirWindow = dynamic_cast<const MirWindowInterface&>(nativeWindow);
188 const VkMirSurfaceCreateInfoKHR createInfo =
190 VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR,
192 (VkXcbSurfaceCreateFlagsKHR)0,
193 mirDisplay.getNative(),
194 mirWindow.getNative()
197 return vki.createMirSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
202 const AndroidWindowInterface& androidWindow = dynamic_cast<const AndroidWindowInterface&>(nativeWindow);
203 const VkAndroidSurfaceCreateInfoKHR createInfo =
205 VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,
207 (VkAndroidSurfaceCreateFlagsKHR)0,
208 androidWindow.getNative()
211 return vki.createAndroidSurfaceKHR(instance, &createInfo, pAllocator, pSurface);
216 const Win32DisplayInterface& win32Display = dynamic_cast<const Win32DisplayInterface&>(nativeDisplay);
217 const Win32WindowInterface& win32Window = dynamic_cast<const Win32WindowInterface&>(nativeWindow);
218 const VkWin32SurfaceCreateInfoKHR createInfo =
220 VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
222 (VkWin32SurfaceCreateFlagsKHR)0,
223 win32Display.getNative(),
224 win32Window.getNative()
227 return vki.createWin32SurfaceKHR(instance, &createInfo, pAllocator, pSurface);
231 DE_FATAL("Unknown WSI type");
232 return VK_ERROR_SURFACE_LOST_KHR;
236 Move<VkSurfaceKHR> createSurface (const InstanceInterface& vki,
239 const Display& nativeDisplay,
240 const Window& nativeWindow,
241 const VkAllocationCallbacks* pAllocator)
243 VkSurfaceKHR object = 0;
244 VK_CHECK(createSurface(vki, instance, wsiType, nativeDisplay, nativeWindow, pAllocator, &object));
245 return Move<VkSurfaceKHR>(check<VkSurfaceKHR>(object), Deleter<VkSurfaceKHR>(vki, instance, pAllocator));
248 VkBool32 getPhysicalDeviceSurfaceSupport (const InstanceInterface& vki,
249 VkPhysicalDevice physicalDevice,
250 deUint32 queueFamilyIndex,
251 VkSurfaceKHR surface)
255 VK_CHECK(vki.getPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, &result));
260 VkSurfaceCapabilitiesKHR getPhysicalDeviceSurfaceCapabilities (const InstanceInterface& vki,
261 VkPhysicalDevice physicalDevice,
262 VkSurfaceKHR surface)
264 VkSurfaceCapabilitiesKHR capabilities;
266 deMemset(&capabilities, 0, sizeof(capabilities));
268 VK_CHECK(vki.getPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &capabilities));
273 std::vector<VkSurfaceFormatKHR> getPhysicalDeviceSurfaceFormats (const InstanceInterface& vki,
274 VkPhysicalDevice physicalDevice,
275 VkSurfaceKHR surface)
277 deUint32 numFormats = 0;
279 VK_CHECK(vki.getPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &numFormats, DE_NULL));
283 std::vector<VkSurfaceFormatKHR> formats (numFormats);
285 VK_CHECK(vki.getPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &numFormats, &formats[0]));
290 return std::vector<VkSurfaceFormatKHR>();
293 std::vector<VkPresentModeKHR> getPhysicalDeviceSurfacePresentModes (const InstanceInterface& vki,
294 VkPhysicalDevice physicalDevice,
295 VkSurfaceKHR surface)
297 deUint32 numModes = 0;
299 VK_CHECK(vki.getPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &numModes, DE_NULL));
303 std::vector<VkPresentModeKHR> modes (numModes);
305 VK_CHECK(vki.getPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &numModes, &modes[0]));
310 return std::vector<VkPresentModeKHR>();
313 std::vector<VkImage> getSwapchainImages (const DeviceInterface& vkd,
315 VkSwapchainKHR swapchain)
317 deUint32 numImages = 0;
319 VK_CHECK(vkd.getSwapchainImagesKHR(device, swapchain, &numImages, DE_NULL));
323 std::vector<VkImage> images (numImages);
325 VK_CHECK(vkd.getSwapchainImagesKHR(device, swapchain, &numImages, &images[0]));
330 return std::vector<VkImage>();