// Copyright 2014-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

If a swapchain is created with pname:presentMode set to either
ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, a single presentable
image can: be acquired, referred to as a shared presentable image.
A shared presentable image may: be concurrently accessed by the application
and the presentation engine, without transitioning the image's layout after
it is initially presented.

  * With ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR, the presentation
    engine is only required to update to the latest contents of a shared
    presentable image after a present.
    The application must: call fname:vkQueuePresentKHR to guarantee an
    update.
    However, the presentation engine may: update from it at any time.
  * With ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, the
    presentation engine will automatically present the latest contents of a
    shared presentable image during every refresh cycle.
    The application is only required to make one initial call to
    fname:vkQueuePresentKHR, after which the presentation engine will update
    from it without any need for further present calls.
    The application can: indicate the image contents have been updated by
    calling fname:vkQueuePresentKHR, but this does not guarantee the timing
    of when updates will occur.

The presentation engine may: access a shared presentable image at any time
after it is first presented.
To avoid tearing, an application should: coordinate access with the
presentation engine.
This requires presentation engine timing information through
platform-specific mechanisms and ensuring that color attachment writes are
made available during the portion of the presentation engine’s refresh cycle
they are intended for.

[NOTE]
.Note
====
The `VK_KHR_shared_presentable_image` extension does not provide
functionality for determining the timing of the presentation engine's
refresh cycles.
====

[open,refpage='vkGetSwapchainStatusKHR',desc='Get a swapchain\'s status',type='protos']
--
In order to query a swapchain's status when rendering to a shared
presentable image, call:
include::{generated}/api/protos/vkGetSwapchainStatusKHR.txt[]

  * pname:device is the device associated with pname:swapchain.
  * pname:swapchain is the swapchain to query.

include::{generated}/validity/protos/vkGetSwapchainStatusKHR.txt[]
--

The possible return values for fname:vkGetSwapchainStatusKHR should: be
interpreted as follows:

  * ename:VK_SUCCESS specifies the presentation engine is presenting the
    contents of the shared presentable image, as per the swapchain's
    elink:VkPresentModeKHR.
  * ename:VK_SUBOPTIMAL_KHR the swapchain no longer matches the surface
    properties exactly, but the presentation engine is presenting the
    contents of the shared presentable image, as per the swapchain's
    elink:VkPresentModeKHR.
  * ename:VK_ERROR_OUT_OF_DATE_KHR the surface has changed in such a way
    that it is no longer compatible with the swapchain.
  * ename:VK_ERROR_SURFACE_LOST_KHR the surface is no longer available.

[NOTE]
.Note
====
The swapchain state may: be cached by implementations, so applications
should: regularly call fname:vkGetSwapchainStatusKHR when using a swapchain
with elink:VkPresentModeKHR set to
ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR.
====


