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

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

=== Other Extension Metadata

*Last Modified Date*::
    2016-11-02
*IP Status*::
    No known IP claims.
*Contributors*::
  - Ian Elliott, Google
  - Jesse Hall, Google
  - Alon Or-bach, Samsung
  - James Jones, NVIDIA
  - Daniel Rakos, AMD
  - Ray Smith, ARM
  - Mika Isojarvi, Google
  - Jeff Juliano, NVIDIA
  - Jeff Bolz, NVIDIA

=== Description

This device extension extends flink:vkQueuePresentKHR, from the
`<<VK_KHR_swapchain>>` extension, allowing an application to specify a list
of rectangular, modified regions of each image to present.
This should be used in situations where an application is only changing a
small portion of the presentable images within a swapchain, since it enables
the presentation engine to avoid wasting time presenting parts of the
surface that have not changed.

This extension is leveraged from the `EGL_KHR_swap_buffers_with_damage`
extension.

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

=== Issues

1) How should we handle steroescopic-3D swapchains? We need to add a layer
for each rectangle.
One approach is to create another struct containing the slink:VkRect2D plus
layer, and have slink:VkPresentRegionsKHR point to an array of that struct.
Another approach is to have two parallel arrays, ptext:pRectangles and
ptext:pLayers, where ptext:pRectangles[i] and ptext:pLayers[i] must be used
together.
Which approach should we use, and if the array of a new structure, what
should that be called?

*RESOLVED*: Create a new structure, which is a slink:VkRect2D plus a layer,
and will be called slink:VkRectLayerKHR.

2) Where is the origin of the slink:VkRectLayerKHR?

*RESOLVED*: The upper left corner of the presentable image(s) of the
swapchain, per the definition of framebuffer coordinates.

3) Does the rectangular region, slink:VkRectLayerKHR, specify pixels of the
swapchain's image(s), or of the surface?

*RESOLVED*: Of the image(s).
Some presentation engines may scale the pixels of a swapchain's image(s) to
the size of the surface.
The size of the swapchain's image(s) will be consistent, where the size of
the surface may vary over time.

4) What if all of the rectangles for a given swapchain contain a width
and/or height of zero?

*RESOLVED*: The application is indicating that no pixels changed since the
last present.
The presentation engine may use such a hint and not update any pixels for
the swapchain.
However, all other semantics of flink:vkQueuePresentKHR must still be
honored, including waiting for semaphores to signal.

5) When the swapchain is created with
sname:VkSwapchainCreateInfoKHR::pname:preTransform set to a value other than
ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, should the rectangular region,
slink:VkRectLayerKHR, be transformed to align with the pname:preTransform?

*RESOLVED*: No.
The rectangular region in slink:VkRectLayerKHR should not be tranformed.
As such, it may not align with the extents of the swapchain's image(s).
It is the responsibility of the presentation engine to transform the
rectangular region.
This matches the behavior of the Android presentation engine, which set the
precedent.

=== Version History

 * Revision 1, 2016-11-02 (Ian Elliott)
   - Internal revisions
 * Revision 2, 2021-03-18 (Ian Elliott)
   - Clarified alignment of rectangles for presentation engines that support
     transformed swapchains.
