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

include::{generated}/meta/{refprefix}VK_KHR_shared_presentable_image.txt[]

=== Other Extension Metadata

*Last Modified Date*::
    2017-03-20
*IP Status*::
    No known IP claims.
*Contributors*::
  - Alon Or-bach, Samsung Electronics
  - Ian Elliott, Google
  - Jesse Hall, Google
  - Pablo Ceballos, Google
  - Chris Forbes, Google
  - Jeff Juliano, NVIDIA
  - James Jones, NVIDIA
  - Daniel Rakos, AMD
  - Tobias Hector, Imagination Technologies
  - Graham Connor, Imagination Technologies
  - Michael Worcester, Imagination Technologies
  - Cass Everitt, Oculus
  - Johannes Van Waveren, Oculus

=== Description

This extension extends `apiext:VK_KHR_swapchain` to enable creation of a
shared presentable image.
This allows the application to use the image while the presention engine is
accessing it, in order to reduce the latency between rendering and
presentation.

include::{generated}/interfaces/VK_KHR_shared_presentable_image.txt[]

=== Issues

1) Should we allow a Vulkan WSI swapchain to toggle between normal usage and
shared presentation usage?

*RESOLVED*: No.
WSI swapchains are typically recreated with new properties instead of having
their properties changed.
This can also save resources, assuming that fewer images are needed for
shared presentation, and assuming that most VR applications do not need to
switch between normal and shared usage.

2) Should we have a query for determining how the presentation engine
refresh is triggered?

*RESOLVED*: Yes.
This is done via which presentation modes a surface supports.

3) Should the object representing a shared presentable image be an extension
of a slink:VkSwapchainKHR or a separate object?

*RESOLVED*: Extension of a swapchain due to overlap in creation properties
and to allow common functionality between shared and normal presentable
images and swapchains.

4) What should we call the extension and the new structures it creates?

*RESOLVED*: Shared presentable image / shared present.

5) Should the pname:minImageCount and pname:presentMode values of the
slink:VkSwapchainCreateInfoKHR be ignored, or required to be compatible
values?

*RESOLVED*: pname:minImageCount must be set to 1, and pname:presentMode
should be set to either ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR.

6) What should the layout of the shared presentable image be?

*RESOLVED*: After acquiring the shared presentable image, the application
must transition it to the ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR layout
prior to it being used.
After this initial transition, any image usage that was requested during
swapchain creation can: be performed on the image without layout transitions
being performed.

7) Do we need a new API for the trigger to refresh new content?

*RESOLVED*: flink:vkQueuePresentKHR to act as API to trigger a refresh, as
will allow combination with other compatible extensions to
flink:vkQueuePresentKHR.

8) How should an application detect a ename:VK_ERROR_OUT_OF_DATE_KHR error
on a swapchain using the ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR
present mode?

*RESOLVED*: Introduce flink:vkGetSwapchainStatusKHR to allow applications to
query the status of a swapchain using a shared presentation mode.

9) What should subsequent calls to flink:vkQueuePresentKHR for
ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR swapchains be defined to
do?

*RESOLVED*: State that implementations may use it as a hint for updated
content.

10) Can the ownership of a shared presentable image be transferred to a
different queue?

*RESOLVED*: No.
It is not possible to transfer ownership of a shared presentable image
obtained from a swapchain created using ename:VK_SHARING_MODE_EXCLUSIVE
after it has been presented.

11) How should flink:vkQueueSubmit behave if a command buffer uses an image
from a ename:VK_ERROR_OUT_OF_DATE_KHR swapchain?

*RESOLVED*: flink:vkQueueSubmit is expected to return the
ename:VK_ERROR_DEVICE_LOST error.

12) Can Vulkan provide any guarantee on the order of rendering, to enable
beam chasing?

*RESOLVED*: This could be achieved via use of render passes to ensure strip
rendering.


=== Version History
 * Revision 1, 2017-03-20 (Alon Or-bach)
   - Internal revisions
