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

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

=== Other Extension Metadata

*Last Modified Date*::
    2018-02-07
*Interactions and External Dependencies*::
  - Promoted to Vulkan 1.2 Core
*Contributors*::
  - Tobias Hector
  - Jeff Bolz

=== Description

This extension provides a new entry point to create render passes in a way
that can be easily extended by other extensions through the substructures of
render pass creation.
The Vulkan 1.0 render pass creation sub-structures do not include
ptext:sType/ptext:pNext members.
Additionally, the render pass begin/next/end commands have been augmented
with new extensible structures for passing additional subpass information.

The slink:VkRenderPassMultiviewCreateInfo and
slink:VkInputAttachmentAspectReference structures that extended the original
slink:VkRenderPassCreateInfo are not accepted into the new creation
functions, and instead their parameters are folded into this extension as
follows:

  * Elements of slink:VkRenderPassMultiviewCreateInfo::pname:pViewMasks are
    now specified in slink:VkSubpassDescription2KHR::pname:viewMask.
  * Elements of slink:VkRenderPassMultiviewCreateInfo::pname:pViewOffsets
    are now specified in slink:VkSubpassDependency2KHR::pname:viewOffset.
  * slink:VkRenderPassMultiviewCreateInfo::pname:correlationMaskCount and
    slink:VkRenderPassMultiviewCreateInfo::pname:pCorrelationMasks are
    directly specified in slink:VkRenderPassCreateInfo2KHR.
  * slink:VkInputAttachmentAspectReference::pname:aspectMask is now
    specified in the relevant input attachment description in
    slink:VkAttachmentDescription2KHR::pname:aspectMask

The details of these mappings are explained fully in the new structures.

=== Promotion to Vulkan 1.2

All functionality in this extension is included in core Vulkan 1.2, with the
KHR suffix omitted.
The original type, enum and command names are still available as aliases of
the core functionality.

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

=== Version History

 * Revision 1, 2018-02-07 (Tobias Hector)
   - Internal revisions
