// Copyright (c) 2014-2019 Khronos Group. This work is licensed under a // Creative Commons Attribution 4.0 International License; see // http://creativecommons.org/licenses/by/4.0/ include::meta/VK_KHR_win32_surface.txt[] *Last Modified Date*:: 2017-04-24 *IP Status*:: No known IP claims. *Contributors*:: - Patrick Doane, Blizzard - Jason Ekstrand, Intel - Ian Elliott, LunarG - Courtney Goeltzenleuchter, LunarG - Jesse Hall, Google - James Jones, NVIDIA - Antoine Labour, Google - Jon Leech, Khronos - David Mao, AMD - Norbert Nopper, Freescale - Alon Or-bach, Samsung - Daniel Rakos, AMD - Graham Sellers, AMD - Ray Smith, ARM - Jeff Vigil, Qualcomm - Chia-I Wu, LunarG The `VK_KHR_win32_surface` extension is an instance extension. It provides a mechanism to create a slink:VkSurfaceKHR object (defined by the `<>` extension) that refers to a Win32 code:HWND, as well as a query to determine support for rendering to the windows desktop. === New Object Types None === New Enum Constants * Extending elink:VkStructureType: ** ename:VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR === New Enums None === New Structures * slink:VkWin32SurfaceCreateInfoKHR === New Functions * flink:vkCreateWin32SurfaceKHR * flink:vkGetPhysicalDeviceWin32PresentationSupportKHR === Issues 1) Does Win32 need a way to query for compatibility between a particular physical device and a specific screen? Compatibility between a physical device and a window generally only depends on what screen the window is on. However, there is not an obvious way to identify a screen without already having a window on the screen. *RESOLVED*: No. While it may be useful, there is not a clear way to do this on Win32. However, a method was added to query support for presenting to the windows desktop as a whole. 2) If a native window object (code:HWND) is used by one graphics API, and then is later used by a different graphics API (one of which is Vulkan), can these uses interfere with each other? *RESOLVED*: Yes. Uses of a window object by multiple graphics APIs results in undefined: behavior. Such behavior may succeed when using one Vulkan implementation but fail when using a different Vulkan implementation. Potential failures include: * Creating then destroying a flip presentation model DXGI swapchain on a window object can prevent flink:vkCreateSwapchainKHR from succeeding on the same window object. * Creating then destroying a slink:VkSwapchainKHR on a window object can prevent creation of a bitblt model DXGI swapchain on the same window object. * Creating then destroying a slink:VkSwapchainKHR on a window object can effectively code:SetPixelFormat to a different format than the format chosen by an OpenGL application. * Creating then destroying a slink:VkSwapchainKHR on a window object on one slink:VkPhysicalDevice can prevent flink:vkCreateSwapchainKHR from succeeding on the same window object, but on a different slink:VkPhysicalDevice that is associated with a different Vulkan ICD. In all cases the problem can be worked around by creating a new window object. Technical details include: * Creating a DXGI swapchain over a window object can alter the object for the remainder of its lifetime. The alteration persists even after the DXGI swapchain has been destroyed. This alteration can make it impossible for a conformant Vulkan implementation to create a slink:VkSwapchainKHR over the same window object. Mention of this alteration can be found in the remarks section of the MSDN documentation for code:DXGI_SWAP_EFFECT. * Calling GDI's code:SetPixelFormat (needed by OpenGL's WGL layer) on a window object alters the object for the remainder of its lifetime. The MSDN documentation for code:SetPixelFormat explains that a window object's pixel format can be set only one time. * Creating a slink:VkSwapchainKHR over a window object can alter the object for the remaining life of its lifetime. Either of the above alterations may occur as a side-effect of slink:VkSwapchainKHR. === Version History * Revision 1, 2015-09-23 (Jesse Hall) - Initial draft, based on the previous contents of VK_EXT_KHR_swapchain (later renamed VK_EXT_KHR_surface). * Revision 2, 2015-10-02 (James Jones) - Added presentation support query for win32 desktops. * Revision 3, 2015-10-26 (Ian Elliott) - Renamed from VK_EXT_KHR_win32_surface to VK_KHR_win32_surface. * Revision 4, 2015-11-03 (Daniel Rakos) - Added allocation callbacks to vkCreateWin32SurfaceKHR. * Revision 5, 2015-11-28 (Daniel Rakos) - Updated the surface create function to take a pCreateInfo structure. * Revision 6, 2017-04-24 (Jeff Juliano) - Add issue 2 addressing reuse of a native window object in a different Graphics API, or by a different Vulkan ICD.