Vulkan-Docs/doc/specs/vulkan/chapters/VK_KHR_swapchain/wsi.txt

1218 lines
54 KiB
Plaintext

// Copyright (c) 2014-2017 Khronos Group. This work is licensed under a
// Creative Commons Attribution 4.0 International License; see
// http://creativecommons.org/licenses/by/4.0/
== WSI Swapchain
[open,refpage='VkSwapchainKHR',desc='Opaque handle to a swapchain object',type='handles']
--
A swapchain object (a.k.a.
swapchain) provides the ability to present rendering results to a surface.
Swapchain objects are represented by sname:VkSwapchainKHR handles:
include::../../api/handles/VkSwapchainKHR.txt[]
A swapchain is an abstraction for an array of presentable images that are
associated with a surface.
The presentable images are represented by sname:VkImage objects created by
the platform.
One image (which can: be an array image for multiview/stereoscopic-3D
surfaces) is displayed at a time, but multiple images can: be queued for
presentation.
An application renders to the image, and then queues the image for
presentation to the surface.
A native window cannot: be associated with more than one swapchain at a
time.
Further, swapchains cannot: be created for native windows that have a
non-Vulkan graphics API surface associated with them.
The presentation engine is an abstraction for the platform's compositor or
hardware/software display engine.
[NOTE]
.Note
====
The presentation engine may: be synchronous or asynchronous with respect to
the application and/or logical device.
Some implementations may: use the device's graphics queue or dedicated
presentation hardware to perform presentation.
====
The presentable images of a swapchain are owned by the presentation engine.
An application can: acquire use of a presentable image from the presentation
engine.
Use of a presentable image must: occur only after the image is returned by
fname:vkAcquireNextImageKHR, and before it is presented by
fname:vkQueuePresentKHR.
This includes transitioning the image layout and rendering commands.
An application can: acquire use of a presentable image with
fname:vkAcquireNextImageKHR.
After acquiring a presentable image and before modifying it, the application
must: use a synchronization primitive to ensure that the presentation engine
has finished reading from the image.
The application can: then transition the image's layout, queue rendering
commands to it, etc.
Finally, the application presents the image with fname:vkQueuePresentKHR,
which releases the acquisition of the image.
The presentation engine controls the order in which presentable images are
acquired for use by the application.
[NOTE]
.Note
====
This allows the platform to handle situations which require out-of-order
return of images after presentation.
At the same time, it allows the application to generate command buffers
referencing all of the images in the swapchain at initialization time,
rather than in its main loop.
====
--
How this all works is described below.
ifdef::VK_KHR_shared_presentable_image[]
include::../VK_KHR_shared_presentable_image/wsi.txt[]
endif::VK_KHR_shared_presentable_image[]
[open,refpage='vkCreateSwapchainKHR',desc='Create a swapchain',type='protos']
--
To create a swapchain, call:
include::../../api/protos/vkCreateSwapchainKHR.txt[]
* pname:device is the device to create the swapchain for.
* pname:pCreateInfo is a pointer to an instance of the
slink:VkSwapchainCreateInfoKHR structure specifying the parameters of
the created swapchain.
* pname:pAllocator is the allocator used for host memory allocated for the
swapchain object when there is no more specific allocator available (see
<<memory-allocation,Memory Allocation>>).
* pname:pSwapchain is a pointer to a sname:VkSwapchainKHR handle in which
the created swapchain object will be returned.
include::../../validity/protos/vkCreateSwapchainKHR.txt[]
--
[open,refpage='VkSwapchainCreateInfoKHR',desc='Structure specifying parameters of a newly created swapchain object',type='structs']
--
The sname:VkSwapchainCreateInfoKHR structure is defined as:
include::../../api/structs/VkSwapchainCreateInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:flags is a bitmask of elink:VkSwapchainCreateFlagBitsKHR
indicating parameters of the swapchain creation.
* pname:surface is the surface onto which the swapchain will present
images.
If the creation succeeds, the swapchain becomes associated with
pname:surface.
* pname:minImageCount is the minimum number of presentable images that the
application needs.
The implementation will either create the swapchain with at least that
many images, or it will fail to create the swapchain.
* pname:imageFormat is a elink:VkFormat value specifying the format the
swapchain image(s) will be created with.
* pname:imageColorSpace is a slink:VkColorSpaceKHR value specifying the
way the swapchain interprets image data.
* pname:imageExtent is the size (in pixels) of the swapchain image(s).
The behavior is platform-dependent if the image extent does not match
the surface's pname:currentExtent as returned by
fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR.
[NOTE]
.Note
====
During some situations, sname:VkSwapchainKHR cannot: be created because of
the Valid Usage of the pname:imageExtent parameter.
The flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR may: return in
slink:VkSurfaceCapabilitiesKHR a pname:currentExtent that has the
pname:width and/or pname:height equal to 0, or that is less than its
counterpart in pname:minImageExtent.
Similarly, pname:maxImageExtent may: also have 0 values for pname:width
and/or pname:height.
For example, on some platforms that may: happen while an associated window
is minimized.
====
* pname:imageArrayLayers is the number of views in a multiview/stereo
surface.
For non-stereoscopic-3D applications, this value is 1.
* pname:imageUsage is a bitmask of elink:VkImageUsageFlagBits describing
the intended usage of the (acquired) swapchain images.
* pname:imageSharingMode is the sharing mode used for the image(s) of the
swapchain.
* pname:queueFamilyIndexCount is the number of queue families having
access to the image(s) of the swapchain when pname:imageSharingMode is
ename:VK_SHARING_MODE_CONCURRENT.
* pname:pQueueFamilyIndices is an array of queue family indices having
access to the images(s) of the swapchain when pname:imageSharingMode is
ename:VK_SHARING_MODE_CONCURRENT.
* pname:preTransform is a elink:VkSurfaceTransformFlagBitsKHR value
describing the transform, relative to the presentation engine's natural
orientation, applied to the image content prior to presentation.
If it does not match the pname:currentTransform value returned by
fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR, the presentation engine
will transform the image content as part of the presentation operation.
* pname:compositeAlpha is a elink:VkCompositeAlphaFlagBitsKHR value
indicating the alpha compositing mode to use when this surface is
composited together with other surfaces on certain window systems.
* pname:presentMode is the presentation mode the swapchain will use.
A swapchain's present mode determines how incoming present requests will
be processed and queued internally.
* pname:clipped indicates whether the Vulkan implementation is allowed to
discard rendering operations that affect regions of the surface that are
not visible.
** If set to ename:VK_TRUE, the presentable images associated with the
swapchain may: not own all of their pixels.
Pixels in the presentable images that correspond to regions of the
target surface obscured by another window on the desktop, or subject to
some other clipping mechanism will have undefined content when read
back.
Pixel shaders may: not execute for these pixels, and thus any side
effects they would have had will not occur.
ename:VK_TRUE value does not guarantee any clipping will occur, but
allows more optimal presentation methods to be used on some platforms.
** If set to ename:VK_FALSE, presentable images associated with the
swapchain will own all of the pixels they contain.
[NOTE]
.Note
====
Applications should: set this value to ename:VK_TRUE if they do not expect
to read back the content of presentable images before presenting them or
after reacquiring them, and if their pixel shaders do not have any side
effects that require them to run for all pixels in the presentable image.
====
* pname:oldSwapchain is dlink:VK_NULL_HANDLE, or the existing non-retired
swapchain currently associated with pname:surface.
Providing a valid pname:oldSwapchain may: aid in the resource reuse, and
also allows the application to still present any images that are already
acquired from it.
Upon calling fname:vkCreateSwapchainKHR with a pname:oldSwapchain that is
not dlink:VK_NULL_HANDLE, pname:oldSwapchain is retired -- even if creation
of the new swapchain fails.
The new swapchain is created in the non-retired state whether or not
pname:oldSwapchain is dlink:VK_NULL_HANDLE.
Upon calling fname:vkCreateSwapchainKHR with a pname:oldSwapchain that is
not dlink:VK_NULL_HANDLE, any images from pname:oldSwapchain that are not
acquired by the application may: be freed by the implementation, which may:
occur even if creation of the new swapchain fails.
The application can: destroy pname:oldSwapchain to free all memory
associated with pname:oldSwapchain.
[NOTE]
.Note
====
Multiple retired swapchains can: be associated with the same
sname:VkSurfaceKHR through multiple uses of sname:oldSwapchain that
outnumber calls to flink:vkDestroySwapchainKHR.
After sname:oldSwapchain is retired, the application can: pass to
flink:vkQueuePresentKHR any images it had already acquired from
sname:oldSwapchain.
E.g., an application may present an image from the old swapchain before an
image from the new swapchain is ready to be presented.
As usual, flink:vkQueuePresentKHR may: fail if sname:oldSwapchain has
entered a state that causes ename:VK_ERROR_OUT_OF_DATE_KHR to be returned.
ifdef::VK_KHR_shared_presentable_image[]
The application can: continue to use a shared presentable image obtained
from pname:oldSwapchain until a presentable image is acquired from the new
swapchain, as long as it has not entered a state that causes it to return
ename:VK_ERROR_OUT_OF_DATE_KHR.
endif::VK_KHR_shared_presentable_image[]
====
.Valid Usage
****
* [[VUID-VkSwapchainCreateInfoKHR-surface-01270]]
pname:surface must: be a surface that is supported by the device as
determined using fname:vkGetPhysicalDeviceSurfaceSupportKHR
* [[VUID-VkSwapchainCreateInfoKHR-minImageCount-01271]]
pname:minImageCount must: be greater than or equal to the value returned
in the pname:minImageCount member of the sname:VkSurfaceCapabilitiesKHR
structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
for the surface
* [[VUID-VkSwapchainCreateInfoKHR-minImageCount-01272]]
pname:minImageCount must: be less than or equal to the value returned in
the pname:maxImageCount member of the sname:VkSurfaceCapabilitiesKHR
structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
for the surface if the returned pname:maxImageCount is not zero
ifdef::VK_KHR_shared_presentable_image[]
* [[VUID-VkSwapchainCreateInfoKHR-minImageCount-01383]]
pname:minImageCount must: be `1` if pname:presentMode is either
ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR
endif::VK_KHR_shared_presentable_image[]
* [[VUID-VkSwapchainCreateInfoKHR-imageFormat-01273]]
pname:imageFormat and pname:imageColorSpace must: match the pname:format
and pname:colorSpace members, respectively, of one of the
sname:VkSurfaceFormatKHR structures returned by
fname:vkGetPhysicalDeviceSurfaceFormatsKHR for the surface
* [[VUID-VkSwapchainCreateInfoKHR-imageExtent-01274]]
pname:imageExtent must: be between pname:minImageExtent and
pname:maxImageExtent, inclusive, where pname:minImageExtent and
pname:maxImageExtent are members of the sname:VkSurfaceCapabilitiesKHR
structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
for the surface
* [[VUID-VkSwapchainCreateInfoKHR-imageExtent-01689]]
pname:imageExtent members pname:width and pname:height must: both be
non-zero
* [[VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275]]
pname:imageArrayLayers must: be greater than `0` and less than or equal
to the pname:maxImageArrayLayers member of the
sname:VkSurfaceCapabilitiesKHR structure returned by
fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface
ifndef::VK_KHR_shared_presentable_image[]
* [[VUID-VkSwapchainCreateInfoKHR-imageUsage-01276]]
pname:imageUsage must: be a subset of the supported usage flags present
in the pname:supportedUsageFlags member of the
sname:VkSurfaceCapabilitiesKHR structure returned by
fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface
endif::VK_KHR_shared_presentable_image[]
ifdef::VK_KHR_shared_presentable_image[]
* [[VUID-VkSwapchainCreateInfoKHR-presentMode-01427]]
If pname:presentMode is ename:VK_PRESENT_MODE_IMMEDIATE_KHR,
ename:VK_PRESENT_MODE_MAILBOX_KHR, ename:VK_PRESENT_MODE_FIFO_KHR or
ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR, pname:imageUsage must: be a
subset of the supported usage flags present in the
pname:supportedUsageFlags member of the slink:VkSurfaceCapabilitiesKHR
structure returned by flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
for pname:surface
* [[VUID-VkSwapchainCreateInfoKHR-imageUsage-01384]]
If pname:presentMode is ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR
or ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, pname:imageUsage
must: be a subset of the supported usage flags present in the
pname:sharedPresentSupportedUsageFlags member of the
slink:VkSharedPresentSurfaceCapabilitiesKHR structure returned by
flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR for pname:surface
endif::VK_KHR_shared_presentable_image[]
* [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277]]
If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT,
pname:pQueueFamilyIndices must: be a valid pointer to an array of
pname:queueFamilyIndexCount basetype:uint32_t values
* [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278]]
If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT,
pname:queueFamilyIndexCount must: be greater than `1`
ifndef::VK_KHR_get_physical_device_properties2[]
* [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393]]
If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT, each
element of pname:pQueueFamilyIndices must: be unique and must: be less
than pname:pQueueFamilyPropertyCount returned by
flink:vkGetPhysicalDeviceQueueFamilyProperties for the
pname:physicalDevice that was used to create pname:device
endif::VK_KHR_get_physical_device_properties2[]
ifdef::VK_KHR_get_physical_device_properties2[]
* [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428]]
If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT, each
element of pname:pQueueFamilyIndices must: be unique and must: be less
than pname:pQueueFamilyPropertyCount returned by either
flink:vkGetPhysicalDeviceQueueFamilyProperties or
flink:vkGetPhysicalDeviceQueueFamilyProperties2KHR for the
pname:physicalDevice that was used to create pname:device
endif::VK_KHR_get_physical_device_properties2[]
* [[VUID-VkSwapchainCreateInfoKHR-preTransform-01279]]
pname:preTransform must: be one of the bits present in the
pname:supportedTransforms member of the sname:VkSurfaceCapabilitiesKHR
structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
for the surface
* [[VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280]]
pname:compositeAlpha must: be one of the bits present in the
pname:supportedCompositeAlpha member of the
sname:VkSurfaceCapabilitiesKHR structure returned by
fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface
* [[VUID-VkSwapchainCreateInfoKHR-presentMode-01281]]
pname:presentMode must: be one of the elink:VkPresentModeKHR values
returned by fname:vkGetPhysicalDeviceSurfacePresentModesKHR for the
surface
ifdef::VK_KHX_device_group[]
* [[VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429]]
If the logical device was created with
slink:VkDeviceGroupDeviceCreateInfoKHX::pname:physicalDeviceCount equal
to 1, pname:flags must: not contain
ename:VK_SWAPCHAIN_CREATE_BIND_SFR_BIT_KHX
endif::VK_KHX_device_group[]
* [[VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01674]]
pname:oldSwapchain must: not be in the retired state
****
include::../../validity/structs/VkSwapchainCreateInfoKHR.txt[]
--
[open,refpage='VkSwapchainCreateFlagBitsKHR',desc='Bitmask controlling swapchain creation',type='enums']
--
Bits which can: be set in slink:VkSwapchainCreateInfoKHR::pname:flags,
specifying parameters of swapchain creation, are:
include::../../api/enums/VkSwapchainCreateFlagBitsKHR.txt[]
ifdef::VK_KHX_device_group[]
* ename:VK_SWAPCHAIN_CREATE_BIND_SFR_BIT_KHX specifies that images created
from the swapchain (i.e. with the pname:swapchain member of
slink:VkImageSwapchainCreateInfoKHX set to this swapchain's handle)
must: use ename:VK_IMAGE_CREATE_BIND_SFR_BIT_KHX.
endif::VK_KHX_device_group[]
--
ifdef::VK_KHX_device_group[]
[open,refpage='VkDeviceGroupSwapchainCreateInfoKHX',desc='Structure specifying parameters of a newly created swapchain object',type='structs']
--
If the pname:pNext chain of slink:VkSwapchainCreateInfoKHR includes a
sname:VkDeviceGroupSwapchainCreateInfoKHX structure, then that structure
includes a set of device group present modes that the swapchain can: be used
with.
The sname:VkDeviceGroupSwapchainCreateInfoKHX structure is defined as:
include::../../api/structs/VkDeviceGroupSwapchainCreateInfoKHX.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:modes is a bitfield of modes that the swapchain can: be used with.
If this structure is not present, pname:modes is considered to be
ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX.
include::../../validity/structs/VkDeviceGroupSwapchainCreateInfoKHX.txt[]
--
endif::VK_KHX_device_group[]
ifdef::VK_EXT_display_control[]
include::../VK_EXT_display_control/swapchain_counters.txt[]
endif::VK_EXT_display_control[]
As mentioned above, if fname:vkCreateSwapchainKHR succeeds, it will return a
handle to a swapchain that contains an array of at least pname:minImageCount
presentable images.
While acquired by the application, presentable images can: be used in any
way that equivalent non-presentable images can: be used.
A presentable image is equivalent to a non-presentable image created with
the following sname:VkImageCreateInfo parameters:
[[swapchain-wsi-image-create-info]]
[options="header"]
|====
| sname:VkImageCreateInfo Field | Value
ifndef::VK_KHX_device_group[]
| pname:flags | 0
endif::VK_KHX_device_group[]
ifdef::VK_KHX_device_group[]
| pname:flags | ename:VK_IMAGE_CREATE_BIND_SFR_BIT_KHX if ename:VK_SWAPCHAIN_CREATE_BIND_SFR_BIT_KHX is set, else 0
endif::VK_KHX_device_group[]
| pname:imageType | ename:VK_IMAGE_TYPE_2D
| pname:format | `pCreateInfo->imageFormat`
| pname:extent | `{pCreateInfo->imageExtent.width, pCreateInfo->imageExtent.height, 1}`
| pname:mipLevels | 1
| pname:arrayLayers | `pCreateInfo->imageArrayLayers`
| pname:samples | ename:VK_SAMPLE_COUNT_1_BIT
| pname:tiling | ename:VK_IMAGE_TILING_OPTIMAL
| pname:usage | `pCreateInfo->imageUsage`
| pname:sharingMode | `pCreateInfo->imageSharingMode`
| pname:queueFamilyIndexCount | `pCreateInfo->queueFamilyIndexCount`
| pname:pQueueFamilyIndices | `pCreateInfo->pQueueFamilyIndices`
| pname:initialLayout | ename:VK_IMAGE_LAYOUT_UNDEFINED
|====
The pname:surface must: not be destroyed until after the swapchain is
destroyed.
If pname:oldSwapchain is not dlink:VK_NULL_HANDLE then pname:surface must:
be associated with pname:oldSwapchain.
Otherwise, the native window referred to by pname:surface must: not already
be associated with another swapchain, and must: not be already be associated
with a non-Vulkan graphics API surface.
The native window referred to by pname:surface must: not become associated
with a non-Vulkan graphics API surface before the swapchain has been
destroyed.
Like core functions, several WSI functions, including
fname:vkCreateSwapchainKHR return ename:VK_ERROR_DEVICE_LOST if the logical
device was lost.
See <<devsandqueues-lost-device,Lost Device>>.
As with most core objects, sname:VkSwapchainKHR is a child of the device and
is affected by the lost state; it must: be destroyed before destroying the
sname:VkDevice.
However, sname:VkSurfaceKHR is not a child of any sname:VkDevice and is not
otherwise affected by the lost device.
After successfully recreating a sname:VkDevice, the same sname:VkSurfaceKHR
can: be used to create a new sname:VkSwapchainKHR, provided the previous one
was destroyed.
[NOTE]
.Note
====
As mentioned in <<devsandqueues-lost-device,Lost Device>>, after a lost
device event, the sname:VkPhysicalDevice may: also be lost.
If other sname:VkPhysicalDevice are available, they can: be used together
with the same sname:VkSurfaceKHR to create the new sname:VkSwapchainKHR,
however the application must: query the surface capabilities again, because
they may: differ on a per-physical device basis.
====
[open,refpage='vkDestroySwapchainKHR',desc='Destroy a swapchain object',type='protos']
--
To destroy a swapchain object call:
include::../../api/protos/vkDestroySwapchainKHR.txt[]
* pname:device is the sname:VkDevice associated with pname:swapchain.
* pname:swapchain is the swapchain to destroy.
* pname:pAllocator is the allocator used for host memory allocated for the
swapchain object when there is no more specific allocator available (see
<<memory-allocation,Memory Allocation>>).
The application must: not destroy a swapchain until after completion of all
outstanding operations on images that were acquired from the swapchain.
pname:swapchain and all associated sname:VkImage handles are destroyed, and
must: not be acquired or used any more by the application.
The memory of each sname:VkImage will only be freed after that image is no
longer used by the presentation engine.
For example, if one image of the swapchain is being displayed in a window,
the memory for that image may: not be freed until the window is destroyed,
or another swapchain is created for the window.
Destroying the swapchain does not invalidate the parent sname:VkSurfaceKHR,
and a new swapchain can: be created with it.
ifdef::VK_KHR_display_swapchain[]
include::../VK_KHR_display_swapchain/destroy_swapchain_interactions.txt[]
endif::VK_KHR_display_swapchain[]
.Valid Usage
****
* [[VUID-vkDestroySwapchainKHR-swapchain-01282]]
All uses of presentable images acquired from pname:swapchain must: have
completed execution
* [[VUID-vkDestroySwapchainKHR-swapchain-01283]]
If sname:VkAllocationCallbacks were provided when pname:swapchain was
created, a compatible set of callbacks must: be provided here
* [[VUID-vkDestroySwapchainKHR-swapchain-01284]]
If no sname:VkAllocationCallbacks were provided when pname:swapchain was
created, pname:pAllocator must: be `NULL`
****
include::../../validity/protos/vkDestroySwapchainKHR.txt[]
--
ifdef::VK_KHR_display_swapchain[]
include::../VK_KHR_display_swapchain/create_shared_swapchains.txt[]
endif::VK_KHR_display_swapchain[]
[open,refpage='vkGetSwapchainImagesKHR',desc='Obtain the array of presentable images associated with a swapchain',type='protos']
--
To obtain the array of presentable images associated with a swapchain, call:
include::../../api/protos/vkGetSwapchainImagesKHR.txt[]
* pname:device is the device associated with pname:swapchain.
* pname:swapchain is the swapchain to query.
* pname:pSwapchainImageCount is a pointer to an integer related to the
number of presentable images available or queried, as described below.
* pname:pSwapchainImages is either `NULL` or a pointer to an array of
sname:VkImage handles.
If pname:pSwapchainImages is `NULL`, then the number of presentable images
for pname:swapchain is returned in pname:pSwapchainImageCount.
Otherwise, pname:pSwapchainImageCount must: point to a variable set by the
user to the number of elements in the pname:pSwapchainImages array, and on
return the variable is overwritten with the number of structures actually
written to pname:pSwapchainImages.
If the value of pname:pSwapchainImageCount is less than the number of
presentable images for pname:swapchain, at most pname:pSwapchainImageCount
structures will be written.
If pname:pSwapchainImageCount is smaller than the number of presentable
images for pname:swapchain, ename:VK_INCOMPLETE will be returned instead of
ename:VK_SUCCESS to indicate that not all the available values were
returned.
include::../../validity/protos/vkGetSwapchainImagesKHR.txt[]
--
[NOTE]
.Note
====
By knowing all presentable images used in the swapchain, the application
can: create command buffers that reference these images prior to entering
its main rendering loop.
====
The implementation will have already allocated and bound the memory backing
the sname:VkImages returned by fname:vkGetSwapchainImagesKHR.
The memory for each image will not alias with the memory for other images or
with any sname:VkDeviceMemory object.
As such, performing any operation affecting the binding of memory to a
presentable image results in undefined behavior.
All presentable images are initially in the ename:VK_IMAGE_LAYOUT_UNDEFINED
layout, thus before using presentable images, the application must:
transition them to a valid layout for the intended use.
Further, the lifetime of presentable images is controlled by the
implementation so destroying a presentable image with flink:vkDestroyImage
results in undefined behavior.
See flink:vkDestroySwapchainKHR for further details on the lifetime of
presentable images.
ifdef::VK_KHX_device_group[]
Images can: also be created by using flink:vkCreateImage with
slink:VkImageSwapchainCreateInfoKHX and bound to swapchain memory using
flink:vkBindImageMemory2KHR with slink:VkBindImageMemorySwapchainInfoKHX.
These images can: be used anywhere swapchain images are used, and are useful
in logical devices with multiple physical devices to create peer memory
bindings of swapchain memory.
These images and bindings have no effect on what memory is presented.
Unlike images retrieved from fname:vkGetSwapchainImagesKHR, these images
must: be destroyed with flink:vkDestroyImage.
endif::VK_KHX_device_group[]
[open,refpage='vkAcquireNextImageKHR',desc='Retrieve the index of the next available presentable image',type='protos']
--
To acquire an available presentable image to use, and retrieve the index of
that image, call:
include::../../api/protos/vkAcquireNextImageKHR.txt[]
* pname:device is the device associated with pname:swapchain.
* pname:swapchain is the non-retired swapchain from which an image is
being acquired.
* pname:timeout indicates how long the function waits, in nanoseconds, if
no image is available.
* pname:semaphore is dlink:VK_NULL_HANDLE or a semaphore to signal.
* pname:fence is dlink:VK_NULL_HANDLE or a fence to signal.
* pname:pImageIndex is a pointer to a code:uint32_t that is set to the
index of the next image to use (i.e. an index into the array of images
returned by fname:vkGetSwapchainImagesKHR).
.Valid Usage
****
* [[VUID-vkAcquireNextImageKHR-swapchain-01285]]
pname:swapchain must: not be in the retired state
* [[VUID-vkAcquireNextImageKHR-semaphore-01286]]
If pname:semaphore is not dlink:VK_NULL_HANDLE it must: be unsignaled
* If pname:semaphore is not dlink:VK_NULL_HANDLE it must: not have any
uncompleted signal or wait operations pending
* [[VUID-vkAcquireNextImageKHR-fence-01287]]
If pname:fence is not dlink:VK_NULL_HANDLE it must: be unsignaled and
must: not be associated with any other queue command that has not yet
completed execution on that queue
* pname:semaphore and pname:fence must: not both be equal to
dlink:VK_NULL_HANDLE
****
include::../../validity/protos/vkAcquireNextImageKHR.txt[]
--
When successful, fname:vkAcquireNextImageKHR acquires a presentable image
that the application can: use, and sets pname:pImageIndex to the index of
that image.
The presentation engine may: not have finished reading from the image at the
time it is acquired, so the application must: use pname:semaphore and/or
pname:fence to ensure that the image layout and contents are not modified
until the presentation engine reads have completed.
As mentioned above, the presentation engine controls the order in which
presentable images are made available to the application.
This allows the platform to handle special situations.
The order in which images are acquired is implementation-dependent.
Images may: be acquired in a seemingly random order that is not a simple
round-robin.
If a swapchain has enough presentable images, applications can: acquire
multiple images without an intervening fname:vkQueuePresentKHR.
Applications can: present images in a different order than the order in
which they were acquired.
If pname:timeout is 0, fname:vkAcquireNextImageKHR will not block, but will
either succeed or return ename:VK_NOT_READY.
If pname:timeout is `UINT64_MAX`, the function will not return until an
image is acquired from the presentation engine.
Other values for pname:timeout will cause the function to return when an
image becomes available, or when the specified number of nanoseconds have
passed (in which case it will return ename:VK_TIMEOUT).
An error can: also cause fname:vkAcquireNextImageKHR to return early.
[NOTE]
.Note
====
As mentioned above, the presentation engine may: be asynchronous with
respect to the application and/or logical device.
fname:vkAcquireNextImageKHR may: return as soon as it can: identify which
image will be acquired, and can: guarantee that pname:semaphore and
pname:fence will be signaled by the presentation engine; and may: not
successfully return sooner.
The application uses pname:timeout to specify how long
fname:vkAcquireNextImageKHR waits for an image to become acquired.
====
Applications cannot: rely on fname:vkAcquireNextImageKHR blocking in order
to meter their rendering speed.
Various factors can: interrupt fname:vkAcquireNextImageKHR from blocking.
[NOTE]
.Note
====
For example, if an error occurs, fname:vkAcquireNextImageKHR may: return
even though no image is available.
As another example, some presentation engines are able to enqueue an
unbounded number of presentation and acquire next image operations such that
fname:vkAcquireNextImageKHR never needs to wait for completion of
outstanding present operations before returning.
====
The availability of presentable images is influenced by factors such as the
implementation of the presentation engine, the elink:VkPresentModeKHR being
used, the number of images in the swapchain, the number of images that the
application has acquired at any given time, and the performance of the
application.
The value of sname:VkSurfaceCapabilitiesKHR::pname:minImageCount indicates
how many images must: be in the swapchain in order for
fname:vkAcquireNextImageKHR to acquire an image if the application currently
has no acquired images.
Let _n_ be the total number of images in the swapchain, _m_ be the value of
sname:VkSurfaceCapabilitiesKHR::pname:minImageCount, and _a_ be the number
of presentable images that the application has currently acquired (i.e.
images acquired with fname:vkAcquireNextImageKHR, but not yet presented with
fname:vkQueuePresentKHR).
fname:vkAcquireNextImageKHR can: always succeed if [eq]#a {leq} n - m# at
the time fname:vkAcquireNextImageKHR is called.
fname:vkAcquireNextImageKHR should: not be called if [eq]#a > n - m# with a
pname:timeout of code:UINT64_MAX; in such a case,
fname:vkAcquireNextImageKHR may: block indefinitely.
[NOTE]
.Note
====
For example, if the pname:minImageCount member of
sname:VkSurfaceCapabilitiesKHR is 2, and the application creates a swapchain
with 2 presentable images, the application can: acquire one image, and must:
present it before trying to acquire another image.
If we modify this example so that the application wishes to acquire up to 3
presentable images simultaneously, it must: request a minimum image count of
4 when creating the swapchain.
====
If pname:semaphore is not dlink:VK_NULL_HANDLE, the semaphore must: be
unsignaled and not have any uncompleted signal or wait operations pending.
It will become signaled when the application can: use the image.
Queue operations that access the image contents must: wait until the
semaphore signals; typically applications should: include the semaphore in
the pname:pWaitSemaphores list for the queue submission that transitions the
image away from the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout.
Use of the semaphore allows rendering operations to be recorded and
submitted before the presentation engine has completed its use of the image.
If pname:fence is not equal to dlink:VK_NULL_HANDLE, the fence must: be
unsignaled and not have any uncompleted signal operations pending.
It will become signaled when the application can: use the image.
Applications can: use this to meter their frame generation work to match the
presentation rate.
An application must: wait until either the pname:semaphore or pname:fence is
signaled before using the presentable image.
[NOTE]
.Note
====
Use of a non-zero pname:timeout is independent from the need for the
application to synchronize access to the acquired image through use of
pname:semaphore and/or pname:fence.
====
pname:semaphore and pname:fence may: already be signaled when
flink:vkAcquireNextImageKHR returns, if the image is being acquired for the
first time, or if the presentable image is immediately ready for use.
A successful call to fname:vkAcquireNextImageKHR counts as a signal
operation on pname:semaphore for the purposes of queue forward-progress
requirements.
The semaphore is guaranteed to signal, so a wait operation can: be queued
for the semaphore without risk of deadlock.
The application must: ensure that the image layout transition happens-after
pname:semaphore is signalled by fname:vkAcquireNextImageKHR.
[NOTE]
.Note
====
When the presentable image will be accessed by some stage [eq]#S#, the
recommended idiom for ensuring the semaphore signals before the transition
occurs is:
* The slink:VkSubmitInfo used to submit the image layout transition for
execution includes pname:semaphore in its pname:pWaitSemaphores member,
with the corresponding element of pname:pWaitDstStageMask including
[eq]#S#.
* The <<synchronization, synchronization command>> that performs the image
layout transition includes [eq]#S# in both the pname:srcStageMask and
pname:dstStageMask.
This will ensure that the image layout transition happens-after [eq]#S#.
====
After a successful return, the image indicated by pname:pImageIndex will
still be in the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout if it was
previously presented, or in the ename:VK_IMAGE_LAYOUT_UNDEFINED layout if
this is the first time it has been acquired.
[NOTE]
.Note
====
Exclusive ownership of presentable images corresponding to a swapchain
created with ename:VK_SHARING_MODE_EXCLUSIVE as defined in
<<resources-sharing,Resource Sharing>> is not altered by a call to
fname:vkAcquireNextImageKHR.
That means upon the first acquisition from such a swapchain presentable
images are not owned by any queue family, while at subsequent acquisitions
the presentable images remain owned by the queue family the image was
previously presented on.
====
The possible return values for fname:vkAcquireNextImageKHR depend on the
pname:timeout provided:
* ename:VK_SUCCESS is returned if an image became available.
* ename:VK_ERROR_SURFACE_LOST_KHR if the surface becomes no longer
available.
* ename:VK_NOT_READY is returned if pname:timeout is zero and no image was
available.
* ename:VK_TIMEOUT is returned if pname:timeout is greater than zero and
less than `UINT64_MAX`, and no image became available within the time
allowed.
* ename:VK_SUBOPTIMAL_KHR is returned if an image became available, and
the swapchain no longer matches the surface properties exactly, but can:
still be used to present to the surface successfully.
[NOTE]
.Note
====
This may: happen, for example, if the platform surface has been resized but
the platform is able to scale the presented images to the new size to
produce valid surface updates.
It is up to the application to decide whether it prefers to continue using
the current swapchain indefinitely or temporarily in this state, or to
re-create the swapchain to better match the platform surface properties.
====
* ename:VK_ERROR_OUT_OF_DATE_KHR is returned if the surface has changed in
such a way that it is no longer compatible with the swapchain, and
further presentation requests using the swapchain will fail.
Applications must: query the new surface properties and recreate their
swapchain if they wish to continue presenting to the surface.
If the native surface and presented image sizes no longer match,
presentation may: fail.
If presentation does succeed, parts of the native surface may: be undefined,
parts of the presented image may: have been clipped before presentation,
and/or the image may: have been scaled (uniformly or not uniformly) before
presentation.
It is the application's responsibility to detect surface size changes and
react appropriately.
If presentation fails because of a mismatch in the surface and presented
image sizes, a ename:VK_ERROR_OUT_OF_DATE_KHR error will be returned.
Before an application can: present an image, the image's layout must: be
transitioned to the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
ifdef::VK_KHR_shared_presentable_image[]
layout, or for a shared presentable image the
ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
endif::VK_KHR_shared_presentable_image[]
layout.
.Note
[NOTE]
====
When transitioning the image to
ifdef::VK_KHR_shared_presentable_image[]
ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
endif::VK_KHR_shared_presentable_image[]
ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, there is no need to delay subsequent
processing, or perform any visibility operations (as flink:vkQueuePresentKHR
performs automatic visibility operations).
To achieve this, the pname:dstAccessMask member of the
slink:VkImageMemoryBarrier should: be set to `0`, and the pname:dstStageMask
parameter should: be set to ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT.
====
ifdef::VK_KHX_device_group[]
[open,refpage='vkAcquireNextImage2KHX',desc='Retrieve the index of the next available presentable image',type='protos']
--
To acquire an available presentable image to use, and retrieve the index of
that image, call:
include::../../api/protos/vkAcquireNextImage2KHX.txt[]
* pname:device is the device associated with pname:swapchain.
* pname:pAcquireInfo is a pointer to a structure of type
slink:VkAcquireNextImageInfoKHX containing parameters of the acquire.
* pname:pImageIndex is a pointer to a code:uint32_t that is set to the
index of the next image to use.
include::../../validity/protos/vkAcquireNextImage2KHX.txt[]
--
[open,refpage='VkAcquireNextImageInfoKHX',desc='Structure specifying parameters of the acquire',type='structs']
--
The sname:VkAcquireNextImageInfoKHX structure is defined as:
include::../../api/structs/VkAcquireNextImageInfoKHX.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:swapchain is a non-retired swapchain from which an image is
acquired.
* pname:timeout indicates how long the function waits, in nanoseconds, if
no image is available.
* pname:semaphore is code:VK_NULL_HANDLE or a semaphore to signal.
* pname:fence is code:VK_NULL_HANDLE or a fence to signal.
* pname:deviceMask is a mask of physical devices for which the swapchain
image will be ready to use when the semaphore or fence is signaled.
If flink:vkAcquireNextImageKHR is used, the device mask is considered to
include all physical devices in the logical device.
[NOTE]
.Note
====
flink:vkAcquireNextImage2KHX signals at most one semaphore, even if the
application requests waiting for multiple physical devices to be ready via
the pname:deviceMask.
However, only a single physical device can: wait on that semaphore, since
the semaphore becomes unsignaled when the wait succeeds.
For other physical devices to wait for the image to be ready, it is
necessary for the application to submit semaphore signal operation(s) to
that first physical device to signal additional semaphore(s) after the wait
succeeds, which the other physical device(s) can: wait upon.
====
.Valid Usage
****
* [[VUID-VkAcquireNextImageInfoKHX-swapchain-01675]]
pname:swapchain must: not be in the retired state
* [[VUID-VkAcquireNextImageInfoKHX-semaphore-01288]]
If pname:semaphore is not dlink:VK_NULL_HANDLE it must: be unsignaled
* If pname:semaphore is not dlink:VK_NULL_HANDLE it must: not have any
uncompleted signal or wait operations pending
* [[VUID-VkAcquireNextImageInfoKHX-fence-01289]]
If pname:fence is not dlink:VK_NULL_HANDLE it must: be unsignaled and
must: not be associated with any other queue command that has not yet
completed execution on that queue
* pname:semaphore and pname:fence must: not both be equal to
dlink:VK_NULL_HANDLE
* [[VUID-VkAcquireNextImageInfoKHX-deviceMask-01290]]
pname:deviceMask must: be a valid device mask
* [[VUID-VkAcquireNextImageInfoKHX-deviceMask-01291]]
pname:deviceMask must: not be zero
****
include::../../validity/structs/VkAcquireNextImageInfoKHX.txt[]
--
endif::VK_KHX_device_group[]
[open,refpage='vkQueuePresentKHR',desc='Queue an image for presentation',type='protos']
--
After queueing all rendering commands and transitioning the image to the
correct layout, to queue an image for presentation, call:
include::../../api/protos/vkQueuePresentKHR.txt[]
* pname:queue is a queue that is capable of presentation to the target
surface's platform on the same device as the image's swapchain.
* pname:pPresentInfo is a pointer to an instance of the
slink:VkPresentInfoKHR structure specifying the parameters of the
presentation.
.Valid Usage
****
* [[VUID-vkQueuePresentKHR-pSwapchains-01292]]
Each element of pname:pSwapchains member of pname:pPresentInfo must: be
a swapchain that is created for a surface for which presentation is
supported from pname:queue as determined using a call to
fname:vkGetPhysicalDeviceSurfaceSupportKHR
ifdef::VK_KHR_display_swapchain[]
* [[VUID-vkQueuePresentKHR-pSwapchains-01293]]
If more than one member of pname:pSwapchains was created from a display
surface, all display surfaces referenced that refer to the same display
must: use the same display mode
endif::VK_KHR_display_swapchain[]
* [[VUID-vkQueuePresentKHR-pWaitSemaphores-01294]]
When a semaphore unsignal operation defined by the elements of the
pname:pWaitSemaphores member of pname:pPresentInfo executes on
pname:queue, no other queue must: be waiting on the same semaphore.
* [[VUID-vkQueuePresentKHR-pWaitSemaphores-01295]]
All elements of the pname:pWaitSemaphores member of pname:pPresentInfo
must: be semaphores that are signaled, or have
<<synchronization-semaphores-signaling, semaphore signal operations>>
previously submitted for execution.
****
Any writes to memory backing the images referenced by the
pname:pImageIndices and pname:pSwapchains members of pname:pPresentInfo,
that are available before flink:vkQueuePresentKHR is executed, are
automatically made visible to the read access performed by the presentation
engine.
This automatic visibility operation for an image happens-after the semaphore
signal operation, and happens-before the presentation engine accesses the
image.
include::../../validity/protos/vkQueuePresentKHR.txt[]
--
[open,refpage='VkPresentInfoKHR',desc='Structure describing parameters of a queue presentation',type='structs']
--
The sname:VkPresentInfoKHR structure is defined as:
include::../../api/structs/VkPresentInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:waitSemaphoreCount is the number of semaphores to wait for before
issuing the present request.
The number may: be zero.
* pname:pWaitSemaphores, if not `NULL`, is an array of sname:VkSemaphore
objects with pname:waitSemaphoreCount entries, and specifies the
semaphores to wait for before issuing the present request.
* pname:swapchainCount is the number of swapchains being presented to by
this command.
* pname:pSwapchains is an array of sname:VkSwapchainKHR objects with
pname:swapchainCount entries.
A given swapchain must: not appear in this list more than once.
* pname:pImageIndices is an array of indices into the array of each
swapchain's presentable images, with pname:swapchainCount entries.
Each entry in this array identifies the image to present on the
corresponding entry in the pname:pSwapchains array.
* pname:pResults is an array of elink:VkResult typed elements with
pname:swapchainCount entries.
Applications that do not need per-swapchain results can: use `NULL` for
pname:pResults.
If non-`NULL`, each entry in pname:pResults will be set to the
elink:VkResult for presenting the swapchain corresponding to the same
index in pname:pSwapchains.
.Valid Usage
****
ifndef::VK_KHR_shared_presentable_image[]
* [[VUID-VkPresentInfoKHR-pImageIndices-01296]]
Each element of pname:pImageIndices must: be the index of a presentable
image acquired from the swapchain specified by the corresponding element
of the pname:pSwapchains array, and the presented image subresource
must: be in the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout at the time
the operation is executed on a sname:VkDevice
endif::VK_KHR_shared_presentable_image[]
ifdef::VK_KHR_shared_presentable_image[]
* [[VUID-VkPresentInfoKHR-pImageIndices-01430]]
Each element of pname:pImageIndices must: be the index of a presentable
image acquired from the swapchain specified by the corresponding element
of the pname:pSwapchains array, and the presented image subresource
must: be in the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or
ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR layout at the time the
operation is executed on a sname:VkDevice
endif::VK_KHR_shared_presentable_image[]
****
include::../../validity/structs/VkPresentInfoKHR.txt[]
--
ifdef::VK_KHR_incremental_present[]
include::../VK_KHR_incremental_present/wsi.txt[]
endif::VK_KHR_incremental_present[]
ifdef::VK_KHR_display_swapchain[]
include::../VK_KHR_display_swapchain/display_swapchain_present.txt[]
endif::VK_KHR_display_swapchain[]
ifdef::VK_KHX_device_group[]
[open,refpage='VkDeviceGroupPresentInfoKHX',desc='Mode and mask controlling which physical devices\' images are presented',type='structs']
--
If the pname:pNext chain of slink:VkPresentInfoKHR includes a
sname:VkDeviceGroupPresentInfoKHX structure, then that structure includes an
array of device masks and a device group present mode.
The sname:VkDeviceGroupPresentInfoKHX structure is defined as:
include::../../api/structs/VkDeviceGroupPresentInfoKHX.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:swapchainCount is zero or the number of elements in
pname:pDeviceMasks.
* pname:pDeviceMasks is an array of device masks, one for each element of
slink:VkPresentInfoKHR::pSwapchains.
* pname:mode is the device group present mode that will be used for this
present.
If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX, then each
element of pname:pDeviceMasks selects which instance of the swapchain image
is presented.
Each element of pname:pDeviceMasks must: have exactly one bit set, and the
corresponding physical device must: have a presentation engine as reported
by slink:VkDeviceGroupPresentCapabilitiesKHX.
If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX, then
each element of pname:pDeviceMasks selects which instance of the swapchain
image is presented.
Each element of pname:pDeviceMasks must: have exactly one bit set, and some
physical device in the logical device must: include that bit in its
slink:VkDeviceGroupPresentCapabilitiesKHX::pname:presentMask.
If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX, then each
element of pname:pDeviceMasks selects which instances of the swapchain image
are component-wise summed and the sum of those images is presented.
If the sum in any component is outside the representable range, the value of
that component is undefined.
Each element of pname:pDeviceMasks must: have a value for which all set bits
are set in one of the elements of
slink:VkDeviceGroupPresentCapabilitiesKHX::pname:presentMask.
If pname:mode is
ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX, then each
element of pname:pDeviceMasks selects which instance(s) of the swapchain
images are presented.
For each bit set in each element of pname:pDeviceMasks, the corresponding
physical device must: have a presentation engine as reported by
slink:VkDeviceGroupPresentCapabilitiesKHX.
If sname:VkDeviceGroupPresentInfoKHX is not provided or pname:swapchainCount
is zero then the masks are considered to be `1`.
If sname:VkDeviceGroupPresentInfoKHX is not provided, pname:mode is
considered to be ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX.
.Valid Usage
****
* [[VUID-VkDeviceGroupPresentInfoKHX-swapchainCount-01297]]
pname:swapchainCount must: equal `0` or
slink:VkPresentInfoKHR::pname:swapchainCount
* [[VUID-VkDeviceGroupPresentInfoKHX-mode-01298]]
If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX, then
each element of pname:pDeviceMasks must: have exactly one bit set, and
the corresponding element of
slink:VkDeviceGroupPresentCapabilitiesKHX::pname:presentMask must: be
non-zero
* [[VUID-VkDeviceGroupPresentInfoKHX-mode-01299]]
If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX, then
each element of pname:pDeviceMasks must: have exactly one bit set, and
some physical device in the logical device must: include that bit in its
slink:VkDeviceGroupPresentCapabilitiesKHX::pname:presentMask.
* [[VUID-VkDeviceGroupPresentInfoKHX-mode-01300]]
If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX, then
each element of pname:pDeviceMasks must: have a value for which all set
bits are set in one of the elements of
slink:VkDeviceGroupPresentCapabilitiesKHX::pname:presentMask
* [[VUID-VkDeviceGroupPresentInfoKHX-mode-01301]]
If pname:mode is
ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX, then for
each bit set in each element of pname:pDeviceMasks, the corresponding
element of slink:VkDeviceGroupPresentCapabilitiesKHX::pname:presentMask
must: be non-zero
* [[VUID-VkDeviceGroupPresentInfoKHX-pDeviceMasks-01302]]
The value of each element of pname:pDeviceMasks must: be equal to the
device mask passed in slink:VkAcquireNextImageInfoKHX::pname:deviceMask
when the image index was last acquired
* [[VUID-VkDeviceGroupPresentInfoKHX-mode-01303]]
pname:mode must: have exactly one bit set, and that bit must: have been
included in slink:VkDeviceGroupSwapchainCreateInfoKHX::pname:modes
****
include::../../validity/structs/VkDeviceGroupPresentInfoKHX.txt[]
--
endif::VK_KHX_device_group[]
ifdef::VK_GOOGLE_display_timing[]
include::../VK_GOOGLE_display_timing/PresentTimeInfo.txt[]
endif::VK_GOOGLE_display_timing[]
fname:vkQueuePresentKHR, releases the acquisition of the images referenced
by pname:imageIndices.
The queue family corresponding to the queue fname:vkQueuePresentKHR is
executed on must: have ownership of the presented images as defined in
<<resources-sharing,Resource Sharing>>.
fname:vkQueuePresentKHR does not alter the queue family ownership, but the
presented images must: not be used again before they have been reacquired
using fname:vkAcquireNextImageKHR.
The processing of the presentation happens in issue order with other queue
operations, but semaphores have to be used to ensure that prior rendering
and other commands in the specified queue complete before the presentation
begins.
The presentation command itself does not delay processing of subsequent
commands on the queue, however, presentation requests sent to a particular
queue are always performed in order.
Exact presentation timing is controlled by the semantics of the presentation
engine and native platform in use.
ifdef::VK_KHR_display_swapchain[]
include::../VK_KHR_display_swapchain/queue_present_interactions.txt[]
endif::VK_KHR_display_swapchain[]
The result codes ename:VK_ERROR_OUT_OF_DATE_KHR and ename:VK_SUBOPTIMAL_KHR
have the same meaning when returned by fname:vkQueuePresentKHR as they do
when returned by fname:vkAcquireNextImageKHR.
If multiple swapchains are presented, the result code is determined applying
the following rules in order:
* If the device is lost, ename:VK_ERROR_DEVICE_LOST is returned.
* If any of the target surfaces are no longer available the error
ename:VK_ERROR_SURFACE_LOST_KHR is returned.
* If any of the presents would have a result of
ename:VK_ERROR_OUT_OF_DATE_KHR if issued separately then
ename:VK_ERROR_OUT_OF_DATE_KHR is returned.
* If any of the presents would have a result of ename:VK_SUBOPTIMAL_KHR if
issued separately then ename:VK_SUBOPTIMAL_KHR is returned.
* Otherwise ename:VK_SUCCESS is returned.
Presentation is a read-only operation that will not affect the content of
the presentable images.
Upon reacquiring the image and transitioning it away from the
ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout, the contents will be the same
as they were prior to transitioning the image to the present source layout
and presenting it.
However, if a mechanism other than Vulkan is used to modify the platform
window associated with the swapchain, the content of all presentable images
in the swapchain becomes undefined.
[NOTE]
.Note
====
The application can: continue to present any acquired images from a retired
swapchain as long as the swapchain has not entered a state that causes
flink:vkQueuePresentKHR to return ename:VK_ERROR_OUT_OF_DATE_KHR.
====
ifdef::VK_EXT_hdr_metadata[]
include::../VK_EXT_hdr_metadata.txt[]
endif::VK_EXT_hdr_metadata[]