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

[[display_swapchain_present,display_swapchain_present]]
When the `VK_KHR_display_swapchain` extension is enabled additional fields
can: be specified when presenting an image to a swapchain by setting
slink:VkPresentInfoKHR::pname:pNext to point to a
slink:VkDisplayPresentInfoKHR structure.

[open,refpage='VkDisplayPresentInfoKHR',desc='Structure describing parameters of a queue presentation to a swapchain',type='structs']
--

The sname:VkDisplayPresentInfoKHR structure is defined as:

include::{generated}/api/structs/VkDisplayPresentInfoKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:srcRect is a rectangular region of pixels to present.
    It must: be a subset of the image being presented.
    If sname:VkDisplayPresentInfoKHR is not specified, this region will be
    assumed to be the entire presentable image.
  * pname:dstRect is a rectangular region within the visible region of the
    swapchain's display mode.
    If sname:VkDisplayPresentInfoKHR is not specified, this region will be
    assumed to be the entire visible region of the swapchain's mode.
    If the specified rectangle is a subset of the display mode's visible
    region, content from display planes below the swapchain's plane will be
    visible outside the rectangle.
    If there are no planes below the swapchain's, the area outside the
    specified rectangle will be black.
    If portions of the specified rectangle are outside of the display's
    visible region, pixels mapping only to those portions of the rectangle
    will be discarded.
  * pname:persistent: If this is ename:VK_TRUE, the display engine will
    enable buffered mode on displays that support it.
    This allows the display engine to stop sending content to the display
    until a new image is presented.
    The display will instead maintain a copy of the last presented image.
    This allows less power to be used, but may: increase presentation
    latency.
    If sname:VkDisplayPresentInfoKHR is not specified, persistent mode will
    not be used.

If the extent of the pname:srcRect and pname:dstRect are not equal, the
presented pixels will be scaled accordingly.

.Valid Usage
****
  * [[VUID-VkDisplayPresentInfoKHR-srcRect-01257]]
    pname:srcRect must: specify a rectangular region that is a subset of the
    image being presented
  * [[VUID-VkDisplayPresentInfoKHR-dstRect-01258]]
    pname:dstRect must: specify a rectangular region that is a subset of the
    pname:visibleRegion parameter of the display mode the swapchain being
    presented uses
  * [[VUID-VkDisplayPresentInfoKHR-persistentContent-01259]]
    If the pname:persistentContent member of the
    sname:VkDisplayPropertiesKHR structure returned by
    fname:vkGetPhysicalDeviceDisplayPropertiesKHR for the display the
    present operation targets is ename:VK_FALSE, then pname:persistent must:
    be ename:VK_FALSE
****

include::{generated}/validity/structs/VkDisplayPresentInfoKHR.txt[]
--
