VkRenderPassMultiviewCreateInfo - Structure containing multiview
information for all subpasses
Description
When a subpass uses a non-zero view mask, multiview functionality is
considered to be enabled. Multiview is all-or-nothing for a render pass
- that is, either all subpasses must have a non-zero view mask (though
some subpasses may have only one view) or all must be zero.
Multiview causes all drawing and clear commands in the subpass to behave
as if they were broadcast to each view, where a view is represented by
one layer of the framebuffer attachments. All draws and clears are
broadcast to each view index whose bit is set in the view mask. The
view index is provided in the ViewIndex shader input variable, and
color, depth/stencil, and input attachments all read/write the layer
of the framebuffer corresponding to the view index.
If the view mask is zero for all subpasses, multiview is considered to
be disabled and all drawing commands execute normally, without this
additional broadcasting.
Some implementations may not support multiview in conjunction with
mesh shaders,
geometry shaders
or
tessellation shaders.
When multiview is enabled, the
DEPENDENCY_VIEW_LOCAL_BIT bit
in a dependency can be used to express a view-local dependency,
meaning that each view in the destination subpass depends on a single
view in the source subpass. Unlike pipeline barriers, a subpass
dependency can potentially have a different view mask in the source
subpass and the destination subpass. If the dependency is view-local,
then each view (dstView) in the destination subpass depends on the view
dstView + pViewOffsets[dependency] in the source subpass. If there is
not such a view in the source subpass, then this dependency does not
affect that view in the destination subpass. If the dependency is not
view-local, then all views in the destination subpass depend on all
views in the source subpass, and the view offset is ignored. A non-zero
view offset is not allowed in a self-dependency.
The elements of pCorrelationMasks are a set of masks of views
indicating that views in the same mask may exhibit spatial coherency
between the views, making it more efficient to render them concurrently.
Correlation masks must not have a functional effect on the results of
the multiview rendering.
When multiview is enabled, at the beginning of each subpass all
non-render pass state is undefined. In particular, each time
cmdBeginRenderPass or
cmdNextSubpass is called the
graphics pipeline must be bound, any relevant descriptor sets or
vertex/index buffers must be bound, and any relevant dynamic state or
push constants must be set before they are used.
A multiview subpass can declare that its shaders will write per-view
attributes for all views in a single invocation, by setting the
SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX
bit in the subpass description. The only supported per-view attributes
are position and viewport mask, and per-view position and viewport masks
are written to output array variables decorated with PositionPerViewNV
and ViewportMaskPerViewNV, respectively. If the
VK_NV_viewport_array2 extension is not supported and enabled,
ViewportMaskPerViewNV must not be used. Values written to elements
of PositionPerViewNV and ViewportMaskPerViewNV must not depend on
the ViewIndex. The shader must also write to an output variable
decorated with Position, and the value written to Position must
equal the value written to PositionPerViewNV[ViewIndex]. Similarly,
if ViewportMaskPerViewNV is written to then the shader must also
write to an output variable decorated with ViewportMaskNV, and the
value written to ViewportMaskNV must equal the value written to
ViewportMaskPerViewNV[ViewIndex]. Implementations will either use
values taken from Position and ViewportMaskNV and invoke the shader
once for each view, or will use values taken from PositionPerViewNV
and ViewportMaskPerViewNV and invoke the shader fewer times. The
values written to Position and ViewportMaskNV must not depend on
the values written to PositionPerViewNV and ViewportMaskPerViewNV,
or vice versa (to allow compilers to eliminate the unused outputs). All
attributes that do not have *PerViewNV counterparts must not depend
on ViewIndex.
Per-view attributes are all-or-nothing for a subpass. That is, all
pipelines compiled against a subpass that includes the
SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX
bit must write per-view attributes to the *PerViewNV[] shader
outputs, in addition to the non-per-view (e.g. Position) outputs.
Pipelines compiled against a subpass that does not include this bit
must not include the *PerViewNV[] outputs in their interfaces.
Valid Usage
If the
multiview
feature is not enabled, each element of pViewMasks must be 0
The index of
the most significant bit in each element of pViewMasks must be
less than
maxMultiviewViewCount
Valid Usage (Implicit)
If
subpassCount is not 0, pViewMasks must be a valid pointer to
an array of subpassCount uint32_t values
If
dependencyCount is not 0, pViewOffsets must be a valid
pointer to an array of dependencyCount int32_t values
If correlationMaskCount is not 0, pCorrelationMasks must be
a valid pointer to an array of correlationMaskCount uint32_t
values
Structure Chaining
- Extends the structure
See Also
VK_KHR_multiview,
VK_VERSION_1_1,
StructureType