8 Swapchains Unchained

8 Swapchains Unchained

Swapchains Unchained! (What you need to know about Vulkan WSI) Alon Or-bach, Chair, Vulkan System Integration Sub-Group – May 2016 @alonorbach (disclaimers apply!) © Copyright Khronos Group 2016 - Page 193 Intro to Vulkan Window System Integration • Explicit control for acquisition and presentation of images WSI Jargon Buster - Designed to fit the Vulkan API and today’s • Platform compositing window systems Our terminology for an OS • Not all extensions are supported by every / window system e.g. platform Android, Windows, - You MUST check and enable the extensions Wayland, X11 via XCB your app/engine uses!!! • Presentation Engine • Today’s presentation should help you get The platform’s compositor or display engine presentation working - Learn how to present through a swapchain • Application Your app or game engine - Overview of Vulkan objects used by the WSI extensions © Copyright Khronos Group 2016 - Page 194 How many WSI extensions are there? • Two cross-platform instance extensions - VK_KHR_surface - VK_KHR_display • Six (platform) instance extensions - VK_KHR_android_surface - VK_KHR_mir_surface - VK_KHR_wayland_surface - VK_KHR_win32_surface - VK_KHR_xcb_surface - VK_KHR_xlib_surface • Two cross-platform device extensions - VK_KHR_swapchain - VK_KHR_display_swapchain © Copyright Khronos Group 2016 - Page 195 Vulkan Surfaces • VkSurfaceKHR Physical Device A Queue - Vulkan’s way to encapsulate a native Family 2 window / surface Queue Family 1 Queue Unlike an EGLSurface, creating a Family 0 Vulkan Surface doesn’t mean you’ve got your render targets created …yet Physical Device B Platform X • Platform-independent surface queries - Find out crucial information about your Queue FamilyQueue 1 Platform Y surface’s properties Family 0 - Such as format, transform, image usage - Some platforms provide additional queries • Presentation support is per queue family Physical Device C - An implementation may support multiple Queue FamilyQueue 1 platforms e.g. both xlib and xcb Family 0 - Or may not support presentation at all © Copyright Khronos Group 2016 - Page 196 Vulkan Swapchains: VK_KHR_swapchain • Array of presentable images associated with a surface const VkSwapchainCreateInfoKHR createInfo = - Application requests a minimum number { VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, // sType of presentable images NULL, // pNext 0, // flags - Implementation creates at least that mySurface, // surface desiredNumberOfPresentableImages, // minImageCount number surfaceFormat, // imageFormat surfaceColorSpace, // imageColorSpace - Implementation may have a limit myExtent, // imageExtent 1, // imageArrayLayers • Upfront allocation of presentable images VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, // imageUsage VK_SHARING_MODE_EXCLUSIVE, // imageSharingMode - No allocation hitching at crucial moment 0, // queueFamilyIndexCount NULL, // pQueueFamilyIndices - Pre-record fixed content command buffers surfaceProperties.currentTransform, // preTransform VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR, // compositeAlpha swapchainPresentMode, // presentMode • Present mode determines behavior VK_TRUE, // clipped - FIFO support mandatory VK_NULL_HANDLE // oldSwapchain }; - Platforms can offer mailbox, immediate, FIFO relaxed FIFO is like eglSwapInterval = 1 Mailbox/Immediate is like eglSwapInterval 0 FIFO relaxed is like EXT_swap_control_tear © Copyright Khronos Group 2016 - Page 197 Vulkan Swapchains: They’re good! • Application knows which image within a swapchain it is presenting Similar but neater than how - Content of image preserved between EGL_KHR_partial_update / EGL_EXT_buffer_age and preserved presents behavior achieves this • Application is responsible for explicitly recreating swapchains - no surprises - Platform informs app if current swapchain - Suboptimal: e.g. after window resize, swapchain still usable for present via image scaling - Surface Lost: swapchain no longer usable for present - Application is responsible to create a new swapchain In EGL, the EGLSurface may be resized by the platform after an eglSwapBuffers call. Vulkan requires the application to intervene © Copyright Khronos Group 2016 - Page 198 Vulkan Swapchains: They’re jolly good! • Presenting and acquiring are separate operations - No need to submit a new image to acquire another one, unless presentation engine cannot release it • Application must only modify presentable images it has acquired • Presentation engine must only display presentable images that have been Stalls in frame loop presented! are very bad! In EGL, calling eglSwapBuffers both presents the current back buffer and acquires a new one Vulkan splits this up into separate operations © Copyright Khronos Group 2016 - Page 199 Steps to setup your presentable images 1 – Create a native window/surface Platform-specific APIs 2 – Create a Vulkan VK_KHR_<platform>_surface surface 3 – Query information VK_KHR_surface about your surface 4 – Create a Vulkan swapchain VK_KHR_swapchain 5 – Get your presentable images © Copyright Khronos Group 2016 - Page 200 Vulkan Frame Loop – as easy as 1-2-3! 0 – Create your swapchain 1 – Acquire the next 3 – Present the image presentable image VK_KHR_swapchain Legend 2 – Submit command Setup buffer(s) for that image Steady-state Response to suboptimal / surface_lost © Copyright Khronos Group 2016 - Page 201 Vulkan Displays: VK_KHR_display Display 0 • Vulkan’s way to discover display devices Display (screens, panels) outside a window system ModeDisplay 1 Mode 0 - Reminder: Not supported on all platforms Physical • Defines VkDisplayKHR and Device VkDisplayModeKHR objects Plane 2 - Represent the display devices and the Plane 1 modes they support connected to a Plane 0 VkPhysicalDevice - Determine if a display supports multiple planes that are blended together Surface Display 1 • Enables creation of a VkSurfaceKHR to Display ModeDisplay 1 represent a display plane Mode 0 A Vulkan display represents an actual display! (Whereas an EGLDisplay is actually just a connection to a driver – like a Vulkan Device) © Copyright Khronos Group 2016 - Page 202 VK_KHR_display_swapchain • Extends the information provided at vkQueuePresentKHR - What region to present from the swapchain image - What region to present to on the display - Whether the display should persist the image • Adds ability to create a shared swapchain - Swapchain that takes multiple VkSwapchainCreateInfoKHR structs - Allows multiple displays to be presented to simultaneously - No guarantee that presents are atomic ...presently! © Copyright Khronos Group 2016 - Page 203 Any question? [email protected] @alonorbach © Copyright Khronos Group 2016 - Page 204.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    12 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us