1214 lines
57 KiB
Plaintext
1214 lines
57 KiB
Plaintext
// Copyright (c) 2015-2016 The Khronos Group Inc.
|
|
// Copyright notice at https://www.khronos.org/registry/speccopyright.html
|
|
|
|
[[renderpass]]
|
|
= Render Pass
|
|
|
|
// refBegin VkRenderPass Opaque handle to a render pass object
|
|
|
|
A _render pass_ represents a collection of attachments, subpasses, and
|
|
dependencies between the subpasses, and describes how the attachments are
|
|
used over the course of the subpasses.
|
|
The use of a render pass in a command buffer is a _render pass instance_.
|
|
|
|
Render passes are represented by sname:VkRenderPass handles:
|
|
|
|
include::../api/handles/VkRenderPass.txt[]
|
|
|
|
// refEnd VkRenderPass
|
|
|
|
An _attachment description_ describes the properties of an attachment
|
|
including its format, sample count, and how its contents are treated at the
|
|
beginning and end of each render pass instance.
|
|
|
|
A _subpass_ represents a phase of rendering that reads and writes a subset
|
|
of the attachments in a render pass.
|
|
Rendering commands are recorded into a particular subpass of a render pass
|
|
instance.
|
|
|
|
A _subpass description_ describes the subset of attachments that is involved
|
|
in the execution of a subpass.
|
|
Each subpass can: read from some attachments as _input attachments_, write
|
|
to some as _color attachments_ or _depth/stencil attachments_, and do
|
|
resolve operations to others as _resolve attachments_.
|
|
A subpass description can: also include a set of _preserve attachments_,
|
|
which are attachments that are not read or written by the subpass but whose
|
|
contents must: be preserved throughout the subpass.
|
|
|
|
A subpass _uses_ an attachment if the attachment is a color, depth/stencil,
|
|
resolve, or input attachment for that subpass.
|
|
A subpass does not use an attachment if that attachment is preserved by the
|
|
subpass.
|
|
The first use of an attachment is in the lowest numbered subpass that uses
|
|
that attachment.
|
|
Similarly, the last use of an attachment is in the highest numbered subpass
|
|
that uses that attachment.
|
|
|
|
The subpasses in a render pass all render to the same dimensions, and
|
|
fragments for pixel (x,y,layer) in one subpass can: only read attachment
|
|
contents written by previous subpasses at that same (x,y,layer) location.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
By describing a complete set of subpasses in advance, render passes provide
|
|
the implementation an opportunity to optimize the storage and transfer of
|
|
attachment data between subpasses.
|
|
|
|
In practice, this means that subpasses with a simple framebuffer-space
|
|
dependency may: be merged into a single tiled rendering pass, keeping the
|
|
attachment data on-chip for the duration of a render pass instance.
|
|
However, it is also quite common for a render pass to only contain a single
|
|
subpass.
|
|
====
|
|
|
|
_Subpass dependencies_ describe ordering restrictions between pairs of
|
|
subpasses.
|
|
If no dependencies are specified, implementations may: reorder or overlap
|
|
portions (e.g., certain shader stages) of the execution of subpasses.
|
|
Dependencies limit the extent of overlap or reordering, and are defined
|
|
using masks of pipeline stages and memory access types.
|
|
Each dependency acts as an
|
|
<<synchronization-execution-and-memory-dependencies,execution and memory
|
|
dependency>>, similarly to how <<synchronization-pipeline-barriers,pipeline
|
|
barriers>> are defined.
|
|
Dependencies are needed if two subpasses operate on attachments with
|
|
overlapping ranges of the same sname:VkDeviceMemory object and at least one
|
|
subpass writes to that range.
|
|
|
|
A _subpass dependency chain_ is a sequence of subpass dependencies in a
|
|
render pass, where the source subpass of each subpass dependency (after the
|
|
first) equals the destination subpass of the previous dependency.
|
|
|
|
A render pass describes the structure of subpasses and attachments
|
|
independent of any specific image views for the attachments.
|
|
The specific image views that will be used for the attachments, and their
|
|
dimensions, are specified in sname:VkFramebuffer objects.
|
|
Framebuffers are created with respect to a specific render pass that the
|
|
framebuffer is compatible with (see <<renderpass-compatibility,Render Pass
|
|
Compatibility>>).
|
|
Collectively, a render pass and a framebuffer define the complete render
|
|
target state for one or more subpasses as well as the algorithmic
|
|
dependencies between the subpasses.
|
|
|
|
The various pipeline stages of the drawing commands for a given subpass may:
|
|
execute concurrently and/or out of order, both within and across drawing
|
|
commands.
|
|
However for a given (x,y,layer,sample) sample location, certain per-sample
|
|
operations are performed in <<primrast-order,rasterization order>>.
|
|
|
|
|
|
[[renderpass-creation]]
|
|
== Render Pass Creation
|
|
|
|
// refBegin vkCreateRenderPass Create a new render pass object
|
|
|
|
To create a render pass, call:
|
|
|
|
include::../api/protos/vkCreateRenderPass.txt[]
|
|
|
|
* pname:device is the logical device that creates the render pass.
|
|
* pname:pCreateInfo is a pointer to an instance of the
|
|
slink:VkRenderPassCreateInfo structure that describes the parameters of
|
|
the render pass.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
* pname:pRenderPass points to a sname:VkRenderPass handle in which the
|
|
resulting render pass object is returned.
|
|
|
|
include::../validity/protos/vkCreateRenderPass.txt[]
|
|
|
|
// refBegin VkRenderPassCreateInfo Structure specifying parameters of a newly created render pass
|
|
|
|
The sname:VkRenderPassCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkRenderPassCreateInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is reserved for future use.
|
|
* pname:attachmentCount is the number of attachments used by this render
|
|
pass, or zero indicating no attachments.
|
|
Attachments are referred to by zero-based indices in the range
|
|
[0,pname:attachmentCount).
|
|
* pname:pAttachments points to an array of pname:attachmentCount number of
|
|
slink:VkAttachmentDescription structures describing properties of the
|
|
attachments, or `NULL` if pname:attachmentCount is zero.
|
|
* pname:subpassCount is the number of subpasses to create for this render
|
|
pass.
|
|
Subpasses are referred to by zero-based indices in the range
|
|
[0,pname:subpassCount).
|
|
A render pass must: have at least one subpass.
|
|
* pname:pSubpasses points to an array of pname:subpassCount number of
|
|
slink:VkSubpassDescription structures describing properties of the
|
|
subpasses.
|
|
* pname:dependencyCount is the number of dependencies between pairs of
|
|
subpasses, or zero indicating no dependencies.
|
|
* pname:pDependencies points to an array of pname:dependencyCount number
|
|
of slink:VkSubpassDependency structures describing dependencies between
|
|
pairs of subpasses, or `NULL` if pname:dependencyCount is zero.
|
|
|
|
.Valid Usage
|
|
****
|
|
* If any two subpasses operate on attachments with overlapping ranges of
|
|
the same sname:VkDeviceMemory object, and at least one subpass writes to
|
|
that area of sname:VkDeviceMemory, a subpass dependency must: be
|
|
included (either directly or via some intermediate subpasses) between
|
|
them
|
|
* If the pname:attachment member of any element of
|
|
pname:pInputAttachments, pname:pColorAttachments,
|
|
pname:pResolveAttachments or pname:pDepthStencilAttachment, or the
|
|
attachment indexed by any element of pname:pPreserveAttachments in any
|
|
given element of pname:pSubpasses is bound to a range of a
|
|
sname:VkDeviceMemory object that overlaps with any other attachment in
|
|
any subpass (including the same subpass), the
|
|
sname:VkAttachmentDescription structures describing them must: include
|
|
ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT in pname:flags
|
|
* If the pname:attachment member of any element of
|
|
pname:pInputAttachments, pname:pColorAttachments,
|
|
pname:pResolveAttachments or pname:pDepthStencilAttachment, or any
|
|
element of pname:pPreserveAttachments in any given element of
|
|
pname:pSubpasses is not ename:VK_ATTACHMENT_UNUSED, it must: be less
|
|
than pname:attachmentCount
|
|
* The value of any element of the pname:pPreserveAttachments member in any
|
|
given element of pname:pSubpasses must: not be
|
|
ename:VK_ATTACHMENT_UNUSED
|
|
****
|
|
|
|
include::../validity/structs/VkRenderPassCreateInfo.txt[]
|
|
|
|
// refBegin VkAttachmentDescription Structure specifying an attachment description
|
|
|
|
The sname:VkAttachmentDescription structure is defined as:
|
|
|
|
include::../api/structs/VkAttachmentDescription.txt[]
|
|
|
|
* pname:flags is a bitmask describing additional properties of the
|
|
attachment.
|
|
Bits which can: be set include:
|
|
+
|
|
--
|
|
// refBegin VkAttachmentDescriptionFlagBits Bitmask specifying additional properties of an attachment
|
|
include::../api/enums/VkAttachmentDescriptionFlagBits.txt[]
|
|
--
|
|
* pname:format is a elink:VkFormat value specifying the format of the
|
|
image that will be used for the attachment.
|
|
* pname:samples is the number of samples of the image as defined in
|
|
elink:VkSampleCountFlagBits.
|
|
* pname:loadOp specifies how the contents of color and depth components of
|
|
the attachment are treated at the beginning of the subpass where it is
|
|
first used:
|
|
+
|
|
--
|
|
// refBegin VkAttachmentLoadOp Specify how contents of an attachment are treated at the beginning of a subpass
|
|
include::../api/enums/VkAttachmentLoadOp.txt[]
|
|
--
|
|
** ename:VK_ATTACHMENT_LOAD_OP_LOAD means the contents within the render
|
|
area will be preserved.
|
|
** ename:VK_ATTACHMENT_LOAD_OP_CLEAR means the contents within the render
|
|
area will be cleared to a uniform value, which is specified when a
|
|
render pass instance is begun.
|
|
** ename:VK_ATTACHMENT_LOAD_OP_DONT_CARE means the contents within the
|
|
area need not be preserved; the contents of the attachment will be
|
|
undefined inside the render area.
|
|
* pname:storeOp specifies how the contents of color and depth components
|
|
of the attachment are treated at the end of the subpass where it is last
|
|
used:
|
|
+
|
|
--
|
|
// refBegin VkAttachmentStoreOp Specify how contents of an attachment are treated at the end of a subpass
|
|
include::../api/enums/VkAttachmentStoreOp.txt[]
|
|
--
|
|
** ename:VK_ATTACHMENT_STORE_OP_STORE means the contents within the render
|
|
area are written to memory and will be available for reading after the
|
|
render pass instance completes once the writes have been synchronized
|
|
with ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT (for color attachments)
|
|
or ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT (for
|
|
depth/stencil attachments).
|
|
** ename:VK_ATTACHMENT_STORE_OP_DONT_CARE means the contents within the
|
|
render area are not needed after rendering, and may: be discarded; the
|
|
contents of the attachment will be undefined inside the render area.
|
|
* pname:stencilLoadOp specifies how the contents of stencil components of
|
|
the attachment are treated at the beginning of the subpass where it is
|
|
first used, and must: be one of the same values allowed for pname:loadOp
|
|
above.
|
|
* pname:stencilStoreOp specifies how the contents of stencil components of
|
|
the attachment are treated at the end of the last subpass where it is
|
|
used, and must: be one of the same values allowed for pname:storeOp
|
|
above.
|
|
* pname:initialLayout is the layout the attachment image subresource will
|
|
be in when a render pass instance begins.
|
|
* pname:finalLayout is the layout the attachment image subresource will be
|
|
transitioned to when a render pass instance ends.
|
|
During a render pass instance, an attachment can: use a different layout
|
|
in each subpass, if desired.
|
|
|
|
If the attachment uses a color format, then pname:loadOp and pname:storeOp
|
|
are used, and pname:stencilLoadOp and pname:stencilStoreOp are ignored.
|
|
If the format has depth and/or stencil components, pname:loadOp and
|
|
pname:storeOp apply only to the depth data, while pname:stencilLoadOp and
|
|
pname:stencilStoreOp define how the stencil data is handled.
|
|
|
|
[[renderpass-precision]]
|
|
During a render pass instance, input/color attachments with color formats
|
|
that have a component size of 8, 16, or 32 bits must: be represented in the
|
|
attachment's format throughout the instance.
|
|
Attachments with other floating- or fixed-point color formats, or with depth
|
|
components may: be represented in a format with a precision higher than the
|
|
attachment format, but must: be represented with the same range.
|
|
When such a component is loaded via the pname:loadOp, it will be converted
|
|
into an implementation-dependent format used by the render pass.
|
|
Such components must: be converted from the render pass format, to the
|
|
format of the attachment, before they are stored or resolved at the end of a
|
|
render pass instance via pname:storeOp.
|
|
Conversions occur as described in <<fundamentals-numerics,Numeric
|
|
Representation and Computation>> and <<fundamentals-fixedconv, Fixed-Point
|
|
Data Conversions>>.
|
|
|
|
[[renderpass-aliasing]]
|
|
If pname:flags includes ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT, then
|
|
the attachment is treated as if it shares physical memory with another
|
|
attachment in the same render pass.
|
|
This information limits the ability of the implementation to reorder certain
|
|
operations (like layout transitions and the pname:loadOp) such that it is
|
|
not improperly reordered against other uses of the same physical memory via
|
|
a different attachment.
|
|
This is described in more detail below.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:finalLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or
|
|
ename:VK_IMAGE_LAYOUT_PREINITIALIZED
|
|
****
|
|
|
|
include::../validity/structs/VkAttachmentDescription.txt[]
|
|
|
|
ifdef::editing-notes[]
|
|
[NOTE]
|
|
.editing-note
|
|
====
|
|
TODO (Jon) - the following text may need to be moved back to combine with
|
|
flink:vkCreateRenderPass above for automatic ref page generation.
|
|
====
|
|
endif::editing-notes[]
|
|
|
|
If a render pass uses multiple attachments that alias the same device
|
|
memory, those attachments must: each include the
|
|
ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT bit in their attachment
|
|
description flags.
|
|
Attachments aliasing the same memory occurs in multiple ways:
|
|
|
|
* Multiple attachments being assigned the same image view as part of
|
|
framebuffer creation.
|
|
* Attachments using distinct image views that correspond to the same image
|
|
subresource of an image.
|
|
* Attachments using views of distinct image subresources which are bound
|
|
to overlapping memory.
|
|
|
|
Render passes must: include subpass dependencies (either directly or via a
|
|
subpass dependency chain) between any two subpasses that operate on the same
|
|
attachment or aliasing attachments and those subpass dependencies must:
|
|
include execution and memory dependencies separating uses of the aliases, if
|
|
at least one of those subpasses writes to one of the aliases.
|
|
Those dependencies must: not include the ename:VK_DEPENDENCY_BY_REGION_BIT
|
|
if the aliases are views of distinct image subresources which overlap in
|
|
memory.
|
|
|
|
Multiple attachments that alias the same memory must: not be used in a
|
|
single subpass.
|
|
A given attachment index must: not be used multiple times in a single
|
|
subpass, with one exception: two subpass attachments can: use the same
|
|
attachment index if at least one use is as an input attachment and neither
|
|
use is as a resolve or preserve attachment.
|
|
In other words, the same view can: be used simultaneously as an input and
|
|
color or depth/stencil attachment, but must: not be used as multiple color
|
|
or depth/stencil attachments nor as resolve or preserve attachments.
|
|
This valid scenario is described in more detail <<renderpass-feedbackloop,
|
|
below>>.
|
|
|
|
If a set of attachments alias each other, then all except the first to be
|
|
used in the render pass must: use an pname:initialLayout of
|
|
ename:VK_IMAGE_LAYOUT_UNDEFINED, since the earlier uses of the other aliases
|
|
make their contents undefined.
|
|
Once an alias has been used and a different alias has been used after it,
|
|
the first alias must: not be used in any later subpasses.
|
|
However, an application can: assign the same image view to multiple aliasing
|
|
attachment indices, which allows that image view to be used multiple times
|
|
even if other aliases are used in between.
|
|
Once an attachment needs the ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT
|
|
bit, there should: be no additional cost of introducing additional aliases,
|
|
and using these additional aliases may: allow more efficient clearing of the
|
|
attachments on multiple uses via ename:VK_ATTACHMENT_LOAD_OP_CLEAR.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
The exact set of attachment indices that alias with each other is not known
|
|
until a framebuffer is created using the render pass, so the above
|
|
conditions cannot: be validated at render pass creation time.
|
|
====
|
|
|
|
// refBegin VkSubpassDescription Structure specifying a subpass description
|
|
|
|
The sname:VkSubpassDescription structure is defined as:
|
|
|
|
include::../api/structs/VkSubpassDescription.txt[]
|
|
|
|
* pname:flags is reserved for future use.
|
|
* pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
|
|
whether this is a compute or graphics subpass.
|
|
Currently, only graphics subpasses are supported.
|
|
* pname:inputAttachmentCount is the number of input attachments.
|
|
* pname:pInputAttachments is an array of slink:VkAttachmentReference
|
|
structures (defined below) that lists which of the render pass's
|
|
attachments can: be read in the shader during the subpass, and what
|
|
layout each attachment will be in during the subpass.
|
|
Each element of the array corresponds to an input attachment unit number
|
|
in the shader, i.e. if the shader declares an input variable
|
|
`layout(input_attachment_index=X, set=Y, binding=Z)` then it uses the
|
|
attachment provided in pname:pInputAttachments[X].
|
|
Input attachments must: also be bound to the pipeline with a descriptor
|
|
set, with the input attachment descriptor written in the location
|
|
(set=Y, binding=Z).
|
|
* pname:colorAttachmentCount is the number of color attachments.
|
|
* pname:pColorAttachments is an array of pname:colorAttachmentCount
|
|
slink:VkAttachmentReference structures that lists which of the render
|
|
pass's attachments will be used as color attachments in the subpass, and
|
|
what layout each attachment will be in during the subpass.
|
|
Each element of the array corresponds to a fragment shader output
|
|
location, i.e. if the shader declared an output variable
|
|
`layout(location=X)` then it uses the attachment provided in
|
|
pname:pColorAttachments[X].
|
|
* pname:pResolveAttachments is `NULL` or an array of
|
|
pname:colorAttachmentCount slink:VkAttachmentReference structures that
|
|
lists which of the render pass's attachments are resolved to at the end
|
|
of the subpass, and what layout each attachment will be in during the
|
|
resolve.
|
|
If pname:pResolveAttachments is not `NULL`, each of its elements
|
|
corresponds to a color attachment (the element in
|
|
pname:pColorAttachments at the same index).
|
|
At the end of each subpass, the subpass's color attachments are resolved
|
|
to corresponding resolve attachments, unless the resolve attachment
|
|
index is ename:VK_ATTACHMENT_UNUSED or pname:pResolveAttachments is
|
|
`NULL`.
|
|
If the first use of an attachment in a render pass is as a resolve
|
|
attachment, then the pname:loadOp is effectively ignored as the resolve
|
|
is guaranteed to overwrite all pixels in the render area.
|
|
* pname:pDepthStencilAttachment is a pointer to a
|
|
slink:VkAttachmentReference specifying which attachment will be used for
|
|
depth/stencil data and the layout it will be in during the subpass.
|
|
Setting the attachment index to ename:VK_ATTACHMENT_UNUSED or leaving
|
|
this pointer as `NULL` indicates that no depth/stencil attachment will
|
|
be used in the subpass.
|
|
* pname:preserveAttachmentCount is the number of preserved attachments.
|
|
* pname:pPreserveAttachments is an array of pname:preserveAttachmentCount
|
|
render pass attachment indices describing the attachments that are not
|
|
used by a subpass, but whose contents must: be preserved throughout the
|
|
subpass.
|
|
|
|
The contents of an attachment within the render area become undefined at the
|
|
start of a subpass S if all of the following conditions are true:
|
|
|
|
* The attachment is used as a color, depth/stencil, or resolve attachment
|
|
in any subpass in the render pass.
|
|
* There is a subpass S1 that uses or preserves the attachment, and a
|
|
subpass dependency from S1 to S.
|
|
* The attachment is not used or preserved in subpass S.
|
|
|
|
Once the contents of an attachment become undefined in subpass S, they
|
|
remain undefined for subpasses in subpass dependency chains starting with
|
|
subpass S until they are written again.
|
|
However, they remain valid for subpasses in other subpass dependency chains
|
|
starting with subpass S1 if those subpasses use or preserve the attachment.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:pipelineBindPoint must: be ename:VK_PIPELINE_BIND_POINT_GRAPHICS
|
|
* pname:colorAttachmentCount must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxColorAttachments
|
|
* If the first use of an attachment in this render pass is as an input
|
|
attachment, and the attachment is not also used as a color or
|
|
depth/stencil attachment in the same subpass, then pname:loadOp must:
|
|
not be ename:VK_ATTACHMENT_LOAD_OP_CLEAR
|
|
* If pname:pResolveAttachments is not `NULL`, for each resolve attachment
|
|
that does not have the value ename:VK_ATTACHMENT_UNUSED, the
|
|
corresponding color attachment must: not have the value
|
|
ename:VK_ATTACHMENT_UNUSED
|
|
* If pname:pResolveAttachments is not `NULL`, the sample count of each
|
|
element of pname:pColorAttachments must: be anything other than
|
|
ename:VK_SAMPLE_COUNT_1_BIT
|
|
* Any given element of pname:pResolveAttachments must: have a sample count
|
|
of ename:VK_SAMPLE_COUNT_1_BIT
|
|
* Any given element of pname:pResolveAttachments must: have the same
|
|
elink:VkFormat as its corresponding color attachment
|
|
* All attachments in pname:pColorAttachments and
|
|
pname:pDepthStencilAttachment that are not ename:VK_ATTACHMENT_UNUSED
|
|
must: have the same sample count
|
|
* If any input attachments are ename:VK_ATTACHMENT_UNUSED, then any
|
|
pipelines bound during the subpass must: not access those input
|
|
attachments from the fragment shader
|
|
* The pname:attachment member of any element of pname:pPreserveAttachments
|
|
must: not be ename:VK_ATTACHMENT_UNUSED
|
|
* Any given element of pname:pPreserveAttachments must: not also be an
|
|
element of any other member of the subpass description
|
|
* If any attachment is used as both an input attachment and a color or
|
|
depth/stencil attachment, then each use must: use the same pname:layout
|
|
****
|
|
|
|
include::../validity/structs/VkSubpassDescription.txt[]
|
|
|
|
// refBegin VkAttachmentReference Structure specifying an attachment reference
|
|
|
|
The sname:VkAttachmentReference structure is defined as:
|
|
|
|
include::../api/structs/VkAttachmentReference.txt[]
|
|
|
|
* pname:attachment is the index of the attachment of the render pass, and
|
|
corresponds to the index of the corresponding element in the
|
|
pname:pAttachments array of the sname:VkRenderPassCreateInfo structure.
|
|
If any color or depth/stencil attachments are
|
|
ename:VK_ATTACHMENT_UNUSED, then no writes occur for those attachments.
|
|
* pname:layout is a elink:VkImageLayout value specifying the layout the
|
|
attachment uses during the subpass.
|
|
The implementation will automatically perform layout transitions as
|
|
needed between subpasses to make each subpass use the requested layouts.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:layout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or
|
|
ename:VK_IMAGE_LAYOUT_PREINITIALIZED
|
|
****
|
|
|
|
include::../validity/structs/VkAttachmentReference.txt[]
|
|
|
|
// refBegin VkSubpassDependency Structure specifying a subpass dependency
|
|
|
|
The sname:VkSubpassDependency structure is defined as:
|
|
|
|
include::../api/structs/VkSubpassDependency.txt[]
|
|
|
|
* pname:srcSubpass and pname:dstSubpass are the subpass indices of the
|
|
producer and consumer subpasses, respectively.
|
|
pname:srcSubpass and pname:dstSubpass can: also have the special value
|
|
ename:VK_SUBPASS_EXTERNAL.
|
|
The source subpass must: always be a lower numbered subpass than the
|
|
destination subpass (excluding external subpasses and
|
|
<<synchronization-pipeline-barriers-subpass-self-dependencies,
|
|
self-dependencies>>), so that the order of subpass descriptions is a
|
|
valid execution ordering, avoiding cycles in the dependency graph.
|
|
* pname:srcStageMask, pname:dstStageMask, pname:srcAccessMask,
|
|
pname:dstAccessMask, and pname:dependencyFlags describe an
|
|
<<synchronization-execution-and-memory-dependencies,execution and memory
|
|
dependency>> between subpasses.
|
|
The bits that can: be included in pname:dependencyFlags are:
|
|
+
|
|
--
|
|
// refBegin VkDependencyFlagBits Bitmask specifying dependencies between subpasses
|
|
include::../api/enums/VkDependencyFlagBits.txt[]
|
|
--
|
|
** If pname:dependencyFlags contains ename:VK_DEPENDENCY_BY_REGION_BIT,
|
|
then the dependency is by-region as defined in
|
|
<<synchronization-execution-and-memory-dependencies,Execution And
|
|
Memory Dependencies>>.
|
|
|
|
Each subpass dependency defines an execution and memory dependency between
|
|
two sets of commands, with the second set depending on the first set.
|
|
When pname:srcSubpass does not equal pname:dstSubpass then the first set of
|
|
commands is:
|
|
|
|
* All commands in the subpass indicated by pname:srcSubpass, if
|
|
pname:srcSubpass is not ename:VK_SUBPASS_EXTERNAL.
|
|
* All commands before the render pass instance, if pname:srcSubpass is
|
|
ename:VK_SUBPASS_EXTERNAL.
|
|
|
|
While the corresponding second set of commands is:
|
|
|
|
* All commands in the subpass indicated by pname:dstSubpass, if
|
|
pname:dstSubpass is not ename:VK_SUBPASS_EXTERNAL.
|
|
* All commands after the render pass instance, if pname:dstSubpass is
|
|
ename:VK_SUBPASS_EXTERNAL.
|
|
|
|
When pname:srcSubpass equals pname:dstSubpass then the first set consists of
|
|
commands in the subpass before a call to flink:vkCmdPipelineBarrier and the
|
|
second set consists of commands in the subpass following that same call as
|
|
described in the
|
|
<<synchronization-pipeline-barriers-subpass-self-dependencies, Subpass
|
|
Self-dependency>> section.
|
|
|
|
The pname:srcStageMask, pname:dstStageMask, pname:srcAccessMask,
|
|
pname:dstAccessMask, and pname:dependencyFlags parameters of the dependency
|
|
are interpreted the same way as for other dependencies, as described in
|
|
<<synchronization, Synchronization and Cache Control>>.
|
|
|
|
.Valid Usage
|
|
****
|
|
* If the <<features-features-geometryShader,geometry shaders>> feature is
|
|
not enabled, pname:srcStageMask must: not contain
|
|
ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
|
|
* If the <<features-features-geometryShader,geometry shaders>> feature is
|
|
not enabled, pname:dstStageMask must: not contain
|
|
ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
|
|
* If the <<features-features-tessellationShader,tessellation shaders>>
|
|
feature is not enabled, pname:srcStageMask must: not contain
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
|
|
* If the <<features-features-tessellationShader,tessellation shaders>>
|
|
feature is not enabled, pname:dstStageMask must: not contain
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
|
|
* pname:srcSubpass must: be less than or equal to pname:dstSubpass, unless
|
|
one of them is ename:VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies
|
|
and ensure a valid execution order
|
|
* pname:srcSubpass and pname:dstSubpass must: not both be equal to
|
|
ename:VK_SUBPASS_EXTERNAL
|
|
* If pname:srcSubpass is equal to pname:dstSubpass, pname:srcStageMask and
|
|
pname:dstStageMask must: only contain one of
|
|
ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
|
ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,
|
|
ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
|
|
ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT,
|
|
ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT,
|
|
ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT,
|
|
ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
|
ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
|
|
ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
|
|
ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
|
ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, or
|
|
ename:VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT
|
|
* If pname:srcSubpass is equal to pname:dstSubpass, the highest bit value
|
|
included in pname:srcStageMask must: be less than or equal to the lowest
|
|
bit value in pname:dstStageMask
|
|
****
|
|
|
|
include::../validity/structs/VkSubpassDependency.txt[]
|
|
|
|
Automatic image layout transitions between subpasses also interact with the
|
|
subpass dependencies.
|
|
If two subpasses are connected by a dependency and those two subpasses use
|
|
the same attachment in a different layout, then the layout transition will
|
|
occur after the memory accesses via pname:srcAccessMask have completed in
|
|
all pipeline stages included in pname:srcStageMask in the source subpass,
|
|
and before any memory accesses via pname:dstAccessMask occur in any pipeline
|
|
stages included in pname:dstStageMask in the destination subpass.
|
|
|
|
The automatic image layout transitions from pname:initialLayout to the first
|
|
used layout (if it is different) are performed according to the following
|
|
rules:
|
|
|
|
* If the attachment does not include the
|
|
ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT bit and there is no
|
|
subpass dependency from ename:VK_SUBPASS_EXTERNAL to the first subpass
|
|
that uses the attachment, then it is as if there were such a dependency
|
|
with pname:srcStageMask = pname:srcAccessMask = 0 and pname:dstStageMask
|
|
and pname:dstAccessMask including all relevant bits (all graphics
|
|
pipeline stages and all access types that use image resources), with the
|
|
transition executing as part of that dependency.
|
|
In other words, it may: overlap work before the render pass instance and
|
|
is complete before the subpass begins.
|
|
* If the attachment does not include the
|
|
ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT bit and there is a subpass
|
|
dependency from ename:VK_SUBPASS_EXTERNAL to the first subpass that uses
|
|
the attachment, then the transition executes as part of that dependency
|
|
and according to its stage and access masks.
|
|
It must: not overlap work that came before the render pass instance that
|
|
is included in the source masks, but it may: overlap work in previous
|
|
subpasses.
|
|
* If the attachment includes the
|
|
ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT bit, then the transition
|
|
executes according to all the subpass dependencies with pname:dstSubpass
|
|
equal to the first subpass index that the attachment is used in.
|
|
That is, it occurs after all memory accesses in the source stages and
|
|
masks from all the source subpasses have completed and are available,
|
|
and before the union of all the destination stages begin, and the new
|
|
layout is visible to the union of all the destination access types.
|
|
If there are no incoming subpass dependencies, then this case follows
|
|
the first rule.
|
|
|
|
Similar rules apply for the transition to the pname:finalLayout, using
|
|
dependencies with pname:dstSubpass equal to ename:VK_SUBPASS_EXTERNAL
|
|
|
|
If an attachment specifies the ename:VK_ATTACHMENT_LOAD_OP_CLEAR load
|
|
operation, then it will logically be cleared at the start of the first
|
|
subpass where it is used.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
Implementations may: move clears earlier as long as it does not affect the
|
|
operation of a render pass instance.
|
|
For example, an implementation may: choose to clear all attachments at the
|
|
start of the render pass instance.
|
|
If an attachment has the ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT flag
|
|
set, then the clear must: occur at the start of subpass where the attachment
|
|
is first used, in order to preserve the operation of the render pass
|
|
instance.
|
|
====
|
|
|
|
The first use of an attachment must: not specify a layout equal to
|
|
ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or
|
|
ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL if the attachment specifies
|
|
that the pname:loadOp is ename:VK_ATTACHMENT_LOAD_OP_CLEAR.
|
|
If a subpass uses the same attachment as both an input attachment and either
|
|
a color attachment or a depth/stencil attachment, then both uses must:
|
|
observe the result of the clear.
|
|
|
|
Similarly, if an attachment specifies that the pname:storeOp is
|
|
ename:VK_ATTACHMENT_STORE_OP_STORE, then it will logically be stored at the
|
|
end of the last subpass where it is used.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
Implementations may: move stores later as long as it does not affect the
|
|
operation of a render pass instance.
|
|
If an attachment has the ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT flag
|
|
set, then the store must: occur at the end of the highest numbered subpass
|
|
that uses the attachment.
|
|
====
|
|
|
|
If an attachment is not used by any subpass, then the pname:loadOp and the
|
|
pname:storeOp are ignored and the attachment's memory contents will not be
|
|
modified by execution of a render pass instance.
|
|
|
|
It will be common for a render pass to consist of a simple linear graph of
|
|
dependencies, where subpass N depends on subpass N-1 for all N, and the
|
|
operation of the memory barriers and layout transitions is fairly
|
|
straightforward to reason about for those simple cases.
|
|
But for more complex graphs, there are some rules that govern when there
|
|
must: be dependencies between subpasses.
|
|
|
|
As stated earlier, render passes must: include subpass dependencies which
|
|
(either directly or via a subpass dependency chain) separate any two
|
|
subpasses that operate on the same attachment or aliasing attachments, if at
|
|
least one of those subpasses writes to the attachment.
|
|
If an image layout changes between those two subpasses, the implementation
|
|
uses the stageMasks and accessMasks indicated by the subpass dependency as
|
|
the masks that control when the layout transition must: occur.
|
|
If there is not a layout change on the attachment, or if an implementation
|
|
treats the two layouts identically, then it may: treat the dependency as a
|
|
simple execution/memory barrier.
|
|
|
|
If two subpasses use the same attachment in different layouts but both uses
|
|
are read-only (i.e. input attachment, or read-only depth/stencil
|
|
attachment), the application does not need to express a dependency between
|
|
the two subpasses.
|
|
Implementations that treat the two layouts differently may: deduce and
|
|
insert a dependency between the subpasses, with the implementation choosing
|
|
the appropriate stage masks and access masks based on whether the attachment
|
|
is used as an input or depth/stencil attachment, and may: insert the
|
|
appropriate layout transition along with the execution/memory barrier.
|
|
Implementations that treat the two layouts identically need not insert a
|
|
barrier, and the two subpasses may: execute simultaneously.
|
|
The stage masks and access masks are chosen as follows:
|
|
|
|
* for input attachments, stage mask =
|
|
ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, access mask =
|
|
ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT.
|
|
* for depth/stencil attachments, stage mask =
|
|
ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
|
|
ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, access mask =
|
|
ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
|
|
|
|
where pname:srcStageMask and pname:srcAccessMask are taken based on usage in
|
|
the source subpass and pname:dstStageMask and pname:dstAccessMask are taken
|
|
based on usage in the destination subpass.
|
|
|
|
[[renderpass-feedbackloop]]
|
|
If a subpass uses the same attachment as both an input attachment and either
|
|
a color attachment or a depth/stencil attachment, reads from the input
|
|
attachment are not automatically coherent with writes through the color or
|
|
depth/stencil attachment.
|
|
In order to achieve well-defined results, one of two criteria must: be
|
|
satisfied.
|
|
First, if the color components or depth/stencil components read by the input
|
|
attachment are mutually exclusive with the components written by the color
|
|
or depth/stencil attachment then there is no _feedback loop_ and the reads
|
|
and writes both function normally, with the reads observing values from the
|
|
previous subpass(es) or from memory.
|
|
This option requires the graphics pipelines used by the subpass to disable
|
|
writes to color components that are read as inputs via the
|
|
pname:colorWriteMask, and to disable writes to depth/stencil components that
|
|
are read as inputs via pname:depthWriteEnable or pname:stencilTestEnable.
|
|
|
|
Second, if the input attachment reads components that are written by the
|
|
color or depth/stencil attachment, then there is a feedback loop and a
|
|
pipeline barrier must: be used between when the attachment is written and
|
|
when it is subsequently read by later fragments.
|
|
This pipeline barrier must: follow the rules of a self-dependency as
|
|
described in
|
|
<<synchronization-pipeline-barriers-subpass-self-dependencies,Subpass
|
|
Self-dependency>>, where the barrier's flags include:
|
|
|
|
* pname:dstStageMask = ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
|
* pname:dstAccessMask = ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, and
|
|
* pname:srcAccessMask = ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT (for
|
|
color attachments) or pname:srcAccessMask =
|
|
ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT (for depth/stencil
|
|
attachments).
|
|
* pname:srcStageMask = ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
|
|
(for color attachments) or pname:srcStageMask =
|
|
ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
|
|
ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT (for depth/stencil
|
|
attachments).
|
|
* pname:dependencyFlags = ename:VK_DEPENDENCY_BY_REGION_BIT.
|
|
|
|
A pipeline barrier is needed each time a fragment will read a particular
|
|
(x,y,layer,sample) location if that location has been written since the most
|
|
recent pipeline barrier, or since the start of the subpass if there have
|
|
been no pipeline barriers since the start of the subpass.
|
|
|
|
An attachment used as both an input attachment and color attachment must: be
|
|
in the ename:VK_IMAGE_LAYOUT_GENERAL layout.
|
|
An attachment used as both an input attachment and depth/stencil attachment
|
|
must: be in either the ename:VK_IMAGE_LAYOUT_GENERAL or
|
|
ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL layout.
|
|
Since an attachment in the
|
|
ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL layout is read-only,
|
|
this situation is not a feedback loop.
|
|
|
|
// refBegin vkDestroyRenderPass Destroy a render pass object
|
|
|
|
To destroy a render pass, call:
|
|
|
|
include::../api/protos/vkDestroyRenderPass.txt[]
|
|
|
|
* pname:device is the logical device that destroys the render pass.
|
|
* pname:renderPass is the handle of the render pass to destroy.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
|
|
.Valid Usage
|
|
****
|
|
* All submitted commands that refer to pname:renderPass must: have
|
|
completed execution
|
|
* If sname:VkAllocationCallbacks were provided when pname:renderPass was
|
|
created, a compatible set of callbacks must: be provided here
|
|
* If no sname:VkAllocationCallbacks were provided when pname:renderPass
|
|
was created, pname:pAllocator must: be `NULL`
|
|
****
|
|
|
|
include::../validity/protos/vkDestroyRenderPass.txt[]
|
|
|
|
|
|
[[renderpass-compatibility]]
|
|
== Render Pass Compatibility
|
|
|
|
Framebuffers and graphics pipelines are created based on a specific render
|
|
pass object.
|
|
They must: only be used with that render pass object, or one compatible with
|
|
it.
|
|
|
|
Two attachment references are compatible if they have matching format and
|
|
sample count, or are both ename:VK_ATTACHMENT_UNUSED or the pointer that
|
|
would contain the reference is `NULL`.
|
|
|
|
Two arrays of attachment references are compatible if all corresponding
|
|
pairs of attachments are compatible.
|
|
If the arrays are of different lengths, attachment references not present in
|
|
the smaller array are treated as ename:VK_ATTACHMENT_UNUSED.
|
|
|
|
Two render passes that contain only a single subpass are compatible if their
|
|
corresponding color, input, resolve, and depth/stencil attachment references
|
|
are compatible.
|
|
|
|
If two render passes contain more than one subpass, they are compatible if
|
|
they are identical except for:
|
|
|
|
* Initial and final image layout in attachment descriptions
|
|
* Load and store operations in attachment descriptions
|
|
* Image layout in attachment references
|
|
|
|
A framebuffer is compatible with a render pass if it was created using the
|
|
same render pass or a compatible render pass.
|
|
|
|
|
|
== Framebuffers
|
|
|
|
// refBegin VkFramebuffer Opaque handle to a framebuffer object
|
|
|
|
Render passes operate in conjunction with _framebuffers_.
|
|
Framebuffers represent a collection of specific memory attachments that a
|
|
render pass instance uses.
|
|
|
|
Framebuffers are represented by sname:VkFramebuffer handles:
|
|
|
|
include::../api/handles/VkFramebuffer.txt[]
|
|
|
|
// refEnd VkFramebuffer
|
|
|
|
// refBegin vkCreateFramebuffer Create a new framebuffer object
|
|
|
|
To create a framebuffer, call:
|
|
|
|
include::../api/protos/vkCreateFramebuffer.txt[]
|
|
|
|
* pname:device is the logical device that creates the framebuffer.
|
|
* pname:pCreateInfo points to a slink:VkFramebufferCreateInfo structure
|
|
which describes additional information about framebuffer creation.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
* pname:pFramebuffer points to a sname:VkFramebuffer handle in which the
|
|
resulting framebuffer object is returned.
|
|
|
|
include::../validity/protos/vkCreateFramebuffer.txt[]
|
|
|
|
// refBegin VkFramebufferCreateInfo Structure specifying parameters of a newly created framebuffer
|
|
|
|
The sname:VkFramebufferCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkFramebufferCreateInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is reserved for future use.
|
|
* pname:renderPass is a render pass that defines what render passes the
|
|
framebuffer will be compatible with.
|
|
See <<renderpass-compatibility,Render Pass Compatibility>> for details.
|
|
* pname:attachmentCount is the number of attachments.
|
|
* pname:pAttachments is an array of sname:VkImageView handles, each of
|
|
which will be used as the corresponding attachment in a render pass
|
|
instance.
|
|
* pname:width, pname:height and pname:layers define the dimensions of the
|
|
framebuffer.
|
|
|
|
Image subresources used as attachments must: not be used via any
|
|
non-attachment usage for the duration of a render pass instance.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
This restriction means that the render pass has full knowledge of all uses
|
|
of all of the attachments, so that the implementation is able to make
|
|
correct decisions about when and how to perform layout transitions, when to
|
|
overlap execution of subpasses, etc.
|
|
====
|
|
|
|
[[renderpass-noattachments]]
|
|
It is legal for a subpass to use no color or depth/stencil attachments, and
|
|
rather use shader side effects such as image stores and atomics to produce
|
|
an output.
|
|
In this case, the subpass continues to use the pname:width, pname:height,
|
|
and pname:layers of the framebuffer to define the dimensions of the
|
|
rendering area, and the pname:rasterizationSamples from each pipeline's
|
|
slink:VkPipelineMultisampleStateCreateInfo to define the number of samples
|
|
used in rasterization; however, if
|
|
slink:VkPhysicalDeviceFeatures::pname:variableMultisampleRate is
|
|
code:VK_FALSE, then all pipelines to be bound with a given zero-attachment
|
|
subpass must: have the same value for
|
|
slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples.
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:attachmentCount must: be equal to the attachment count specified
|
|
in pname:renderPass
|
|
* Any given element of pname:pAttachments that is used as a color
|
|
attachment or resolve attachment by pname:renderPass must: have been
|
|
created with a pname:usage value including
|
|
ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
|
|
* Any given element of pname:pAttachments that is used as a depth/stencil
|
|
attachment by pname:renderPass must: have been created with a
|
|
pname:usage value including
|
|
ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
|
|
* Any given element of pname:pAttachments that is used as an input
|
|
attachment by pname:renderPass must: have been created with a
|
|
pname:usage value including ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
|
|
* Any given element of pname:pAttachments must: have been created with an
|
|
elink:VkFormat value that matches the elink:VkFormat specified by the
|
|
corresponding sname:VkAttachmentDescription in pname:renderPass
|
|
* Any given element of pname:pAttachments must: have been created with a
|
|
pname:samples value that matches the pname:samples value specified by
|
|
the corresponding sname:VkAttachmentDescription in pname:renderPass
|
|
* Any given element of pname:pAttachments must: have dimensions at least
|
|
as large as the corresponding framebuffer dimension
|
|
* Any given element of pname:pAttachments must: only specify a single mip
|
|
level
|
|
* Any given element of pname:pAttachments must: have been created with the
|
|
identity swizzle
|
|
* pname:width must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxFramebufferWidth
|
|
* pname:height must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxFramebufferHeight
|
|
* pname:layers must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxFramebufferLayers
|
|
****
|
|
|
|
include::../validity/structs/VkFramebufferCreateInfo.txt[]
|
|
|
|
// refBegin vkDestroyFramebuffer Destroy a framebuffer object
|
|
|
|
To destroy a framebuffer, call:
|
|
|
|
include::../api/protos/vkDestroyFramebuffer.txt[]
|
|
|
|
* pname:device is the logical device that destroys the framebuffer.
|
|
* pname:framebuffer is the handle of the framebuffer to destroy.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
|
|
.Valid Usage
|
|
****
|
|
* All submitted commands that refer to pname:framebuffer must: have
|
|
completed execution
|
|
* If sname:VkAllocationCallbacks were provided when pname:framebuffer was
|
|
created, a compatible set of callbacks must: be provided here
|
|
* If no sname:VkAllocationCallbacks were provided when pname:framebuffer
|
|
was created, pname:pAllocator must: be `NULL`
|
|
****
|
|
|
|
include::../validity/protos/vkDestroyFramebuffer.txt[]
|
|
|
|
|
|
[[renderpass-commands]]
|
|
== Render Pass Commands
|
|
|
|
An application records the commands for a render pass instance one subpass
|
|
at a time, by beginning a render pass instance, iterating over the subpasses
|
|
to record commands for that subpass, and then ending the render pass
|
|
instance.
|
|
|
|
// refBegin vkCmdBeginRenderPass Begin a new render pass
|
|
|
|
To begin a render pass instance, call:
|
|
|
|
include::../api/protos/vkCmdBeginRenderPass.txt[]
|
|
|
|
* pname:commandBuffer is the command buffer in which to record the
|
|
command.
|
|
* pname:pRenderPassBegin is a pointer to a slink:VkRenderPassBeginInfo
|
|
structure (defined below) which indicates the render pass to begin an
|
|
instance of, and the framebuffer the instance uses.
|
|
* pname:contents specifies how the commands in the first subpass will be
|
|
provided, and is one of the values:
|
|
+
|
|
--
|
|
// refBegin VkSubpassContents Specify how commands in the first subpass of a render pass are provided
|
|
include::../api/enums/VkSubpassContents.txt[]
|
|
--
|
|
+
|
|
If pname:contents is ename:VK_SUBPASS_CONTENTS_INLINE, the contents of the
|
|
subpass will be recorded inline in the primary command buffer, and secondary
|
|
command buffers must: not be executed within the subpass.
|
|
If pname:contents is ename:VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS,
|
|
the contents are recorded in secondary command buffers that will be called
|
|
from the primary command buffer, and fname:vkCmdExecuteCommands is the only
|
|
valid command on the command buffer until fname:vkCmdNextSubpass or
|
|
fname:vkCmdEndRenderPass.
|
|
|
|
After beginning a render pass instance, the command buffer is ready to
|
|
record the commands for the first subpass of that render pass.
|
|
|
|
.Valid Usage
|
|
****
|
|
* If any of the pname:initialLayout or pname:finalLayout member of the
|
|
sname:VkAttachmentDescription structures or the pname:layout member of
|
|
the sname:VkAttachmentReference structures specified when creating the
|
|
render pass specified in the pname:renderPass member of
|
|
pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
|
|
then the corresponding attachment image subresource of the framebuffer
|
|
specified in the pname:framebuffer member of pname:pRenderPassBegin
|
|
must: have been created with ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
|
|
set
|
|
* If any of the pname:initialLayout or pname:finalLayout member of the
|
|
sname:VkAttachmentDescription structures or the pname:layout member of
|
|
the sname:VkAttachmentReference structures specified when creating the
|
|
render pass specified in the pname:renderPass member of
|
|
pname:pRenderPassBegin is
|
|
ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL or
|
|
ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the
|
|
corresponding attachment image subresource of the framebuffer specified
|
|
in the pname:framebuffer member of pname:pRenderPassBegin must: have
|
|
been created with ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set
|
|
* If any of the pname:initialLayout or pname:finalLayout member of the
|
|
sname:VkAttachmentDescription structures or the pname:layout member of
|
|
the sname:VkAttachmentReference structures specified when creating the
|
|
render pass specified in the pname:renderPass member of
|
|
pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
|
then the corresponding attachment image subresource of the framebuffer
|
|
specified in the pname:framebuffer member of pname:pRenderPassBegin
|
|
must: have been created with ename:VK_IMAGE_USAGE_SAMPLED_BIT or
|
|
ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set
|
|
* If any of the pname:initialLayout or pname:finalLayout member of the
|
|
sname:VkAttachmentDescription structures or the pname:layout member of
|
|
the sname:VkAttachmentReference structures specified when creating the
|
|
render pass specified in the pname:renderPass member of
|
|
pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
|
|
then the corresponding attachment image subresource of the framebuffer
|
|
specified in the pname:framebuffer member of pname:pRenderPassBegin
|
|
must: have been created with ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT set
|
|
* If any of the pname:initialLayout or pname:finalLayout member of the
|
|
sname:VkAttachmentDescription structures or the pname:layout member of
|
|
the sname:VkAttachmentReference structures specified when creating the
|
|
render pass specified in the pname:renderPass member of
|
|
pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
|
|
then the corresponding attachment image subresource of the framebuffer
|
|
specified in the pname:framebuffer member of pname:pRenderPassBegin
|
|
must: have been created with ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT set
|
|
* If any of the pname:initialLayout members of the
|
|
sname:VkAttachmentDescription structures specified when creating the
|
|
render pass specified in the pname:renderPass member of
|
|
pname:pRenderPassBegin is not ename:VK_IMAGE_LAYOUT_UNDEFINED, then each
|
|
such pname:initialLayout must: be equal to the current layout of the
|
|
corresponding attachment image subresource of the framebuffer specified
|
|
in the pname:framebuffer member of pname:pRenderPassBegin
|
|
****
|
|
|
|
include::../validity/protos/vkCmdBeginRenderPass.txt[]
|
|
|
|
// refBegin VkRenderPassBeginInfo Structure specifying render pass begin info
|
|
|
|
The sname:VkRenderPassBeginInfo structure is defined as:
|
|
|
|
include::../api/structs/VkRenderPassBeginInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:renderPass is the render pass to begin an instance of.
|
|
* pname:framebuffer is the framebuffer containing the attachments that are
|
|
used with the render pass.
|
|
* pname:renderArea is the render area that is affected by the render pass
|
|
instance, and is described in more detail below.
|
|
* pname:clearValueCount is the number of elements in pname:pClearValues.
|
|
* pname:pClearValues is an array of slink:VkClearValue structures that
|
|
contains clear values for each attachment, if the attachment uses a
|
|
pname:loadOp value of ename:VK_ATTACHMENT_LOAD_OP_CLEAR or if the
|
|
attachment has a depth/stencil format and uses a pname:stencilLoadOp
|
|
value of ename:VK_ATTACHMENT_LOAD_OP_CLEAR.
|
|
The array is indexed by attachment number.
|
|
Only elements corresponding to cleared attachments are used.
|
|
Other elements of pname:pClearValues are ignored.
|
|
|
|
pname:renderArea is the render area that is affected by the render pass
|
|
instance.
|
|
The effects of attachment load, store and resolve operations are restricted
|
|
to the pixels whose x and y coordinates fall within the render area on all
|
|
attachments.
|
|
The render area extends to all layers of pname:framebuffer.
|
|
The application must: ensure (using scissor if necessary) that all rendering
|
|
is contained within the render area, otherwise the pixels outside of the
|
|
render area become undefined and shader side effects may: occur for
|
|
fragments outside the render area.
|
|
The render area must: be contained within the framebuffer dimensions.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
There may: be a performance cost for using a render area smaller than the
|
|
framebuffer, unless it matches the render area granularity for the render
|
|
pass.
|
|
====
|
|
|
|
.Valid Usage
|
|
****
|
|
* pname:clearValueCount must: be greater than the largest attachment index
|
|
in pname:renderPass that specifies a pname:loadOp (or
|
|
pname:stencilLoadOp, if the attachment has a depth/stencil format) of
|
|
ename:VK_ATTACHMENT_LOAD_OP_CLEAR
|
|
* If pname:clearValueCount is not `0`, pname:pClearValues must: be a
|
|
pointer to an array of pname:clearValueCount valid sname:VkClearValue
|
|
unions
|
|
* pname:renderPass must: be <<renderpass-compatibility,compatible>> with
|
|
the pname:renderPass member of the sname:VkFramebufferCreateInfo
|
|
structure specified when creating pname:framebuffer.
|
|
****
|
|
|
|
include::../validity/structs/VkRenderPassBeginInfo.txt[]
|
|
|
|
// refBegin vkGetRenderAreaGranularity Returns the granularity for optimal render area
|
|
|
|
To query the render area granularity, call:
|
|
|
|
include::../api/protos/vkGetRenderAreaGranularity.txt[]
|
|
|
|
* pname:device is the logical device that owns the render pass.
|
|
* pname:renderPass is a handle to a render pass.
|
|
* pname:pGranularity points to a slink:VkExtent2D structure in which the
|
|
granularity is returned.
|
|
|
|
The conditions leading to an optimal pname:renderArea are:
|
|
|
|
* the pname:offset.x member in pname:renderArea is a multiple of the
|
|
pname:width member of the returned slink:VkExtent2D (the horizontal
|
|
granularity).
|
|
* the pname:offset.y member in pname:renderArea is a multiple of the
|
|
pname:height of the returned slink:VkExtent2D (the vertical
|
|
granularity).
|
|
* either the pname:offset.width member in pname:renderArea is a multiple
|
|
of the horizontal granularity or pname:offset.x+pname:offset.width is
|
|
equal to the pname:width of the pname:framebuffer in the
|
|
slink:VkRenderPassBeginInfo.
|
|
* either the pname:offset.height member in pname:renderArea is a multiple
|
|
of the vertical granularity or pname:offset.y+pname:offset.height is
|
|
equal to the pname:height of the pname:framebuffer in the
|
|
slink:VkRenderPassBeginInfo.
|
|
|
|
Subpass dependencies are not affected by the render area, and apply to the
|
|
entire image subresources attached to the framebuffer.
|
|
Similarly, pipeline barriers are valid even if their effect extends outside
|
|
the render area.
|
|
|
|
include::../validity/protos/vkGetRenderAreaGranularity.txt[]
|
|
|
|
// refBegin vkCmdNextSubpass Transition to the next subpass of a render pass
|
|
|
|
To transition to the next subpass in the render pass instance after
|
|
recording the commands for a subpass, call:
|
|
|
|
include::../api/protos/vkCmdNextSubpass.txt[]
|
|
|
|
* pname:commandBuffer is the command buffer in which to record the
|
|
command.
|
|
* pname:contents specifies how the commands in the next subpass will be
|
|
provided, in the same fashion as the corresponding parameter of
|
|
flink:vkCmdBeginRenderPass.
|
|
|
|
The subpass index for a render pass begins at zero when
|
|
fname:vkCmdBeginRenderPass is recorded, and increments each time
|
|
fname:vkCmdNextSubpass is recorded.
|
|
|
|
Moving to the next subpass automatically performs any multisample resolve
|
|
operations in the subpass being ended.
|
|
End-of-subpass multisample resolves are treated as color attachment writes
|
|
for the purposes of synchronization.
|
|
That is, they are considered to execute in the
|
|
ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage and their
|
|
writes are synchronized with ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
|
|
Synchronization between rendering within a subpass and any resolve
|
|
operations at the end of the subpass occurs automatically, without need for
|
|
explicit dependencies or pipeline barriers.
|
|
However, if the resolve attachment is also used in a different subpass, an
|
|
explicit dependency is needed.
|
|
|
|
After transitioning to the next subpass, the application can: record the
|
|
commands for that subpass.
|
|
|
|
.Valid Usage
|
|
****
|
|
* The current subpass index must: be less than the number of subpasses in
|
|
the render pass minus one
|
|
****
|
|
|
|
include::../validity/protos/vkCmdNextSubpass.txt[]
|
|
|
|
// refBegin vkCmdEndRenderPass End the current render pass
|
|
|
|
To record a command to end a render pass instance after recording the
|
|
commands for the last subpass, call:
|
|
|
|
include::../api/protos/vkCmdEndRenderPass.txt[]
|
|
|
|
* pname:commandBuffer is the command buffer in which to end the current
|
|
render pass instance.
|
|
|
|
Ending a render pass instance performs any multisample resolve operations on
|
|
the final subpass.
|
|
|
|
.Valid Usage
|
|
****
|
|
* The current subpass index must: be equal to the number of subpasses in
|
|
the render pass minus one
|
|
****
|
|
|
|
include::../validity/protos/vkCmdEndRenderPass.txt[]
|
|
|