1// Copyright 2014-2021 The Khronos Group, Inc. 2// 3// SPDX-License-Identifier: CC-BY-4.0 4 5include::{generated}/meta/{refprefix}VK_KHR_swapchain.txt[] 6 7=== Other Extension Metadata 8 9*Last Modified Date*:: 10 2017-10-06 11*IP Status*:: 12 No known IP claims. 13*Interactions and External Dependencies*:: 14 - Interacts with Vulkan 1.1 15*Contributors*:: 16 - Patrick Doane, Blizzard 17 - Ian Elliott, LunarG 18 - Jesse Hall, Google 19 - Mathias Heyer, NVIDIA 20 - James Jones, NVIDIA 21 - David Mao, AMD 22 - Norbert Nopper, Freescale 23 - Alon Or-bach, Samsung 24 - Daniel Rakos, AMD 25 - Graham Sellers, AMD 26 - Jeff Vigil, Qualcomm 27 - Chia-I Wu, LunarG 28 - Jason Ekstrand, Intel 29 - Matthaeus G. Chajdas, AMD 30 - Ray Smith, ARM 31 32=== Description 33 34The `VK_KHR_swapchain` extension is the device-level companion to the 35`apiext:VK_KHR_surface` extension. 36It introduces slink:VkSwapchainKHR objects, which provide the ability to 37present rendering results to a surface. 38 39include::{generated}/interfaces/VK_KHR_swapchain.txt[] 40 41=== Issues 42 431) Does this extension allow the application to specify the memory backing 44of the presentable images? 45 46*RESOLVED*: No. 47Unlike standard images, the implementation will allocate the memory backing 48of the presentable image. 49 502) What operations are allowed on presentable images? 51 52*RESOLVED*: This is determined by the image usage flags specified when 53creating the presentable image's swapchain. 54 553) Does this extension support MSAA presentable images? 56 57*RESOLVED*: No. 58Presentable images are always single-sampled. 59Multi-sampled rendering must use regular images. 60To present the rendering results the application must manually resolve the 61multi- sampled image to a single-sampled presentable image prior to 62presentation. 63 644) Does this extension support stereo/multi-view presentable images? 65 66*RESOLVED*: Yes. 67The number of views associated with a presentable image is determined by the 68pname:imageArrayLayers specified when creating a swapchain. 69All presentable images in a given swapchain use the same array size. 70 715) Are the layers of stereo presentable images half-sized? 72 73*RESOLVED*: No. 74The image extents always match those requested by the application. 75 766) Do the "`present`" and "`acquire next image`" commands operate on a 77queue? If not, do they need to include explicit semaphore objects to 78interlock them with queue operations? 79 80*RESOLVED*: The present command operates on a queue. 81The image ownership operation it represents happens in order with other 82operations on the queue, so no explicit semaphore object is required to 83synchronize its actions. 84 85Applications may want to acquire the next image in separate threads from 86those in which they manage their queue, or in multiple threads. 87To make such usage easier, the acquire next image command takes a semaphore 88to signal as a method of explicit synchronization. 89The application must later queue a wait for this semaphore before queuing 90execution of any commands using the image. 91 927) Does flink:vkAcquireNextImageKHR block if no images are available? 93 94*RESOLVED*: The command takes a timeout parameter. 95Special values for the timeout are 0, which makes the call a non-blocking 96operation, and code:UINT64_MAX, which blocks indefinitely. 97Values in between will block for up to the specified time. 98The call will return when an image becomes available or an error occurs. 99It may, but is not required to, return before the specified timeout expires 100if the swapchain becomes out of date. 101 1028) Can multiple presents be queued using one flink:vkQueuePresentKHR call? 103 104*RESOLVED*: Yes. 105slink:VkPresentInfoKHR contains a list of swapchains and corresponding image 106indices that will be presented. 107When supported, all presentations queued with a single 108flink:vkQueuePresentKHR call will be applied atomically as one operation. 109The same swapchain must not appear in the list more than once. 110Later extensions may provide applications stronger guarantees of atomicity 111for such present operations, and/or allow them to query whether atomic 112presentation of a particular group of swapchains is possible. 113 1149) How do the presentation and acquire next image functions notify the 115application the targeted surface has changed? 116 117*RESOLVED*: Two new result codes are introduced for this purpose: 118 119 * ename:VK_SUBOPTIMAL_KHR - Presentation will still succeed, subject to 120 the window resize behavior, but the swapchain is no longer configured 121 optimally for the surface it targets. 122 Applications should query updated surface information and recreate their 123 swapchain at the next convenient opportunity. 124 * ename:VK_ERROR_OUT_OF_DATE_KHR - Failure. 125 The swapchain is no longer compatible with the surface it targets. 126 The application must query updated surface information and recreate the 127 swapchain before presentation will succeed. 128 129These can be returned by both flink:vkAcquireNextImageKHR and 130flink:vkQueuePresentKHR. 131 13210) Does the flink:vkAcquireNextImageKHR command return a semaphore to the 133application via an output parameter, or accept a semaphore to signal from 134the application as an object handle parameter? 135 136*RESOLVED*: Accept a semaphore to signal as an object handle. 137This avoids the need to specify whether the application must destroy the 138semaphore or whether it is owned by the swapchain, and if the latter, what 139its lifetime is and whether it can be reused for other operations once it is 140received from flink:vkAcquireNextImageKHR. 141 14211) What types of swapchain queuing behavior should be exposed? Options 143include swap interval specification, mailbox/most recent vs. FIFO queue 144management, targeting specific vertical blank intervals or absolute times 145for a given present operation, and probably others. 146For some of these, whether they are specified at swapchain creation time or 147as per-present parameters needs to be decided as well. 148 149*RESOLVED*: The base swapchain extension will expose 3 possible behaviors 150(of which, FIFO will always be supported): 151 152 - Immediate present: Does not wait for vertical blanking period to update 153 the current image, likely resulting in visible tearing. 154 No internal queue is used. 155 Present requests are applied immediately. 156 - Mailbox queue: Waits for the next vertical blanking period to update the 157 current image. 158 No tearing should be observed. 159 An internal single-entry queue is used to hold pending presentation 160 requests. 161 If the queue is full when a new presentation request is received, the 162 new request replaces the existing entry, and any images associated with 163 the prior entry become available for reuse by the application. 164 - FIFO queue: Waits for the next vertical blanking period to update the 165 current image. 166 No tearing should be observed. 167 An internal queue containing [eq]#ptext:numSwapchainImages - 1# entries 168 is used to hold pending presentation requests. 169 New requests are appended to the end of the queue, and one request is 170 removed from the beginning of the queue and processed during each 171 vertical blanking period in which the queue is non-empty 172 173Not all surfaces will support all of these modes, so the modes supported 174will be returned using a surface information query. 175All surfaces must support the FIFO queue mode. 176Applications must choose one of these modes up front when creating a 177swapchain. 178Switching modes can be accomplished by recreating the swapchain. 179 18012) Can ename:VK_PRESENT_MODE_MAILBOX_KHR provide non-blocking guarantees 181for flink:vkAcquireNextImageKHR? If so, what is the proper criteria? 182 183*RESOLVED*: Yes. 184The difficulty is not immediately obvious here. 185Naively, if at least 3 images are requested, mailbox mode should always have 186an image available for the application if the application does not own any 187images when the call to flink:vkAcquireNextImageKHR was made. 188However, some presentation engines may have more than one "`current`" image, 189and would still need to block in some cases. 190The right requirement appears to be that if the application allocates the 191surface's minimum number of images + 1 then it is guaranteed non-blocking 192behavior when it does not currently own any images. 193 19413) Is there a way to create and initialize a new swapchain for a surface 195that has generated a ename:VK_SUBOPTIMAL_KHR return code while still using 196the old swapchain? 197 198*RESOLVED*: Not as part of this specification. 199This could be useful to allow the application to create an "`optimal`" 200replacement swapchain and rebuild all its command buffers using it in a 201background thread at a low priority while continuing to use the 202"`suboptimal`" swapchain in the main thread. 203It could probably use the same "`atomic replace`" semantics proposed for 204recreating direct-to-device swapchains without incurring a mode switch. 205However, after discussion, it was determined some platforms probably could 206not support concurrent swapchains for the same surface though, so this will 207be left out of the base KHR extensions. 208A future extension could add this for platforms where it is supported. 209 21014) Should there be a special value for 211slink:VkSurfaceCapabilitiesKHR::pname:maxImageCount to indicate there are no 212practical limits on the number of images in a swapchain? 213 214*RESOLVED*: Yes. 215There will often be cases where there is no practical limit to the number of 216images in a swapchain other than the amount of available resources (i.e., 217memory) in the system. 218Trying to derive a hard limit from things like memory size is prone to 219failure. 220It is better in such cases to leave it to applications to figure such soft 221limits out via trial/failure iterations. 222 22315) Should there be a special value for 224slink:VkSurfaceCapabilitiesKHR::pname:currentExtent to indicate the size of 225the platform surface is undefined:? 226 227*RESOLVED*: Yes. 228On some platforms (Wayland, for example), the surface size is defined by the 229images presented to it rather than the other way around. 230 23116) Should there be a special value for 232slink:VkSurfaceCapabilitiesKHR::pname:maxImageExtent to indicate there is no 233practical limit on the surface size? 234 235*RESOLVED*: No. 236It seems unlikely such a system would exist. 2370 could be used to indicate the platform places no limits on the extents 238beyond those imposed by Vulkan for normal images, but this query could just 239as easily return those same limits, so a special "`unlimited`" value does 240not seem useful for this field. 241 24217) How should surface rotation and mirroring be exposed to applications? 243How do they specify rotation and mirroring transforms applied prior to 244presentation? 245 246*RESOLVED*: Applications can query both the supported and current transforms 247of a surface. 248Both are specified relative to the device's "`natural`" display rotation and 249direction. 250The supported transforms indicate which orientations the presentation engine 251accepts images in. 252For example, a presentation engine that does not support transforming 253surfaces as part of presentation, and which is presenting to a surface that 254is displayed with a 90-degree rotation, would return only one supported 255transform bit: ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR. 256Applications must transform their rendering by the transform they specify 257when creating the swapchain in pname:preTransform field. 258 25918) Can surfaces ever not support etext:VK_MIRROR_NONE? Can they support 260vertical and horizontal mirroring simultaneously? Relatedly, should 261etext:VK_MIRROR_NONE[_BIT] be zero, or bit one, and should applications be 262allowed to specify multiple pre and current mirror transform bits, or 263exactly one? 264 265*RESOLVED*: Since some platforms may not support presenting with a transform 266other than the native window's current transform, and prerotation/mirroring 267are specified relative to the device's natural rotation and direction, 268rather than relative to the surface's current rotation and direction, it is 269necessary to express lack of support for no mirroring. 270To allow this, the etext:MIRROR_NONE enum must occupy a bit in the flags. 271Since etext:MIRROR_NONE must be a bit in the bitmask rather than a bitmask 272with no values set, allowing more than one bit to be set in the bitmask 273would make it possible to describe undefined: transforms such as 274etext:VK_MIRROR_NONE_BIT | etext:VK_MIRROR_HORIZONTAL_BIT, or a transform 275that includes both "`no mirroring`" and "`horizontal mirroring`" 276simultaneously. 277Therefore, it is desirable to allow specifying all supported mirroring 278transforms using only one bit. 279The question then becomes, should there be a 280etext:VK_MIRROR_HORIZONTAL_AND_VERTICAL_BIT to represent a simultaneous 281horizontal and vertical mirror transform? However, such a transform is 282equivalent to a 180 degree rotation, so presentation engines and 283applications that wish to support or use such a transform can express it 284through rotation instead. 285Therefore, 3 exclusive bits are sufficient to express all needed mirroring 286transforms. 287 28819) Should support for sRGB be required? 289 290*RESOLVED*: In the advent of UHD and HDR display devices, proper color space 291information is vital to the display pipeline represented by the swapchain. 292The app can discover the supported format/color-space pairs and select a 293pair most suited to its rendering needs. 294Currently only the sRGB color space is supported, future extensions may 295provide support for more color spaces. 296See issues 23 and 24. 297 29820) Is there a mechanism to modify or replace an existing swapchain with one 299targeting the same surface? 300 301*RESOLVED*: Yes. 302This is described above in the text. 303 30421) Should there be a way to set prerotation and mirroring using native APIs 305when presenting using a Vulkan swapchain? 306 307*RESOLVED*: Yes. 308The transforms that can be expressed in this extension are a subset of those 309possible on native platforms. 310If a platform exposes a method to specify the transform of presented images 311for a given surface using native methods and exposes more transforms or 312other properties for surfaces than Vulkan supports, it might be impossible, 313difficult, or inconvenient to set some of those properties using Vulkan KHR 314extensions and some using the native interfaces. 315To avoid overwriting properties set using native commands when presenting 316using a Vulkan swapchain, the application can set the pretransform to 317"`inherit`", in which case the current native properties will be used, or if 318none are available, a platform-specific default will be used. 319Platforms that do not specify a reasonable default or do not provide native 320mechanisms to specify such transforms should not include the inherit bits in 321the pname:supportedTransforms bitmask they return in 322slink:VkSurfaceCapabilitiesKHR. 323 32422) Should the content of presentable images be clipped by objects obscuring 325their target surface? 326 327*RESOLVED*: Applications can choose which behavior they prefer. 328Allowing the content to be clipped could enable more efficient presentation 329methods on some platforms, but some applications might rely on the content 330of presentable images to perform techniques such as partial updates or 331motion blurs. 332 33323) What is the purpose of specifying a elink:VkColorSpaceKHR along with 334elink:VkFormat when creating a swapchain? 335 336*RESOLVED*: While Vulkan itself is color space agnostic (e.g. even the 337meaning of R, G, B and A can be freely defined by the rendering 338application), the swapchain eventually will have to present the images on a 339display device with specific color reproduction characteristics. 340If any color space transformations are necessary before an image can be 341displayed, the color space of the presented image must be known to the 342swapchain. 343A swapchain will only support a restricted set of color format and -space 344pairs. 345This set can be discovered via flink:vkGetPhysicalDeviceSurfaceFormatsKHR. 346As it can be expected that most display devices support the sRGB color 347space, at least one format/color-space pair has to be exposed, where the 348color space is ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR. 349 35024) How are sRGB formats and the sRGB color space related? 351 352*RESOLVED*: While Vulkan exposes a number of SRGB texture formats, using 353such formats does not guarantee working in a specific color space. 354It merely means that the hardware can directly support applying the 355non-linear transfer functions defined by the sRGB standard color space when 356reading from or writing to images of those formats. 357Still, it is unlikely that a swapchain will expose a etext:*_SRGB format 358along with any color space other than 359ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR. 360 361On the other hand, non-etext:*_SRGB formats will be very likely exposed in 362pair with a SRGB color space. 363This means, the hardware will not apply any transfer function when reading 364from or writing to such images, yet they will still be presented on a device 365with sRGB display characteristics. 366In this case the application is responsible for applying the transfer 367function, for instance by using shader math. 368 36925) How are the lifetimes of surfaces and swapchains targeting them related? 370 371*RESOLVED*: A surface must outlive any swapchains targeting it. 372A slink:VkSurfaceKHR owns the binding of the native window to the Vulkan 373driver. 374 37526) How can the client control the way the alpha component of swapchain 376images is treated by the presentation engine during compositing? 377 378*RESOLVED*: We should add new enum values to allow the client to negotiate 379with the presentation engine on how to treat image alpha values during the 380compositing process. 381Since not all platforms can practically control this through the Vulkan 382driver, a value of ename:VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR is provided like 383for surface transforms. 384 38527) Is flink:vkCreateSwapchainKHR the right function to return 386ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, or should the various 387platform-specific slink:VkSurfaceKHR factory functions catch this error 388earlier? 389 390*RESOLVED*: For most platforms, the slink:VkSurfaceKHR structure is a simple 391container holding the data that identifies a native window or other object 392representing a surface on a particular platform. 393For the surface factory functions to return this error, they would likely 394need to register a reference on the native objects with the native display 395server somehow, and ensure no other such references exist. 396Surfaces were not intended to be that heavyweight. 397 398Swapchains are intended to be the objects that directly manipulate native 399windows and communicate with the native presentation mechanisms. 400Swapchains will already need to communicate with the native display server 401to negotiate allocation and/or presentation of presentable images for a 402native surface. 403Therefore, it makes more sense for swapchain creation to be the point at 404which native object exclusivity is enforced. 405Platforms may choose to enforce further restrictions on the number of 406slink:VkSurfaceKHR objects that may be created for the same native window if 407such a requirement makes sense on a particular platform, but a global 408requirement is only sensible at the swapchain level. 409 410=== Examples 411 412[NOTE] 413.Note 414==== 415The example code for the `apiext:VK_KHR_surface` and `VK_KHR_swapchain` 416extensions was removed from the appendix after revision 1.0.29. 417This WSI example code was ported to the cube demo that is shipped with the 418official Khronos SDK, and is being kept up-to-date in that location (see: 419https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c). 420==== 421 422=== Version History 423 424 * Revision 1, 2015-05-20 (James Jones) 425 - Initial draft, based on LunarG KHR spec, other KHR specs, patches 426 attached to bugs. 427 428 * Revision 2, 2015-05-22 (Ian Elliott) 429 - Made many agreed-upon changes from 2015-05-21 KHR TSG meeting. 430 This includes using only a queue for presentation, and having an 431 explicit function to acquire the next image. 432 - Fixed typos and other minor mistakes. 433 434 * Revision 3, 2015-05-26 (Ian Elliott) 435 - Improved the Description section. 436 - Added or resolved issues that were found in improving the Description. 437 For example, pSurfaceDescription is used consistently, instead of 438 sometimes using pSurface. 439 440 * Revision 4, 2015-05-27 (James Jones) 441 - Fixed some grammatical errors and typos 442 - Filled in the description of imageUseFlags when creating a swapchain. 443 - Added a description of swapInterval. 444 - Replaced the paragraph describing the order of operations on a queue 445 for image ownership and presentation. 446 447 * Revision 5, 2015-05-27 (James Jones) 448 - Imported relevant issues from the (abandoned) 449 vk_wsi_persistent_swapchain_images extension. 450 - Added issues 6 and 7, regarding behavior of the acquire next image and 451 present commands with respect to queues. 452 - Updated spec language and examples to align with proposed resolutions 453 to issues 6 and 7. 454 455 * Revision 6, 2015-05-27 (James Jones) 456 - Added issue 8, regarding atomic presentation of multiple swapchains 457 - Updated spec language and examples to align with proposed resolution 458 to issue 8. 459 460 * Revision 7, 2015-05-27 (James Jones) 461 - Fixed compilation errors in example code, and made related spec fixes. 462 463 * Revision 8, 2015-05-27 (James Jones) 464 - Added issue 9, and the related VK_SUBOPTIMAL_KHR result code. 465 - Renamed VK_OUT_OF_DATE_KHR to VK_ERROR_OUT_OF_DATE_KHR. 466 467 * Revision 9, 2015-05-27 (James Jones) 468 - Added inline proposed resolutions (marked with [JRJ]) to some XXX 469 questions/issues. 470 These should be moved to the issues section in a subsequent update if 471 the proposals are adopted. 472 473 * Revision 10, 2015-05-28 (James Jones) 474 - Converted vkAcquireNextImageKHR back to a non-queue operation that 475 uses a VkSemaphore object for explicit synchronization. 476 - Added issue 10 to determine whether vkAcquireNextImageKHR generates or 477 returns semaphores, or whether it operates on a semaphore provided by 478 the application. 479 480 * Revision 11, 2015-05-28 (James Jones) 481 - Marked issues 6, 7, and 8 resolved. 482 - Renamed VkSurfaceCapabilityPropertiesKHR to VkSurfacePropertiesKHR to 483 better convey the mutable nature of the information it contains. 484 485 * Revision 12, 2015-05-28 (James Jones) 486 - Added issue 11 with a proposed resolution, and the related issue 12. 487 - Updated various sections of the spec to match the proposed resolution 488 to issue 11. 489 490 * Revision 13, 2015-06-01 (James Jones) 491 - Moved some structures to VK_EXT_KHR_swap_chain to resolve the 492 specification's issues 1 and 2. 493 494 * Revision 14, 2015-06-01 (James Jones) 495 - Added code for example 4 demonstrating how an application might make 496 use of the two different present and acquire next image KHR result 497 codes. 498 - Added issue 13. 499 500 * Revision 15, 2015-06-01 (James Jones) 501 - Added issues 14 - 16 and related spec language. 502 - Fixed some spelling errors. 503 - Added language describing the meaningful return values for 504 vkAcquireNextImageKHR and vkQueuePresentKHR. 505 506 * Revision 16, 2015-06-02 (James Jones) 507 - Added issues 17 and 18, as well as related spec language. 508 - Removed some erroneous text added by mistake in the last update. 509 510 * Revision 17, 2015-06-15 (Ian Elliott) 511 - Changed special value from "-1" to "0" so that the data types can be 512 unsigned. 513 514 * Revision 18, 2015-06-15 (Ian Elliott) 515 - Clarified the values of VkSurfacePropertiesKHR::minImageCount and the 516 timeout parameter of the vkAcquireNextImageKHR function. 517 518 * Revision 19, 2015-06-17 (James Jones) 519 - Misc. 520 cleanup. 521 Removed resolved inline issues and fixed typos. 522 - Fixed clarification of VkSurfacePropertiesKHR::minImageCount made in 523 version 18. 524 - Added a brief "Image Ownership" definition to the list of terms used 525 in the spec. 526 527 * Revision 20, 2015-06-17 (James Jones) 528 - Updated enum-extending values using new convention. 529 530 * Revision 21, 2015-06-17 (James Jones) 531 - Added language describing how to use 532 VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR. 533 - Cleaned up an XXX comment regarding the description of which queues 534 vkQueuePresentKHR can be used on. 535 536 * Revision 22, 2015-06-17 (James Jones) 537 - Rebased on Vulkan API version 126. 538 539 * Revision 23, 2015-06-18 (James Jones) 540 - Updated language for issue 12 to read as a proposed resolution. 541 - Marked issues 11, 12, 13, 16, and 17 resolved. 542 - Temporarily added links to the relevant bugs under the remaining 543 unresolved issues. 544 - Added issues 19 and 20 as well as proposed resolutions. 545 546 * Revision 24, 2015-06-19 (Ian Elliott) 547 - Changed special value for VkSurfacePropertiesKHR::currentExtent back 548 to "`-1`" from "`0`". 549 This value will never need to be unsigned, and "`0`" is actually a 550 legal value. 551 552 * Revision 25, 2015-06-23 (Ian Elliott) 553 - Examples now show use of function pointers for extension functions. 554 - Eliminated extraneous whitespace. 555 556 * Revision 26, 2015-06-25 (Ian Elliott) 557 - Resolved Issues 9 & 10 per KHR TSG meeting. 558 559 * Revision 27, 2015-06-25 (James Jones) 560 - Added oldSwapchain member to VkSwapchainCreateInfoKHR. 561 562 * Revision 28, 2015-06-25 (James Jones) 563 - Added the "`inherit`" bits to the rotation and mirroring flags and the 564 associated issue 21. 565 566 * Revision 29, 2015-06-25 (James Jones) 567 - Added the "`clipped`" flag to VkSwapchainCreateInfoKHR, and the 568 associated issue 22. 569 - Specified that presenting an image does not modify it. 570 571 * Revision 30, 2015-06-25 (James Jones) 572 - Added language to the spec that clarifies the behavior of 573 vkCreateSwapchainKHR() when the oldSwapchain field of 574 VkSwapchainCreateInfoKHR is not NULL. 575 576 * Revision 31, 2015-06-26 (Ian Elliott) 577 - Example of new VkSwapchainCreateInfoKHR members, "`oldSwapchain`" and 578 "`clipped`". 579 - Example of using VkSurfacePropertiesKHR::{min|max}ImageCount to set 580 VkSwapchainCreateInfoKHR::minImageCount. 581 - Rename vkGetSurfaceInfoKHR()'s 4th parameter to "`pDataSize`", for 582 consistency with other functions. 583 - Add macro with C-string name of extension (just to header file). 584 585 * Revision 32, 2015-06-26 (James Jones) 586 - Minor adjustments to the language describing the behavior of 587 "`oldSwapchain`" 588 - Fixed the version date on my previous two updates. 589 590 * Revision 33, 2015-06-26 (Jesse Hall) 591 - Add usage flags to VkSwapchainCreateInfoKHR 592 593 * Revision 34, 2015-06-26 (Ian Elliott) 594 - Rename vkQueuePresentKHR()'s 2nd parameter to "`pPresentInfo`", for 595 consistency with other functions. 596 597 * Revision 35, 2015-06-26 (Jason Ekstrand) 598 - Merged the VkRotationFlagBitsKHR and VkMirrorFlagBitsKHR enums into a 599 single VkSurfaceTransformFlagBitsKHR enum. 600 601 * Revision 36, 2015-06-26 (Jason Ekstrand) 602 - Added a VkSurfaceTransformKHR enum that is not a bitmask. 603 Each value in VkSurfaceTransformKHR corresponds directly to one of the 604 bits in VkSurfaceTransformFlagBitsKHR so transforming from one to the 605 other is easy. 606 Having a separate enum means that currentTransform and preTransform 607 are now unambiguous by definition. 608 609 * Revision 37, 2015-06-29 (Ian Elliott) 610 - Corrected one of the signatures of vkAcquireNextImageKHR, which had 611 the last two parameters switched from what it is elsewhere in the 612 specification and header files. 613 614 * Revision 38, 2015-06-30 (Ian Elliott) 615 - Corrected a typo in description of the vkGetSwapchainInfoKHR() 616 function. 617 - Corrected a typo in header file comment for VkPresentInfoKHR::sType. 618 619 * Revision 39, 2015-07-07 (Daniel Rakos) 620 - Added error section describing when each error is expected to be 621 reported. 622 - Replaced bool32_t with VkBool32. 623 624 * Revision 40, 2015-07-10 (Ian Elliott) 625 - Updated to work with version 138 of the `vulkan.h` header. 626 This includes declaring the VkSwapchainKHR type using the new 627 VK_DEFINE_NONDISP_HANDLE macro, and no longer extending VkObjectType 628 (which was eliminated). 629 630 * Revision 41 2015-07-09 (Mathias Heyer) 631 - Added color space language. 632 633 * Revision 42, 2015-07-10 (Daniel Rakos) 634 - Updated query mechanism to reflect the convention changes done in the 635 core spec. 636 - Removed "`queue`" from the name of 637 VK_STRUCTURE_TYPE_QUEUE_PRESENT_INFO_KHR to be consistent with the 638 established naming convention. 639 - Removed reference to the no longer existing VkObjectType enum. 640 641 * Revision 43, 2015-07-17 (Daniel Rakos) 642 - Added support for concurrent sharing of swapchain images across queue 643 families. 644 - Updated sample code based on recent changes 645 646 * Revision 44, 2015-07-27 (Ian Elliott) 647 - Noted that support for VK_PRESENT_MODE_FIFO_KHR is required. 648 That is ICDs may optionally support IMMEDIATE and MAILBOX, but must 649 support FIFO. 650 651 * Revision 45, 2015-08-07 (Ian Elliott) 652 - Corrected a typo in spec file (type and variable name had wrong case 653 for the imageColorSpace member of the VkSwapchainCreateInfoKHR 654 struct). 655 - Corrected a typo in header file (last parameter in 656 PFN_vkGetSurfacePropertiesKHR was missing "`KHR`" at the end of type: 657 VkSurfacePropertiesKHR). 658 659 * Revision 46, 2015-08-20 (Ian Elliott) 660 - Renamed this extension and all of its enumerations, types, functions, 661 etc. 662 This makes it compliant with the proposed standard for Vulkan 663 extensions. 664 - Switched from "`revision`" to "`version`", including use of the 665 VK_MAKE_VERSION macro in the header file. 666 - Made improvements to several descriptions. 667 - Changed the status of several issues from PROPOSED to RESOLVED, 668 leaving no unresolved issues. 669 - Resolved several TODOs, did miscellaneous cleanup, etc. 670 671 * Revision 47, 2015-08-20 (Ian Elliott--porting a 2015-07-29 change from 672 James Jones) 673 - Moved the surface transform enums to VK_WSI_swapchain so they could be 674 reused by VK_WSI_display. 675 676 * Revision 48, 2015-09-01 (James Jones) 677 - Various minor cleanups. 678 679 * Revision 49, 2015-09-01 (James Jones) 680 - Restore single-field revision number. 681 682 * Revision 50, 2015-09-01 (James Jones) 683 - Update Example #4 to include code that illustrates how to use the 684 oldSwapchain field. 685 686 * Revision 51, 2015-09-01 (James Jones) 687 - Fix example code compilation errors. 688 689 * Revision 52, 2015-09-08 (Matthaeus G. Chajdas) 690 - Corrected a typo. 691 692 * Revision 53, 2015-09-10 (Alon Or-bach) 693 - Removed underscore from SWAP_CHAIN left in 694 VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR. 695 696 * Revision 54, 2015-09-11 (Jesse Hall) 697 - Described the execution and memory coherence requirements for image 698 transitions to and from VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR. 699 700 * Revision 55, 2015-09-11 (Ray Smith) 701 - Added errors for destroying and binding memory to presentable images 702 703 * Revision 56, 2015-09-18 (James Jones) 704 - Added fence argument to vkAcquireNextImageKHR 705 - Added example of how to meter a host thread based on presentation 706 rate. 707 708 * Revision 57, 2015-09-26 (Jesse Hall) 709 - Replace VkSurfaceDescriptionKHR with VkSurfaceKHR. 710 - Added issue 25 with agreed resolution. 711 712 * Revision 58, 2015-09-28 (Jesse Hall) 713 - Renamed from VK_EXT_KHR_device_swapchain to VK_EXT_KHR_swapchain. 714 715 * Revision 59, 2015-09-29 (Ian Elliott) 716 - Changed vkDestroySwapchainKHR() to return void. 717 718 * Revision 60, 2015-10-01 (Jeff Vigil) 719 - Added error result VK_ERROR_SURFACE_LOST_KHR. 720 721 * Revision 61, 2015-10-05 (Jason Ekstrand) 722 - Added the VkCompositeAlpha enum and corresponding structure fields. 723 724 * Revision 62, 2015-10-12 (Daniel Rakos) 725 - Added VK_PRESENT_MODE_FIFO_RELAXED_KHR. 726 727 * Revision 63, 2015-10-15 (Daniel Rakos) 728 - Moved surface capability queries to VK_EXT_KHR_surface. 729 730 * Revision 64, 2015-10-26 (Ian Elliott) 731 - Renamed from VK_EXT_KHR_swapchain to VK_KHR_swapchain. 732 733 * Revision 65, 2015-10-28 (Ian Elliott) 734 - Added optional pResult member to VkPresentInfoKHR, so that 735 per-swapchain results can be obtained from vkQueuePresentKHR(). 736 737 * Revision 66, 2015-11-03 (Daniel Rakos) 738 - Added allocation callbacks to create and destroy functions. 739 - Updated resource transition language. 740 - Updated sample code. 741 742 * Revision 67, 2015-11-10 (Jesse Hall) 743 - Add reserved flags bitmask to VkSwapchainCreateInfoKHR. 744 - Modify naming and member ordering to match API style conventions, and 745 so the VkSwapchainCreateInfoKHR image property members mirror 746 corresponding VkImageCreateInfo members but with an 'image' prefix. 747 - Make VkPresentInfoKHR::pResults non-const; it is an output array 748 parameter. 749 - Make pPresentInfo parameter to vkQueuePresentKHR const. 750 751 * Revision 68, 2016-04-05 (Ian Elliott) 752 - Moved the "`validity`" include for vkAcquireNextImage to be in its 753 proper place, after the prototype and list of parameters. 754 - Clarified language about presentable images, including how they are 755 acquired, when applications can and cannot use them, etc. 756 As part of this, removed language about "`ownership`" of presentable 757 images, and replaced it with more-consistent language about 758 presentable images being "`acquired`" by the application. 759 760 * 2016-08-23 (Ian Elliott) 761 - Update the example code, to use the final API command names, to not 762 have so many characters per line, and to split out a new example to 763 show how to obtain function pointers. 764 This code is more similar to the LunarG "`cube`" demo program. 765 766 * 2016-08-25 (Ian Elliott) 767 - A note was added at the beginning of the example code, stating that it 768 will be removed from future versions of the appendix. 769 770 * Revision 69, 2017-09-07 (Tobias Hector) 771 - Added interactions with Vulkan 1.1 772 773 * Revision 70, 2017-10-06 (Ian Elliott) 774 - Corrected interactions with Vulkan 1.1 775