blob: 13cd79ae4b1b0292b15596fbad84ec811a3c2d7e [file] [log] [blame]
// Copyright 2015-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0
[[pipelines]]
= Pipelines
The following <<pipelines-block-diagram,figure>> shows a block diagram of
the Vulkan pipelines.
Some Vulkan commands specify geometric objects to be drawn or computational
work to be performed, while others specify state controlling how objects are
handled by the various pipeline stages, or control data transfer between
memory organized as images and buffers.
Commands are effectively sent through a processing pipeline, either a
_graphics pipeline_,
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
a _ray tracing pipeline_,
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
or a _compute pipeline_.
ifdef::VK_NV_mesh_shader[]
The graphics pipeline can be operated in two modes, as either _primitive
shading_ or _mesh shading_ pipeline.
*Primitive Shading*
endif::VK_NV_mesh_shader[]
The first stage of the <<pipelines-graphics,graphics pipeline>>
(<<drawing,Input Assembler>>) assembles vertices to form geometric
primitives such as points, lines, and triangles, based on a requested
primitive topology.
In the next stage (<<shaders-vertex,Vertex Shader>>) vertices can: be
transformed, computing positions and attributes for each vertex.
If <<tessellation,tessellation>> and/or <<geometry,geometry>> shaders are
supported, they can: then generate multiple primitives from a single input
primitive, possibly changing the primitive topology or generating additional
attribute data in the process.
ifdef::VK_NV_mesh_shader[]
*Mesh Shading*
When using the <<mesh,_mesh shading_>> pipeline input primitives are not
assembled implicitly, but explicitly through the (<<shaders-mesh,Mesh
Shader>>).
The work on the mesh pipeline is initiated by the application
<<drawing-mesh-shading,drawing>> a set of mesh tasks.
If an optional (<<shaders-task,Task Shader>>) is active, each task triggers
the execution of a task shader workgroup that will generate a new set of
tasks upon completion.
Each of these spawned tasks, or each of the original dispatched tasks if no
task shader is present, triggers the execution of a mesh shader workgroup
that produces an output mesh with a variable-sized number of primitives
assembled from vertices stored in the output mesh.
*Common*
endif::VK_NV_mesh_shader[]
The final resulting primitives are <<vertexpostproc-clipping,clipped>> to a
clip volume in preparation for the next stage, <<primsrast,Rasterization>>.
The rasterizer produces a series of _fragments_ associated with a region of
the framebuffer, from a two-dimensional description of a point, line
segment, or triangle.
These fragments are processed by <<fragops,fragment operations>> to
determine whether generated values will be written to the framebuffer.
<<fragops-shader, Fragment shading>> determines the values to be written to
the framebuffer attachments.
Framebuffer operations then read and write the color and depth/stencil
attachments of the framebuffer for a given subpass of a <<renderpass,render
pass instance>>.
The attachments can: be used as input attachments in the fragment shader in
a later subpass of the same render pass.
The <<pipelines-compute,compute pipeline>> is a separate pipeline from the
graphics pipeline, which operates on one-, two-, or three-dimensional
workgroups which can: read from and write to buffer and image memory.
This ordering is meant only as a tool for describing Vulkan, not as a strict
rule of how Vulkan is implemented, and we present it only as a means to
organize the various operations of the pipelines.
Actual ordering guarantees between pipeline stages are explained in detail
in the <<synchronization-pipeline-stages-order, synchronization chapter>>.
[[pipelines-block-diagram]]
ifndef::VK_NV_mesh_shader[]
image::{images}/pipeline.svg[title="Block diagram of the Vulkan pipeline",align="center",opts="{imageopts}"]
endif::VK_NV_mesh_shader[]
ifdef::VK_NV_mesh_shader[]
image::{images}/pipelinemesh.svg[title="Block diagram of the Vulkan pipeline",align="center",opts="{imageopts}"]
endif::VK_NV_mesh_shader[]
Each pipeline is controlled by a monolithic object created from a
description of all of the shader stages and any relevant fixed-function
stages.
<<interfaces,Linking>> the whole pipeline together allows the optimization
of shaders based on their input/outputs and eliminates expensive draw time
state validation.
A pipeline object is bound to the current state using
flink:vkCmdBindPipeline.
Any pipeline object state that is specified as <<pipelines-dynamic-state,
dynamic>> is not applied to the current state when the pipeline object is
bound, but is instead set by dynamic state setting commands.
No state, including dynamic state, is inherited from one command buffer to
another.
[open,refpage='VkPipeline',desc='Opaque handle to a pipeline object',type='handles']
--
Compute,
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ray tracing,
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
and graphics pipelines are each represented by sname:VkPipeline handles:
include::{generated}/api/handles/VkPipeline.txt[]
--
[[pipelines-compute]]
== Compute Pipelines
Compute pipelines consist of a single static compute shader stage and the
pipeline layout.
The compute pipeline represents a compute shader and is created by calling
fname:vkCreateComputePipelines with pname:module and pname:pName selecting
an entry point from a shader module, where that entry point defines a valid
compute shader, in the slink:VkPipelineShaderStageCreateInfo structure
contained within the slink:VkComputePipelineCreateInfo structure.
[open,refpage='vkCreateComputePipelines',desc='Creates a new compute pipeline object',type='protos']
--
To create compute pipelines, call:
include::{generated}/api/protos/vkCreateComputePipelines.txt[]
* pname:device is the logical device that creates the compute pipelines.
* pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
pipeline caching is disabled; or the handle of a valid
<<pipelines-cache,pipeline cache>> object, in which case use of that
cache is enabled for the duration of the command.
* pname:createInfoCount is the length of the pname:pCreateInfos and
pname:pPipelines arrays.
* pname:pCreateInfos is a pointer to an array of
slink:VkComputePipelineCreateInfo structures.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
* pname:pPipelines is a pointer to an array of slink:VkPipeline handles in
which the resulting compute pipeline objects are returned.
ifdef::editing-notes[]
+
[NOTE]
.editing-note
====
TODO (Jon) - Should we say something like "`the i'th element of the
pname:pPipelines array is created based on the corresponding element of the
pname:pCreateInfos array`"? Also for flink:vkCreateGraphicsPipelines below.
====
endif::editing-notes[]
.Valid Usage
****
* [[VUID-vkCreateComputePipelines-flags-00695]]
If the pname:flags member of any element of pname:pCreateInfos contains
the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the
pname:basePipelineIndex member of that same element is not `-1`,
pname:basePipelineIndex must: be less than the index into
pname:pCreateInfos that corresponds to that element
* [[VUID-vkCreateComputePipelines-flags-00696]]
If the pname:flags member of any element of pname:pCreateInfos contains
the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline
must: have been created with the
ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set
ifdef::VK_EXT_pipeline_creation_cache_control[]
* [[VUID-vkCreateComputePipelines-pipelineCache-02873]]
If pname:pipelineCache was created with
ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host
access to pname:pipelineCache must: be
<<fundamentals-threadingbehavior,externally synchronized>>
endif::VK_EXT_pipeline_creation_cache_control[]
****
include::{generated}/validity/protos/vkCreateComputePipelines.txt[]
--
[open,refpage='VkComputePipelineCreateInfo',desc='Structure specifying parameters of a newly created compute pipeline',type='structs']
--
The sname:VkComputePipelineCreateInfo structure is defined as:
include::{generated}/api/structs/VkComputePipelineCreateInfo.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
how the pipeline will be generated.
* pname:stage is a slink:VkPipelineShaderStageCreateInfo structure
describing the compute shader.
* pname:layout is the description of binding locations used by both the
pipeline and descriptor sets used with the pipeline.
* pname:basePipelineHandle is a pipeline to derive from
* pname:basePipelineIndex is an index into the pname:pCreateInfos
parameter to use as a pipeline to derive from
The parameters pname:basePipelineHandle and pname:basePipelineIndex are
described in more detail in <<pipelines-pipeline-derivatives,Pipeline
Derivatives>>.
.Valid Usage
****
* [[VUID-VkComputePipelineCreateInfo-flags-00697]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineIndex is -1, pname:basePipelineHandle must:
be a valid handle to a compute sname:VkPipeline
* [[VUID-VkComputePipelineCreateInfo-flags-00698]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineHandle is dlink:VK_NULL_HANDLE,
pname:basePipelineIndex must: be a valid index into the calling
command's pname:pCreateInfos parameter
* [[VUID-VkComputePipelineCreateInfo-flags-00699]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineIndex is not -1, pname:basePipelineHandle
must: be dlink:VK_NULL_HANDLE
* [[VUID-VkComputePipelineCreateInfo-flags-00700]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineHandle is not dlink:VK_NULL_HANDLE,
pname:basePipelineIndex must: be -1
* [[VUID-VkComputePipelineCreateInfo-stage-00701]]
The pname:stage member of pname:stage must: be
ename:VK_SHADER_STAGE_COMPUTE_BIT
* [[VUID-VkComputePipelineCreateInfo-stage-00702]]
The shader code for the entry point identified by pname:stage and the
rest of the state identified by this structure must: adhere to the
pipeline linking rules described in the <<interfaces,Shader Interfaces>>
chapter
* [[VUID-VkComputePipelineCreateInfo-layout-00703]]
pname:layout must: be
<<descriptorsets-pipelinelayout-consistency,consistent>> with the layout
of the compute shader specified in pname:stage
* [[VUID-VkComputePipelineCreateInfo-layout-01687]]
The number of resources in pname:layout accessible to the compute shader
stage must: be less than or equal to
sname:VkPhysicalDeviceLimits::pname:maxPerStageResources
ifdef::VK_KHR_pipeline_library[]
* [[VUID-VkComputePipelineCreateInfo-flags-03364]]
pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
endif::VK_KHR_pipeline_library[]
ifdef::VK_KHR_ray_tracing_pipeline[]
* [[VUID-VkComputePipelineCreateInfo-flags-03365]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
* [[VUID-VkComputePipelineCreateInfo-flags-03366]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
* [[VUID-VkComputePipelineCreateInfo-flags-03367]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
* [[VUID-VkComputePipelineCreateInfo-flags-03368]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
* [[VUID-VkComputePipelineCreateInfo-flags-03369]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
* [[VUID-VkComputePipelineCreateInfo-flags-03370]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
* [[VUID-VkComputePipelineCreateInfo-flags-03576]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing_motion_blur[]
* [[VUID-VkComputePipelineCreateInfo-flags-04945]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
endif::VK_NV_ray_tracing_motion_blur[]
ifdef::VK_NV_device_generated_commands[]
* [[VUID-VkComputePipelineCreateInfo-flags-02874]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV
endif::VK_NV_device_generated_commands[]
ifdef::VK_EXT_pipeline_creation_cache_control[]
* [[VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875]]
If the <<features-pipelineCreationCacheControl,
pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
must: not include
ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or
ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
endif::VK_EXT_pipeline_creation_cache_control[]
****
include::{generated}/validity/structs/VkComputePipelineCreateInfo.txt[]
--
[open,refpage='VkPipelineShaderStageCreateInfo',desc='Structure specifying parameters of a newly created pipeline shader stage',type='structs']
--
The sname:VkPipelineShaderStageCreateInfo structure is defined as:
include::{generated}/api/structs/VkPipelineShaderStageCreateInfo.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is a bitmask of elink:VkPipelineShaderStageCreateFlagBits
specifying how the pipeline shader stage will be generated.
* pname:stage is a elink:VkShaderStageFlagBits value specifying a single
pipeline stage.
* pname:module is a slink:VkShaderModule object containing the shader for
this stage.
* pname:pName is a pointer to a null-terminated UTF-8 string specifying
the entry point name of the shader for this stage.
* pname:pSpecializationInfo is a pointer to a slink:VkSpecializationInfo
structure, as described in
<<pipelines-specialization-constants,Specialization Constants>>, or
`NULL`.
.Valid Usage
****
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00704]]
If the <<features-geometryShader,geometry shaders>> feature is not
enabled, pname:stage must: not be ename:VK_SHADER_STAGE_GEOMETRY_BIT
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00705]]
If the <<features-tessellationShader,tessellation shaders>> feature is
not enabled, pname:stage must: not be
ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or
ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT
ifdef::VK_NV_mesh_shader[]
* [[VUID-VkPipelineShaderStageCreateInfo-stage-02091]]
If the <<features-meshShader,mesh shader>> feature is not enabled,
pname:stage must: not be ename:VK_SHADER_STAGE_MESH_BIT_NV
* [[VUID-VkPipelineShaderStageCreateInfo-stage-02092]]
If the <<features-taskShader,task shader>> feature is not enabled,
pname:stage must: not be ename:VK_SHADER_STAGE_TASK_BIT_NV
endif::VK_NV_mesh_shader[]
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00706]]
pname:stage must: not be ename:VK_SHADER_STAGE_ALL_GRAPHICS, or
ename:VK_SHADER_STAGE_ALL
* [[VUID-VkPipelineShaderStageCreateInfo-pName-00707]]
pname:pName must: be the name of an code:OpEntryPoint in pname:module
with an execution model that matches pname:stage
* [[VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708]]
If the identified entry point includes any variable in its interface
that is declared with the code:ClipDistance code:BuiltIn decoration,
that variable must: not have an array size greater than
sname:VkPhysicalDeviceLimits::pname:maxClipDistances
* [[VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709]]
If the identified entry point includes any variable in its interface
that is declared with the code:CullDistance code:BuiltIn decoration,
that variable must: not have an array size greater than
sname:VkPhysicalDeviceLimits::pname:maxCullDistances
* [[VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710]]
If the identified entry point includes any variables in its interface
that are declared with the code:ClipDistance or code:CullDistance
code:BuiltIn decoration, those variables must: not have array sizes
which sum to more than
sname:VkPhysicalDeviceLimits::pname:maxCombinedClipAndCullDistances
* [[VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711]]
If the identified entry point includes any variable in its interface
that is declared with the code:SampleMask code:BuiltIn decoration, that
variable must: not have an array size greater than
sname:VkPhysicalDeviceLimits::pname:maxSampleMaskWords
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00712]]
If pname:stage is ename:VK_SHADER_STAGE_VERTEX_BIT, the identified entry
point must: not include any input variable in its interface that is
decorated with code:CullDistance
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00713]]
If pname:stage is ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or
ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, and the identified
entry point has an code:OpExecutionMode instruction that specifies a
patch size with code:OutputVertices, the patch size must: be greater
than `0` and less than or equal to
sname:VkPhysicalDeviceLimits::pname:maxTessellationPatchSize
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00714]]
If pname:stage is ename:VK_SHADER_STAGE_GEOMETRY_BIT, the identified
entry point must: have an code:OpExecutionMode instruction that
specifies a maximum output vertex count that is greater than `0` and
less than or equal to
sname:VkPhysicalDeviceLimits::pname:maxGeometryOutputVertices
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00715]]
If pname:stage is ename:VK_SHADER_STAGE_GEOMETRY_BIT, the identified
entry point must: have an code:OpExecutionMode instruction that
specifies an invocation count that is greater than `0` and less than or
equal to
sname:VkPhysicalDeviceLimits::pname:maxGeometryShaderInvocations
* [[VUID-VkPipelineShaderStageCreateInfo-stage-02596]]
If pname:stage is a
<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
stage>>, and the identified entry point writes to code:Layer for any
primitive, it must: write the same value to code:Layer for all vertices
of a given primitive
* [[VUID-VkPipelineShaderStageCreateInfo-stage-02597]]
If pname:stage is a
<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
stage>>, and the identified entry point writes to code:ViewportIndex for
any primitive, it must: write the same value to code:ViewportIndex for
all vertices of a given primitive
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00718]]
If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, the identified
entry point must: not include any output variables in its interface
decorated with code:CullDistance
* [[VUID-VkPipelineShaderStageCreateInfo-stage-00719]]
If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, and the identified
entry point writes to code:FragDepth in any execution path, it must:
write to code:FragDepth in all execution paths
ifdef::VK_EXT_shader_stencil_export[]
* [[VUID-VkPipelineShaderStageCreateInfo-stage-01511]]
If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, and the identified
entry point writes to code:FragStencilRefEXT in any execution path, it
must: write to code:FragStencilRefEXT in all execution paths
endif::VK_EXT_shader_stencil_export[]
ifdef::VK_NV_mesh_shader[]
* [[VUID-VkPipelineShaderStageCreateInfo-stage-02093]]
If pname:stage is ename:VK_SHADER_STAGE_MESH_BIT_NV, the identified
entry point must: have an code:OpExecutionMode instruction that
specifies a maximum output vertex count, code:OutputVertices, that is
greater than `0` and less than or equal to
sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxMeshOutputVertices
* [[VUID-VkPipelineShaderStageCreateInfo-stage-02094]]
If pname:stage is ename:VK_SHADER_STAGE_MESH_BIT_NV, the identified
entry point must: have an code:OpExecutionMode instruction that
specifies a maximum output primitive count, code:OutputPrimitivesNV,
that is greater than `0` and less than or equal to
sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxMeshOutputPrimitives
endif::VK_NV_mesh_shader[]
ifdef::VK_EXT_subgroup_size_control[]
* [[VUID-VkPipelineShaderStageCreateInfo-flags-02784]]
If pname:flags has the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
flag set, the <<features-subgroupSizeControl,
pname:subgroupSizeControl>> feature must: be enabled
* [[VUID-VkPipelineShaderStageCreateInfo-flags-02785]]
If pname:flags has the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
flag set, the <<features-computeFullSubgroups,
pname:computeFullSubgroups>> feature must: be enabled
* [[VUID-VkPipelineShaderStageCreateInfo-pNext-02754]]
If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
structure is included in the pname:pNext chain, pname:flags must: not
have the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
flag set
* [[VUID-VkPipelineShaderStageCreateInfo-pNext-02755]]
If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
structure is included in the pname:pNext chain, the
<<features-subgroupSizeControl, pname:subgroupSizeControl>> feature
must: be enabled, and pname:stage must: be a valid bit specified in
<<limits-required-subgroup-size-stages,
pname:requiredSubgroupSizeStages>>
* [[VUID-VkPipelineShaderStageCreateInfo-pNext-02756]]
If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
structure is included in the pname:pNext chain and pname:stage is
ename:VK_SHADER_STAGE_COMPUTE_BIT, the local workgroup size of the
shader must: be less than or equal to the product of
slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::pname:requiredSubgroupSize
and
<<limits-max-subgroups-per-workgroup,pname:maxComputeWorkgroupSubgroups>>
* [[VUID-VkPipelineShaderStageCreateInfo-pNext-02757]]
If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
structure is included in the pname:pNext chain, and pname:flags has the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
flag set, the local workgroup size in the X dimension of the pipeline
must: be a multiple of
slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::pname:requiredSubgroupSize
* [[VUID-VkPipelineShaderStageCreateInfo-flags-02758]]
If pname:flags has both the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT and
ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
flags set, the local workgroup size in the X dimension of the pipeline
must: be a multiple of
<<limits-max-subgroup-size,pname:maxSubgroupSize>>
* [[VUID-VkPipelineShaderStageCreateInfo-flags-02759]]
If pname:flags has the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
flag set and pname:flags does not have the
ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
flag set and no
slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure
is included in the pname:pNext chain, the local workgroup size in the X
dimension of the pipeline must: be a multiple of
<<limits-subgroup-size,pname:subgroupSize>>
endif::VK_EXT_subgroup_size_control[]
* [[VUID-VkPipelineShaderStageCreateInfo-module-04145]]
The SPIR-V code that was used to create pname:module must: be valid as
described by the <<spirv-spec,Khronos SPIR-V Specification>> after
applying the specializations provided in pname:pSpecializationInfo, if
any, and then converting all specialization constants into fixed
constants
****
include::{generated}/validity/structs/VkPipelineShaderStageCreateInfo.txt[]
--
[open,refpage='VkPipelineShaderStageCreateFlags',desc='Bitmask of VkPipelineShaderStageCreateFlagBits',type='flags']
--
include::{generated}/api/flags/VkPipelineShaderStageCreateFlags.txt[]
tname:VkPipelineShaderStageCreateFlags is a bitmask type for setting a mask
of zero or more elink:VkPipelineShaderStageCreateFlagBits.
--
[open,refpage='VkPipelineShaderStageCreateFlagBits',desc='Bitmask controlling how a pipeline shader stage is created',type='enums']
--
Possible values of the pname:flags member of
slink:VkPipelineShaderStageCreateInfo specifying how a pipeline shader stage
is created, are:
include::{generated}/api/enums/VkPipelineShaderStageCreateFlagBits.txt[]
ifdef::VK_EXT_subgroup_size_control[]
* ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
specifies that the
<<interfaces-builtin-variables-sgs,code:SubgroupSize>> may: vary in the
shader stage.
* ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
specifies that the subgroup sizes must: be launched with all invocations
active in the compute stage.
[NOTE]
.Note
====
If ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
and ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT are
specified and <<limits-max-subgroup-size,pname:minSubgroupSize>> does not
equal <<limits-max-subgroup-size,pname:maxSubgroupSize>> and no
<<pipelines-required-subgroup-size, required subgroup size>> is specified,
then the only way to guarantee that the 'X' dimension of the local workgroup
size is a multiple of <<interfaces-builtin-variables-sgs,code:SubgroupSize>>
is to make it a multiple of pname:maxSubgroupSize.
Under these conditions, you are guaranteed full subgroups but not any
particular subgroup size.
====
endif::VK_EXT_subgroup_size_control[]
--
[open,refpage='VkShaderStageFlagBits',desc='Bitmask specifying a pipeline stage',type='enums']
--
Commands and structures which need to specify one or more shader stages do
so using a bitmask whose bits correspond to stages.
Bits which can: be set to specify shader stages are:
include::{generated}/api/enums/VkShaderStageFlagBits.txt[]
* ename:VK_SHADER_STAGE_VERTEX_BIT specifies the vertex stage.
* ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT specifies the
tessellation control stage.
* ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT specifies the
tessellation evaluation stage.
* ename:VK_SHADER_STAGE_GEOMETRY_BIT specifies the geometry stage.
* ename:VK_SHADER_STAGE_FRAGMENT_BIT specifies the fragment stage.
* ename:VK_SHADER_STAGE_COMPUTE_BIT specifies the compute stage.
* ename:VK_SHADER_STAGE_ALL_GRAPHICS is a combination of bits used as
shorthand to specify all graphics stages defined above (excluding the
compute stage).
* ename:VK_SHADER_STAGE_ALL is a combination of bits used as shorthand to
specify all shader stages supported by the device, including all
additional stages which are introduced by extensions.
ifdef::VK_NV_mesh_shader[]
* ename:VK_SHADER_STAGE_TASK_BIT_NV specifies the task stage.
* ename:VK_SHADER_STAGE_MESH_BIT_NV specifies the mesh stage.
endif::VK_NV_mesh_shader[]
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
* ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR specifies the ray generation stage.
* ename:VK_SHADER_STAGE_ANY_HIT_BIT_KHR specifies the any-hit stage.
* ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR specifies the closest hit
stage.
* ename:VK_SHADER_STAGE_MISS_BIT_KHR specifies the miss stage.
* ename:VK_SHADER_STAGE_INTERSECTION_BIT_KHR specifies the intersection
stage.
* ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR specifies the callable stage.
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
[NOTE]
.Note
====
ename:VK_SHADER_STAGE_ALL_GRAPHICS only includes the original five graphics
stages included in Vulkan 1.0, and not any stages added by extensions.
Thus, it may not have the desired effect in all cases.
====
--
[open,refpage='VkShaderStageFlags',desc='Bitmask of VkShaderStageFlagBits',type='flags']
--
include::{generated}/api/flags/VkShaderStageFlags.txt[]
tname:VkShaderStageFlags is a bitmask type for setting a mask of zero or
more elink:VkShaderStageFlagBits.
--
ifdef::VK_EXT_subgroup_size_control[]
[open,refpage='VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT',desc='Structure specifying the required subgroup size of a newly created pipeline shader stage',type='structs']
--
The sname:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure
is defined as:
include::{generated}/api/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* [[pipelines-required-subgroup-size]] pname:requiredSubgroupSize is an
unsigned integer value that specifies the required subgroup size for the
newly created pipeline shader stage.
.Valid Usage
****
* [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02760]]
pname:requiredSubgroupSize must: be a power-of-two integer
* [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02761]]
pname:requiredSubgroupSize must: be greater or equal to
<<limits-min-subgroup-size,minSubgroupSize>>
* [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02762]]
pname:requiredSubgroupSize must: be less than or equal to
<<limits-max-subgroup-size,maxSubgroupSize>>
****
If a sname:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure
is included in the pname:pNext chain of
slink:VkPipelineShaderStageCreateInfo, it specifies that the pipeline shader
stage being compiled has a required subgroup size.
include::{generated}/validity/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.txt[]
--
endif::VK_EXT_subgroup_size_control[]
ifdef::VK_HUAWEI_subpass_shading[]
[open,refpage='VkSubpassShadingPipelineCreateInfoHUAWEI',desc='Structure specifying parameters of a newly created subpass shading pipeline',type='structs']
--
A subpass shading pipeline is a compute pipeline which must: be called only
in a subpass of a render pass with work dimensions specified by render area
size.
The subpass shading pipeline shader is a compute shader allowed to access
input attachments specified in the calling subpass.
To create a subpass shading pipeline, call flink:vkCreateComputePipelines
with slink:VkSubpassShadingPipelineCreateInfoHUAWEI in the pname:pNext chain
of slink:VkComputePipelineCreateInfo.
The sname:VkSubpassShadingPipelineCreateInfoHUAWEI structure is defined as:
include::{generated}/api/structs/VkSubpassShadingPipelineCreateInfoHUAWEI.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:renderPass is a handle to a render pass object describing the
environment in which the pipeline will be used.
The pipeline must: only be used with a render pass instance compatible
with the one provided.
See <<renderpass-compatibility,Render Pass Compatibility>> for more
information.
* pname:subpass is the index of the subpass in the render pass where this
pipeline will be used.
.Valid Usage
****
* [[VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-subpass-04946]]
pname:subpass must: be created with
ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI bind point
****
include::{generated}/validity/structs/VkSubpassShadingPipelineCreateInfoHUAWEI.txt[]
--
[open,refpage='vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI',desc='Query maximum supported subpass shading workgroup size for a give render pass',type='protos']
--
A subpass shading pipeline's workgroup size is a 2D vector with number of
power-of-two in width and height.
The maximum number of width and height is implementation dependent, and may:
vary for different formats and sample counts of attachments in a render
pass.
To query the maximum workgroup size, call:
include::{generated}/api/protos/vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI.txt[]
* pname:device is a handle to a local device object that was used to
create the given render pass.
* pname:renderPass is a handle to a render pass object describing the
environment in which the pipeline will be used.
The pipeline must: only be used with a render pass instance compatible
with the one provided.
See <<renderpass-compatibility,Render Pass Compatibility>> for more
information.
* pname:pMaxWorkgroupSize is a pointer to a slink:VkExtent2D structure.
include::{generated}/validity/protos/vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI.txt[]
--
endif::VK_HUAWEI_subpass_shading[]
[[pipelines-graphics]]
== Graphics Pipelines
Graphics pipelines consist of multiple shader stages, multiple
fixed-function pipeline stages, and a pipeline layout.
[open,refpage='vkCreateGraphicsPipelines',desc='Create graphics pipelines',type='protos']
--
To create graphics pipelines, call:
include::{generated}/api/protos/vkCreateGraphicsPipelines.txt[]
* pname:device is the logical device that creates the graphics pipelines.
* pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
pipeline caching is disabled; or the handle of a valid
<<pipelines-cache,pipeline cache>> object, in which case use of that
cache is enabled for the duration of the command.
* pname:createInfoCount is the length of the pname:pCreateInfos and
pname:pPipelines arrays.
* pname:pCreateInfos is a pointer to an array of
slink:VkGraphicsPipelineCreateInfo structures.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
* pname:pPipelines is a pointer to an array of slink:VkPipeline handles in
which the resulting graphics pipeline objects are returned.
The slink:VkGraphicsPipelineCreateInfo structure includes an array of
slink:VkPipelineShaderStageCreateInfo structures for each of the desired
active shader stages, as well as creation information for all relevant
fixed-function stages, and a pipeline layout.
.Valid Usage
****
* [[VUID-vkCreateGraphicsPipelines-flags-00720]]
If the pname:flags member of any element of pname:pCreateInfos contains
the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the
pname:basePipelineIndex member of that same element is not `-1`,
pname:basePipelineIndex must: be less than the index into
pname:pCreateInfos that corresponds to that element
* [[VUID-vkCreateGraphicsPipelines-flags-00721]]
If the pname:flags member of any element of pname:pCreateInfos contains
the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline
must: have been created with the
ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set
ifdef::VK_EXT_pipeline_creation_cache_control[]
* [[VUID-vkCreateGraphicsPipelines-pipelineCache-02876]]
If pname:pipelineCache was created with
ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host
access to pname:pipelineCache must: be
<<fundamentals-threadingbehavior,externally synchronized>>
endif::VK_EXT_pipeline_creation_cache_control[]
****
ifdef::VK_EXT_pipeline_creation_cache_control[]
[NOTE]
.Note
====
An implicit cache may be provided by the implementation or a layer.
For this reason, it is still valid to set
ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT on
pname:flags for any element of pname:pCreateInfos while passing
dlink:VK_NULL_HANDLE for pname:pipelineCache.
====
endif::VK_EXT_pipeline_creation_cache_control[]
include::{generated}/validity/protos/vkCreateGraphicsPipelines.txt[]
--
[open,refpage='VkGraphicsPipelineCreateInfo',desc='Structure specifying parameters of a newly created graphics pipeline',type='structs']
--
The sname:VkGraphicsPipelineCreateInfo structure is defined as:
include::{generated}/api/structs/VkGraphicsPipelineCreateInfo.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
how the pipeline will be generated.
* pname:stageCount is the number of entries in the pname:pStages array.
* pname:pStages is a pointer to an array of pname:stageCount
slink:VkPipelineShaderStageCreateInfo structures describing the set of
the shader stages to be included in the graphics pipeline.
* pname:pVertexInputState is a pointer to a
slink:VkPipelineVertexInputStateCreateInfo structure.
ifdef::VK_NV_mesh_shader[]
It is ignored if the pipeline includes a mesh shader stage.
endif::VK_NV_mesh_shader[]
ifdef::VK_EXT_vertex_input_dynamic_state[]
It is ignored if the pipeline is created with the
ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic state set.
endif::VK_EXT_vertex_input_dynamic_state[]
* pname:pInputAssemblyState is a pointer to a
slink:VkPipelineInputAssemblyStateCreateInfo structure which determines
input assembly behavior, as described in <<drawing, Drawing Commands>>.
ifdef::VK_NV_mesh_shader[]
It is ignored if the pipeline includes a mesh shader stage.
endif::VK_NV_mesh_shader[]
* pname:pTessellationState is a pointer to a
slink:VkPipelineTessellationStateCreateInfo structure, and is ignored if
the pipeline does not include a tessellation control shader stage and
tessellation evaluation shader stage.
* pname:pViewportState is a pointer to a
slink:VkPipelineViewportStateCreateInfo structure, and is ignored if the
pipeline has rasterization disabled.
* pname:pRasterizationState is a pointer to a
slink:VkPipelineRasterizationStateCreateInfo structure.
* pname:pMultisampleState is a pointer to a
slink:VkPipelineMultisampleStateCreateInfo structure, and is ignored if
the pipeline has rasterization disabled.
* pname:pDepthStencilState is a pointer to a
slink:VkPipelineDepthStencilStateCreateInfo structure, and is ignored if
the pipeline has rasterization disabled or if no depth/stencil
attachment is used.
* pname:pColorBlendState is a pointer to a
slink:VkPipelineColorBlendStateCreateInfo structure, and is ignored if
the pipeline has rasterization disabled or if no color attachments are
used.
* pname:pDynamicState is a pointer to a
slink:VkPipelineDynamicStateCreateInfo structure, and is used to
indicate which properties of the pipeline state object are dynamic and
can: be changed independently of the pipeline state.
This can: be `NULL`, which means no state in the pipeline is considered
dynamic.
* pname:layout is the description of binding locations used by both the
pipeline and descriptor sets used with the pipeline.
* pname:renderPass is a handle to a render pass object describing the
environment in which the pipeline will be used.
The pipeline must: only be used with a render pass instance compatible
with the one provided.
See <<renderpass-compatibility,Render Pass Compatibility>> for more
information.
* pname:subpass is the index of the subpass in the render pass where this
pipeline will be used.
* pname:basePipelineHandle is a pipeline to derive from.
* pname:basePipelineIndex is an index into the pname:pCreateInfos
parameter to use as a pipeline to derive from.
The parameters pname:basePipelineHandle and pname:basePipelineIndex are
described in more detail in <<pipelines-pipeline-derivatives,Pipeline
Derivatives>>.
ifdef::VK_NV_glsl_shader[]
If any shader stage fails to compile,
ifdef::VK_EXT_debug_report[]
the compile log will be reported back to the application, and
endif::VK_EXT_debug_report[]
ename:VK_ERROR_INVALID_SHADER_NV will be generated.
endif::VK_NV_glsl_shader[]
[[pipeline-graphics-subsets]]
The state required for a graphics pipeline is divided into
<<pipeline-graphics-subsets-vertex-input, vertex input state>>,
<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
state>>, <<pipeline-graphics-subsets-fragment-shader,fragment shader
state>>, and <<pipeline-graphics-subsets-fragment-output,fragment output
state>>.
[[pipeline-graphics-subsets-vertex-input]]
Vertex input state is defined by:
* slink:VkPipelineVertexInputStateCreateInfo
* slink:VkPipelineInputAssemblyStateCreateInfo
[[pipeline-graphics-subsets-pre-rasterization]]
Pre-rasterization shader state is defined by:
* slink:VkPipelineShaderStageCreateInfo entries for:
** Vertex shaders
** Tessellation control shaders
** Tessellation evaluation shaders
** Geometry shaders
ifdef::VK_NV_mesh_shader[]
** Task shaders
** Mesh shaders
endif::VK_NV_mesh_shader[]
* Within the slink:VkPipelineLayout, all bindings that affect the
specified shader stages
* slink:VkPipelineViewportStateCreateInfo
* slink:VkPipelineRasterizationStateCreateInfo
* slink:VkPipelineTessellationStateCreateInfo if tessellation stages are
included.
* slink:VkRenderPass and pname:subpass parameter
ifdef::VK_EXT_discard_rectangles[]
* slink:VkPipelineDiscardRectangleStateCreateInfoEXT
endif::VK_EXT_discard_rectangles[]
ifdef::VK_KHR_fragment_shading_rate[]
* slink:VkPipelineFragmentShadingRateStateCreateInfoKHR
ifdef::VK_NV_fragment_shading_rate_enums[]
* slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV
endif::VK_NV_fragment_shading_rate_enums[]
endif::VK_KHR_fragment_shading_rate[]
[[pipeline-graphics-subsets-fragment-shader]]
Fragment shader state is defined by:
* A slink:VkPipelineShaderStageCreateInfo entry for the fragment shader
* Within the slink:VkPipelineLayout, all bindings that affect the fragment
shader
* slink:VkPipelineMultisampleStateCreateInfo
* slink:VkPipelineDepthStencilStateCreateInfo
* slink:VkRenderPass and pname:subpass parameter
ifdef::VK_KHR_fragment_shading_rate[]
* slink:VkPipelineFragmentShadingRateStateCreateInfoKHR
ifdef::VK_NV_fragment_shading_rate_enums[]
* slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV
endif::VK_NV_fragment_shading_rate_enums[]
endif::VK_KHR_fragment_shading_rate[]
[[pipeline-graphics-subsets-fragment-output]]
Fragment output state is defined by:
* slink:VkPipelineColorBlendStateCreateInfo
* The pname:alphaToCoverageEnable and pname:alphaToOneEnable members of
slink:VkPipelineMultisampleStateCreateInfo.
* slink:VkRenderPass and pname:subpass parameter
[[pipeline-graphics-subsets-complete]]
A complete graphics pipeline always includes
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, with other subsets included depending on that state.
If the <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
shader state>> includes a vertex shader, then
<<pipeline-graphics-subsets-vertex-input, vertex input state>> is included
in a complete graphics pipeline.
If the value of
slink:VkPipelineRasterizationStateCreateInfo::pname:rasterizerDiscardEnable
in the <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
shader state>> is ename:VK_FALSE
ifdef::VK_EXT_extended_dynamic_state2[]
or the ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT dynamic state is
enabled
endif::VK_EXT_extended_dynamic_state2[]
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
<<pipeline-graphics-subsets-fragment-output, fragment output interface
state>> is included in a complete graphics pipeline.
Pipelines must: be created with a complete set of pipeline state.
.Valid Usage
****
* [[VUID-VkGraphicsPipelineCreateInfo-flags-00722]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineIndex is -1, pname:basePipelineHandle must:
be a valid handle to a graphics sname:VkPipeline
* [[VUID-VkGraphicsPipelineCreateInfo-flags-00723]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineHandle is dlink:VK_NULL_HANDLE,
pname:basePipelineIndex must: be a valid index into the calling
command's pname:pCreateInfos parameter
* [[VUID-VkGraphicsPipelineCreateInfo-flags-00724]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineIndex is not -1, pname:basePipelineHandle
must: be dlink:VK_NULL_HANDLE
* [[VUID-VkGraphicsPipelineCreateInfo-flags-00725]]
If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
flag, and pname:basePipelineHandle is not dlink:VK_NULL_HANDLE,
pname:basePipelineIndex must: be -1
* [[VUID-VkGraphicsPipelineCreateInfo-stage-00726]]
The pname:stage member of each element of pname:pStages must: be unique
ifndef::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineCreateInfo-stage-00727]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> the pname:stage member of one element of pname:pStages must: be
ename:VK_SHADER_STAGE_VERTEX_BIT
endif::VK_NV_mesh_shader[]
ifdef::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-02095]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> the geometric shader stages provided in pname:pStages must: be
either from the mesh shading pipeline (pname:stage is
ename:VK_SHADER_STAGE_TASK_BIT_NV or ename:VK_SHADER_STAGE_MESH_BIT_NV)
or from the primitive shading pipeline (pname:stage is
ename:VK_SHADER_STAGE_VERTEX_BIT,
ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, or
ename:VK_SHADER_STAGE_GEOMETRY_BIT)
* [[VUID-VkGraphicsPipelineCreateInfo-stage-02096]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> the pname:stage member of one element of pname:pStages must: be
either ename:VK_SHADER_STAGE_VERTEX_BIT or
ename:VK_SHADER_STAGE_MESH_BIT_NV
endif::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineCreateInfo-stage-00728]]
The pname:stage member of each element of pname:pStages must: not be
ename:VK_SHADER_STAGE_COMPUTE_BIT
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00729]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes a tessellation control shader stage,
it must: include a tessellation evaluation shader stage
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00730]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes a tessellation evaluation shader
stage, it must: include a tessellation control shader stage
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00731]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes a tessellation control shader stage
and a tessellation evaluation shader stage, pname:pTessellationState
must: be a valid pointer to a valid
slink:VkPipelineTessellationStateCreateInfo structure
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00732]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes tessellation shader stages, the
shader code of at least one stage must: contain an code:OpExecutionMode
instruction that specifies the type of subdivision in the pipeline
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00733]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes tessellation shader stages, and the
shader code of both stages contain an code:OpExecutionMode instruction
that specifies the type of subdivision in the pipeline, they must: both
specify the same subdivision mode
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00734]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes tessellation shader stages, the
shader code of at least one stage must: contain an code:OpExecutionMode
instruction that specifies the output patch size in the pipeline
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00735]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes tessellation shader stages, and the
shader code of both contain an code:OpExecutionMode instruction that
specifies the out patch size in the pipeline, they must: both specify
the same patch size
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00736]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes tessellation shader stages, the
pname:topology member of pname:pInputAssembly must: be
ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
* [[VUID-VkGraphicsPipelineCreateInfo-topology-00737]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and the pname:topology member of pname:pInputAssembly is
ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, pname:pStages must: include
tessellation shader stages
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00738]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes a geometry shader stage, and does not
include any tessellation shader stages, its shader code must: contain an
code:OpExecutionMode instruction that specifies an input primitive type
that is <<shaders-geometry-execution, compatible>> with the primitive
topology specified in pname:pInputAssembly
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00739]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:pStages includes a geometry shader stage, and also
includes tessellation shader stages, its shader code must: contain an
code:OpExecutionMode instruction that specifies an input primitive type
that is <<shaders-geometry-execution, compatible>> with the primitive
topology that is output by the tessellation stages
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00740]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, it includes both a fragment shader and a geometry shader, and
the fragment shader code reads from an input variable that is decorated
with code:PrimitiveId, then the geometry shader code must: write to a
matching output variable, decorated with code:PrimitiveId, in all
execution paths
ifdef::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineCreateInfo-PrimitiveId-06264]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, it includes a mesh shader and the fragment shader code reads
from an input variable that is decorated with code:PrimitiveId, then the
mesh shader code must: write to a matching output variable, decorated
with code:PrimitiveId, in all execution paths
endif::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06038]]
If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is
being created with <<pipeline-graphics-subsets-fragment-shader, fragment
shader state>> the fragment shader must: not read from any input
attachment that is defined as ename:VK_ATTACHMENT_UNUSED in
pname:subpass
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-00742]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and multiple pre-rasterization shader stages are included in
pname:pStages, the shader code for the entry points identified by those
pname:pStages and the rest of the state identified by this structure
must: adhere to the pipeline linking rules described in the
<<interfaces,Shader Interfaces>> chapter
* [[VUID-VkGraphicsPipelineCreateInfo-None-04889]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, the fragment shader and last
<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
stage>> and any relevant state must: adhere to the pipeline linking
rules described in the <<interfaces,Shader Interfaces>> chapter
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06039]]
If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-fragment-shader, fragment
shader state>>, and pname:subpass uses a depth/stencil attachment in
pname:renderPass with a read-only layout for the depth aspect in the
slink:VkAttachmentReference defined by pname:subpass, the
pname:depthWriteEnable member of pname:pDepthStencilState must: be
ename:VK_FALSE
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06040]]
If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-fragment-shader, fragment
shader state>>, and pname:subpass uses a depth/stencil attachment in
pname:renderPass with a read-only layout for the stencil aspect in the
slink:VkAttachmentReference defined by pname:subpass, the pname:failOp,
pname:passOp and pname:depthFailOp members of each of the pname:front
and pname:back members of pname:pDepthStencilState must: be
ename:VK_STENCIL_OP_KEEP
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06041]]
If pname:renderPass is not dlink:VK_NULL_HANDLE, and the pipeline is
being created with <<pipeline-graphics-subsets-fragment-output, fragment
output interface state>>, then for each color attachment in the subpass,
if the <<potential-format-features,potential format features>> of the
format of the corresponding attachment description do not contain
ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then the
pname:blendEnable member of the corresponding element of the
pname:pAttachments member of pname:pColorBlendState must: be
ename:VK_FALSE
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06042]]
If pname:renderPass is not dlink:VK_NULL_HANDLE, and the pipeline is
being created with <<pipeline-graphics-subsets-fragment-output, fragment
output interface state>>, and the subpass uses color attachments, the
pname:attachmentCount member of pname:pColorBlendState must: be equal to
the pname:colorAttachmentCount used to create pname:subpass
ifndef::VK_EXT_extended_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_VIEWPORT, the
pname:pViewports member of pname:pViewportState must: be a valid pointer
to an array of pname:pViewportState->viewportCount valid
sname:VkViewport structures
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_SCISSOR, the
pname:pScissors member of pname:pViewportState must: be a valid pointer
to an array of pname:pViewportState->scissorCount sname:VkRect2D
structures
endif::VK_EXT_extended_dynamic_state[]
ifdef::VK_EXT_extended_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04130]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_VIEWPORT or
ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT, the pname:pViewports
member of pname:pViewportState must: be a valid pointer to an array of
pname:pViewportState->viewportCount valid sname:VkViewport structures
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04131]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_SCISSOR or
ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, the pname:pScissors
member of pname:pViewportState must: be a valid pointer to an array of
pname:pViewportState->scissorCount sname:VkRect2D structures
endif::VK_EXT_extended_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and the wide lines feature is not enabled, and no element of
the pname:pDynamicStates member of pname:pDynamicState is
ename:VK_DYNAMIC_STATE_LINE_WIDTH, the pname:lineWidth member of
pname:pRasterizationState must: be `1.0`
* [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and the pname:rasterizerDiscardEnable member of
pname:pRasterizationState is ename:VK_FALSE, pname:pViewportState must:
be a valid pointer to a valid slink:VkPipelineViewportStateCreateInfo
structure
ifdef::VK_EXT_extended_dynamic_state2[]
* [[VUID-VkGraphicsPipelineCreateInfo-pViewportState-04892]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and the graphics pipeline state was created with the
ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT dynamic state
enabled, pname:pViewportState must: be a valid pointer to a valid
slink:VkPipelineViewportStateCreateInfo structure
endif::VK_EXT_extended_dynamic_state2[]
* [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
pname:pMultisampleState must: be a valid pointer to a valid
slink:VkPipelineMultisampleStateCreateInfo structure
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06043]]
If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-fragment-shader, fragment
shader state>>, and pname:subpass uses a depth/stencil attachment,
pname:pDepthStencilState must: be a valid pointer to a valid
slink:VkPipelineDepthStencilStateCreateInfo structure
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06044]]
If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-fragment-output, fragment
output interface state>>, and pname:subpass uses color attachments,
pname:pColorBlendState must: be a valid pointer to a valid
slink:VkPipelineColorBlendStateCreateInfo structure
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06045]]
If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is
being created with <<pipeline-graphics-subsets-fragment-output, fragment
output interface state>>, pname:pColorBlendState->attachmentCount must:
be greater than the index of all color attachments that are not
ename:VK_ATTACHMENT_UNUSED for the pname:subpass index in
pname:renderPass
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, the depth bias clamping feature is not enabled, no element of
the pname:pDynamicStates member of pname:pDynamicState is
ename:VK_DYNAMIC_STATE_DEPTH_BIAS, and the pname:depthBiasEnable member
of pname:pRasterizationState is ename:VK_TRUE, the pname:depthBiasClamp
member of pname:pRasterizationState must: be `0.0`
ifndef::VK_EXT_depth_range_unrestricted[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and no element of the pname:pDynamicStates member of pname:pDynamicState
is ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the
pname:depthBoundsTestEnable member of pname:pDepthStencilState is
ename:VK_TRUE, the pname:minDepthBounds and pname:maxDepthBounds members
of pname:pDepthStencilState must: be between `0.0` and `1.0`, inclusive
endif::VK_EXT_depth_range_unrestricted[]
ifdef::VK_EXT_depth_range_unrestricted[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-02510]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and the `apiext:VK_EXT_depth_range_unrestricted` extension is not
enabled and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the
pname:depthBoundsTestEnable member of pname:pDepthStencilState is
ename:VK_TRUE, the pname:minDepthBounds and pname:maxDepthBounds members
of pname:pDepthStencilState must: be between `0.0` and `1.0`, inclusive
endif::VK_EXT_depth_range_unrestricted[]
ifdef::VK_EXT_sample_locations[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and no element of the pname:pDynamicStates member of pname:pDynamicState
is ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the
pname:sampleLocationsEnable member of a
slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE,
pname:sampleLocationsInfo.sampleLocationGridSize.width must: evenly
divide
slink:VkMultisamplePropertiesEXT::pname:sampleLocationGridSize.width as
returned by flink:vkGetPhysicalDeviceMultisamplePropertiesEXT with a
pname:samples parameter equaling pname:rasterizationSamples
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and no element of the pname:pDynamicStates member of pname:pDynamicState
is ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the
pname:sampleLocationsEnable member of a
slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE,
pname:sampleLocationsInfo.sampleLocationGridSize.height must: evenly
divide
slink:VkMultisamplePropertiesEXT::pname:sampleLocationGridSize.height as
returned by flink:vkGetPhysicalDeviceMultisamplePropertiesEXT with a
pname:samples parameter equaling pname:rasterizationSamples
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and no element of the pname:pDynamicStates member of pname:pDynamicState
is ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the
pname:sampleLocationsEnable member of a
slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE,
pname:sampleLocationsInfo.sampleLocationsPerPixel must: equal
pname:rasterizationSamples
* [[VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and the pname:sampleLocationsEnable member of a
slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE, the
fragment shader code must: not statically use the extended instruction
code:InterpolateAtSample
endif::VK_EXT_sample_locations[]
* [[VUID-VkGraphicsPipelineCreateInfo-layout-00756]]
pname:layout must: be
<<descriptorsets-pipelinelayout-consistency,consistent>> with all
shaders specified in pname:pStages
* [[VUID-VkGraphicsPipelineCreateInfo-subpass-00757]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and neither the `apiext:VK_AMD_mixed_attachment_samples` nor the
`apiext:VK_NV_framebuffer_mixed_samples` extensions are enabled, and if
pname:subpass uses color and/or depth/stencil attachments, then the
pname:rasterizationSamples member of pname:pMultisampleState must: be
the same as the sample count for those subpass attachments
ifdef::VK_AMD_mixed_attachment_samples[]
* [[VUID-VkGraphicsPipelineCreateInfo-subpass-01505]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled,
and if pname:subpass uses color and/or depth/stencil attachments, then
the pname:rasterizationSamples member of pname:pMultisampleState must:
equal the maximum of the sample counts of those subpass attachments
endif::VK_AMD_mixed_attachment_samples[]
ifdef::VK_NV_framebuffer_mixed_samples[]
* [[VUID-VkGraphicsPipelineCreateInfo-subpass-01411]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled,
and if pname:subpass has a depth/stencil attachment and depth test,
stencil test, or depth bounds test are enabled, then the
pname:rasterizationSamples member of pname:pMultisampleState must: be
the same as the sample count of the depth/stencil attachment
* [[VUID-VkGraphicsPipelineCreateInfo-subpass-01412]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled,
and if pname:subpass has any color attachments, then the
pname:rasterizationSamples member of pname:pMultisampleState must: be
greater than or equal to the sample count for those subpass attachments
endif::VK_NV_framebuffer_mixed_samples[]
ifdef::VK_NV_coverage_reduction_mode[]
* [[VUID-VkGraphicsPipelineCreateInfo-coverageReductionMode-02722]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
and the `apiext:VK_NV_coverage_reduction_mode` extension is enabled, the
coverage reduction mode specified by
slink:VkPipelineCoverageReductionStateCreateInfoNV::pname:coverageReductionMode,
the pname:rasterizationSamples member of pname:pMultisampleState and the
sample counts for the color and depth/stencil attachments (if the
subpass has them) must: be a valid combination returned by
fname:vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
endif::VK_NV_coverage_reduction_mode[]
* [[VUID-VkGraphicsPipelineCreateInfo-subpass-00758]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
pname:subpass does not use any color and/or depth/stencil attachments,
then the pname:rasterizationSamples member of pname:pMultisampleState
must: follow the rules for a <<renderpass-noattachments, zero-attachment
subpass>>
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06046]]
If pname:renderPass is a valid renderPass, pname:subpass must: be a
valid subpass within pname:renderPass
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06047]]
If pname:renderPass is a valid renderPass, the pipeline is being created
with <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
shader state>>, and the pname:renderPass has multiview enabled and
pname:subpass has more than one bit set in the view mask and
pname:multiviewTessellationShader is not enabled, then pname:pStages
must: not include tessellation shaders
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06048]]
If pname:renderPass is a valid renderPass, the pipeline is being created
with <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
shader state>>, and the pname:renderPass has multiview enabled and
pname:subpass has more than one bit set in the view mask and
pname:multiviewGeometryShader is not enabled, then pname:pStages must:
not include a geometry shader
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06049]]
If pname:renderPass is a valid renderPass, the pipeline is being created
with <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
shader state>>, and the pname:renderPass has multiview enabled and
pname:subpass has more than one bit set in the view mask, shaders in the
pipeline must: not write to the code:Layer built-in output
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06050]]
If pname:renderPass is a valid renderPass and the pipeline is being
created with <<pipeline-graphics-subsets-pre-rasterization,
pre-rasterization shader state>>, and the pname:renderPass has multiview
enabled, then all shaders must: not include variables decorated with the
code:Layer built-in decoration in their interfaces
endif::VK_VERSION_1_1,VK_KHR_multiview[]
ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
* [[VUID-VkGraphicsPipelineCreateInfo-flags-00764]]
pname:flags must: not contain the ename:VK_PIPELINE_CREATE_DISPATCH_BASE
flag
endif::VK_VERSION_1_1,VK_KHR_device_group[]
ifdef::VK_VERSION_1_1,VK_KHR_maintenance2,VK_KHR_create_renderpass2[]
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-01565]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
an input attachment was referenced by an pname:aspectMask at
pname:renderPass creation time, the fragment shader must: only read from
the aspects that were specified for that input attachment
endif::VK_VERSION_1_1,VK_KHR_maintenance2,VK_KHR_create_renderpass2[]
* [[VUID-VkGraphicsPipelineCreateInfo-layout-01688]]
The number of resources in pname:layout accessible to each shader stage
that is used by the pipeline must: be less than or equal to
sname:VkPhysicalDeviceLimits::pname:maxPerStageResources
ifdef::VK_NV_clip_space_w_scaling[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, and
the pname:viewportWScalingEnable member of a
slink:VkPipelineViewportWScalingStateCreateInfoNV structure, included in
the pname:pNext chain of pname:pViewportState, is ename:VK_TRUE, the
pname:pViewportWScalings member of the
slink:VkPipelineViewportWScalingStateCreateInfoNV must: be a pointer to
an array of
slink:VkPipelineViewportWScalingStateCreateInfoNV::pname:viewportCount
valid slink:VkViewportWScalingNV structures
endif::VK_NV_clip_space_w_scaling[]
ifdef::VK_NV_scissor_exclusive[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV, and
if pname:pViewportState->pNext chain includes a
slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure, and
if its pname:exclusiveScissorCount member is not `0`, then its
pname:pExclusiveScissors member must: be a valid pointer to an array of
pname:exclusiveScissorCount slink:VkRect2D structures
endif::VK_NV_scissor_exclusive[]
ifdef::VK_NV_shading_rate_image[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is
ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, and if
pname:pViewportState->pNext chain includes a
slink:VkPipelineViewportShadingRateImageStateCreateInfoNV structure,
then its pname:pShadingRatePalettes member must: be a valid pointer to
an array of pname:viewportCount valid slink:VkShadingRatePaletteNV
structures
endif::VK_NV_shading_rate_image[]
ifdef::VK_EXT_discard_rectangles[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04058]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and no element of the pname:pDynamicStates member of
pname:pDynamicState is ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, and
if pname:pNext chain includes a
slink:VkPipelineDiscardRectangleStateCreateInfoEXT structure, and if its
pname:discardRectangleCount member is not `0`, then its
pname:pDiscardRectangles member must: be a valid pointer to an array of
pname:discardRectangleCount slink:VkRect2D structures
endif::VK_EXT_discard_rectangles[]
ifndef::VK_EXT_vertex_input_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-02097]]
If the pipeline is being created with
<<pipeline-graphics-subsets-vertex-input, vertex input state>>,
pname:pVertexInputState must: be a valid pointer to a valid
slink:VkPipelineVertexInputStateCreateInfo structure
endif::VK_EXT_vertex_input_dynamic_state[]
ifndef::VK_EXT_vertex_input_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-04910]]
If the pipeline is being created with
<<pipeline-graphics-subsets-vertex-input, vertex input state>>, and
ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT is not set,
pname:pVertexInputState must: be a valid pointer to a valid
slink:VkPipelineVertexInputStateCreateInfo structure
endif::VK_EXT_vertex_input_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-02098]]
If the pipeline is being created with
<<pipeline-graphics-subsets-vertex-input, vertex input state>>,
pname:pInputAssemblyState must: be a valid pointer to a valid
slink:VkPipelineInputAssemblyStateCreateInfo structure
ifdef::VK_EXT_transform_feedback[]
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-02317]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, the code:Xfb execution mode can: be specified by no more than
one shader stage in pname:pStages
* [[VUID-VkGraphicsPipelineCreateInfo-pStages-02318]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and any shader stage in pname:pStages specifies code:Xfb
execution mode it must: be the last
<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
stage>>
* [[VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and a
slink:VkPipelineRasterizationStateStreamCreateInfoEXT::pname:rasterizationStream
value other than zero is specified, all variables in the output
interface of the entry point being compiled decorated with
code:Position, code:PointSize, code:ClipDistance, or code:CullDistance
must: be decorated with identical code:Stream values that match the
pname:rasterizationStream
* [[VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02320]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and
slink:VkPipelineRasterizationStateStreamCreateInfoEXT::pname:rasterizationStream
is zero, or not specified, all variables in the output interface of the
entry point being compiled decorated with code:Position, code:PointSize,
code:ClipDistance, or code:CullDistance must: be decorated with a
code:Stream value of zero, or must: not specify the code:Stream
decoration
* [[VUID-VkGraphicsPipelineCreateInfo-geometryStreams-02321]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and the last
<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
stage>> is a geometry shader, and that geometry shader uses the
code:GeometryStreams capability, then
sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:geometryStreams
feature must: be enabled
ifdef::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineCreateInfo-None-02322]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and there are any mesh shader stages in the pipeline there
must: not be any shader stage in the pipeline with a code:Xfb execution
mode
endif::VK_NV_mesh_shader[]
endif::VK_EXT_transform_feedback[]
ifdef::VK_EXT_line_rasterization[]
* [[VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and at least one of <<pipeline-graphics-subsets-fragment-output,
fragment output interface state>> or
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
the pname:lineRasterizationMode member of a
slink:VkPipelineRasterizationLineStateCreateInfoEXT structure included
in the pname:pNext chain of pname:pRasterizationState is
ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT or
ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the
pname:alphaToCoverageEnable, pname:alphaToOneEnable, and
pname:sampleShadingEnable members of pname:pMultisampleState must: all
be ename:VK_FALSE
* [[VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, the pname:stippledLineEnable member of
slink:VkPipelineRasterizationLineStateCreateInfoEXT is ename:VK_TRUE,
and no element of the pname:pDynamicStates member of pname:pDynamicState
is ename:VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, then the
pname:lineStippleFactor member of
slink:VkPipelineRasterizationLineStateCreateInfoEXT must: be in the
range [eq]#[1,256]#
endif::VK_EXT_line_rasterization[]
ifdef::VK_KHR_pipeline_library[]
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03371]]
pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
endif::VK_KHR_pipeline_library[]
ifdef::VK_KHR_ray_tracing_pipeline[]
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03372]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03373]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03374]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03375]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03376]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03377]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-flags-03577]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing_motion_blur[]
* [[VUID-VkGraphicsPipelineCreateInfo-flags-04947]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
endif::VK_NV_ray_tracing_motion_blur[]
ifdef::VK_EXT_extended_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378]]
If the <<features-extendedDynamicState, extendedDynamicState>> feature
is not enabled, there must: be no element of the pname:pDynamicStates
member of pname:pDynamicState set to
ename:VK_DYNAMIC_STATE_CULL_MODE_EXT,
ename:VK_DYNAMIC_STATE_FRONT_FACE_EXT,
ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT,
ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT,
ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT,
ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,
ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,
ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, or
ename:VK_DYNAMIC_STATE_STENCIL_OP_EXT
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is included
in the pname:pDynamicStates array then pname:viewportCount must: be zero
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT is included
in the pname:pDynamicStates array then pname:scissorCount must: be zero
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04132]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is included
in the pname:pDynamicStates array then ename:VK_DYNAMIC_STATE_VIEWPORT
must: not be present
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04133]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>>, and ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT is included
in the pname:pDynamicStates array then ename:VK_DYNAMIC_STATE_SCISSOR
must: not be present
endif::VK_EXT_extended_dynamic_state[]
ifdef::VK_EXT_extended_dynamic_state2[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04868]]
If the <<features-extendedDynamicState2, extendedDynamicState2>> feature
is not enabled, there must: be no element of the pname:pDynamicStates
member of pname:pDynamicState set to
ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT,
ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT, or
ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04869]]
If the <<features-extendedDynamicState2LogicOp,
extendedDynamicState2LogicOp>> feature is not enabled, there must: be no
element of the pname:pDynamicStates member of pname:pDynamicState set to
ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04870]]
If the <<features-extendedDynamicState2PatchControlPoints,
extendedDynamicState2PatchControlPoints>> feature is not enabled, there
must: be no element of the pname:pDynamicStates member of
pname:pDynamicState set to
ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT
endif::VK_EXT_extended_dynamic_state2[]
ifdef::VK_NV_device_generated_commands[]
* [[VUID-VkGraphicsPipelineCreateInfo-flags-02877]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then the
<<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
ifdef::VK_EXT_transform_feedback[]
* [[VUID-VkGraphicsPipelineCreateInfo-flags-02966]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and pname:flags includes
ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then all stages must:
not specify code:Xfb execution mode
endif::VK_EXT_transform_feedback[]
endif::VK_NV_device_generated_commands[]
ifdef::VK_EXT_pipeline_creation_cache_control[]
* [[VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878]]
If the <<features-pipelineCreationCacheControl,
pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
must: not include
ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or
ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
endif::VK_EXT_pipeline_creation_cache_control[]
ifdef::VK_KHR_fragment_shading_rate[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04494]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
must: be greater than or equal to `1`
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04495]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
must: be greater than or equal to `1`
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04496]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
must: be a power-of-two value
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04497]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
must: be a power-of-two value
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04498]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
must: be less than or equal to `4`
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04499]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
must: be less than or equal to `4`
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04500]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-pipelineFragmentShadingRate,
pname:pipelineFragmentShadingRate feature>> is not enabled,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
and
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
must: both be equal to `1`
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04501]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-primitiveFragmentShadingRate,
pname:primitiveFragmentShadingRate feature>> is not enabled,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:combinerOps[0]
must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04502]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-attachmentFragmentShadingRate,
pname:attachmentFragmentShadingRate feature>> is not enabled,
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:combinerOps[1]
must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
ifdef::VK_EXT_extended_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04503]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and the
<<limits-primitiveFragmentShadingRateWithMultipleViewports,
pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
supported, ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is not
included in pname:pDynamicState->pDynamicStates, and
slink:VkPipelineViewportStateCreateInfo::pname:viewportCount is greater
than `1`, entry points specified in pname:pStages must: not write to the
code:PrimitiveShadingRateKHR built-in
endif::VK_EXT_extended_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04504]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and the
<<limits-primitiveFragmentShadingRateWithMultipleViewports,
pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
supported, and entry points specified in pname:pStages write to the
code:ViewportIndex built-in, they must: not also write to the
code:PrimitiveShadingRateKHR built-in
ifdef::VK_NV_viewport_array2[]
* [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04505]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and the
<<limits-primitiveFragmentShadingRateWithMultipleViewports,
pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
supported, and entry points specified in pname:pStages write to the
code:ViewportMaskNV built-in, they must: not also write to the
code:PrimitiveShadingRateKHR built-in
endif::VK_NV_viewport_array2[]
* [[VUID-VkGraphicsPipelineCreateInfo-fragmentShadingRateNonTrivialCombinerOps-04506]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, the <<limits-fragmentShadingRateNonTrivialCombinerOps,
pname:fragmentShadingRateNonTrivialCombinerOps>> limit is not supported,
and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in
pname:pDynamicState->pDynamicStates, elements of
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:combinerOps
must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR
endif::VK_KHR_fragment_shading_rate[]
ifdef::VK_NV_fragment_shading_rate_enums[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04569]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-fragmentShadingRateEnums, pname:fragmentShadingRateEnums
feature>> is not enabled,
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRateType
must: be equal to ename:VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04570]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-pipelineFragmentShadingRate,
pname:pipelineFragmentShadingRate feature>> is not enabled,
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate
must: be equal to
ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04571]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-primitiveFragmentShadingRate,
pname:primitiveFragmentShadingRate feature>> is not enabled,
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps[0]
must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04572]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
included in pname:pDynamicState->pDynamicStates, and the
<<features-attachmentFragmentShadingRate,
pname:attachmentFragmentShadingRate feature>> is not enabled,
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps[1]
must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-fragmentShadingRateNonTrivialCombinerOps-04573]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and the <<limits-fragmentShadingRateNonTrivialCombinerOps,
pname:fragmentShadingRateNonTrivialCombinerOps>> limit is not supported
and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in
pname:pDynamicState->pDynamicStates, elements of
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps
must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR
* [[VUID-VkGraphicsPipelineCreateInfo-None-04574]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and the <<features-supersampleFragmentShadingRates,
supersampleFragmentShadingRates feature>> is not enabled,
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate
must: not be equal to
ename:VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV,
ename:VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV,
ename:VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV, or
ename:VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV
* [[VUID-VkGraphicsPipelineCreateInfo-None-04575]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
state>>, and the <<features-noInvocationFragmentShadingRates,
noInvocationFragmentShadingRates feature>> is not enabled,
slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate
must: not be equal to ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV
endif::VK_NV_fragment_shading_rate_enums[]
ifdef::VK_KHR_ray_tracing_pipeline[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03578]]
All elements of the pname:pDynamicStates member of pname:pDynamicState
must: not be ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_EXT_vertex_input_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04807]]
If the pipeline is being created with
<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
state>> and the <<features-vertexInputDynamicState,
vertexInputDynamicState>> feature is not enabled, there must: be no
element of the pname:pDynamicStates member of pname:pDynamicState set to
ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT
endif::VK_EXT_vertex_input_dynamic_state[]
* [[VUID-VkGraphicsPipelineCreateInfo-None-04893]]
The pipeline must: be created with a
<<pipeline-graphics-subsets-complete, complete set of state>>
ifdef::VK_EXT_color_write_enable[]
* [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04800]]
If the <<features-colorWriteEnable, colorWriteEnable>> feature is not
enabled, there must: be no element of the pname:pDynamicStates member of
pname:pDynamicState set to ename:VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT
endif::VK_EXT_color_write_enable[]
ifdef::VK_QCOM_render_pass_shader_resolve[]
* [[VUID-VkGraphicsPipelineCreateInfo-rasterizationSamples-04899]]
If the pipeline is being created with fragment shader state, and the
apiext:VK_QCOM_render_pass_shader_resolve extension is enabled, and if
subpass has any input attachments, and if the subpass description
contains ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then the
sample count of the input attachments must: equal
pname:rasterizationSamples
* [[VUID-VkGraphicsPipelineCreateInfo-sampleShadingEnable-04900]]
If the pipeline is being created with fragment shader state, and the
apiext:VK_QCOM_render_pass_shader_resolve extension is enabled, and if
the subpass description contains
ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then
pname:sampleShadingEnable must: be false
* [[VUID-VkGraphicsPipelineCreateInfo-flags-04901]]
If pname:flags includes
ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, then the subpass
must: be the last subpass in a subpass dependency chain
* [[VUID-VkGraphicsPipelineCreateInfo-flags-04902]]
If pname:flags includes
ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
pname:pResolveAttachments is not `NULL`, then each resolve attachment
must: be ename:VK_ATTACHMENT_UNUSED
endif::VK_QCOM_render_pass_shader_resolve[]
ifndef::VK_KHR_dynamic_rendering[]
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06051]]
pname:renderPass must: not be dlink:VK_NULL_HANDLE
endif::VK_KHR_dynamic_rendering[]
ifdef::VK_KHR_dynamic_rendering[]
* [[VUID-VkGraphicsPipelineCreateInfo-dynamicRendering-06052]]
If the <<features-dynamicRendering,pname:dynamicRendering>> feature is
not enabled, pname:renderPass must: not be dlink:VK_NULL_HANDLE
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06053]]
If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-fragment-shader, fragment
shader state>>, and either of
slink:VkPipelineRenderingCreateInfoKHR::depthAttachmentFormat or
slink:VkPipelineRenderingCreateInfoKHR::stencilAttachmentFormat are not
ename:VK_FORMAT_UNDEFINED, pname:pDepthStencilState must: be a valid
pointer to a valid slink:VkPipelineDepthStencilStateCreateInfo structure
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06054]]
If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-fragment-output, fragment
output interface state>>, and
slink:VkPipelineRenderingCreateInfoKHR::colorAttachmentCount is not
equal to `0`, pname:pColorBlendState must: be a valid pointer to a valid
slink:VkPipelineColorBlendStateCreateInfo structure
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06055]]
If pname:renderPass is dlink:VK_NULL_HANDLE and the pipeline is being
created with <<pipeline-graphics-subsets-fragment-output, fragment
output interface state>>, pname:pColorBlendState->attachmentCount must:
be equal to slink:VkPipelineRenderingCreateInfoKHR::colorAttachmentCount
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06056]]
If pname:renderPass is dlink:VK_NULL_HANDLE and the pipeline is being
created with <<pipeline-graphics-subsets-fragment-shader, fragment
shader state>> the fragment shader must: not read from any input
attachment
ifdef::VK_KHR_multiview,VK_VERSION_1_1[]
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06057]]
If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-pre-rasterization,
pre-rasterization shader state>>, the pname:viewMask member of a
slink:VkPipelineRenderingCreateInfoKHR structure included in the
pname:pNext chain is not `0`, and the
<<features-multiview-tess,pname:multiviewTessellationShader>> feature is
not enabled, then pname:pStages must: not include tessellation shaders
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06058]]
If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-pre-rasterization,
pre-rasterization shader state>>, the pname:viewMask member of a
slink:VkPipelineRenderingCreateInfoKHR structure included in the
pname:pNext chain is not `0`, and the
<<features-multiview-gs,pname:multiviewGeometryShader>> feature is not
enabled, then pname:pStages must: not include a geometry shader
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06059]]
If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
created with <<pipeline-graphics-subsets-pre-rasterization,
pre-rasterization shader state>>, and the pname:viewMask member of a
slink:VkPipelineRenderingCreateInfoKHR structure included in the
pname:pNext chain is not `0`, shaders in pname:pStages must: not include
variables decorated with the code:Layer built-in decoration in their
interfaces
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06060]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-output, fragment output interface
state>> and pname:renderPass is dlink:VK_NULL_HANDLE,
pname:pColorBlendState->attachmentCount must: be equal to the
pname:colorAttachmentCount member of the
slink:VkPipelineRenderingCreateInfoKHR structure included in the
pname:pNext chain
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06061]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
pname:renderPass is dlink:VK_NULL_HANDLE, fragment shaders in
pname:pStages must: not include the code:InputAttachment capability
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06062]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-output, fragment output interface
state>> and pname:renderPass is dlink:VK_NULL_HANDLE, for each color
attachment format defined by the pname:pColorAttachmentFormats member of
slink:VkPipelineRenderingCreateInfoKHR, if its
<<potential-format-features,potential format features>> do not contain
ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then the
pname:blendEnable member of the corresponding element of the
pname:pAttachments member of pname:pColorBlendState must: be
ename:VK_FALSE
endif::VK_KHR_multiview,VK_VERSION_1_1[]
ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
* [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06063]]
If the pipeline is being created with
<<pipeline-graphics-subsets-fragment-output, fragment output interface
state>> and pname:renderPass is dlink:VK_NULL_HANDLE, if the pname:pNext
chain includes slink:VkAttachmentSampleCountInfoAMD or
sname:VkAttachmentSampleCountInfoNV, the pname:colorAttachmentCount
member of that structure must: be equal to the value of
slink:VkPipelineRenderingCreateInfoKHR::pname:colorAttachmentCount
endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
endif::VK_KHR_dynamic_rendering[]
****
include::{generated}/validity/structs/VkGraphicsPipelineCreateInfo.txt[]
--
ifdef::VK_KHR_dynamic_rendering[]
[open,refpage='VkPipelineRenderingCreateInfoKHR',desc='Structure specifying attachment formats',type='structs']
--
The sname:VkPipelineRenderingCreateInfoKHR structure is defined as:
include::{generated}/api/structs/VkPipelineRenderingCreateInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:viewMask is the viewMask used for rendering.
* pname:colorAttachmentCount is the number of entries in
pname:pColorAttachmentFormats
* pname:pColorAttachmentFormats is an array of elink:VkFormat values
defining the format of color attachments used in this pipeline.
* pname:depthAttachmentFormat is a elink:VkFormat value defining the
format of the depth attachment used in this pipeline.
* pname:stencilAttachmentFormat is a elink:VkFormat value defining the
format of the stencil attachment used in this pipeline.
When a pipeline is created without a slink:VkRenderPass, if this structure
is present in the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo,
it specifies the view mask and format of attachments used for rendering.
If this structure is not specified, and the pipeline does not include a
slink:VkRenderPass, pname:viewMask and pname:colorAttachmentCount are `0`,
and pname:depthAttachmentFormat and pname:stencilAttachmentFormat are
ename:VK_FORMAT_UNDEFINED.
If a graphics pipeline is created with a valid slink:VkRenderPass,
parameters of this structure are ignored.
If pname:depthAttachmentFormat, pname:stencilAttachmentFormat, or any
element of pname:pColorAttachmentFormats is ename:VK_FORMAT_UNDEFINED, it
indicates that the corresponding attachment is unused within the render
pass.
Valid formats indicate that an attachment can: be used - but it is still
valid to set the attachment to `NULL` when beginning rendering.
.Valid Usage
****
* [[VUID-VkPipelineRenderingCreateInfoKHR-pColorAttachmentFormats-06064]]
If any element of pname:pColorAttachmentFormats is not
ename:VK_FORMAT_UNDEFINED, it must: be a format with
<<potential-format-features, potential format features>> that include
ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
* [[VUID-VkPipelineRenderingCreateInfoKHR-depthAttachmentFormat-06065]]
If pname:depthAttachmentFormat is not ename:VK_FORMAT_UNDEFINED, it
must: be a format with <<potential-format-features, potential format
features>> that include
ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
* [[VUID-VkPipelineRenderingCreateInfoKHR-stencilAttachmentFormat-06164]]
If pname:stencilAttachmentFormat is not ename:VK_FORMAT_UNDEFINED, it
must: be a format with <<potential-format-features, potential format
features>> that include
ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
* [[VUID-VkPipelineRenderingCreateInfoKHR-depthAttachmentFormat-06165]]
If pname:depthAttachmentFormat is not ename:VK_FORMAT_UNDEFINED and
pname:stencilAttachmentFormat is not ename:VK_FORMAT_UNDEFINED,
pname:depthAttachmentFormat must: equal pname:stencilAttachmentFormat
* [[VUID-VkPipelineRenderingCreateInfoKHR-multiview-06066]]
If the <<features-multiview,pname:multiview>> feature is not enabled,
pname:viewMask must: be `0`
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
* [[VUID-VkPipelineRenderingCreateInfoKHR-viewMask-06067]]
The index of the most significant bit in pname:viewMask must: be less
than <<limits-maxMultiviewViewCount,pname:maxMultiviewViewCount>>
endif::VK_VERSION_1_1,VK_KHR_multiview[]
****
include::{generated}/validity/structs/VkPipelineRenderingCreateInfoKHR.txt[]
--
endif::VK_KHR_dynamic_rendering[]
[open,refpage='VkPipelineCreateFlagBits',desc='Bitmask controlling how a pipeline is created',type='enums']
--
Possible values of the pname:flags member of
slink:VkGraphicsPipelineCreateInfo,
ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,]
ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,]
and slink:VkComputePipelineCreateInfo, specifying how a pipeline is created,
are:
include::{generated}/api/enums/VkPipelineCreateFlagBits.txt[]
* ename:VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT specifies that the
created pipeline will not be optimized.
Using this flag may: reduce the time taken to create the pipeline.
* ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT specifies that the
pipeline to be created is allowed to be the parent of a pipeline that
will be created in a subsequent pipeline creation call.
* ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT specifies that the pipeline to
be created will be a child of a previously created parent pipeline.
ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
* ename:VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT specifies that
any shader input variables decorated as code:ViewIndex will be assigned
values as if they were decorated as code:DeviceIndex.
endif::VK_VERSION_1_1,VK_KHR_multiview[]
* ename:VK_PIPELINE_CREATE_DISPATCH_BASE specifies that a compute pipeline
can: be used with flink:vkCmdDispatchBase with a non-zero base
workgroup.
endif::VK_VERSION_1_1,VK_KHR_device_group[]
ifdef::VK_NV_ray_tracing[]
* ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV specifies that a pipeline
is created with all shaders in the deferred state.
Before using the pipeline the application must: call
flink:vkCompileDeferredNV exactly once on each shader in the pipeline
before using the pipeline.
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_pipeline_executable_properties[]
* ename:VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR specifies that the
shader compiler should capture statistics for the pipeline executables
produced by the compile process which can: later be retrieved by calling
flink:vkGetPipelineExecutableStatisticsKHR.
Enabling this flag must: not affect the final compiled pipeline but may:
disable pipeline caching or otherwise affect pipeline creation time.
* ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR
specifies that the shader compiler should capture the internal
representations of pipeline executables produced by the compile process
which can: later be retrieved by calling
flink:vkGetPipelineExecutableInternalRepresentationsKHR.
Enabling this flag must: not affect the final compiled pipeline but may:
disable pipeline caching or otherwise affect pipeline creation time.
endif::VK_KHR_pipeline_executable_properties[]
ifdef::VK_KHR_pipeline_library[]
* ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR specifies that the pipeline
cannot: be used directly, and instead defines a _pipeline library_ that
can: be combined with other pipelines using the
slink:VkPipelineLibraryCreateInfoKHR structure.
ifdef::VK_KHR_ray_tracing_pipeline[]
This is available in ray tracing pipelines.
endif::VK_KHR_ray_tracing_pipeline[]
endif::VK_KHR_pipeline_library[]
ifdef::VK_KHR_ray_tracing_pipeline[]
* ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
specifies that an any-hit shader will always be present when an any-hit
shader would be executed.
A NULL any-hit shader is an any-hit shader which is effectively
ename:VK_SHADER_UNUSED_KHR, such as from a shader group consisting
entirely of zeros.
* ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
specifies that a closest hit shader will always be present when a
closest hit shader would be executed.
A NULL closest hit shader is a closest hit shader which is effectively
ename:VK_SHADER_UNUSED_KHR, such as from a shader group consisting
entirely of zeros.
* ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
specifies that a miss shader will always be present when a miss shader
would be executed.
A NULL miss shader is a miss shader which is effectively
ename:VK_SHADER_UNUSED_KHR, such as from a shader group consisting
entirely of zeros.
* ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
specifies that an intersection shader will always be present when an
intersection shader would be executed.
A NULL intersection shader is an intersection shader which is
effectively ename:VK_SHADER_UNUSED_KHR, such as from a shader group
consisting entirely of zeros.
* ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR specifies
that triangle primitives will be skipped during traversal using
code:OpTraceRayKHR.
* ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR specifies that
AABB primitives will be skipped during traversal using
code:OpTraceRayKHR.
* ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
specifies that the shader group handles can: be saved and reused on a
subsequent run (e.g. for trace capture and replay).
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_device_generated_commands[]
* ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV specifies that the
pipeline can be used in combination with <<device-generated-commands>>.
endif::VK_NV_device_generated_commands[]
ifdef::VK_EXT_pipeline_creation_cache_control[]
* ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT
specifies that pipeline creation will fail if a compile is required for
creation of a valid slink:VkPipeline object;
ename:VK_PIPELINE_COMPILE_REQUIRED_EXT will be returned by pipeline
creation, and the slink:VkPipeline will be set to dlink:VK_NULL_HANDLE.
* When creating multiple pipelines,
ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT specifies that
control will be returned to the application on failure of the
corresponding pipeline rather than continuing to create additional
pipelines.
endif::VK_EXT_pipeline_creation_cache_control[]
ifdef::VK_NV_ray_tracing_motion_blur[]
* ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV specifies that
the pipeline is allowed to use code:OpTraceRayMotionNV.
endif::VK_NV_ray_tracing_motion_blur[]
ifdef::VK_KHR_dynamic_rendering[]
ifdef::VK_KHR_fragment_shading_rate[]
* ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
specifies that the pipeline will be used with a fragment shading rate
attachment.
endif::VK_KHR_fragment_shading_rate[]
ifdef::VK_EXT_fragment_density_map[]
* ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
specifies that the pipeline will be used with a fragment density map
attachment.
endif::VK_EXT_fragment_density_map[]
endif::VK_KHR_dynamic_rendering[]
It is valid to set both ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT and
ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT.
This allows a pipeline to be both a parent and possibly a child in a
pipeline hierarchy.
See <<pipelines-pipeline-derivatives,Pipeline Derivatives>> for more
information.
--
[open,refpage='VkPipelineCreateFlags',desc='Bitmask of VkPipelineCreateFlagBits',type='flags']
--
include::{generated}/api/flags/VkPipelineCreateFlags.txt[]
tname:VkPipelineCreateFlags is a bitmask type for setting a mask of zero or
more elink:VkPipelineCreateFlagBits.
--
[open,refpage='VkPipelineDynamicStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline dynamic state',type='structs']
--
The sname:VkPipelineDynamicStateCreateInfo structure is defined as:
include::{generated}/api/structs/VkPipelineDynamicStateCreateInfo.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is reserved for future use.
* pname:dynamicStateCount is the number of elements in the
pname:pDynamicStates array.
* pname:pDynamicStates is a pointer to an array of elink:VkDynamicState
values specifying which pieces of pipeline state will use the values
from dynamic state commands rather than from pipeline state creation
information.
.Valid Usage
****
* [[VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442]]
Each element of pname:pDynamicStates must: be unique
****
include::{generated}/validity/structs/VkPipelineDynamicStateCreateInfo.txt[]
--
[open,refpage='VkPipelineDynamicStateCreateFlags',desc='Reserved for future use',type='flags']
--
include::{generated}/api/flags/VkPipelineDynamicStateCreateFlags.txt[]
tname:VkPipelineDynamicStateCreateFlags is a bitmask type for setting a
mask, but is currently reserved for future use.
--
[open,refpage='VkDynamicState',desc='Indicate which dynamic state is taken from dynamic state commands',type='enums']
--
The source of different pieces of dynamic state is specified by the
slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates property of the
currently active pipeline, each of whose elements must: be one of the
values:
include::{generated}/api/enums/VkDynamicState.txt[]
* ename:VK_DYNAMIC_STATE_VIEWPORT specifies that the pname:pViewports
state in slink:VkPipelineViewportStateCreateInfo will be ignored and
must: be set dynamically with flink:vkCmdSetViewport before any drawing
commands.
The number of viewports used by a pipeline is still specified by the
pname:viewportCount member of slink:VkPipelineViewportStateCreateInfo.
* ename:VK_DYNAMIC_STATE_SCISSOR specifies that the pname:pScissors state
in slink:VkPipelineViewportStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetScissor before any drawing commands.
The number of scissor rectangles used by a pipeline is still specified
by the pname:scissorCount member of
slink:VkPipelineViewportStateCreateInfo.
* ename:VK_DYNAMIC_STATE_LINE_WIDTH specifies that the pname:lineWidth
state in slink:VkPipelineRasterizationStateCreateInfo will be ignored
and must: be set dynamically with flink:vkCmdSetLineWidth before any
drawing commands that generate line primitives for the rasterizer.
* ename:VK_DYNAMIC_STATE_DEPTH_BIAS specifies that the
pname:depthBiasConstantFactor, pname:depthBiasClamp and
pname:depthBiasSlopeFactor states in
slink:VkPipelineRasterizationStateCreateInfo will be ignored and must:
be set dynamically with flink:vkCmdSetDepthBias before any draws are
performed with pname:depthBiasEnable in
slink:VkPipelineRasterizationStateCreateInfo set to ename:VK_TRUE.
* ename:VK_DYNAMIC_STATE_BLEND_CONSTANTS specifies that the
pname:blendConstants state in slink:VkPipelineColorBlendStateCreateInfo
will be ignored and must: be set dynamically with
flink:vkCmdSetBlendConstants before any draws are performed with a
pipeline state with sname:VkPipelineColorBlendAttachmentState member
pname:blendEnable set to ename:VK_TRUE and any of the blend functions
using a constant blend color.
* ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS specifies that the
pname:minDepthBounds and pname:maxDepthBounds states of
slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetDepthBounds before any draws are
performed with a pipeline state with
slink:VkPipelineDepthStencilStateCreateInfo member
pname:depthBoundsTestEnable set to ename:VK_TRUE.
* ename:VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK specifies that the
pname:compareMask state in slink:VkPipelineDepthStencilStateCreateInfo
for both pname:front and pname:back will be ignored and must: be set
dynamically with flink:vkCmdSetStencilCompareMask before any draws are
performed with a pipeline state with
slink:VkPipelineDepthStencilStateCreateInfo member
pname:stencilTestEnable set to ename:VK_TRUE
* ename:VK_DYNAMIC_STATE_STENCIL_WRITE_MASK specifies that the
pname:writeMask state in slink:VkPipelineDepthStencilStateCreateInfo for
both pname:front and pname:back will be ignored and must: be set
dynamically with flink:vkCmdSetStencilWriteMask before any draws are
performed with a pipeline state with
slink:VkPipelineDepthStencilStateCreateInfo member
pname:stencilTestEnable set to ename:VK_TRUE
* ename:VK_DYNAMIC_STATE_STENCIL_REFERENCE specifies that the
pname:reference state in slink:VkPipelineDepthStencilStateCreateInfo for
both pname:front and pname:back will be ignored and must: be set
dynamically with flink:vkCmdSetStencilReference before any draws are
performed with a pipeline state with
slink:VkPipelineDepthStencilStateCreateInfo member
pname:stencilTestEnable set to ename:VK_TRUE
ifdef::VK_NV_clip_space_w_scaling[]
* ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV specifies that the
pname:pViewportScalings state in
slink:VkPipelineViewportWScalingStateCreateInfoNV will be ignored and
must: be set dynamically with flink:vkCmdSetViewportWScalingNV before
any draws are performed with a pipeline state with
slink:VkPipelineViewportWScalingStateCreateInfoNV member
pname:viewportScalingEnable set to ename:VK_TRUE
endif::VK_NV_clip_space_w_scaling[]
ifdef::VK_EXT_discard_rectangles[]
* ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT specifies that the
pname:pDiscardRectangles state in
slink:VkPipelineDiscardRectangleStateCreateInfoEXT will be ignored and
must: be set dynamically with flink:vkCmdSetDiscardRectangleEXT before
any draw or clear commands.
The elink:VkDiscardRectangleModeEXT and the number of active discard
rectangles is still specified by the pname:discardRectangleMode and
pname:discardRectangleCount members of
slink:VkPipelineDiscardRectangleStateCreateInfoEXT.
endif::VK_EXT_discard_rectangles[]
ifdef::VK_EXT_sample_locations[]
* ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT specifies that the
pname:sampleLocationsInfo state in
slink:VkPipelineSampleLocationsStateCreateInfoEXT will be ignored and
must: be set dynamically with flink:vkCmdSetSampleLocationsEXT before
any draw or clear commands.
Enabling custom sample locations is still indicated by the
pname:sampleLocationsEnable member of
slink:VkPipelineSampleLocationsStateCreateInfoEXT.
endif::VK_EXT_sample_locations[]
ifdef::VK_NV_scissor_exclusive[]
* ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV specifies that the
pname:pExclusiveScissors state in
slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV will be
ignored and must: be set dynamically with
flink:vkCmdSetExclusiveScissorNV before any drawing commands.
The number of exclusive scissor rectangles used by a pipeline is still
specified by the pname:exclusiveScissorCount member of
slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV.
endif::VK_NV_scissor_exclusive[]
ifdef::VK_NV_shading_rate_image[]
* ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV specifies that
the pname:pShadingRatePalettes state in
slink:VkPipelineViewportShadingRateImageStateCreateInfoNV will be
ignored and must: be set dynamically with
flink:vkCmdSetViewportShadingRatePaletteNV before any drawing commands.
* ename:VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV specifies that
the coarse sample order state in
slink:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV will be
ignored and must: be set dynamically with
flink:vkCmdSetCoarseSampleOrderNV before any drawing commands.
endif::VK_NV_shading_rate_image[]
ifdef::VK_EXT_line_rasterization[]
* ename:VK_DYNAMIC_STATE_LINE_STIPPLE_EXT specifies that the
pname:lineStippleFactor and pname:lineStipplePattern state in
slink:VkPipelineRasterizationLineStateCreateInfoEXT will be ignored and
must: be set dynamically with flink:vkCmdSetLineStippleEXT before any
draws are performed with a pipeline state with
slink:VkPipelineRasterizationLineStateCreateInfoEXT member
pname:stippledLineEnable set to ename:VK_TRUE.
endif::VK_EXT_line_rasterization[]
ifdef::VK_EXT_extended_dynamic_state[]
* ename:VK_DYNAMIC_STATE_CULL_MODE_EXT specifies that the pname:cullMode
state in slink:VkPipelineRasterizationStateCreateInfo will be ignored
and must: be set dynamically with flink:vkCmdSetCullModeEXT before any
drawing commands.
* ename:VK_DYNAMIC_STATE_FRONT_FACE_EXT specifies that the pname:frontFace
state in slink:VkPipelineRasterizationStateCreateInfo will be ignored
and must: be set dynamically with flink:vkCmdSetFrontFaceEXT before any
drawing commands.
* ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT specifies that the
pname:topology state in slink:VkPipelineInputAssemblyStateCreateInfo
only specifies the <<drawing-primitive-topology-class, topology class>>,
and the specific topology order and adjacency must: be set dynamically
with flink:vkCmdSetPrimitiveTopologyEXT before any drawing commands.
* ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT specifies that the
pname:viewportCount and pname:pViewports state in
slink:VkPipelineViewportStateCreateInfo will be ignored and must: be set
dynamically with flink:vkCmdSetViewportWithCountEXT before any draw
call.
* ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT specifies that the
pname:scissorCount and pname:pScissors state in
slink:VkPipelineViewportStateCreateInfo will be ignored and must: be set
dynamically with flink:vkCmdSetScissorWithCountEXT before any draw call.
* ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT specifies that
the pname:stride state in slink:VkVertexInputBindingDescription will be
ignored and must: be set dynamically with
flink:vkCmdBindVertexBuffers2EXT before any draw call.
* ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT specifies that the
pname:depthTestEnable state in
slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetDepthTestEnableEXT before any draw
call.
* ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT specifies that the
pname:depthWriteEnable state in
slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetDepthWriteEnableEXT before any draw
call.
* ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT specifies that the
pname:depthCompareOp state in
slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetDepthCompareOpEXT before any draw
call.
* ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT specifies that the
pname:depthBoundsTestEnable state in
slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetDepthBoundsTestEnableEXT before any
draw call.
* ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT specifies that the
pname:stencilTestEnable state in
slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetStencilTestEnableEXT before any draw
call.
* ename:VK_DYNAMIC_STATE_STENCIL_OP_EXT specifies that the pname:failOp,
pname:passOp, pname:depthFailOp, and pname:compareOp states in
sname:VkPipelineDepthStencilStateCreateInfo for both pname:front and
pname:back will be ignored and must: be set dynamically with
flink:vkCmdSetStencilOpEXT before any draws are performed with a
pipeline state with sname:VkPipelineDepthStencilStateCreateInfo member
pname:stencilTestEnable set to ename:VK_TRUE
endif::VK_EXT_extended_dynamic_state[]
ifdef::VK_EXT_extended_dynamic_state2[]
* ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT specifies that the
pname:patchControlPoints state in
slink:VkPipelineTessellationStateCreateInfo will be ignored and must: be
set dynamically with flink:vkCmdSetPatchControlPointsEXT before any
drawing commands.
* ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT specifies that the
pname:rasterizerDiscardEnable state in
slink:VkPipelineRasterizationStateCreateInfo will be ignored and must:
be set dynamically with flink:vkCmdSetRasterizerDiscardEnableEXT before
any drawing commands.
* ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT specifies that the
pname:depthBiasEnable state in
slink:VkPipelineRasterizationStateCreateInfo will be ignored and must:
be set dynamically with flink:vkCmdSetDepthBiasEnableEXT before any
drawing commands.
* ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT specifies that the pname:logicOp
state in slink:VkPipelineColorBlendStateCreateInfo will be ignored and
must: be set dynamically with flink:vkCmdSetLogicOpEXT before any
drawing commands.
* ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT specifies that the
pname:primitiveRestartEnable state in
slink:VkPipelineInputAssemblyStateCreateInfo will be ignored and must:
be set dynamically with flink:vkCmdSetPrimitiveRestartEnableEXT before
any drawing commands.
endif::VK_EXT_extended_dynamic_state2[]
ifdef::VK_KHR_fragment_shading_rate[]
* ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR specifies that state in
slink:VkPipelineFragmentShadingRateStateCreateInfoKHR
ifdef::VK_NV_fragment_shading_rate_enums[]
and slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV
endif::VK_NV_fragment_shading_rate_enums[]
will be ignored and must: be set dynamically with
flink:vkCmdSetFragmentShadingRateKHR
ifdef::VK_NV_fragment_shading_rate_enums[]
or flink:vkCmdSetFragmentShadingRateEnumNV
endif::VK_NV_fragment_shading_rate_enums[]
before any drawing commands.
endif::VK_KHR_fragment_shading_rate[]
ifdef::VK_KHR_ray_tracing_pipeline[]
* ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR specifies
that the default stack size computation for the pipeline will be ignored
and must: be set dynamically with
flink:vkCmdSetRayTracingPipelineStackSizeKHR before any ray tracing
calls are performed.
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_EXT_vertex_input_dynamic_state[]
* ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT specifies that the
pname:pVertexInputState state will be ignored and must: be set
dynamically with flink:vkCmdSetVertexInputEXT before any drawing
commands
endif::VK_EXT_vertex_input_dynamic_state[]
ifdef::VK_EXT_color_write_enable[]
* ename:VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT specifies that the
pname:pColorWriteEnables state in
slink:VkPipelineColorWriteCreateInfoEXT will be ignored and must: be set
dynamically with flink:vkCmdSetColorWriteEnableEXT before any draw call.
endif::VK_EXT_color_write_enable[]
--
=== Valid Combinations of Stages for Graphics Pipelines
ifdef::VK_NV_mesh_shader[]
The geometric primitive processing can either be handled on a per primitive
basis by the vertex, tessellation, and geometry shader stages, or on a per
mesh basis using task and mesh shader stages.
If the pipeline includes a mesh shader stage, it uses the mesh pipeline,
otherwise it uses the primitive pipeline.
If a task shader is omitted, the task shading stage is skipped.
endif::VK_NV_mesh_shader[]
If tessellation shader stages are omitted, the tessellation shading and
fixed-function stages of the pipeline are skipped.
If a geometry shader is omitted, the geometry shading stage is skipped.
If a fragment shader is omitted, fragment color outputs have undefined:
values, and the fragment depth value is unmodified.
This can: be useful for depth-only rendering.
Presence of a shader stage in a pipeline is indicated by including a valid
slink:VkPipelineShaderStageCreateInfo with pname:module and pname:pName
selecting an entry point from a shader module, where that entry point is
valid for the stage specified by pname:stage.
Presence of some of the fixed-function stages in the pipeline is implicitly
derived from enabled shaders and provided state.
For example, the fixed-function tessellator is always present when the
pipeline has valid Tessellation Control and Tessellation Evaluation shaders.
.For example:
* Depth/stencil-only rendering in a subpass with no color attachments
** Active Pipeline Shader Stages
*** Vertex Shader
** Required: Fixed-Function Pipeline Stages
*** slink:VkPipelineVertexInputStateCreateInfo
*** slink:VkPipelineInputAssemblyStateCreateInfo
*** slink:VkPipelineViewportStateCreateInfo
*** slink:VkPipelineRasterizationStateCreateInfo
*** slink:VkPipelineMultisampleStateCreateInfo
*** slink:VkPipelineDepthStencilStateCreateInfo
* Color-only rendering in a subpass with no depth/stencil attachment
** Active Pipeline Shader Stages
*** Vertex Shader
*** Fragment Shader
** Required: Fixed-Function Pipeline Stages
*** slink:VkPipelineVertexInputStateCreateInfo
*** slink:VkPipelineInputAssemblyStateCreateInfo
*** slink:VkPipelineViewportStateCreateInfo
*** slink:VkPipelineRasterizationStateCreateInfo
*** slink:VkPipelineMultisampleStateCreateInfo
*** slink:VkPipelineColorBlendStateCreateInfo
* Rendering pipeline with tessellation and geometry shaders
** Active Pipeline Shader Stages
*** Vertex Shader
*** Tessellation Control Shader
*** Tessellation Evaluation Shader
*** Geometry Shader
*** Fragment Shader
** Required: Fixed-Function Pipeline Stages
*** slink:VkPipelineVertexInputStateCreateInfo
*** slink:VkPipelineInputAssemblyStateCreateInfo
*** slink:VkPipelineTessellationStateCreateInfo
*** slink:VkPipelineViewportStateCreateInfo
*** slink:VkPipelineRasterizationStateCreateInfo
*** slink:VkPipelineMultisampleStateCreateInfo
*** slink:VkPipelineDepthStencilStateCreateInfo
*** slink:VkPipelineColorBlendStateCreateInfo
ifdef::VK_NV_mesh_shader[]
* Rendering pipeline with task and mesh shaders
** Active Pipeline Shader Stages
*** Task Shader
*** Mesh Shader
*** Fragment Shader
** Required: Fixed-Function Pipeline Stages
*** slink:VkPipelineViewportStateCreateInfo
*** slink:VkPipelineRasterizationStateCreateInfo
*** slink:VkPipelineMultisampleStateCreateInfo
*** slink:VkPipelineDepthStencilStateCreateInfo
*** slink:VkPipelineColorBlendStateCreateInfo
endif::VK_NV_mesh_shader[]
ifdef::VK_NV_device_generated_commands[]
[[graphics-shadergroups]]
=== Graphics Pipeline Shader Groups
Graphics pipelines can contain multiple shader groups that can be bound
individually.
Each shader group behaves as if it was a pipeline using the shader group's
state.
When the pipeline is bound by regular means, it behaves as if the state of
group `0` is active, use flink:vkCmdBindPipelineShaderGroupNV to bind an
invidual shader group.
The primary purpose of shader groups is allowing the device to bind
different pipeline state using <<device-generated-commands>>.
[open,refpage='VkGraphicsPipelineShaderGroupsCreateInfoNV',desc='Structure specifying parameters of a newly created multi shader group pipeline',type='structs']
--
The sname:VkGraphicsPipelineShaderGroupsCreateInfoNV structure is defined
as:
include::{generated}/api/structs/VkGraphicsPipelineShaderGroupsCreateInfoNV.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:groupCount is the number of elements in the pname:pGroups array.
* pname:pGroups is a pointer to an array of
slink:VkGraphicsShaderGroupCreateInfoNV structures specifying which
state of the original slink:VkGraphicsPipelineCreateInfo each shader
group overrides.
* pname:pipelineCount is the number of elements in the pname:pPipelines
array.
* pname:pPipelines is a pointer to an array of graphics sname:VkPipeline
structures which are referenced within the created pipeline, including
all their shader groups.
When referencing shader groups by index, groups defined in the referenced
pipelines are treated as if they were defined as additional entries in
pname:pGroups.
They are appended in the order they appear in the pname:pPipelines array and
in the pname:pGroups array when those pipelines were defined.
The application must: maintain the lifetime of all such referenced pipelines
based on the pipelines that make use of them.
.Valid Usage
****
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02879]]
pname:groupCount must: be at least `1` and as maximum
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxGraphicsShaderGroupCount
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02880]]
The sum of pname:groupCount including those groups added from referenced
pname:pPipelines must: also be as maximum
sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxGraphicsShaderGroupCount
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02881]]
The state of the first element of pname:pGroups must: match its
equivalent within the parent's slink:VkGraphicsPipelineCreateInfo
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02882]]
Each element of pname:pGroups must: in combination with the rest of the
pipeline state yield a valid state configuration
ifndef::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02883]]
All elements of pname:pGroups must: use the same shader stage
combinations
endif::VK_NV_mesh_shader[]
ifdef::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02884]]
All elements of pname:pGroups must: use the same shader stage
combinations unless any mesh shader stage is used, then either
combination of task and mesh or just mesh shader is valid
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02885]]
Mesh and regular primitive shading stages cannot be mixed across
pname:pGroups
endif::VK_NV_mesh_shader[]
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886]]
Each element of pname:pPipelines must: have been created with identical
state to the pipeline currently created except the state that can be
overridden by slink:VkGraphicsShaderGroupCreateInfoNV
* [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/structs/VkGraphicsPipelineShaderGroupsCreateInfoNV.txt[]
--
[open,refpage='VkGraphicsShaderGroupCreateInfoNV',desc='Structure specifying override parameters for each shader group',type='structs']
--
The sname:VkGraphicsShaderGroupCreateInfoNV structure provides the state
overrides for each shader group.
Each shader group behaves like a pipeline that was created from its state as
well as the remaining parent's state.
It is defined as:
include::{generated}/api/structs/VkGraphicsShaderGroupCreateInfoNV.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:stageCount is the number of entries in the pname:pStages array.
* pname:pStages is a pointer to an array
slink:VkPipelineShaderStageCreateInfo structures specifying the set of
the shader stages to be included in this shader group.
* pname:pVertexInputState is a pointer to a
slink:VkPipelineVertexInputStateCreateInfo structure.
* pname:pTessellationState is a pointer to a
slink:VkPipelineTessellationStateCreateInfo structure, and is ignored if
the shader group does not include a tessellation control shader stage
and tessellation evaluation shader stage.
.Valid Usage
****
* [[VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-02888]]
For pname:stageCount, the same restrictions as in
slink:VkGraphicsPipelineCreateInfo::pname:stageCount apply
* [[VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-02889]]
For pname:pStages, the same restrictions as in
slink:VkGraphicsPipelineCreateInfo::pname:pStages apply
* [[VUID-VkGraphicsShaderGroupCreateInfoNV-pVertexInputState-02890]]
For pname:pVertexInputState, the same restrictions as in
slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState apply
* [[VUID-VkGraphicsShaderGroupCreateInfoNV-pTessellationState-02891]]
For pname:pTessellationState, the same restrictions as in
slink:VkGraphicsPipelineCreateInfo::pname:pTessellationState apply
****
include::{generated}/validity/structs/VkGraphicsShaderGroupCreateInfoNV.txt[]
--
endif::VK_NV_device_generated_commands[]
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
[[pipelines-ray-tracing]]
== Ray Tracing Pipelines
Ray tracing pipelines consist of multiple shader stages, fixed-function
traversal stages, and a pipeline layout.
[open,refpage='VK_SHADER_UNUSED_KHR',desc='Sentinel for an unused shader index',type='consts',alias='VK_SHADER_UNUSED_NV']
--
ename:VK_SHADER_UNUSED_KHR is a special shader index used to indicate that a
ray generation, miss, or callable shader member is not used.
include::{generated}/api/enums/VK_SHADER_UNUSED_KHR.txt[]
ifdef::VK_NV_ray_tracing[]
or the equivalent
include::{generated}/api/enums/VK_SHADER_UNUSED_NV.txt[]
endif::VK_NV_ray_tracing[]
--
ifdef::VK_NV_ray_tracing[]
[open,refpage='vkCreateRayTracingPipelinesNV',desc='Creates a new ray tracing pipeline object',type='protos']
--
:refpage: vkCreateRayTracingPipelinesNV
To create ray tracing pipelines, call:
include::{generated}/api/protos/vkCreateRayTracingPipelinesNV.txt[]
* pname:device is the logical device that creates the ray tracing
pipelines.
* pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
pipeline caching is disabled, or the handle of a valid
<<pipelines-cache,pipeline cache>> object, in which case use of that
cache is enabled for the duration of the command.
* pname:createInfoCount is the length of the pname:pCreateInfos and
pname:pPipelines arrays.
* pname:pCreateInfos is a pointer to an array of
slink:VkRayTracingPipelineCreateInfoNV structures.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
* pname:pPipelines is a pointer to an array in which the resulting ray
tracing pipeline objects are returned.
.Valid Usage
****
include::{chapters}/commonvalidity/create_ray_tracing_pipelines_common.txt[]
****
include::{generated}/validity/protos/vkCreateRayTracingPipelinesNV.txt[]
--
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='vkCreateRayTracingPipelinesKHR',desc='Creates a new ray tracing pipeline object',type='protos']
--
:refpage: vkCreateRayTracingPipelinesKHR
To create ray tracing pipelines, call:
include::{generated}/api/protos/vkCreateRayTracingPipelinesKHR.txt[]
* pname:device is the logical device that creates the ray tracing
pipelines.
* pname:deferredOperation is dlink:VK_NULL_HANDLE or the handle of a valid
slink:VkDeferredOperationKHR <<deferred-host-operations-requesting,
request deferral>> object for this command.
* pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
pipeline caching is disabled, or the handle of a valid
<<pipelines-cache,pipeline cache>> object, in which case use of that
cache is enabled for the duration of the command.
* pname:createInfoCount is the length of the pname:pCreateInfos and
pname:pPipelines arrays.
* pname:pCreateInfos is a pointer to an array of
slink:VkRayTracingPipelineCreateInfoKHR structures.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
* pname:pPipelines is a pointer to an array in which the resulting ray
tracing pipeline objects are returned.
The ename:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS error is returned if the
implementation is unable to re-use the shader group handles provided in
slink:VkRayTracingShaderGroupCreateInfoKHR::pname:pShaderGroupCaptureReplayHandle
when
slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
is enabled.
.Valid Usage
****
include::{chapters}/commonvalidity/create_ray_tracing_pipelines_common.txt[]
include::{chapters}/commonvalidity/deferred_operations_common.txt[]
* [[VUID-vkCreateRayTracingPipelinesKHR-rayTracingPipeline-03586]]
The <<features-rayTracingPipeline, pname:rayTracingPipeline>> feature
must: be enabled
ifdef::VK_EXT_pipeline_creation_cache_control+VK_KHR_deferred_host_operations[]
* [[VUID-vkCreateRayTracingPipelinesKHR-deferredOperation-03587]]
If pname:deferredOperation is not dlink:VK_NULL_HANDLE, the pname:flags
member of elements of pname:pCreateInfos must: not include
ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
endif::VK_EXT_pipeline_creation_cache_control+VK_KHR_deferred_host_operations[]
****
include::{generated}/validity/protos/vkCreateRayTracingPipelinesKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing[]
[open,refpage='VkRayTracingPipelineCreateInfoNV',desc='Structure specifying parameters of a newly created ray tracing pipeline',type='structs']
--
:refpage: VkRayTracingPipelineCreateInfoNV
The sname:VkRayTracingPipelineCreateInfoNV structure is defined as:
include::{generated}/api/structs/VkRayTracingPipelineCreateInfoNV.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
how the pipeline will be generated.
* pname:stageCount is the number of entries in the pname:pStages array.
* pname:pStages is a pointer to an array of
slink:VkPipelineShaderStageCreateInfo structures specifying the set of
the shader stages to be included in the ray tracing pipeline.
* pname:groupCount is the number of entries in the pname:pGroups array.
* pname:pGroups is a pointer to an array of
slink:VkRayTracingShaderGroupCreateInfoNV structures describing the set
of the shader stages to be included in each shader group in the ray
tracing pipeline.
* pname:maxRecursionDepth is the <<ray-tracing-recursion-depth, maximum
recursion depth>> of shaders executed by this pipeline.
* pname:layout is the description of binding locations used by both the
pipeline and descriptor sets used with the pipeline.
* pname:basePipelineHandle is a pipeline to derive from.
* pname:basePipelineIndex is an index into the pname:pCreateInfos
parameter to use as a pipeline to derive from.
The parameters pname:basePipelineHandle and pname:basePipelineIndex are
described in more detail in <<pipelines-pipeline-derivatives,Pipeline
Derivatives>>.
.Valid Usage
****
include::{chapters}/commonvalidity/ray_tracing_pipeline_create_info_common.txt[]
* [[VUID-VkRayTracingPipelineCreateInfoNV-stage-06232]]
The pname:stage member of at least one element of pname:pStages must: be
ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR
ifdef::VK_KHR_pipeline_library[]
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03456]]
pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
endif::VK_KHR_pipeline_library[]
* [[VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457]]
pname:maxRecursionDepth must: be less than or equal to
slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxRecursionDepth
ifdef::VK_KHR_ray_tracing_pipeline[]
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03458]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03459]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03460]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03461]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03462]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03463]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03588]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing_motion_blur[]
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-04948]]
pname:flags must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
endif::VK_NV_ray_tracing_motion_blur[]
ifdef::VK_EXT_pipeline_creation_cache_control[]
* [[VUID-VkRayTracingPipelineCreateInfoNV-flags-02957]]
pname:flags must: not include both
ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV and
ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT at
the same time
endif::VK_EXT_pipeline_creation_cache_control[]
****
include::{generated}/validity/structs/VkRayTracingPipelineCreateInfoNV.txt[]
--
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='VkRayTracingPipelineCreateInfoKHR',desc='Structure specifying parameters of a newly created ray tracing pipeline',type='structs']
--
:refpage: VkRayTracingPipelineCreateInfoKHR
The sname:VkRayTracingPipelineCreateInfoKHR structure is defined as:
include::{generated}/api/structs/VkRayTracingPipelineCreateInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
how the pipeline will be generated.
* pname:stageCount is the number of entries in the pname:pStages array.
* pname:pStages is a pointer to an array of pname:stageCount
slink:VkPipelineShaderStageCreateInfo structures describing the set of
the shader stages to be included in the ray tracing pipeline.
* pname:groupCount is the number of entries in the pname:pGroups array.
* pname:pGroups is a pointer to an array of pname:groupCount
slink:VkRayTracingShaderGroupCreateInfoKHR structures describing the set
of the shader stages to be included in each shader group in the ray
tracing pipeline.
* pname:maxPipelineRayRecursionDepth is the <<ray-tracing-recursion-depth,
maximum recursion depth>> of shaders executed by this pipeline.
* pname:pLibraryInfo is a pointer to a
slink:VkPipelineLibraryCreateInfoKHR structure defining pipeline
libraries to include.
* pname:pLibraryInterface is a pointer to a
slink:VkRayTracingPipelineInterfaceCreateInfoKHR structure defining
additional information when using pipeline libraries.
* pname:pDynamicState is a pointer to a
slink:VkPipelineDynamicStateCreateInfo structure, and is used to
indicate which properties of the pipeline state object are dynamic and
can: be changed independently of the pipeline state.
This can: be `NULL`, which means no state in the pipeline is considered
dynamic.
* pname:layout is the description of binding locations used by both the
pipeline and descriptor sets used with the pipeline.
* pname:basePipelineHandle is a pipeline to derive from.
* pname:basePipelineIndex is an index into the pname:pCreateInfos
parameter to use as a pipeline to derive from.
The parameters pname:basePipelineHandle and pname:basePipelineIndex are
described in more detail in <<pipelines-pipeline-derivatives,Pipeline
Derivatives>>.
ifdef::VK_KHR_pipeline_library[]
When ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR is specified, this pipeline
defines a _pipeline library_ which cannot: be bound as a ray tracing
pipeline directly.
Instead, pipeline libraries define common shaders and shader groups which
can: be included in future pipeline creation.
If pipeline libraries are included in pname:pLibraryInfo, shaders defined in
those libraries are treated as if they were defined as additional entries in
pname:pStages, appended in the order they appear in the pname:pLibraries
array and in the pname:pStages array when those libraries were defined.
When referencing shader groups in order to obtain a shader group handle,
groups defined in those libraries are treated as if they were defined as
additional entries in pname:pGroups, appended in the order they appear in
the pname:pLibraries array and in the pname:pGroups array when those
libraries were defined.
The shaders these groups reference are set when the pipeline library is
created, referencing those specified in the pipeline library, not in the
pipeline that includes it.
endif::VK_KHR_pipeline_library[]
The default stack size for a pipeline if
ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR is not provided
is computed as described in <<ray-tracing-pipeline-stack, Ray Tracing
Pipeline Stack>>.
.Valid Usage
****
include::{chapters}/commonvalidity/ray_tracing_pipeline_create_info_common.txt[]
* [[VUID-VkRayTracingPipelineCreateInfoKHR-stage-03425]]
If pname:flags does not include
ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, the pname:stage member of at
least one element of pname:pStages, including those implicitly added by
pname:pLibraryInfo, must: be ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoKHR-maxPipelineRayRecursionDepth-03589]]
pname:maxPipelineRayRecursionDepth must: be less than or equal to
slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayRecursionDepth
ifdef::VK_KHR_pipeline_library[]
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465]]
If pname:flags includes ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,
pname:pLibraryInterface must: not be `NULL`
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03590]]
If pname:pLibraryInfo is not `NULL` and its pname:libraryCount member is
greater than `0`, its pname:pLibraryInterface member must: not be `NULL`
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03591]]
Each element of pname:pLibraryInfo->pLibraries must: have been created
with the value of pname:maxPipelineRayRecursionDepth equal to that in
this pipeline
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03592]]
If pname:pLibraryInfo is not `NULL`, each element of its
pname:pLibraries member must: have been created with a pname:layout that
is compatible with the pname:layout in this pipeline
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03593]]
If pname:pLibraryInfo is not `NULL`, each element of its
pname:pLibraries member must: have been created with values of the
pname:maxPipelineRayPayloadSize and pname:maxPipelineRayHitAttributeSize
members of pname:pLibraryInterface equal to those in this pipeline
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03594]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,
each element of pname:pLibraryInfo->pLibraries must: have been created
with the
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
bit set
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04718]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR, each element of
pname:pLibraryInfo->pLibraries must: have been created with the
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR bit set
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04719]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR, each
element of pname:pLibraryInfo->pLibraries must: have been created with
the ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR bit set
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04720]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,
each element of pname:pLibraryInfo->pLibraries must: have been created
with the
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR bit
set
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04721]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
each element of pname:pLibraryInfo->pLibraries must: have been created
with the
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
bit set
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04722]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,
each element of pname:pLibraryInfo->pLibraries must: have been created
with the
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
bit set
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04723]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR, each
element of pname:pLibraryInfo->pLibraries must: have been created with
the ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
bit set
endif::VK_KHR_pipeline_library[]
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03595]]
If the `apiext:VK_KHR_pipeline_library` extension is not enabled,
pname:pLibraryInfo and pname:pLibraryInterface must: be `NULL`
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,
for any element of pname:pGroups with a pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the
pname:anyHitShader of that element must: not be
ename:VK_SHADER_UNUSED_KHR
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
for any element of pname:pGroups with a pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the
pname:closestHitShader of that element must: not be
ename:VK_SHADER_UNUSED_KHR
* [[VUID-VkRayTracingPipelineCreateInfoKHR-rayTraversalPrimitiveCulling-03596]]
If the <<features-rayTraversalPrimitiveCulling,
pname:rayTraversalPrimitiveCulling>> feature is not enabled, pname:flags
must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoKHR-rayTraversalPrimitiveCulling-03597]]
If the <<features-rayTraversalPrimitiveCulling,
pname:rayTraversalPrimitiveCulling>> feature is not enabled, pname:flags
must: not include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03598]]
If pname:flags includes
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,
<<features-rayTracingPipelineShaderGroupHandleCaptureReplay,
pname:rayTracingPipelineShaderGroupHandleCaptureReplay>> must: be
enabled
* [[VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplay-03599]]
If
slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
is ename:VK_TRUE and the pname:pShaderGroupCaptureReplayHandle member of
any element of pname:pGroups is not `NULL`, pname:flags must: include
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03600]]
If pname:pLibraryInfo is not `NULL` and its pname:libraryCount is `0`,
pname:stageCount must: not be `0`
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03601]]
If pname:pLibraryInfo is not `NULL` and its pname:libraryCount is `0`,
pname:groupCount must: not be `0`
* [[VUID-VkRayTracingPipelineCreateInfoKHR-pDynamicStates-03602]]
Any element of the pname:pDynamicStates member of pname:pDynamicState
must: be ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR
****
include::{generated}/validity/structs/VkRayTracingPipelineCreateInfoKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing[]
[open,refpage='VkRayTracingShaderGroupCreateInfoNV',desc='Structure specifying shaders in a shader group',type='structs']
--
:refpage: VkRayTracingShaderGroupCreateInfoNV
The sname:VkRayTracingShaderGroupCreateInfoNV structure is defined as:
include::{generated}/api/structs/VkRayTracingShaderGroupCreateInfoNV.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:type is the type of hit group specified in this structure.
* pname:generalShader is the index of the ray generation, miss, or
callable shader from
slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group if
the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV, and
ename:VK_SHADER_UNUSED_NV otherwise.
* pname:closestHitShader is the optional index of the closest hit shader
from slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group
if the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV or
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV, and
ename:VK_SHADER_UNUSED_NV otherwise.
* pname:anyHitShader is the optional index of the any-hit shader from
slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group if
the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV or
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV, and
ename:VK_SHADER_UNUSED_NV otherwise.
* pname:intersectionShader is the index of the intersection shader from
slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group if
the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV, and
ename:VK_SHADER_UNUSED_NV otherwise.
.Valid Usage
****
* [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02413]]
If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then
pname:generalShader must: be a valid index into
slink:VkRayTracingPipelineCreateInfoNV::pname:pStages referring to a
shader of ename:VK_SHADER_STAGE_RAYGEN_BIT_NV,
ename:VK_SHADER_STAGE_MISS_BIT_NV, or
ename:VK_SHADER_STAGE_CALLABLE_BIT_NV
* [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02414]]
If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then
pname:closestHitShader, pname:anyHitShader, and pname:intersectionShader
must: be ename:VK_SHADER_UNUSED_NV
* [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02415]]
If pname:type is
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV then
pname:intersectionShader must: be a valid index into
slink:VkRayTracingPipelineCreateInfoNV::pname:pStages referring to a
shader of ename:VK_SHADER_STAGE_INTERSECTION_BIT_NV
* [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02416]]
If pname:type is
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV then
pname:intersectionShader must: be ename:VK_SHADER_UNUSED_NV
* [[VUID-VkRayTracingShaderGroupCreateInfoNV-closestHitShader-02417]]
pname:closestHitShader must: be either ename:VK_SHADER_UNUSED_NV or a
valid index into slink:VkRayTracingPipelineCreateInfoNV::pname:pStages
referring to a shader of ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV
* [[VUID-VkRayTracingShaderGroupCreateInfoNV-anyHitShader-02418]]
pname:anyHitShader must: be either ename:VK_SHADER_UNUSED_NV or a valid
index into slink:VkRayTracingPipelineCreateInfoNV::pname:pStages
referring to a shader of ename:VK_SHADER_STAGE_ANY_HIT_BIT_NV
****
include::{generated}/validity/structs/VkRayTracingShaderGroupCreateInfoNV.txt[]
--
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='VkRayTracingShaderGroupCreateInfoKHR',desc='Structure specifying shaders in a shader group',type='structs']
--
:refpage: VkRayTracingShaderGroupCreateInfoKHR
The sname:VkRayTracingShaderGroupCreateInfoKHR structure is defined as:
include::{generated}/api/structs/VkRayTracingShaderGroupCreateInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:type is the type of hit group specified in this structure.
* pname:generalShader is the index of the ray generation, miss, or
callable shader from
slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group if
the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR, and
ename:VK_SHADER_UNUSED_KHR otherwise.
* pname:closestHitShader is the optional index of the closest hit shader
from slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group
if the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, and
ename:VK_SHADER_UNUSED_KHR otherwise.
* pname:anyHitShader is the optional index of the any-hit shader from
slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group if
the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, and
ename:VK_SHADER_UNUSED_KHR otherwise.
* pname:intersectionShader is the index of the intersection shader from
slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group if
the shader group has pname:type of
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, and
ename:VK_SHADER_UNUSED_KHR otherwise.
* pname:pShaderGroupCaptureReplayHandle is `NULL` or a pointer to replay
information for this shader group.
Ignored if
slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
is ename:VK_FALSE.
.Valid Usage
****
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03474]]
If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then
pname:generalShader must: be a valid index into
slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages referring to a
shader of ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR,
ename:VK_SHADER_STAGE_MISS_BIT_KHR, or
ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03475]]
If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then
pname:closestHitShader, pname:anyHitShader, and pname:intersectionShader
must: be ename:VK_SHADER_UNUSED_KHR
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03476]]
If pname:type is
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR then
pname:intersectionShader must: be a valid index into
slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages referring to a
shader of ename:VK_SHADER_STAGE_INTERSECTION_BIT_KHR
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03477]]
If pname:type is
ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR then
pname:intersectionShader must: be ename:VK_SHADER_UNUSED_KHR
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-closestHitShader-03478]]
pname:closestHitShader must: be either ename:VK_SHADER_UNUSED_KHR or a
valid index into slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages
referring to a shader of ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-anyHitShader-03479]]
pname:anyHitShader must: be either ename:VK_SHADER_UNUSED_KHR or a valid
index into slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages
referring to a shader of ename:VK_SHADER_STAGE_ANY_HIT_BIT_KHR
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03603]]
If
slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplayMixed
is ename:VK_FALSE then pname:pShaderGroupCaptureReplayHandle must: not
be provided if it has not been provided on a previous call to ray
tracing pipeline creation
* [[VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03604]]
If
slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplayMixed
is ename:VK_FALSE then the caller must: guarantee that no ray tracing
pipeline creation commands with pname:pShaderGroupCaptureReplayHandle
provided execute simultaneously with ray tracing pipeline creation
commands without pname:pShaderGroupCaptureReplayHandle provided
****
include::{generated}/validity/structs/VkRayTracingShaderGroupCreateInfoKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]
[open,refpage='VkRayTracingShaderGroupTypeKHR',desc='Shader group types',type='enums',alias='VkRayTracingShaderGroupTypeNV']
--
:refpage: VkRayTracingShaderGroupTypeKHR
Possible values of pname:type in sname:VkRayTracingShaderGroupCreateInfoKHR
are:
include::{generated}/api/enums/VkRayTracingShaderGroupTypeKHR.txt[]
ifdef::VK_NV_ray_tracing[]
or the equivalent
include::{generated}/api/enums/VkRayTracingShaderGroupTypeNV.txt[]
endif::VK_NV_ray_tracing[]
* ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR indicates a shader
group with a single ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR,
ename:VK_SHADER_STAGE_MISS_BIT_KHR, or
ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR shader in it.
* ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR specifies
a shader group that only hits triangles and must: not contain an
intersection shader, only closest hit and any-hit shaders.
* ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR
specifies a shader group that only intersects with custom geometry and
must: contain an intersection shader and may: contain closest hit and
any-hit shaders.
[NOTE]
.Note
====
For current group types, the hit group type could be inferred from the
presence or absence of the intersection shader, but we provide the type
explicitly for future hit groups that do not have that property.
====
--
ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='VkRayTracingPipelineInterfaceCreateInfoKHR',desc='Structure specifying additional interface information when using libraries',type='structs']
--
:refpage: VkRayTracingPipelineInterfaceCreateInfoKHR
The sname:VkRayTracingPipelineInterfaceCreateInfoKHR structure is defined
as:
include::{generated}/api/structs/VkRayTracingPipelineInterfaceCreateInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:maxPipelineRayPayloadSize is the maximum payload size in bytes
used by any shader in the pipeline.
* pname:maxPipelineRayHitAttributeSize is the maximum attribute structure
size in bytes used by any shader in the pipeline.
pname:maxPipelineRayPayloadSize is calculated as the maximum number of bytes
used by any block declared in the code:RayPayloadKHR or
code:IncomingRayPayloadKHR storage classes.
pname:maxPipelineRayHitAttributeSize is calculated as the maximum number of
bytes used by any block declared in the code:HitAttributeKHR storage class.
As variables in these storage classes do not have explicit offsets, the size
should be calculated as if each variable has a
<<interfaces-alignment-requirements, scalar alignment>> equal to the largest
scalar alignment of any of the block's members.
[NOTE]
.Note
====
There is no explicit upper limit for pname:maxPipelineRayPayloadSize, but in
practice it should be kept as small as possible.
Similar to invocation local memory, it must be allocated for each shader
invocation and for devices which support many simultaneous invocations, this
storage can rapidly be exhausted, resulting in failure.
====
.Valid Usage
****
* [[VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-maxPipelineRayHitAttributeSize-03605]]
pname:maxPipelineRayHitAttributeSize must: be less than or equal to
slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayHitAttributeSize
****
include::{generated}/validity/structs/VkRayTracingPipelineInterfaceCreateInfoKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]
[open,refpage='vkGetRayTracingShaderGroupHandlesKHR',desc='Query ray tracing pipeline shader group handles',type='protos',alias='vkGetRayTracingShaderGroupHandlesNV']
--
:refpage: vkGetRayTracingShaderGroupHandlesKHR
To query the opaque handles of shaders in the ray tracing pipeline, call:
ifdef::VK_KHR_ray_tracing_pipeline[]
include::{generated}/api/protos/vkGetRayTracingShaderGroupHandlesKHR.txt[]
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_KHR_ray_tracing_pipeline+VK_NV_ray_tracing[or the equivalent command]
ifdef::VK_NV_ray_tracing[]
include::{generated}/api/protos/vkGetRayTracingShaderGroupHandlesNV.txt[]
endif::VK_NV_ray_tracing[]
* pname:device is the logical device containing the ray tracing pipeline.
* pname:pipeline is the ray tracing pipeline object containing the
shaders.
* pname:firstGroup is the index of the first group to retrieve a handle
for from the
ifdef::VK_KHR_ray_tracing_pipeline[]
slink:VkRayTracingPipelineCreateInfoKHR::pname:pGroups
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_KHR_ray_tracing_pipeline+VK_NV_ray_tracing[or]
ifdef::VK_NV_ray_tracing[]
slink:VkRayTracingPipelineCreateInfoNV::pname:pGroups
endif::VK_NV_ray_tracing[]
array.
* pname:groupCount is the number of shader handles to retrieve.
* pname:dataSize is the size in bytes of the buffer pointed to by
pname:pData.
* pname:pData is a pointer to a user-allocated buffer where the results
will be written.
.Valid Usage
****
* [[VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-04619]]
pname:pipeline must: be a ray tracing pipeline
* [[VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-04050]]
pname:firstGroup must: be less than the number of shader groups in
pname:pipeline
* [[VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419]]
The sum of pname:firstGroup and pname:groupCount must: be less than or
equal to the number of shader groups in pname:pipeline
* [[VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420]]
pname:dataSize must: be at least
[eq]#slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleSize
{times} pname:groupCount#
ifdef::VK_KHR_pipeline_library[]
* [[VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482]]
pname:pipeline must: have not been created with
ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
endif::VK_KHR_pipeline_library[]
****
include::{generated}/validity/protos/vkGetRayTracingShaderGroupHandlesKHR.txt[]
--
ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='vkGetRayTracingCaptureReplayShaderGroupHandlesKHR',desc='Query ray tracing capture replay pipeline shader group handles',type='protos']
--
:refpage: vkGetRayTracingCaptureReplayShaderGroupHandlesKHR
To query the optional capture handle information of shaders in the ray
tracing pipeline, call:
include::{generated}/api/protos/vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.txt[]
* pname:device is the logical device containing the ray tracing pipeline.
* pname:pipeline is the ray tracing pipeline object containing the
shaders.
* pname:firstGroup is the index of the first group to retrieve a handle
for from the slink:VkRayTracingPipelineCreateInfoKHR::pname:pGroups
array.
* pname:groupCount is the number of shader handles to retrieve.
* pname:dataSize is the size in bytes of the buffer pointed to by
pname:pData.
* pname:pData is a pointer to a user-allocated buffer where the results
will be written.
.Valid Usage
****
* [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-04620]]
pname:pipeline must: be a ray tracing pipeline
* [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051]]
pname:firstGroup must: be less than the number of shader groups in
pname:pipeline
* [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483]]
The sum of pname:firstGroup and pname:groupCount must: be less than or
equal to the number of shader groups in pname:pipeline
* [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484]]
pname:dataSize must: be at least
[eq]#slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleCaptureReplaySize
{times} pname:groupCount#
* [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingPipelineShaderGroupHandleCaptureReplay-03606]]
sname:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
must: be enabled to call this function
* [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-03607]]
pname:pipeline must: have been created with a pname:flags that included
ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
****
include::{generated}/validity/protos/vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing[]
Ray tracing pipelines can: contain more shaders than a graphics or compute
pipeline, so to allow parallel compilation of shaders within a pipeline, an
application can: choose to defer compilation until a later point in time.
[open,refpage='vkCompileDeferredNV',desc='Deferred compilation of shaders',type='protos']
--
:refpage: vkCompileDeferredNV
To compile a deferred shader in a pipeline call:
include::{generated}/api/protos/vkCompileDeferredNV.txt[]
* pname:device is the logical device containing the ray tracing pipeline.
* pname:pipeline is the ray tracing pipeline object containing the
shaders.
* pname:shader is the index of the shader to compile.
.Valid Usage
****
* [[VUID-vkCompileDeferredNV-pipeline-04621]]
pname:pipeline must: be a ray tracing pipeline
* [[VUID-vkCompileDeferredNV-pipeline-02237]]
pname:pipeline must: have been created with
ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV
* [[VUID-vkCompileDeferredNV-shader-02238]]
pname:shader must: not have been called as a deferred compile before
****
include::{generated}/validity/protos/vkCompileDeferredNV.txt[]
--
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='vkGetRayTracingShaderGroupStackSizeKHR',desc='Query ray tracing pipeline shader group shader stack size',type='protos']
--
To query the pipeline stack size of shaders in a shader group in the ray
tracing pipeline, call:
include::{generated}/api/protos/vkGetRayTracingShaderGroupStackSizeKHR.txt[]
* pname:device is the logical device containing the ray tracing pipeline.
* pname:pipeline is the ray tracing pipeline object containing the shaders
groups.
* pname:group is the index of the shader group to query.
* pname:groupShader is the type of shader from the group to query.
The return value is the ray tracing pipeline stack size in bytes for the
specified shader as called from the specified shader group.
.Valid Usage
****
* [[VUID-vkGetRayTracingShaderGroupStackSizeKHR-pipeline-04622]]
pname:pipeline must: be a ray tracing pipeline
* [[VUID-vkGetRayTracingShaderGroupStackSizeKHR-group-03608]]
The value of pname:group must be less than the number of shader groups
in pname:pipeline
* [[VUID-vkGetRayTracingShaderGroupStackSizeKHR-groupShader-03609]]
The shader identified by pname:groupShader in pname:group must: not be
ename:VK_SHADER_UNUSED_KHR
****
include::{generated}/validity/protos/vkGetRayTracingShaderGroupStackSizeKHR.txt[]
--
[open,refpage='VkShaderGroupShaderKHR',desc='Shader group shaders',type='enums']
--
Possible values of pname:groupShader in
flink:vkGetRayTracingShaderGroupStackSizeKHR are:
include::{generated}/api/enums/VkShaderGroupShaderKHR.txt[]
* ename:VK_SHADER_GROUP_SHADER_GENERAL_KHR uses the shader specified in
the group with
slink:VkRayTracingShaderGroupCreateInfoKHR::pname:generalShader
* ename:VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR uses the shader specified
in the group with
slink:VkRayTracingShaderGroupCreateInfoKHR::pname:closestHitShader
* ename:VK_SHADER_GROUP_SHADER_ANY_HIT_KHR uses the shader specified in
the group with
slink:VkRayTracingShaderGroupCreateInfoKHR::pname:anyHitShader
* ename:VK_SHADER_GROUP_SHADER_INTERSECTION_KHR uses the shader specified
in the group with
slink:VkRayTracingShaderGroupCreateInfoKHR::pname:intersectionShader
--
[open,refpage='vkCmdSetRayTracingPipelineStackSizeKHR',desc='Set the stack size dynamically for a ray tracing pipeline',type='protos']
--
:refpage: vkCmdSetRayTracingPipelineStackSizeKHR
To <<pipelines-dynamic-state, dynamically set>> the stack size for a ray
tracing pipeline, call:
include::{generated}/api/protos/vkCmdSetRayTracingPipelineStackSizeKHR.txt[]
* pname:commandBuffer is the command buffer into which the command will be
recorded.
* pname:pipelineStackSize is the stack size to use for subsequent ray
tracing trace commands.
This command sets the stack size for subsequent ray tracing commands when
the ray tracing pipeline is created with
ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR set in
slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
Otherwise, the stack size is computed as described in
<<ray-tracing-pipeline-stack, Ray Tracing Pipeline Stack>>.
.Valid Usage
****
* [[VUID-vkCmdSetRayTracingPipelineStackSizeKHR-pipelineStackSize-03610]]
pname:pipelineStackSize must: be large enough for any dynamic execution
through the shaders in the ray tracing pipeline used by a subsequent
trace call
****
include::{generated}/validity/protos/vkCmdSetRayTracingPipelineStackSizeKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
[[pipelines-destruction]]
== Pipeline Destruction
[open,refpage='vkDestroyPipeline',desc='Destroy a pipeline object',type='protos']
--
To destroy a pipeline, call:
include::{generated}/api/protos/vkDestroyPipeline.txt[]
* pname:device is the logical device that destroys the pipeline.
* pname:pipeline is the handle of the pipeline to destroy.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
.Valid Usage
****
* [[VUID-vkDestroyPipeline-pipeline-00765]]
All submitted commands that refer to pname:pipeline must: have completed
execution
* [[VUID-vkDestroyPipeline-pipeline-00766]]
If sname:VkAllocationCallbacks were provided when pname:pipeline was
created, a compatible set of callbacks must: be provided here
* [[VUID-vkDestroyPipeline-pipeline-00767]]
If no sname:VkAllocationCallbacks were provided when pname:pipeline was
created, pname:pAllocator must: be `NULL`
****
include::{generated}/validity/protos/vkDestroyPipeline.txt[]
--
[[pipelines-multiple]]
== Multiple Pipeline Creation
Multiple pipelines can: be created simultaneously by passing an array of
slink:VkGraphicsPipelineCreateInfo,
ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,]
ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,]
or slink:VkComputePipelineCreateInfo structures into the
flink:vkCreateGraphicsPipelines,
ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCreateRayTracingPipelinesKHR,]
ifdef::VK_NV_ray_tracing[flink:vkCreateRayTracingPipelinesNV,]
and flink:vkCreateComputePipelines commands, respectively.
Applications can: group together similar pipelines to be created in a single
call, and implementations are encouraged to look for reuse opportunities
within a group-create.
When an application attempts to create many pipelines in a single command,
it is possible that some subset may: fail creation.
In that case, the corresponding entries in the pname:pPipelines output array
will be filled with dlink:VK_NULL_HANDLE values.
If any pipeline fails creation despite valid arguments (for example, due to
out of memory errors), the elink:VkResult code returned by
ftext:vkCreate*Pipelines will indicate why.
The implementation will attempt to create all pipelines, and only return
dlink:VK_NULL_HANDLE values for those that actually failed.
ifdef::VK_EXT_pipeline_creation_cache_control[]
If creation fails for a pipeline that had
ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT set, pipelines at
an index in the pname:pPipelines array greater than or equal to that of the
failing pipeline must: be set to dlink:VK_NULL_HANDLE.
endif::VK_EXT_pipeline_creation_cache_control[]
[[pipelines-pipeline-derivatives]]
== Pipeline Derivatives
A pipeline derivative is a child pipeline created from a parent pipeline,
where the child and parent are expected to have much commonality.
The goal of derivative pipelines is that they be cheaper to create using the
parent as a starting point, and that it be more efficient (on either host or
device) to switch/bind between children of the same parent.
A derivative pipeline is created by setting the
ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag in the
stext:Vk*PipelineCreateInfo structure.
If this is set, then exactly one of pname:basePipelineHandle or
pname:basePipelineIndex members of the structure must: have a valid
handle/index, and specifies the parent pipeline.
If pname:basePipelineHandle is used, the parent pipeline must: have already
been created.
If pname:basePipelineIndex is used, then the parent is being created in the
same command.
dlink:VK_NULL_HANDLE acts as the invalid handle for
pname:basePipelineHandle, and -1 is the invalid index for
pname:basePipelineIndex.
If pname:basePipelineIndex is used, the base pipeline must: appear earlier
in the array.
The base pipeline must: have been created with the
ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set.
[[pipelines-cache]]
== Pipeline Cache
[open,refpage='VkPipelineCache',desc='Opaque handle to a pipeline cache object',type='handles']
--
Pipeline cache objects allow the result of pipeline construction to be
reused between pipelines and between runs of an application.
Reuse between pipelines is achieved by passing the same pipeline cache
object when creating multiple related pipelines.
Reuse across runs of an application is achieved by retrieving pipeline cache
contents in one run of an application, saving the contents, and using them
to preinitialize a pipeline cache on a subsequent run.
The contents of the pipeline cache objects are managed by the
implementation.
Applications can: manage the host memory consumed by a pipeline cache object
and control the amount of data retrieved from a pipeline cache object.
Pipeline cache objects are represented by sname:VkPipelineCache handles:
include::{generated}/api/handles/VkPipelineCache.txt[]
--
[[pipelines-cache-create]]
=== Creating a Pipeline Cache
[open,refpage='vkCreatePipelineCache',desc='Creates a new pipeline cache',type='protos']
--
To create pipeline cache objects, call:
include::{generated}/api/protos/vkCreatePipelineCache.txt[]
* pname:device is the logical device that creates the pipeline cache
object.
* pname:pCreateInfo is a pointer to a slink:VkPipelineCacheCreateInfo
structure containing initial parameters for the pipeline cache object.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
* pname:pPipelineCache is a pointer to a slink:VkPipelineCache handle in
which the resulting pipeline cache object is returned.
[NOTE]
.Note
====
Applications can: track and manage the total host memory size of a pipeline
cache object using the pname:pAllocator.
Applications can: limit the amount of data retrieved from a pipeline cache
object in fname:vkGetPipelineCacheData.
Implementations should: not internally limit the total number of entries
added to a pipeline cache object or the total host memory consumed.
====
Once created, a pipeline cache can: be passed to the
flink:vkCreateGraphicsPipelines
ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCreateRayTracingPipelinesKHR,]
ifdef::VK_NV_ray_tracing[flink:vkCreateRayTracingPipelinesNV,]
and flink:vkCreateComputePipelines commands.
If the pipeline cache passed into these commands is not
dlink:VK_NULL_HANDLE, the implementation will query it for possible reuse
opportunities and update it with new content.
The use of the pipeline cache object in these commands is internally
synchronized, and the same pipeline cache object can: be used in multiple
threads simultaneously.
ifdef::VK_EXT_pipeline_creation_cache_control[]
If pname:flags of pname:pCreateInfo includes
ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, all commands
that modify the returned pipeline cache object must: be
<<fundamentals-threadingbehavior,externally synchronized>>.
endif::VK_EXT_pipeline_creation_cache_control[]
[NOTE]
.Note
====
Implementations should: make every effort to limit any critical sections to
the actual accesses to the cache, which is expected to be significantly
shorter than the duration of the ftext:vkCreate*Pipelines commands.
====
include::{generated}/validity/protos/vkCreatePipelineCache.txt[]
--
[open,refpage='VkPipelineCacheCreateInfo',desc='Structure specifying parameters of a newly created pipeline cache',type='structs']
--
The sname:VkPipelineCacheCreateInfo structure is defined as:
include::{generated}/api/structs/VkPipelineCacheCreateInfo.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
ifdef::VK_EXT_pipeline_creation_cache_control[]
* pname:flags is a bitmask of elink:VkPipelineCacheCreateFlagBits
specifying the behavior of the pipeline cache.
endif::VK_EXT_pipeline_creation_cache_control[]
ifndef::VK_EXT_pipeline_creation_cache_control[]
* pname:flags is reserved for future use.
endif::VK_EXT_pipeline_creation_cache_control[]
* pname:initialDataSize is the number of bytes in pname:pInitialData.
If pname:initialDataSize is zero, the pipeline cache will initially be
empty.
* pname:pInitialData is a pointer to previously retrieved pipeline cache
data.
If the pipeline cache data is incompatible (as defined below) with the
device, the pipeline cache will be initially empty.
If pname:initialDataSize is zero, pname:pInitialData is ignored.
.Valid Usage
****
* [[VUID-VkPipelineCacheCreateInfo-initialDataSize-00768]]
If pname:initialDataSize is not `0`, it must: be equal to the size of
pname:pInitialData, as returned by fname:vkGetPipelineCacheData when
pname:pInitialData was originally retrieved
* [[VUID-VkPipelineCacheCreateInfo-initialDataSize-00769]]
If pname:initialDataSize is not `0`, pname:pInitialData must: have been
retrieved from a previous call to fname:vkGetPipelineCacheData
ifdef::VK_EXT_pipeline_creation_cache_control[]
* [[VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892]]
If the <<features-pipelineCreationCacheControl,
pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
must: not include
ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT
endif::VK_EXT_pipeline_creation_cache_control[]
****
include::{generated}/validity/structs/VkPipelineCacheCreateInfo.txt[]
--
[open,refpage='VkPipelineCacheCreateFlags', desc='Bitmask of VkPipelineCreateFlagBits', type='flags']
--
include::{generated}/api/flags/VkPipelineCacheCreateFlags.txt[]
ifdef::VK_EXT_pipeline_creation_cache_control[]
tname:VkPipelineCacheCreateFlags is a bitmask type for setting a mask of
zero or more elink:VkPipelineCacheCreateFlagBits.
endif::VK_EXT_pipeline_creation_cache_control[]
ifndef::VK_EXT_pipeline_creation_cache_control[]
tname:VkPipelineCacheCreateFlags is a bitmask type for setting a mask, but
is currently reserved for future use.
endif::VK_EXT_pipeline_creation_cache_control[]
--
ifdef::VK_EXT_pipeline_creation_cache_control[]
[open,refpage='VkPipelineCacheCreateFlagBits',desc='Bitmask specifying the behavior of the pipeline cache',type='enums']
--
Possible values of the pname:flags member of
slink:VkPipelineCacheCreateInfo, specifying the behavior of the pipeline
cache, are:
include::{generated}/api/enums/VkPipelineCacheCreateFlagBits.txt[]
* ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT specifies
that all commands that modify the created slink:VkPipelineCache will be
<<fundamentals-threadingbehavior,externally synchronized>>.
When set, the implementation may: skip any unnecessary processing needed
to support simultaneous modification from multiple threads where
allowed.
--
endif::VK_EXT_pipeline_creation_cache_control[]
[[pipelines-cache-merge]]
=== Merging Pipeline Caches
[open,refpage='vkMergePipelineCaches',desc='Combine the data stores of pipeline caches',type='protos']
--
Pipeline cache objects can: be merged using the command:
include::{generated}/api/protos/vkMergePipelineCaches.txt[]
* pname:device is the logical device that owns the pipeline cache objects.
* pname:dstCache is the handle of the pipeline cache to merge results
into.
* pname:srcCacheCount is the length of the pname:pSrcCaches array.
* pname:pSrcCaches is a pointer to an array of pipeline cache handles,
which will be merged into pname:dstCache.
The previous contents of pname:dstCache are included after the merge.
[NOTE]
.Note
====
The details of the merge operation are implementation-dependent, but
implementations should: merge the contents of the specified pipelines and
prune duplicate entries.
====
.Valid Usage
****
* [[VUID-vkMergePipelineCaches-dstCache-00770]]
pname:dstCache must: not appear in the list of source caches
****
include::{generated}/validity/protos/vkMergePipelineCaches.txt[]
--
[[pipelines-cache-retrieval]]
=== Retrieving Pipeline Cache Data
[open,refpage='vkGetPipelineCacheData',desc='Get the data store from a pipeline cache',type='protos']
--
Data can: be retrieved from a pipeline cache object using the command:
include::{generated}/api/protos/vkGetPipelineCacheData.txt[]
* pname:device is the logical device that owns the pipeline cache.
* pname:pipelineCache is the pipeline cache to retrieve data from.
* pname:pDataSize is a pointer to a code:size_t value related to the
amount of data in the pipeline cache, as described below.
* pname:pData is either `NULL` or a pointer to a buffer.
If pname:pData is `NULL`, then the maximum size of the data that can: be
retrieved from the pipeline cache, in bytes, is returned in pname:pDataSize.
Otherwise, pname:pDataSize must: point to a variable set by the user to the
size of the buffer, in bytes, pointed to by pname:pData, and on return the
variable is overwritten with the amount of data actually written to
pname:pData.
If pname:pDataSize is less than the maximum size that can: be retrieved by
the pipeline cache, at most pname:pDataSize bytes will be written to
pname:pData, and ename:VK_INCOMPLETE will be returned instead of
ename:VK_SUCCESS, to indicate that not all of the pipeline cache was
returned.
Any data written to pname:pData is valid and can: be provided as the
pname:pInitialData member of the slink:VkPipelineCacheCreateInfo structure
passed to fname:vkCreatePipelineCache.
Two calls to fname:vkGetPipelineCacheData with the same parameters must:
retrieve the same data unless a command that modifies the contents of the
cache is called between them.
The initial bytes written to pname:pData must: be a header as described in
the <<pipelines-cache-header, Pipeline Cache Header>> section.
If pname:pDataSize is less than what is necessary to store this header,
nothing will be written to pname:pData and zero will be written to
pname:pDataSize.
include::{generated}/validity/protos/vkGetPipelineCacheData.txt[]
--
[[pipelines-cache-header]]
=== Pipeline Cache Header
Applications can: store the data retrieved from the pipeline cache, and use
these data, possibly in a future run of the application, to populate new
pipeline cache objects.
The results of pipeline compiles, however, may: depend on the vendor ID,
device ID, driver version, and other details of the device.
To enable applications to detect when previously retrieved data is
incompatible with the device, the pipeline cache data must: begin with a
valid pipeline cache header.
[open,refpage='VkPipelineCacheHeaderVersionOne',desc='Structure describing the layout of the pipeline cache header',type='structs']
--
Version one of the pipeline cache header is defined as:
include::{generated}/api/structs/VkPipelineCacheHeaderVersionOne.txt[]
* pname:headerSize is the length in bytes of the pipeline cache header.
* pname:headerVersion is a elink:VkPipelineCacheHeaderVersion enum value
specifying the version of the header.
A consumer of the pipeline cache should: use the cache version to
interpret the remainder of the cache header.
* pname:vendorID is the sname:VkPhysicalDeviceProperties::pname:vendorID
of the implementation.
* pname:deviceID is the sname:VkPhysicalDeviceProperties::pname:deviceID
of the implementation.
* pname:pipelineCacheUUID is the
sname:VkPhysicalDeviceProperties::pname:pipelineCacheUUID of the
implementation.
Unlike most structures declared by the Vulkan API, all fields of this
structure are written with the least significant byte first, regardless of
host byte-order.
The C language specification does not define the packing of structure
members.
This layout assumes tight structure member packing, with members laid out in
the order listed in the structure, and the intended size of the structure is
32 bytes.
If a compiler produces code that diverges from that pattern, applications
must: employ another method to set values at the correct offsets.
.Valid Usage
****
* [[VUID-VkPipelineCacheHeaderVersionOne-headerSize-04967]]
pname:headerSize must: be 32
* [[VUID-VkPipelineCacheHeaderVersionOne-headerVersion-04968]]
pname:headerVersion must: be ename:VK_PIPELINE_CACHE_HEADER_VERSION_ONE
****
include::{generated}/validity/structs/VkPipelineCacheHeaderVersionOne.txt[]
--
[open,refpage='VkPipelineCacheHeaderVersion',desc='Encode pipeline cache version',type='enums',xrefs='vkCreatePipelineCache vkGetPipelineCacheData']
--
Possible values of the pname:headerVersion value of the pipeline cache
header are:
include::{generated}/api/enums/VkPipelineCacheHeaderVersion.txt[]
* ename:VK_PIPELINE_CACHE_HEADER_VERSION_ONE specifies version one of the
pipeline cache.
--
[[pipelines-cache-destroy]]
=== Destroying a Pipeline Cache
[open,refpage='vkDestroyPipelineCache',desc='Destroy a pipeline cache object',type='protos']
--
To destroy a pipeline cache, call:
include::{generated}/api/protos/vkDestroyPipelineCache.txt[]
* pname:device is the logical device that destroys the pipeline cache
object.
* pname:pipelineCache is the handle of the pipeline cache to destroy.
* pname:pAllocator controls host memory allocation as described in the
<<memory-allocation, Memory Allocation>> chapter.
.Valid Usage
****
* [[VUID-vkDestroyPipelineCache-pipelineCache-00771]]
If sname:VkAllocationCallbacks were provided when pname:pipelineCache
was created, a compatible set of callbacks must: be provided here
* [[VUID-vkDestroyPipelineCache-pipelineCache-00772]]
If no sname:VkAllocationCallbacks were provided when pname:pipelineCache
was created, pname:pAllocator must: be `NULL`
****
include::{generated}/validity/protos/vkDestroyPipelineCache.txt[]
--
[[pipelines-specialization-constants]]
== Specialization Constants
Specialization constants are a mechanism whereby constants in a SPIR-V
module can: have their constant value specified at the time the
sname:VkPipeline is created.
This allows a SPIR-V module to have constants that can: be modified while
executing an application that uses the Vulkan API.
[NOTE]
.Note
====
Specialization constants are useful to allow a compute shader to have its
local workgroup size changed at runtime by the user, for example.
====
Each slink:VkPipelineShaderStageCreateInfo structure contains a
pname:pSpecializationInfo member, which can: be `NULL` to indicate no
specialization constants, or point to a sname:VkSpecializationInfo
structure.
[open,refpage='VkSpecializationInfo',desc='Structure specifying specialization information',type='structs']
--
The sname:VkSpecializationInfo structure is defined as:
include::{generated}/api/structs/VkSpecializationInfo.txt[]
* pname:mapEntryCount is the number of entries in the pname:pMapEntries
array.
* pname:pMapEntries is a pointer to an array of
sname:VkSpecializationMapEntry structures which map constant IDs to
offsets in pname:pData.
* pname:dataSize is the byte size of the pname:pData buffer.
* pname:pData contains the actual constant values to specialize with.
.Valid Usage
****
* [[VUID-VkSpecializationInfo-offset-00773]]
The pname:offset member of each element of pname:pMapEntries must: be
less than pname:dataSize
* [[VUID-VkSpecializationInfo-pMapEntries-00774]]
The pname:size member of each element of pname:pMapEntries must: be less
than or equal to pname:dataSize minus pname:offset
* [[VUID-VkSpecializationInfo-constantID-04911]]
The pname:constantID value of each element of pname:pMapEntries must: be
unique within pname:pMapEntries
****
include::{generated}/validity/structs/VkSpecializationInfo.txt[]
--
[open,refpage='VkSpecializationMapEntry',desc='Structure specifying a specialization map entry',type='structs']
--
The sname:VkSpecializationMapEntry structure is defined as:
include::{generated}/api/structs/VkSpecializationMapEntry.txt[]
* pname:constantID is the ID of the specialization constant in SPIR-V.
* pname:offset is the byte offset of the specialization constant value
within the supplied data buffer.
* pname:size is the byte size of the specialization constant value within
the supplied data buffer.
If a pname:constantID value is not a specialization constant ID used in the
shader, that map entry does not affect the behavior of the pipeline.
.Valid Usage
****
* [[VUID-VkSpecializationMapEntry-constantID-00776]]
For a pname:constantID specialization constant declared in a shader,
pname:size must: match the byte size of the pname:constantID.
If the specialization constant is of type code:boolean, pname:size must:
be the byte size of basetype:VkBool32
****
include::{generated}/validity/structs/VkSpecializationMapEntry.txt[]
--
In human readable SPIR-V:
[source,glsl]
---------------------------------------------------
OpDecorate %x SpecId 13 ; decorate .x component of WorkgroupSize with ID 13
OpDecorate %y SpecId 42 ; decorate .y component of WorkgroupSize with ID 42
OpDecorate %z SpecId 3 ; decorate .z component of WorkgroupSize with ID 3
OpDecorate %wgsize BuiltIn WorkgroupSize ; decorate WorkgroupSize onto constant
%i32 = OpTypeInt 32 0 ; declare an unsigned 32-bit type
%uvec3 = OpTypeVector %i32 3 ; declare a 3 element vector type of unsigned 32-bit
%x = OpSpecConstant %i32 1 ; declare the .x component of WorkgroupSize
%y = OpSpecConstant %i32 1 ; declare the .y component of WorkgroupSize
%z = OpSpecConstant %i32 1 ; declare the .z component of WorkgroupSize
%wgsize = OpSpecConstantComposite %uvec3 %x %y %z ; declare WorkgroupSize
---------------------------------------------------
From the above we have three specialization constants, one for each of the
x, y & z elements of the WorkgroupSize vector.
Now to specialize the above via the specialization constants mechanism:
[source,c++]
---------------------------------------------------
const VkSpecializationMapEntry entries[] =
{
{
13, // constantID
0 * sizeof(uint32_t), // offset
sizeof(uint32_t) // size
},
{
42, // constantID
1 * sizeof(uint32_t), // offset
sizeof(uint32_t) // size
},
{
3, // constantID
2 * sizeof(uint32_t), // offset
sizeof(uint32_t) // size
}
};
const uint32_t data[] = { 16, 8, 4 }; // our workgroup size is 16x8x4
const VkSpecializationInfo info =
{
3, // mapEntryCount
entries, // pMapEntries
3 * sizeof(uint32_t), // dataSize
data, // pData
};
---------------------------------------------------
Then when calling flink:vkCreateComputePipelines, and passing the
sname:VkSpecializationInfo we defined as the pname:pSpecializationInfo
parameter of slink:VkPipelineShaderStageCreateInfo, we will create a compute
pipeline with the runtime specified local workgroup size.
Another example would be that an application has a SPIR-V module that has
some platform-dependent constants they wish to use.
In human readable SPIR-V:
// [source,glsl]
[source,glsl]
---------------------------------------------------
OpDecorate %1 SpecId 0 ; decorate our signed 32-bit integer constant
OpDecorate %2 SpecId 12 ; decorate our 32-bit floating-point constant
%i32 = OpTypeInt 32 1 ; declare a signed 32-bit type
%float = OpTypeFloat 32 ; declare a 32-bit floating-point type
%1 = OpSpecConstant %i32 -1 ; some signed 32-bit integer constant
%2 = OpSpecConstant %float 0.5 ; some 32-bit floating-point constant
---------------------------------------------------
From the above we have two specialization constants, one is a signed 32-bit
integer and the second is a 32-bit floating-point value.
Now to specialize the above via the specialization constants mechanism:
[source,c++]
---------------------------------------------------
struct SpecializationData {
int32_t data0;
float data1;
};
const VkSpecializationMapEntry entries[] =
{
{
0, // constantID
offsetof(SpecializationData, data0), // offset
sizeof(SpecializationData::data0) // size
},
{
12, // constantID
offsetof(SpecializationData, data1), // offset
sizeof(SpecializationData::data1) // size
}
};
SpecializationData data;
data.data0 = -42; // set the data for the 32-bit integer
data.data1 = 42.0f; // set the data for the 32-bit floating-point
const VkSpecializationInfo info =
{
2, // mapEntryCount
entries, // pMapEntries
sizeof(data), // dataSize
&data, // pData
};
---------------------------------------------------
It is legal for a SPIR-V module with specializations to be compiled into a
pipeline where no specialization information was provided.
SPIR-V specialization constants contain default values such that if a
specialization is not provided, the default value will be used.
In the examples above, it would be valid for an application to only
specialize some of the specialization constants within the SPIR-V module,
and let the other constants use their default values encoded within the
OpSpecConstant declarations.
ifdef::VK_KHR_pipeline_library[]
[[pipeline-library]]
== Pipeline Libraries
A pipeline library is a special pipeline that was created using the
ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR and cannot be bound, instead it
defines a set of pipeline state which can be linked into other pipelines.
ifdef::VK_KHR_ray_tracing_pipeline[]
For ray tracing pipelines this includes shaders and shader groups.
endif::VK_KHR_ray_tracing_pipeline[]
The application must: maintain the lifetime of a pipeline library based on
the pipelines that link with it.
A pipeline library is considered in-use, as long as one of the linking
pipelines is in-use.
This linkage is achieved by using the following structure within the
appropriate creation mechanisms:
[open,refpage='VkPipelineLibraryCreateInfoKHR',desc='Structure specifying pipeline libraries to use when creating a pipeline',type='structs']
--
The sname:VkPipelineLibraryCreateInfoKHR structure is defined as:
include::{generated}/api/structs/VkPipelineLibraryCreateInfoKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:libraryCount is the number of pipeline libraries in
pname:pLibraries.
* pname:pLibraries is a pointer to an array of slink:VkPipeline structures
specifying pipeline libraries to use when creating a pipeline.
.Valid Usage
****
* [[VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-03381]]
Each element of pname:pLibraries must: have been created with
ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
****
include::{generated}/validity/structs/VkPipelineLibraryCreateInfoKHR.txt[]
--
endif::VK_KHR_pipeline_library[]
[[pipelines-binding]]
== Pipeline Binding
[open,refpage='vkCmdBindPipeline',desc='Bind a pipeline object to a command buffer',type='protos']
--
Once a pipeline has been created, it can: be bound to the command buffer
using the command:
include::{generated}/api/protos/vkCmdBindPipeline.txt[]
* pname:commandBuffer is the command buffer that the pipeline will be
bound to.
* pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
to which bind point the pipeline is bound.
Binding one does not disturb the others.
* pname:pipeline is the pipeline to be bound.
[[pipeline-bindpoint-commands]]
Once bound, a pipeline binding affects subsequent commands that interact
with the given pipeline type in the command buffer until a different
pipeline of the same type is bound to the bind point.
Commands that do not interact with the given pipeline type must: not be
affected by the pipeline state.
* The pipeline bound to ename:VK_PIPELINE_BIND_POINT_COMPUTE controls the
behavior of all <<dispatch, dispatching commands>>.
* The pipeline bound to ename:VK_PIPELINE_BIND_POINT_GRAPHICS controls the
behavior of all <<drawing, drawing commands>>.
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
* The pipeline bound to ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
controls the behavior of flink:vkCmdTraceRaysKHR and
flink:vkCmdTraceRaysIndirectKHR.
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ifdef::VK_HUAWEI_subpass_shading[]
* The pipeline bound to
ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI controls the
behavior of flink:vkCmdSubpassShadingHUAWEI.
endif::VK_HUAWEI_subpass_shading[]
.Valid Usage
****
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-00777]]
If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_COMPUTE, the
sname:VkCommandPool that pname:commandBuffer was allocated from must:
support compute operations
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-00778]]
If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS, the
sname:VkCommandPool that pname:commandBuffer was allocated from must:
support graphics operations
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-00779]]
If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_COMPUTE,
pname:pipeline must: be a compute pipeline
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-00780]]
If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS,
pname:pipeline must: be a graphics pipeline
* [[VUID-vkCmdBindPipeline-pipeline-00781]]
If the <<features-variableMultisampleRate,variable multisample rate>>
feature is not supported, pname:pipeline is a graphics pipeline, the
current subpass <<renderpass-noattachments, uses no attachments>>, and
this is not the first call to this function with a graphics pipeline
after transitioning to the current subpass, then the sample count
specified by this pipeline must: match that set in the previous pipeline
ifdef::VK_EXT_sample_locations[]
* [[VUID-vkCmdBindPipeline-variableSampleLocations-01525]]
If
slink:VkPhysicalDeviceSampleLocationsPropertiesEXT::pname:variableSampleLocations
is ename:VK_FALSE, and pname:pipeline is a graphics pipeline created
with a slink:VkPipelineSampleLocationsStateCreateInfoEXT structure
having its pname:sampleLocationsEnable member set to ename:VK_TRUE but
without ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT enabled then the
current render pass instance must: have been begun by specifying a
slink:VkRenderPassSampleLocationsBeginInfoEXT structure whose
pname:pPostSubpassSampleLocations member contains an element with a
pname:subpassIndex matching the current subpass index and the
pname:sampleLocationsInfo member of that element must: match the
pname:sampleLocationsInfo specified in
slink:VkPipelineSampleLocationsStateCreateInfoEXT when the pipeline was
created
endif::VK_EXT_sample_locations[]
ifdef::VK_EXT_transform_feedback[]
* [[VUID-vkCmdBindPipeline-None-02323]]
This command must: not be recorded when transform feedback is active
endif::VK_EXT_transform_feedback[]
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-02391]]
If pname:pipelineBindPoint is
ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, the sname:VkCommandPool
that pname:commandBuffer was allocated from must: support compute
operations
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-02392]]
If pname:pipelineBindPoint is
ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pname:pipeline must: be a
ray tracing pipeline
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ifdef::VK_KHR_pipeline_library[]
* [[VUID-vkCmdBindPipeline-pipeline-03382]]
pname:pipeline must: not have been created with
ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR set
endif::VK_KHR_pipeline_library[]
ifdef::VK_NV_inherited_viewport_scissor[]
* [[VUID-vkCmdBindPipeline-commandBuffer-04808]]
If pname:commandBuffer is a secondary command buffer with
slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
enabled and pname:pipelineBindPoint is
ename:VK_PIPELINE_BIND_POINT_GRAPHICS, then the pname:pipeline must:
have been created with ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT or
ename:VK_DYNAMIC_STATE_VIEWPORT, and
ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT or
ename:VK_DYNAMIC_STATE_SCISSOR enabled
endif::VK_NV_inherited_viewport_scissor[]
ifdef::VK_NV_inherited_viewport_scissor,VK_EXT_discard_rectangles[]
* [[VUID-vkCmdBindPipeline-commandBuffer-04809]]
If pname:commandBuffer is a secondary command buffer with
slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
enabled and pname:pipelineBindPoint is
ename:VK_PIPELINE_BIND_POINT_GRAPHICS and pname:pipeline was created
with slink:VkPipelineDiscardRectangleStateCreateInfoEXT structure and
its pname:discardRectangleCount member is not `0`, then the pipeline
must: have been created with
ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT enabled
endif::VK_NV_inherited_viewport_scissor,VK_EXT_discard_rectangles[]
ifdef::VK_EXT_provoking_vertex[]
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-04881]]
If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS and
the
<<limits-provokingVertexModePerPipeline,provokingVertexModePerPipeline>>
limit is ename:VK_FALSE, then pipeline's
slink:VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::pname:provokingVertexMode
must: be the same as that of any other pipelines previously bound to
this bind point within the current render pass instance, including any
pipeline already bound when beginning the render pass instance
endif::VK_EXT_provoking_vertex[]
ifdef::VK_HUAWEI_subpass_shading[]
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-04949]]
If pname:pipelineBindPoint is
ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI, the
sname:VkCommandPool that pname:commandBuffer was allocated from must:
support compute operations
* [[VUID-vkCmdBindPipeline-pipelineBindPoint-04950]]
If pname:pipelineBindPoint is
ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI, pname:pipeline
must: be a subpass shading pipeline
endif::VK_HUAWEI_subpass_shading[]
ifdef::VK_KHR_dynamic_rendering[]
* [[VUID-vkCmdBindPipeline-pipeline-06195]]
If pname:pipeline is a graphics pipeline, this command has been called
inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
and commands using the previously bound graphics pipeline have been
recorded within the render pass instance, then the value of
slink:VkPipelineRenderingCreateInfoKHR::pname:colorAttachmentCount
specified by this pipeline must: match that set in the previous pipeline
* [[VUID-vkCmdBindPipeline-pipeline-06196]]
If pname:pipeline is a graphics pipeline, this command has been called
inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
and commands using the previously bound graphics pipeline have been
recorded within the render pass instance, then the elements of
slink:VkPipelineRenderingCreateInfoKHR::pname:pColorAttachmentFormats
specified by this pipeline must: match that set in the previous pipeline
* [[VUID-vkCmdBindPipeline-pipeline-06197]]
If pname:pipeline is a graphics pipeline, this command has been called
inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
and commands using the previously bound graphics pipeline have been
recorded within the render pass instance, then the value of
slink:VkPipelineRenderingCreateInfoKHR::pname:depthAttachmentFormat
specified by this pipeline must: match that set in the previous pipeline
* [[VUID-vkCmdBindPipeline-pipeline-06194]]
If pname:pipeline is a graphics pipeline, this command has been called
inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
and commands using the previously bound graphics pipeline have been
recorded within the render pass instance, then the value of
slink:VkPipelineRenderingCreateInfoKHR::pname:stencilAttachmentFormat
specified by this pipeline must: match that set in the previous pipeline
endif::VK_KHR_dynamic_rendering[]
****
include::{generated}/validity/protos/vkCmdBindPipeline.txt[]
--
[open,refpage='VkPipelineBindPoint',desc='Specify the bind point of a pipeline object to a command buffer',type='enums']
--
Possible values of flink:vkCmdBindPipeline::pname:pipelineBindPoint,
specifying the bind point of a pipeline object, are:
include::{generated}/api/enums/VkPipelineBindPoint.txt[]
* ename:VK_PIPELINE_BIND_POINT_COMPUTE specifies binding as a compute
pipeline.
* ename:VK_PIPELINE_BIND_POINT_GRAPHICS specifies binding as a graphics
pipeline.
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
* ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR specifies binding as a ray
tracing pipeline.
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ifdef::VK_HUAWEI_subpass_shading[]
* ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI specifies binding as
a subpass shading pipeline.
endif::VK_HUAWEI_subpass_shading[]
--
ifdef::VK_NV_device_generated_commands[]
[open,refpage='vkCmdBindPipelineShaderGroupNV',desc='Bind a pipeline object's shader group to a command buffer',type='protos']
--
For pipelines that were created with the support of multiple shader groups
(see <<graphics-shadergroups,Graphics Pipeline Shader Groups>>), the regular
fname:vkCmdBindPipeline command will bind Shader Group `0`.
To explicitly bind a shader group use:
include::{generated}/api/protos/vkCmdBindPipelineShaderGroupNV.txt[]
* pname:commandBuffer is the command buffer that the pipeline will be
bound to.
* pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
the bind point to which the pipeline will be bound.
* pname:pipeline is the pipeline to be bound.
* pname:groupIndex is the shader group to be bound.
.Valid Usage
****
* [[VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02893]]
pname:groupIndex must: be `0` or less than the effective
slink:VkGraphicsPipelineShaderGroupsCreateInfoNV::pname:groupCount
including the referenced pipelines
* [[VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-02894]]
The pname:pipelineBindPoint must: be
ename:VK_PIPELINE_BIND_POINT_GRAPHICS
* [[VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02895]]
The same restrictions as flink:vkCmdBindPipeline apply as if the bound
pipeline was created only with the Shader Group from the
pname:groupIndex information
* [[VUID-vkCmdBindPipelineShaderGroupNV-deviceGeneratedCommands-02896]]
The <<features-deviceGeneratedCommands,
sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
feature must: be enabled
****
include::{generated}/validity/protos/vkCmdBindPipelineShaderGroupNV.txt[]
--
endif::VK_NV_device_generated_commands[]
[[pipelines-dynamic-state]]
== Dynamic State
When a pipeline object is bound, any pipeline object state that is not
specified as dynamic is applied to the command buffer state.
Pipeline object state that is specified as dynamic is not applied to the
command buffer state at this time.
Instead, dynamic state can: be modified at any time and persists for the
lifetime of the command buffer, or until modified by another dynamic state
setting command or another pipeline bind.
When a pipeline object is bound, the following applies to each state
parameter:
* If the state is not specified as dynamic in the new pipeline object,
then that command buffer state is overwritten by the state in the new
pipeline object.
Before any draw or dispatch call with this pipeline there must: not have
been any calls to any of the corresponding dynamic state setting
commands after this pipeline was bound
* If the state is specified as dynamic in the new pipeline object, then
that command buffer state is not disturbed.
Before any draw or dispatch call with this pipeline there must: have
been at least one call to each of the corresponding dynamic state
setting commands since the command buffer recording was begun, or the
last bound pipeline object with that state specified as static,
whichever was the latter
Dynamic state that does not affect the result of operations can: be left
undefined:.
[NOTE]
.Note
====
For example, if blending is disabled by the pipeline object state then the
dynamic color blend constants do not need to be specified in the command
buffer, even if this state is specified as dynamic in the pipeline object.
====
ifdef::VK_AMD_shader_info,VK_KHR_pipeline_executable_properties[]
[[pipelines-shader-information]]
== Pipeline Shader Information
endif::VK_AMD_shader_info,VK_KHR_pipeline_executable_properties[]
ifdef::VK_KHR_pipeline_executable_properties[]
include::VK_KHR_pipeline_executable_properties/pipelines.txt[]
endif::VK_KHR_pipeline_executable_properties[]
ifdef::VK_AMD_shader_info[]
include::VK_AMD_shader_info.txt[]
endif::VK_AMD_shader_info[]
// These includes have their own section headers
ifdef::VK_AMD_pipeline_compiler_control[]
include::VK_AMD_pipeline_compiler_control.txt[]
endif::VK_AMD_pipeline_compiler_control[]
ifdef::VK_EXT_pipeline_creation_feedback[]
include::VK_EXT_pipeline_creation_feedback/pipelines.txt[]
endif::VK_EXT_pipeline_creation_feedback[]