• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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