| // Copyright 2015-2023 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,VK_EXT_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,VK_EXT_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_HUAWEI_cluster_culling_shader[] |
| *Cluster Culling Shading* |
| |
| When using the Cluster Culling Shader, a compute-like shader will perform |
| cluster-based culling, a set of new built-in output variables are used to |
| express visible cluster, in addition, a new built-in function is used to |
| emit these variables from the cluster culling shader to the Input |
| Assembler(IA) stage, then IA can use these variables to fetches vertices of |
| visible cluster and drive vertex shader to work. |
| |
| endif::VK_HUAWEI_cluster_culling_shader[] |
| |
| ifdef::VK_NV_mesh_shader,VK_EXT_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,VK_EXT_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,VK_EXT_mesh_shader[] |
| image::{images}/pipeline.svg[title="Block diagram of the Vulkan pipeline",align="center",opts="{imageopts}"] |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| image::{images}/pipelinemesh.svg[title="Block diagram of the Vulkan pipeline",align="center",opts="{imageopts}"] |
| endif::VK_NV_mesh_shader,VK_EXT_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.adoc[] |
| -- |
| |
| |
| [[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 |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| with an offline compiled pipeline provided in pname:pipelineCache and the |
| pipeline identified by slink:VkPipelineOfflineCreateInfo structure in the |
| pname:pNext chain of slink:VkComputePipelineCreateInfo structure. |
| endif::VKSC_VERSION_1_0[] |
| |
| |
| [open,refpage='vkCreateComputePipelines',desc='Creates a new compute pipeline object',type='protos'] |
| -- |
| :refpage: vkCreateComputePipelines |
| :objectnameplural: compute pipelines |
| :objectnamecamelcase: computePipeline |
| :objectcount: pname:createInfoCount |
| |
| To create compute pipelines, call: |
| |
| include::{generated}/api/protos/vkCreateComputePipelines.adoc[] |
| |
| * pname:device is the logical device that creates the compute pipelines. |
| ifndef::VKSC_VERSION_1_0[] |
| * 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| * pname:pipelineCache is the handle of a valid <<pipelines-cache,pipeline |
| cache>> object. |
| endif::VKSC_VERSION_1_0[] |
| * 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[] |
| |
| ifdef::VKSC_VERSION_1_0[] |
| If a pipeline creation fails due to: |
| |
| * The identified pipeline not being present in pname:pipelineCache |
| * The pname:pNext chain not including a slink:VkPipelineOfflineCreateInfo |
| structure |
| |
| the operation will continue as specified in <<pipelines-multiple, Multiple |
| Pipeline Creation>> and the command will return |
| ename:VK_ERROR_NO_PIPELINE_MATCH. |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * flink:vkCreateComputePipelines returns ename:VK_ERROR_NO_PIPELINE_MATCH |
| if the slink:VkComputePipelineCreateInfo::pname:pNext chain does not |
| include a valid slink:VkPipelineOfflineCreateInfo structure <<SCID-1>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{chapters}/commonvalidity/no_dynamic_allocations_common.adoc[] |
| |
| .Valid Usage |
| **** |
| ifndef::VKSC_VERSION_1_0[] |
| * [[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 |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| * [[VUID-vkCreateComputePipelines-pipelineCache-02873]] |
| If pname:pipelineCache was created with |
| ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT, host access |
| to pname:pipelineCache must: be |
| <<fundamentals-threadingbehavior,externally synchronized>> |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| include::{chapters}/commonvalidity/memory_reservation_request_count_common.adoc[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * flink:vkCreateComputePipelines::pname:pipelineCache must: not be |
| dlink:VK_NULL_HANDLE <<SCID-1>>, <<SCID-8>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/protos/vkCreateComputePipelines.adoc[] |
| -- |
| |
| [open,refpage='VkComputePipelineCreateInfo',desc='Structure specifying parameters of a newly created compute pipeline',type='structs'] |
| -- |
| :refpage: VkComputePipelineCreateInfo |
| |
| The sname:VkComputePipelineCreateInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkComputePipelineCreateInfo.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| * pname:basePipelineIndex is an index into the pname:pCreateInfos |
| parameter to use as a pipeline to derive from. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| |
| The parameters pname:basePipelineHandle and pname:basePipelineIndex are |
| described in more detail in <<pipelines-pipeline-derivatives,Pipeline |
| Derivatives>>. |
| |
| ifdef::VK_KHR_maintenance5[] |
| If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the |
| pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags |
| from that structure is used instead of pname:flags from this structure. |
| endif::VK_KHR_maintenance5[] |
| |
| .Valid Usage |
| **** |
| :pipelineType: compute |
| include::{chapters}/commonvalidity/pipeline_create_info_common.adoc[] |
| include::{chapters}/commonvalidity/compute_graph_pipeline_create_info_common.adoc[] |
| * [[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-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-shaderEnqueue-09177]] |
| ifdef::VK_AMDX_shader_enqueue[] |
| If <<features-shaderEnqueue,pname:shaderEnqueue>> is not enabled, |
| endif::VK_AMDX_shader_enqueue[] |
| pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| ifdef::VK_AMDX_shader_enqueue[] |
| * [[VUID-VkComputePipelineCreateInfo-flags-09178]] |
| If pname:flags does not include |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, the shader specified by |
| pname:stage must: not declare the code:ShaderEnqueueAMDX capability |
| endif::VK_AMDX_shader_enqueue[] |
| endif::VK_KHR_pipeline_library[] |
| ifdef::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| * [[VUID-VkComputePipelineCreateInfo-pipelineStageCreationFeedbackCount-06566]] |
| If |
| slink:VkPipelineCreationFeedbackCreateInfo::pname:pipelineStageCreationFeedbackCount |
| is not `0`, it must: be `1` |
| endif::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| ifdef::VK_EXT_opacity_micromap[] |
| * [[VUID-VkComputePipelineCreateInfo-flags-07367]] |
| pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT |
| endif::VK_EXT_opacity_micromap[] |
| ifdef::VK_NV_displacement_micromap[] |
| * [[VUID-VkComputePipelineCreateInfo-flags-07996]] |
| pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV |
| endif::VK_NV_displacement_micromap[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * slink:VkComputePipelineCreateInfo::pname:basePipelineHandle must: be |
| dlink:VK_NULL_HANDLE <<SCID-8>>. |
| * slink:VkComputePipelineCreateInfo::pname:basePipelineIndex must: be zero |
| <<SCID-8>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/structs/VkComputePipelineCreateInfo.adoc[] |
| -- |
| |
| [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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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. |
| ifdef::VK_EXT_graphics_pipeline_library,VK_EXT_shader_module_identifier,VK_KHR_maintenance5[] |
| * pname:module is optionally a slink:VkShaderModule object containing the |
| shader code for this stage. |
| endif::VK_EXT_graphics_pipeline_library,VK_EXT_shader_module_identifier,VK_KHR_maintenance5[] |
| ifndef::VK_EXT_graphics_pipeline_library,VK_EXT_shader_module_identifier,VK_KHR_maintenance5[] |
| * pname:module is a slink:VkShaderModule object containing the shader code |
| for this stage. |
| endif::VK_EXT_graphics_pipeline_library,VK_EXT_shader_module_identifier,VK_KHR_maintenance5[] |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| * 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`. |
| |
| ifdef::VKSC_VERSION_1_0[] |
| In Vulkan SC, the pipeline compilation process occurs |
| <<pipelines-offline-compilation,offline>> and the pname:module, pname:pName, |
| and pname:pSpecializationInfo parameters are not used at runtime and should: |
| be ignored by the implementation. |
| If provided, the application must: set the pname:pName and |
| pname:pSpecializationInfo parameters to the values that were specified for |
| the offline compilation of this pipeline. |
| endif::VKSC_VERSION_1_0[] |
| |
| ifdef::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| If pname:module is not dlink:VK_NULL_HANDLE, the shader code used by the |
| pipeline is defined by pname:module. |
| If pname:module is dlink:VK_NULL_HANDLE, the shader code is defined by the |
| chained slink:VkShaderModuleCreateInfo if present. |
| endif::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| ifndef::VKSC_VERSION_1_0,VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| The shader code used by the pipeline is defined by pname:module. |
| endif::VKSC_VERSION_1_0,VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| |
| ifdef::VK_EXT_shader_module_identifier[] |
| If the <<features-shaderModuleIdentifier, pname:shaderModuleIdentifier>> |
| feature is enabled, applications can: omit shader code for pname:stage and |
| instead provide a module identifier. |
| This is done by including a |
| slink:VkPipelineShaderStageModuleIdentifierCreateInfoEXT struct with |
| pname:identifierSize not equal to 0 in the pname:pNext chain. |
| A shader stage created in this way is equivalent to one created using a |
| shader module with the same identifier. |
| The identifier allows an implementation to look up a pipeline without |
| consuming a valid SPIR-V module. |
| If a pipeline is not found, pipeline compilation is not possible and the |
| implementation must: fail as specified by |
| ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT. |
| |
| When an identifier is used in lieu of a shader module, implementations may: |
| fail pipeline compilation with ename:VK_PIPELINE_COMPILE_REQUIRED for any |
| reason. |
| |
| [NOTE] |
| .Note |
| ==== |
| The rationale for the relaxed requirement on implementations to return a |
| pipeline with slink:VkPipelineShaderStageModuleIdentifierCreateInfoEXT is |
| that layers or tools may intercept pipeline creation calls and require the |
| full SPIR-V context to operate correctly. |
| ICDs are not expected to fail pipeline compilation if the pipeline exists in |
| a cache somewhere. |
| ==== |
| |
| ifdef::VK_KHR_pipeline_library[] |
| Applications can: use identifiers when creating pipelines with |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR. |
| When creating such pipelines, ename:VK_SUCCESS may: be returned, but |
| subsequently fail when referencing the pipeline in a |
| slink:VkPipelineLibraryCreateInfoKHR struct. |
| Applications must: allow pipeline compilation to fail during link steps with |
| ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT as it may: |
| not be possible to determine if a pipeline can: be created from identifiers |
| until the link step. |
| endif::VK_KHR_pipeline_library[] |
| endif::VK_EXT_shader_module_identifier[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-00704]] |
| If the <<features-geometryShader, pname:geometryShader>> feature is not |
| enabled, pname:stage must: not be ename:VK_SHADER_STAGE_GEOMETRY_BIT |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-00705]] |
| If the <<features-tessellationShader, pname:tessellationShader>> 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,VK_EXT_mesh_shader[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-02091]] |
| If the <<features-meshShader, pname:meshShaders>> feature is not |
| enabled, pname:stage must: not be ename:VK_SHADER_STAGE_MESH_BIT_EXT |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-02092]] |
| If the <<features-taskShader, pname:taskShaders>> feature is not |
| enabled, pname:stage must: not be ename:VK_SHADER_STAGE_TASK_BIT_EXT |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| |
| ifdef::VK_HUAWEI_cluster_culling_shader[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-clustercullingShader-07813]] |
| If the <<features-clustercullingShader, pname:clustercullingShader>> |
| feature is not enabled, pname:stage must: not be |
| ename:VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI |
| endif::VK_HUAWEI_cluster_culling_shader[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-00706]] |
| pname:stage must: not be ename:VK_SHADER_STAGE_ALL_GRAPHICS, or |
| ename:VK_SHADER_STAGE_ALL |
| ifdef::VKSC_VERSION_1_0[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-module-05026]] |
| pname:module must: be dlink:VK_NULL_HANDLE. |
| * [[VUID-VkPipelineShaderStageCreateInfo-pName-05027]] |
| If pname:pName is not `NULL`, it must: be the name of an |
| code:OpEntryPoint in the SPIR-V shader module used for offline |
| compilation of this pipeline with an execution model that matches |
| pname:stage |
| endif::VKSC_VERSION_1_0[] |
| ifndef::VKSC_VERSION_1_0[] |
| * [[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 |
| endif::VKSC_VERSION_1_0[] |
| * [[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-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 specifying 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 specifying 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 specifying 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 either 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, 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 either 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, 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-06685]] |
| If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, and the identified |
| entry point writes to code:FragDepth in any execution path, all |
| execution paths that are not exclusive to helper invocations must: |
| either discard the fragment, or write or initialize the value of |
| code:FragDepth |
| ifdef::VK_EXT_shader_stencil_export[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-06686]] |
| If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, and the identified |
| entry point writes to code:FragStencilRefEXT in any execution path, all |
| execution paths that are not exclusive to helper invocations must: |
| either discard the fragment, or write or initialize the value of |
| code:FragStencilRefEXT |
| endif::VK_EXT_shader_stencil_export[] |
| ifdef::VK_VERSION_1_3,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 |
| 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 flag |
| set, the <<features-computeFullSubgroups, pname:computeFullSubgroups>> |
| feature must: be enabled |
| * [[VUID-VkPipelineShaderStageCreateInfo-flags-08988]] |
| If pname:flags includes |
| ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT, |
| pname:stage must: be |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| one of ename:VK_SHADER_STAGE_MESH_BIT_EXT, |
| ename:VK_SHADER_STAGE_TASK_BIT_EXT, or |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ename:VK_SHADER_STAGE_COMPUTE_BIT |
| * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02754]] |
| If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 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 |
| flag set |
| * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02755]] |
| If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 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-requiredSubgroupSizeStages, pname:requiredSubgroupSizeStages>> |
| * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02756]] |
| If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo structure |
| is included in the pname:pNext chain and pname:stage is |
| ename:VK_SHADER_STAGE_COMPUTE_BIT, |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[ename:VK_SHADER_STAGE_MESH_BIT_EXT, or ename:VK_SHADER_STAGE_TASK_BIT_EXT,] |
| the local workgroup size of the shader must: be less than or equal to |
| the product of |
| slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo::pname:requiredSubgroupSize |
| and <<limits-maxComputeWorkgroupSubgroups, |
| pname:maxComputeWorkgroupSubgroups>> |
| * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02757]] |
| If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo structure |
| is included in the pname:pNext chain, and pname:flags has the |
| ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT flag |
| set, the local workgroup size in the X dimension of the pipeline must: |
| be a multiple of |
| slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo::pname:requiredSubgroupSize |
| * [[VUID-VkPipelineShaderStageCreateInfo-flags-02758]] |
| If pname:flags has both the |
| ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT and |
| ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT |
| flags set, the local workgroup size in the X dimension of the pipeline |
| must: be a multiple of <<limits-maxSubgroupSize, pname:maxSubgroupSize>> |
| * [[VUID-VkPipelineShaderStageCreateInfo-flags-02759]] |
| If pname:flags has the |
| ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT flag |
| set and pname:flags does not have the |
| ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT |
| flag set and no |
| slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 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>> |
| ifdef::VK_KHR_cooperative_matrix[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-module-08987]] |
| If pname:module uses the code:OpTypeCooperativeMatrixKHR instruction |
| with a code:Scope equal to code:Subgroup, then the local workgroup size |
| in the X dimension of the pipeline must: be a multiple of |
| <<limits-subgroup-size,pname:subgroupSize>>. |
| endif::VK_KHR_cooperative_matrix[] |
| endif::VK_VERSION_1_3,VK_EXT_subgroup_size_control[] |
| |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-08771]] |
| ifdef::VK_EXT_shader_module_identifier[] |
| If a shader module identifier is not specified for this pname:stage, |
| endif::VK_EXT_shader_module_identifier[] |
| pname:module must: be a valid slink:VkShaderModule |
| ifdef::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| if none of the following features are enabled: |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| ** <<features-graphicsPipelineLibrary, pname:graphicsPipelineLibrary>> |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifdef::VK_KHR_maintenance5[] |
| ** <<features-maintenance5, pname:maintenance5>> |
| endif::VK_KHR_maintenance5[] |
| endif::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| |
| ifdef::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-06845]] |
| ifdef::VK_EXT_shader_module_identifier[] |
| If a shader module identifier is not specified for this pname:stage, |
| pname:module must: be a valid slink:VkShaderModule, or |
| endif::VK_EXT_shader_module_identifier[] |
| ifndef::VK_EXT_shader_module_identifier[] |
| If pname:module is dlink:VK_NULL_HANDLE] |
| endif::VK_EXT_shader_module_identifier[] |
| there must: be a valid slink:VkShaderModuleCreateInfo structure in the |
| pname:pNext chain |
| endif::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| |
| ifdef::VK_EXT_shader_module_identifier[] |
| ifdef::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-06844]] |
| If a shader module identifier is specified for this pname:stage, a |
| slink:VkShaderModuleCreateInfo structure must: not be present in the |
| pname:pNext chain |
| endif::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-stage-06848]] |
| If a shader module identifier is specified for this pname:stage, |
| pname:module must: be dlink:VK_NULL_HANDLE |
| endif::VK_EXT_shader_module_identifier[] |
| * [[VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-06849]] |
| ifdef::VK_EXT_shader_module_identifier[] |
| If a shader module identifier is not specified, the |
| endif::VK_EXT_shader_module_identifier[] |
| ifndef::VK_EXT_shader_module_identifier[The] |
| shader code used by the pipeline 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.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineShaderStageCreateFlags',desc='Bitmask of VkPipelineShaderStageCreateFlagBits',type='flags'] |
| -- |
| include::{generated}/api/flags/VkPipelineShaderStageCreateFlags.adoc[] |
| |
| 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.adoc[] |
| |
| ifdef::VK_VERSION_1_3,VK_EXT_subgroup_size_control[] |
| * ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT |
| 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 |
| specifies that the subgroup sizes must: be launched with all invocations |
| active in the |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[task, mesh, or] |
| 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-minSubgroupSize, pname:minSubgroupSize>> does not |
| equal <<limits-maxSubgroupSize, 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_VERSION_1_3,VK_EXT_subgroup_size_control[] |
| -- |
| |
| [open,refpage='VkShaderStageFlagBits',desc='Bitmask specifying a pipeline stage',type='enums'] |
| -- |
| Bits which can: be set by commands and structures, specifying one or more |
| shader stages, are: |
| |
| include::{generated}/api/enums/VkShaderStageFlagBits.adoc[] |
| |
| * 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,VK_EXT_mesh_shader[] |
| * ename:VK_SHADER_STAGE_TASK_BIT_EXT specifies the task stage. |
| * ename:VK_SHADER_STAGE_MESH_BIT_EXT specifies the mesh stage. |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_HUAWEI_cluster_culling_shader[] |
| * ename:VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI specifies the cluster |
| culling stage. |
| endif::VK_HUAWEI_cluster_culling_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.adoc[] |
| |
| tname:VkShaderStageFlags is a bitmask type for setting a mask of zero or |
| more elink:VkShaderStageFlagBits. |
| -- |
| |
| ifdef::VK_VERSION_1_3,VK_EXT_subgroup_size_control[] |
| [open,refpage='VkPipelineShaderStageRequiredSubgroupSizeCreateInfo',desc='Structure specifying the required subgroup size of a newly created pipeline shader stage',type='structs',alias='VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT'] |
| -- |
| The sname:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo structure is |
| defined as: |
| |
| include::{generated}/api/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfo.adoc[] |
| |
| ifdef::VK_EXT_subgroup_size_control[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.adoc[] |
| endif::VK_EXT_subgroup_size_control[] |
| |
| ifdef::VK_EXT_shader_object[] |
| or the equiavlent |
| |
| include::{generated}/api/structs/VkShaderRequiredSubgroupSizeCreateInfoEXT.adoc[] |
| endif::VK_EXT_shader_object[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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 specifying the required subgroup size for the |
| newly created pipeline shader stage. |
| |
| If a sname:VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 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. |
| |
| ifdef::VK_EXT_shader_object[] |
| If a sname:VkShaderRequiredSubgroupSizeCreateInfoEXT structure is included |
| in the pname:pNext chain of slink:VkShaderCreateInfoEXT, it specifies that |
| the shader being compiled has a required subgroup size. |
| endif::VK_EXT_shader_object[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-requiredSubgroupSize-02760]] |
| pname:requiredSubgroupSize must: be a power-of-two integer |
| * [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-requiredSubgroupSize-02761]] |
| pname:requiredSubgroupSize must: be greater or equal to |
| <<limits-minSubgroupSize, pname:minSubgroupSize>> |
| * [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-requiredSubgroupSize-02762]] |
| pname:requiredSubgroupSize must: be less than or equal to |
| <<limits-maxSubgroupSize, pname:maxSubgroupSize>> |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfo.adoc[] |
| -- |
| endif::VK_VERSION_1_3,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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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.adoc[] |
| -- |
| |
| [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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| endif::VK_HUAWEI_subpass_shading[] |
| |
| ifdef::VK_EXT_pipeline_robustness[] |
| [open,refpage='VkPipelineRobustnessCreateInfoEXT',desc='Structure controlling the robustness of a newly created pipeline shader stage',type='structs'] |
| -- |
| The sname:VkPipelineRobustnessCreateInfoEXT structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineRobustnessCreateInfoEXT.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:storageBuffers sets the behaviour of out of bounds accesses made |
| to resources bound as: |
| ** ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER |
| ** ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER |
| ** ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC |
| * pname:uniformBuffers describes the behaviour of out of bounds accesses |
| made to resources bound as: |
| ** ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER |
| ** ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER |
| ** ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC |
| ifdef::VK_VERSION_1_3,VK_EXT_inline_uniform_block[] |
| ** ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK |
| endif::VK_VERSION_1_3,VK_EXT_inline_uniform_block[] |
| * pname:vertexInputs describes the behaviour of out of bounds accesses |
| made to vertex input attributes |
| * pname:images describes the behaviour of out of bounds accesses made to |
| resources bound as: |
| ** ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE |
| ** ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE |
| |
| ifdef::VK_EXT_mutable_descriptor_type,VK_VALVE_mutable_descriptor_type[] |
| Resources bound as ename:VK_DESCRIPTOR_TYPE_MUTABLE_EXT will have the |
| robustness behavior that covers its active descriptor type. |
| endif::VK_EXT_mutable_descriptor_type,VK_VALVE_mutable_descriptor_type[] |
| |
| The scope of the effect of sname:VkPipelineRobustnessCreateInfoEXT depends |
| on which structure's pname:pNext chain it is included in. |
| |
| * sname:VkGraphicsPipelineCreateInfo, |
| ifdef::VK_KHR_ray_tracing_pipeline[sname:VkRayTracingPipelineCreateInfoKHR,] |
| sname:VkComputePipelineCreateInfo: + |
| The robustness behavior described by |
| sname:VkPipelineRobustnessCreateInfoEXT applies to all accesses through |
| this pipeline |
| * sname:VkPipelineShaderStageCreateInfo: + |
| The robustness behavior described by |
| sname:VkPipelineRobustnessCreateInfoEXT applies to all accesses |
| emanating from the shader code of this shader stage |
| |
| If sname:VkPipelineRobustnessCreateInfoEXT is specified for both a pipeline |
| and a pipeline stage, the sname:VkPipelineRobustnessCreateInfoEXT specified |
| for the pipeline stage will take precedence. |
| |
| ifdef::VK_KHR_pipeline_library[] |
| When sname:VkPipelineRobustnessCreateInfoEXT is specified for a pipeline, it |
| only affects the subset of the pipeline that is specified by the create |
| info, as opposed to subsets linked from pipeline libraries. |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| For slink:VkGraphicsPipelineCreateInfo, that subset is specified by |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags. |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| For slink:VkRayTracingPipelineCreateInfoKHR, that subset is specified by the |
| specific stages in slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages. |
| endif::VK_KHR_ray_tracing_pipeline[] |
| endif::VK_KHR_pipeline_library[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06926]] |
| If the <<features-pipelineRobustness, pname:pipelineRobustness>> feature |
| is not enabled, pname:storageBuffers must: be |
| ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06927]] |
| If the <<features-pipelineRobustness, pname:pipelineRobustness>> feature |
| is not enabled, pname:uniformBuffers must: be |
| ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06928]] |
| If the <<features-pipelineRobustness, pname:pipelineRobustness>> feature |
| is not enabled, pname:vertexInputs must: be |
| ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06929]] |
| If the <<features-pipelineRobustness, pname:pipelineRobustness>> feature |
| is not enabled, pname:images must: be |
| ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-robustImageAccess-06930]] |
| If the <<features-robustImageAccess, pname:robustImageAccess>> feature |
| is not supported, pname:images must: not be |
| ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-robustBufferAccess2-06931]] |
| If the <<features-robustBufferAccess2, pname:robustBufferAccess2>> |
| feature is not supported, pname:storageBuffers must: not be |
| ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-robustBufferAccess2-06932]] |
| If the <<features-robustBufferAccess2, pname:robustBufferAccess2>> |
| feature is not supported, pname:uniformBuffers must: not be |
| ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-robustBufferAccess2-06933]] |
| If the <<features-robustBufferAccess2, pname:robustBufferAccess2>> |
| feature is not supported, pname:vertexInputs must: not be |
| ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT |
| * [[VUID-VkPipelineRobustnessCreateInfoEXT-robustImageAccess2-06934]] |
| If the <<features-robustImageAccess2, pname:robustImageAccess2>> feature |
| is not supported, pname:images must: not be |
| ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineRobustnessCreateInfoEXT.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineRobustnessBufferBehaviorEXT',desc='Enum controlling the robustness of buffer accesses in a pipeline stage',type='enums'] |
| -- |
| Possible values of the pname:storageBuffers, pname:uniformBuffers, and |
| pname:vertexInputs members of slink:VkPipelineRobustnessCreateInfoEXT are: |
| |
| include::{generated}/api/enums/VkPipelineRobustnessBufferBehaviorEXT.adoc[] |
| |
| * ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT |
| specifies that this pipeline stage follows the behavior of robustness |
| features that are enabled on the device that created this pipeline |
| * ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT specifies that |
| buffer accesses by this pipeline stage to the relevant resource types |
| must: not be out of bounds |
| * ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT |
| specifies that out of bounds accesses by this pipeline stage to the |
| relevant resource types behave as if the <<features-robustBufferAccess, |
| pname:robustBufferAccess>> feature is enabled |
| * ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT |
| specifies that out of bounds accesses by this pipeline stage to the |
| relevant resource types behave as if the <<features-robustBufferAccess2, |
| pname:robustBufferAccess2>> feature is enabled |
| -- |
| |
| [open,refpage='VkPipelineRobustnessImageBehaviorEXT',desc='Enum controlling the robustness of image accesses in a pipeline stage',type='enums'] |
| -- |
| Possible values of the pname:images member of |
| slink:VkPipelineRobustnessCreateInfoEXT are: |
| |
| include::{generated}/api/enums/VkPipelineRobustnessImageBehaviorEXT.adoc[] |
| |
| * ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT specifies |
| that this pipeline stage follows the behavior of robustness features |
| that are enabled on the device that created this pipeline |
| * ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT specifies that |
| image accesses by this pipeline stage to the relevant resource types |
| must: not be out of bounds |
| * ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT |
| specifies that out of bounds accesses by this pipeline stage to images |
| behave as if the <<features-robustImageAccess, pname:robustImageAccess>> |
| feature is enabled |
| * ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT |
| specifies that out of bounds accesses by this pipeline stage to images |
| behave as if the <<features-robustImageAccess2, |
| pname:robustImageAccess2>> feature is enabled |
| -- |
| endif::VK_EXT_pipeline_robustness[] |
| |
| ifdef::VK_EXT_shader_module_identifier[] |
| [open,refpage='VkPipelineShaderStageModuleIdentifierCreateInfoEXT',desc='Structure specifying an identifier for a shader module',type='structs'] |
| -- |
| An identifier can: be provided instead of shader code in an attempt to |
| compile pipelines without providing complete SPIR-V to the implementation. |
| |
| The sname:VkPipelineShaderStageModuleIdentifierCreateInfoEXT structure is |
| defined as: |
| |
| include::{generated}/api/structs/VkPipelineShaderStageModuleIdentifierCreateInfoEXT.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:identifierSize is the size, in bytes, of the buffer pointed to by |
| pname:pIdentifier. |
| * pname:pIdentifier is a pointer to a buffer of opaque data specifying an |
| identifier. |
| |
| Any identifier can: be used. |
| If the pipeline being created with identifier requires compilation to |
| complete the pipeline creation call, pipeline compilation must: fail as |
| defined by ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT. |
| |
| pname:pIdentifier and pname:identifierSize can: be obtained from an |
| slink:VkShaderModuleIdentifierEXT queried earlier. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-pNext-06850]] |
| If this structure is included in a pname:pNext chain and |
| pname:identifierSize is not equal to 0, the |
| <<features-shaderModuleIdentifier, pname:shaderModuleIdentifier>> |
| feature must: be enabled |
| * [[VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-pNext-06851]] |
| If this struct is included in a pname:pNext chain of |
| slink:VkPipelineShaderStageCreateInfo and pname:identifierSize is not |
| equal to 0, the pipeline must: be created with the |
| ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT flag set |
| * [[VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-identifierSize-06852]] |
| pname:identifierSize must: be less-or-equal to |
| ename:VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineShaderStageModuleIdentifierCreateInfoEXT.adoc[] |
| -- |
| endif::VK_EXT_shader_module_identifier[] |
| |
| ifdef::VK_NV_device_generated_commands_compute[] |
| If a compute pipeline is going to be used in <<device-generated-commands, |
| Device-Generated Commands>> by specifying its pipeline token with |
| slink:VkBindPipelineIndirectCommandNV, then that pipeline's associated |
| metadata must: be saved at a specified buffer device address for later use |
| in indirect command generation. |
| The buffer device address must: be specified at the time of compute pipeline |
| creation with slink:VkComputePipelineIndirectBufferInfoNV structure in the |
| pname:pNext chain of slink:VkComputePipelineCreateInfo. |
| |
| [open,refpage='VkComputePipelineIndirectBufferInfoNV',desc='Structure describing the device address where pipeline\'s metadata will be saved',type='structs'] |
| -- |
| The sname:VkComputePipelineIndirectBufferInfoNV structure is defined as: |
| |
| include::{generated}/api/structs/VkComputePipelineIndirectBufferInfoNV.adoc[] |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:deviceAddress is the address where the pipeline's metadata will be |
| stored. |
| * pname:size is the size of pipeline's metadata that was queried using |
| flink:vkGetPipelineIndirectMemoryRequirementsNV. |
| * pname:pipelineDeviceAddressCaptureReplay is the device address where |
| pipeline's metadata was originally saved and can now be used to |
| re-populate pname:deviceAddress for replay. |
| |
| If pname:pipelineDeviceAddressCaptureReplay is zero, no specific address is |
| requested. |
| If pname:pipelineDeviceAddressCaptureReplay is not zero, then it must: be an |
| address retrieved from an identically created pipeline on the same |
| implementation. |
| The pipeline metadata must: also be placed on an identically created buffer |
| and at the same offset using the flink:vkCmdUpdatePipelineIndirectBufferNV |
| command. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-deviceGeneratedComputePipelines-09009]] |
| The <<features-deviceGeneratedComputePipelines, |
| sname:VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::pname:deviceGeneratedComputePipelines>> |
| feature must: be enabled |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-flags-09010]] |
| The pipeline creation flags in |
| slink:VkComputePipelineCreateInfo::pname:flags must: include |
| ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-deviceAddress-09011]] |
| pname:deviceAddress must: be aligned to the |
| slink:VkMemoryRequirements2::pname:alignment, as returned by |
| flink:vkGetPipelineIndirectMemoryRequirementsNV |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-deviceAddress-09012]] |
| pname:deviceAddress must: have been allocated from a buffer that was |
| created with usage ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT and |
| ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-size-09013]] |
| pname:size must: be greater than or equal to the |
| slink:VkMemoryRequirements2::pname:size, as returned by |
| flink:vkGetPipelineIndirectMemoryRequirementsNV |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09014]] |
| If pname:pipelineDeviceAddressCaptureReplay is non-zero then the |
| <<features-deviceGeneratedComputePipelines, |
| sname:VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::pname:deviceGeneratedComputeCaptureReplay>> |
| feature must: be enabled |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09015]] |
| If pname:pipelineDeviceAddressCaptureReplay is non-zero then that |
| address must: have been allocated with flag |
| ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT set |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09016]] |
| If pname:pipelineDeviceAddressCaptureReplay is non-zero, the |
| pname:pipeline must: have been recreated for replay |
| * [[VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09017]] |
| pname:pipelineDeviceAddressCaptureReplay must: satisfy the |
| pname:alignment and pname:size requirements similar to |
| pname:deviceAddress |
| **** |
| |
| include::{generated}/validity/structs/VkComputePipelineIndirectBufferInfoNV.adoc[] |
| -- |
| |
| [open,refpage='vkCmdUpdatePipelineIndirectBufferNV',desc='Update the indirect compute pipeline\'s metadata',type='protos'] |
| -- |
| To save a compute pipeline's metadata at a device address call: |
| |
| include::{generated}/api/protos/vkCmdUpdatePipelineIndirectBufferNV.adoc[] |
| |
| * pname:commandBuffer is the command buffer into which the command will be |
| recorded. |
| * pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying |
| the type of pipeline whose metadata will be saved. |
| * pname:pipeline is the pipeline whose metadata will be saved. |
| |
| fname:vkCmdUpdatePipelineIndirectBufferNV is only allowed outside of a |
| render pass. |
| This command is treated as a "`transfer`" operation for the purposes of |
| synchronization barriers. |
| The writes to the address must: be synchronized using stages |
| ename:VK_PIPELINE_STAGE_2_COPY_BIT and |
| ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV and with access masks |
| ename:VK_ACCESS_MEMORY_WRITE_BIT and |
| ename:VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV respectively before using the |
| results in preprocessing. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkCmdUpdatePipelineIndirectBufferNV-pipelineBindPoint-09018]] |
| pname:pipelineBindPoint must: be ename:VK_PIPELINE_BIND_POINT_COMPUTE |
| * [[VUID-vkCmdUpdatePipelineIndirectBufferNV-pipeline-09019]] |
| pname:pipeline must: have been created with |
| ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV flag set |
| * [[VUID-vkCmdUpdatePipelineIndirectBufferNV-pipeline-09020]] |
| pname:pipeline must: have been created with |
| slink:VkComputePipelineIndirectBufferInfoNV structure specifying a valid |
| address where its metadata will be saved |
| * [[VUID-vkCmdUpdatePipelineIndirectBufferNV-deviceGeneratedComputePipelines-09021]] |
| The <<features-deviceGeneratedComputePipelines, |
| sname:VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::pname:deviceGeneratedComputePipelines>> |
| feature must: be enabled |
| **** |
| |
| include::{generated}/validity/protos/vkCmdUpdatePipelineIndirectBufferNV.adoc[] |
| -- |
| |
| endif::VK_NV_device_generated_commands_compute[] |
| |
| [[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'] |
| -- |
| :refpage: vkCreateGraphicsPipelines |
| :objectnameplural: graphics pipelines |
| :objectnamecamelcase: graphicsPipeline |
| :objectcount: pname:createInfoCount |
| |
| To create graphics pipelines, call: |
| |
| include::{generated}/api/protos/vkCreateGraphicsPipelines.adoc[] |
| |
| * pname:device is the logical device that creates the graphics pipelines. |
| ifndef::VKSC_VERSION_1_0[] |
| * 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| * pname:pipelineCache is the handle of a valid <<pipelines-cache,pipeline |
| cache>> object. |
| endif::VKSC_VERSION_1_0[] |
| * 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. |
| |
| ifdef::VKSC_VERSION_1_0[] |
| If a pipeline creation fails due to: |
| |
| * The identified pipeline not being present in pname:pipelineCache |
| * The pname:pNext chain not including a slink:VkPipelineOfflineCreateInfo |
| structure |
| |
| the operation will continue as specified in <<pipelines-multiple, Multiple |
| Pipeline Creation>> and the command will return |
| ename:VK_ERROR_NO_PIPELINE_MATCH. |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * flink:vkCreateGraphicsPipelines returns ename:VK_ERROR_NO_PIPELINE_MATCH |
| if the slink:VkGraphicsPipelineCreateInfo::pname:pNext chain does not |
| include a valid slink:VkPipelineOfflineCreateInfo structure <<SCID-1>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{chapters}/commonvalidity/no_dynamic_allocations_common.adoc[] |
| |
| .Valid Usage |
| **** |
| ifndef::VKSC_VERSION_1_0[] |
| * [[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 |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| * [[VUID-vkCreateGraphicsPipelines-pipelineCache-02876]] |
| If pname:pipelineCache was created with |
| ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT, host access |
| to pname:pipelineCache must: be |
| <<fundamentals-threadingbehavior,externally synchronized>> |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| include::{chapters}/commonvalidity/memory_reservation_request_count_common.adoc[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * flink:vkCreateGraphicsPipelines::pname:pipelineCache must: not be |
| dlink:VK_NULL_HANDLE <<SCID-1>>, <<SCID-8>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| ifdef::VK_VERSION_1_3,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 on |
| pname:flags for any element of pname:pCreateInfos while passing |
| dlink:VK_NULL_HANDLE for pname:pipelineCache. |
| ==== |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| |
| include::{generated}/validity/protos/vkCreateGraphicsPipelines.adoc[] |
| -- |
| |
| [open,refpage='VkGraphicsPipelineCreateInfo',desc='Structure specifying parameters of a newly created graphics pipeline',type='structs'] |
| -- |
| :refpage: VkGraphicsPipelineCreateInfo |
| |
| The sname:VkGraphicsPipelineCreateInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkGraphicsPipelineCreateInfo.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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,VK_EXT_mesh_shader[] |
| It is ignored if the pipeline includes a mesh shader stage. |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_EXT_vertex_input_dynamic_state[] |
| It can: be `NULL` 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 for vertex shading, as described in <<drawing, |
| Drawing Commands>>. |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is enabled, it |
| can: be `NULL` if the pipeline is created with both |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, and |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY dynamic states set and |
| <<limits-dynamicPrimitiveTopologyUnrestricted, |
| pname:dynamicPrimitiveTopologyUnrestricted>> is ename:VK_TRUE. |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| It is ignored if the pipeline includes a mesh shader stage. |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| * pname:pTessellationState is a pointer to a |
| slink:VkPipelineTessellationStateCreateInfo structure defining |
| tessellation state used by tessellation shaders. |
| ifdef::VK_EXT_extended_dynamic_state2[] |
| It can: be `NULL` if the pipeline is created with the |
| ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT dynamic state set. |
| endif::VK_EXT_extended_dynamic_state2[] |
| * pname:pViewportState is a pointer to a |
| slink:VkPipelineViewportStateCreateInfo structure defining viewport |
| state used when rasterization is enabled. |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is enabled, it |
| can: be `NULL` if the pipeline is created with both |
| ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT, and |
| ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT dynamic states set. |
| endif::VK_EXT_extended_dynamic_state3[] |
| * pname:pRasterizationState is a pointer to a |
| slink:VkPipelineRasterizationStateCreateInfo structure defining |
| rasterization state. |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is enabled, it |
| can: be `NULL` if the pipeline is created with all of |
| ename:VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE, |
| ename:VK_DYNAMIC_STATE_POLYGON_MODE_EXT, |
| ename:VK_DYNAMIC_STATE_CULL_MODE, ename:VK_DYNAMIC_STATE_FRONT_FACE, |
| ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_BIAS, and ename:VK_DYNAMIC_STATE_LINE_WIDTH |
| dynamic states set. |
| endif::VK_EXT_extended_dynamic_state3[] |
| * pname:pMultisampleState is a pointer to a |
| slink:VkPipelineMultisampleStateCreateInfo structure defining |
| multisample state used when rasterization is enabled. |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is enabled, it |
| can: be `NULL` if the pipeline is created with all of |
| ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT, |
| ename:VK_DYNAMIC_STATE_SAMPLE_MASK_EXT, and |
| ename:VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT dynamic states set, |
| and either <<features-alphaToOne,alphaToOne>> is disabled on the device |
| or ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT is set, in which case |
| slink:VkPipelineMultisampleStateCreateInfo::pname:sampleShadingEnable is |
| assumed to be ename:VK_FALSE. |
| endif::VK_EXT_extended_dynamic_state3[] |
| * pname:pDepthStencilState is a pointer to a |
| slink:VkPipelineDepthStencilStateCreateInfo structure defining |
| depth/stencil state used when rasterization is enabled for depth or |
| stencil attachments accessed during rendering. |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is enabled, it |
| can: be `NULL` if the pipeline is created with all of |
| ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP, |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_OP, and |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic states set. |
| endif::VK_EXT_extended_dynamic_state3[] |
| * pname:pColorBlendState is a pointer to a |
| slink:VkPipelineColorBlendStateCreateInfo structure defining color blend |
| state used when rasterization is enabled for any color attachments |
| accessed during rendering. |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is enabled, it |
| can: be `NULL` if the pipeline is created with all of |
| ename:VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT, and |
| ename:VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic states set. |
| endif::VK_EXT_extended_dynamic_state3[] |
| * pname:pDynamicState is a pointer to a |
| slink:VkPipelineDynamicStateCreateInfo structure defining 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. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| * pname:basePipelineIndex is an index into the pname:pCreateInfos |
| parameter to use as a pipeline to derive from. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| |
| 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[] |
| |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| [NOTE] |
| .Note |
| ==== |
| With `apiext:VK_EXT_extended_dynamic_state3`, it is possible that many of |
| the sname:VkGraphicsPipelineCreateInfo members above can: be `NULL` because |
| all their state is dynamic and therefore ignored. |
| This is optional so the application can: still use a valid pointer if it |
| needs to set the pname:pNext or pname:flags fields to specify state for |
| other extensions. |
| ==== |
| endif::VK_EXT_extended_dynamic_state3[] |
| |
| [[pipelines-graphics-subsets]] |
| The state required for a graphics pipeline is divided into |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>>, |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization shader |
| state>>, <<pipelines-graphics-subsets-fragment-shader,fragment shader |
| state>>, and <<pipelines-graphics-subsets-fragment-output,fragment output |
| state>>. |
| |
| [[pipelines-graphics-subsets-vertex-input]] |
| .Vertex Input State |
| Vertex input state is defined by: |
| |
| * slink:VkPipelineVertexInputStateCreateInfo |
| * slink:VkPipelineInputAssemblyStateCreateInfo |
| |
| ifndef::VK_EXT_mesh_shader[] |
| This state must: be specified to create a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>>. |
| endif::VK_EXT_mesh_shader[] |
| |
| ifdef::VK_EXT_mesh_shader[] |
| If |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| this pipeline specifies |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization state>> |
| either directly or by including it as a pipeline library and its |
| endif::VK_EXT_graphics_pipeline_library[] |
| pname:pStages includes a vertex shader, this state must: be specified to |
| create a <<pipelines-graphics-subsets-complete,complete graphics pipeline>>. |
| endif::VK_EXT_mesh_shader[] |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| If a pipeline includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT in |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags either explicitly |
| or as a default, and either the conditions requiring this state for a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>> are met |
| or this pipeline does not specify |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization state>> in |
| any way, that pipeline must: specify this state directly. |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| |
| [[pipelines-graphics-subsets-pre-rasterization]] |
| .Pre-Rasterization Shader State |
| 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,VK_EXT_mesh_shader[] |
| ** Task shaders |
| ** Mesh shaders |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| * Within the slink:VkPipelineLayout, all descriptor sets with |
| pre-rasterization shader bindings if |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT was specified. |
| ** If ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT was not |
| specified, the full pipeline layout must be specified. |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifndef::VK_EXT_graphics_pipeline_library[] |
| * Within the slink:VkPipelineLayout, the full pipeline layout must be |
| specified. |
| endif::VK_EXT_graphics_pipeline_library[] |
| * slink:VkPipelineViewportStateCreateInfo |
| * slink:VkPipelineRasterizationStateCreateInfo |
| * slink:VkPipelineTessellationStateCreateInfo |
| * slink:VkRenderPass and pname:subpass parameter |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * The pname:viewMask parameter of slink:VkPipelineRenderingCreateInfo |
| (formats are ignored) |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_EXT_discard_rectangles[] |
| * slink:VkPipelineDiscardRectangleStateCreateInfoEXT |
| endif::VK_EXT_discard_rectangles[] |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * slink:VkPipelineFragmentShadingRateStateCreateInfoKHR |
| endif::VK_KHR_fragment_shading_rate[] |
| |
| This state must: be specified to create a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>>. |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| If either the pname:pNext chain includes a |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT structure with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT |
| included in pname:flags, or it is not specified and would default to include |
| that value, this state must: be specified in the pipeline. |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| |
| [[pipelines-graphics-subsets-fragment-shader]] |
| .Fragment Shader State |
| Fragment shader state is defined by: |
| |
| * A slink:VkPipelineShaderStageCreateInfo entry for the fragment shader |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| * Within the slink:VkPipelineLayout, all descriptor sets with fragment |
| shader bindings if |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT was specified. |
| ** If ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT was not |
| specified, the full pipeline layout must be specified. |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifndef::VK_EXT_graphics_pipeline_library[] |
| * Within the slink:VkPipelineLayout, the full pipeline layout must be |
| specified. |
| endif::VK_EXT_graphics_pipeline_library[] |
| * slink:VkPipelineMultisampleStateCreateInfo |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| if <<primsrast-sampleshading, sample shading>> is enabled or |
| pname:renderpass is not dlink:VK_NULL_HANDLE |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * slink:VkPipelineDepthStencilStateCreateInfo |
| * slink:VkRenderPass and pname:subpass parameter |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * The pname:viewMask parameter of slink:VkPipelineRenderingCreateInfo |
| (formats are ignored) |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| 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[] |
| ifdef::VK_NV_representative_fragment_test[] |
| * slink:VkPipelineRepresentativeFragmentTestStateCreateInfoNV |
| endif::VK_NV_representative_fragment_test[] |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * Inclusion/omission of the |
| ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR |
| flag |
| endif::VK_KHR_fragment_shading_rate[] |
| ifdef::VK_EXT_fragment_density_map[] |
| * Inclusion/omission of the |
| ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT |
| flag |
| endif::VK_EXT_fragment_density_map[] |
| |
| If |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| a pipeline specifies |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization state>> |
| either directly or by including it as a pipeline library and |
| endif::VK_EXT_graphics_pipeline_library[] |
| pname:rasterizerDiscardEnable is set to ename:VK_FALSE |
| ifdef::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| or ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE is used, |
| endif::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| endif::VK_EXT_graphics_pipeline_library[] |
| this state must: be specified to create a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>>. |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| If a pipeline includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT in |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags either explicitly |
| or as a default, and either the conditions requiring this state for a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>> are met |
| or this pipeline does not specify |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization state>> in |
| any way, that pipeline must: specify this state directly. |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| |
| [[pipelines-graphics-subsets-fragment-output]] |
| .Fragment Output State |
| Fragment output state is defined by: |
| |
| * slink:VkPipelineColorBlendStateCreateInfo |
| * slink:VkRenderPass and pname:subpass parameter |
| * slink:VkPipelineMultisampleStateCreateInfo |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * slink:VkPipelineRenderingCreateInfo |
| ifdef::VK_AMD_mixed_attachment_samples[] |
| * slink:VkAttachmentSampleCountInfoAMD |
| endif::VK_AMD_mixed_attachment_samples[] |
| ifdef::VK_NV_framebuffer_mixed_samples[] |
| * slink:VkAttachmentSampleCountInfoNV |
| endif::VK_NV_framebuffer_mixed_samples[] |
| ifdef::VK_ANDROID_external_format_resolve[] |
| * slink:VkExternalFormatANDROID |
| endif::VK_ANDROID_external_format_resolve[] |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_EXT_attachment_feedback_loop_layout[] |
| * Inclusion/omission of the |
| ename:VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT and |
| ename:VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| flags |
| endif::VK_EXT_attachment_feedback_loop_layout[] |
| |
| If |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| a pipeline specifies |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization state>> |
| either directly or by including it as a pipeline library and |
| endif::VK_EXT_graphics_pipeline_library[] |
| pname:rasterizerDiscardEnable is set to ename:VK_FALSE |
| ifdef::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| or ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE is used, |
| endif::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| endif::VK_EXT_graphics_pipeline_library[] |
| this state must: be specified to create a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>>. |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| If a pipeline includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT in |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags either explicitly |
| or as a default, and either the conditions requiring this state for a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>> are met |
| or this pipeline does not specify |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization state>> in |
| any way, that pipeline must: specify this state directly. |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| |
| [[pipelines-graphics-subsets-dynamic-state]] |
| .Dynamic State |
| Dynamic state values set via pname:pDynamicState must: be ignored if the |
| state they correspond to is not otherwise statically set by one of the state |
| subsets used to create the pipeline. |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| Additionally, setting dynamic state values must: not modify whether state in |
| a linked library is static or dynamic; this is set and unchangeable when the |
| library is created. |
| endif::VK_EXT_graphics_pipeline_library[] |
| For example, if a pipeline only included |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>, then any dynamic state value corresponding to depth or stencil |
| testing has no effect. |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| Any linked library that has dynamic state enabled that same dynamic state |
| must: also be enabled in all the other linked libraries to which that |
| dynamic state applies. |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| [[pipelines-graphics-subsets-complete]] |
| .Complete Graphics Pipelines |
| |
| A complete graphics pipeline always includes |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>, with other subsets included depending on that state as specified in |
| the above sections. |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| .Graphics Pipeline Library Layouts |
| |
| If different subsets are linked together with pipeline layouts created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, the final |
| effective pipeline layout is effectively the union of the linked pipeline |
| layouts. |
| When binding descriptor sets for this pipeline, the pipeline layout used |
| must: be compatible with this union. |
| This pipeline layout can: be overridden when linking with |
| ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT by providing a |
| slink:VkPipelineLayout that is <<descriptorsets-compatibility,compatible>> |
| with this union other than |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, or when linking |
| without ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT by providing |
| a slink:VkPipelineLayout that is fully |
| <<descriptorsets-compatibility,compatible>> with this union. |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| ifdef::VK_KHR_maintenance5[] |
| If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the |
| pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags |
| from that structure is used instead of pname:flags from this structure. |
| endif::VK_KHR_maintenance5[] |
| |
| ifdef::VKSC_VERSION_1_0[] |
| In Vulkan SC, the pipeline compilation process occurs |
| <<pipelines-offline-compilation,offline>> and the pname:pStages are not |
| needed at runtime and may: be omitted. |
| If omitted, pname:stageCount must: be set to `0` and pname:pStages must: be |
| `NULL`. |
| If provided, the values must: match the values specified to the offline |
| compiler. |
| endif::VKSC_VERSION_1_0[] |
| |
| .Valid Usage |
| **** |
| :pipelineType: graphics |
| include::{chapters}/commonvalidity/pipeline_create_info_common.adoc[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-stage-02096]] |
| If the pipeline requires <<pipelines-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 |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| or ename:VK_SHADER_STAGE_MESH_BIT_EXT |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02095]] |
| If the pipeline requires <<pipelines-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_EXT or |
| ename:VK_SHADER_STAGE_MESH_BIT_EXT) 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) |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_NV_mesh_shader+VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-TaskNV-07063]] |
| The shader stages for ename:VK_SHADER_STAGE_TASK_BIT_EXT or |
| ename:VK_SHADER_STAGE_MESH_BIT_EXT must: use either the code:TaskNV and |
| code:MeshNV {ExecutionModel} or the code:TaskEXT and code:MeshEXT |
| {ExecutionModel}, but must: not use both |
| endif::VK_NV_mesh_shader+VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00729]] |
| If the pipeline requires <<pipelines-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 requires <<pipelines-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-09022]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> and pname:pStages includes a |
| tessellation control shader stage, |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| and the `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled |
| or the ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT dynamic state is |
| not set, |
| endif::VK_EXT_extended_dynamic_state3[] |
| pname:pTessellationState must: be a valid pointer to a valid |
| slink:VkPipelineTessellationStateCreateInfo structure |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pTessellationState-09023]] |
| If pname:pTessellationState is not `NULL` it must: be a pointer to a |
| valid slink:VkPipelineTessellationStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00732]] |
| If the pipeline requires <<pipelines-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 specifying the type of subdivision in |
| the pipeline |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00733]] |
| If the pipeline requires <<pipelines-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 specifying the type of subdivision in |
| the pipeline, they must: both specify the same subdivision mode |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00734]] |
| If the pipeline requires <<pipelines-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 specifying the output patch size in the |
| pipeline |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00735]] |
| If the pipeline requires <<pipelines-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 specifying the out patch size in the |
| pipeline, they must: both specify the same patch size |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-08888]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> and <<pipelines-graphics-subsets-vertex-input, vertex input |
| state>> and pname:pStages includes tessellation shader stages, |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| and either ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY dynamic state is |
| not enabled or |
| <<limits-dynamicPrimitiveTopologyUnrestricted,pname:dynamicPrimitiveTopologyUnrestricted>> |
| is ename:VK_FALSE, |
| endif::VK_EXT_extended_dynamic_state3[] |
| the pname:topology member of pname:pInputAssembly must: be |
| ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST |
| * [[VUID-VkGraphicsPipelineCreateInfo-topology-08889]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> and <<pipelines-graphics-subsets-vertex-input, vertex input |
| state>> and the pname:topology member of pname:pInputAssembly is |
| ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| and either ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY dynamic state is |
| not enabled or |
| <<limits-dynamicPrimitiveTopologyUnrestricted,pname:dynamicPrimitiveTopologyUnrestricted>> |
| is ename:VK_FALSE, |
| endif::VK_EXT_extended_dynamic_state3[] |
| then pname:pStages must: include tessellation shader stages |
| * [[VUID-VkGraphicsPipelineCreateInfo-TessellationEvaluation-07723]] |
| If the pipeline is being created with a code:TessellationEvaluation |
| {ExecutionModel}, no code:Geometry {ExecutionModel}, uses the |
| code:PointMode {ExecutionMode}, and |
| <<features-shaderTessellationAndGeometryPointSize, |
| pname:shaderTessellationAndGeometryPointSize>> is enabled, a |
| code:PointSize decorated variable must: be written to |
| ifdef::VK_KHR_maintenance5[] |
| if <<features-maintenance5, pname:maintenance5>> is not enabled |
| endif::VK_KHR_maintenance5[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-topology-08773]] |
| If the pipeline is being created with a code:Vertex {ExecutionModel} and |
| no code:TessellationEvaluation or code:Geometry {ExecutionModel}, and |
| the pname:topology member of pname:pInputAssembly is |
| ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST, |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| and either ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY dynamic state is |
| not enabled or |
| <<limits-dynamicPrimitiveTopologyUnrestricted,pname:dynamicPrimitiveTopologyUnrestricted>> |
| is ename:VK_FALSE, |
| endif::VK_EXT_extended_dynamic_state3[] |
| a code:PointSize decorated variable must: be written to |
| ifdef::VK_KHR_maintenance5[] |
| if <<features-maintenance5, pname:maintenance5>> is not enabled |
| endif::VK_KHR_maintenance5[] |
| ifdef::VK_KHR_maintenance5[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-maintenance5-08775]] |
| If <<features-maintenance5, pname:maintenance5>> is enabled and a |
| code:PointSize decorated variable is written to, all execution paths |
| must: write to a code:PointSize decorated variable |
| endif::VK_KHR_maintenance5[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-TessellationEvaluation-07724]] |
| If the pipeline is being created with a code:TessellationEvaluation |
| {ExecutionModel}, no code:Geometry {ExecutionModel}, uses the |
| code:PointMode {ExecutionMode}, and |
| <<features-shaderTessellationAndGeometryPointSize, |
| pname:shaderTessellationAndGeometryPointSize>> is not enabled, a |
| code:PointSize decorated variable must: not be written to |
| * [[VUID-VkGraphicsPipelineCreateInfo-shaderTessellationAndGeometryPointSize-08776]] |
| If the pipeline is being created with a code:Geometry {ExecutionModel}, |
| uses the code:OutputPoints {ExecutionMode}, and |
| <<features-shaderTessellationAndGeometryPointSize, |
| pname:shaderTessellationAndGeometryPointSize>> is enabled, a |
| code:PointSize decorated variable must: be written to for every vertex |
| emitted |
| ifdef::VK_KHR_maintenance5[] |
| if <<features-maintenance5, pname:maintenance5>> is not enabled |
| endif::VK_KHR_maintenance5[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-Geometry-07726]] |
| If the pipeline is being created with a code:Geometry {ExecutionModel}, |
| uses the code:OutputPoints {ExecutionMode}, and |
| <<features-shaderTessellationAndGeometryPointSize, |
| pname:shaderTessellationAndGeometryPointSize>> is not enabled, a |
| code:PointSize decorated variable must: not be written to |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00738]] |
| If the pipeline requires <<pipelines-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 specifying |
| 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 requires <<pipelines-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 specifying 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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> and |
| <<pipelines-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,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-PrimitiveId-06264]] |
| If the pipeline requires <<pipelines-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,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06038]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is |
| being created with <<pipelines-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 requires <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> and |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| the fragment shader and last |
| <<pipelines-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-06041]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, and the pipeline is |
| being created with <<pipelines-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-07609]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, and the pipeline is |
| being created with <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and the pname:pColorBlendState |
| pointer is not `NULL`, 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 |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04130]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and pname:pViewportState->pViewports |
| is not dynamic, then pname:pViewportState->pViewports must: be a valid |
| pointer to an array of pname:pViewportState->viewportCount valid |
| sname:VkViewport structures |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04131]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and pname:pViewportState->pScissors is |
| not dynamic, then pname:pViewportState->pScissors must: be a valid |
| pointer to an array of pname:pViewportState->scissorCount sname:VkRect2D |
| structures |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and the <<features-wideLines, |
| pname:wideLines>> 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` |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750]] |
| If the pipeline requires <<pipelines-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 |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-09024]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and the |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE dynamic state is |
| enabled or the pname:rasterizerDiscardEnable member of |
| pname:pRasterizationState is ename:VK_FALSE, and either the |
| `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled, or |
| either the ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT or |
| ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT dynamic states are not set, |
| pname:pViewportState must: be a valid pointer to a valid |
| slink:VkPipelineViewportStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pViewportState-09025]] |
| If pname:pViewportState is not `NULL` it must: be a valid pointer to a |
| valid slink:VkPipelineViewportStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pViewportState-04892]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and the graphics pipeline state was |
| created with the ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE |
| dynamic state enabled, pname:pViewportState must: be a valid pointer to |
| a valid slink:VkPipelineViewportStateCreateInfo structure |
| endif::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:pMultisampleState must: be a |
| valid pointer to a valid slink:VkPipelineMultisampleStateCreateInfo |
| structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pMultisampleState-09026]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and the |
| `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled or any |
| of the ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT, |
| ename:VK_DYNAMIC_STATE_SAMPLE_MASK_EXT, or |
| ename:VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT dynamic states is |
| not set, or <<features-alphaToOne,alphaToOne>> is enabled on the device |
| and ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT is not set, |
| pname:pMultisampleState must: be a valid pointer to a valid |
| slink:VkPipelineMultisampleStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pMultisampleState-09027]] |
| If pname:pMultisampleState is not `NULL` is must: be a valid pointer to |
| a valid slink:VkPipelineMultisampleStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-alphaToCoverageEnable-08891]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| the |
| slink:VkPipelineMultisampleStateCreateInfo::pname:alphaToCoverageEnable |
| is not ignored and is ename:VK_TRUE, then the |
| <<interfaces-fragmentoutput, Fragment Output Interface>> must: contain a |
| variable for the alpha code:Component word in code:Location 0 at |
| code:Index 0 |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06043]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-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 |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-09028]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>>, and pname:subpass uses a depth/stencil attachment, and |
| the `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled or, |
| any of the ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP, |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_OP, or |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic states are not set, |
| pname:pDepthStencilState must: be a valid pointer to a valid |
| slink:VkPipelineDepthStencilStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDepthStencilState-09029]] |
| If pname:pDepthStencilState is not `NULL` it must: be a valid pointer to |
| a valid slink:VkPipelineDepthStencilStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06044]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-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 |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-09030]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-output, fragment |
| output interface state>>, and pname:subpass uses color attachments, and |
| `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled, or any |
| of the ename:VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT, or |
| ename:VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic states are not set, |
| pname:pColorBlendState must: be a valid pointer to a valid |
| slink:VkPipelineColorBlendStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, the <<features-depthBiasClamp, |
| pname:depthBiasClamp>> 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 requires <<pipelines-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 requires <<pipelines-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-07610]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> or <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:rasterizationSamples and |
| pname:sampleLocationsInfo are not dynamic, and |
| slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable |
| 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-07611]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> or <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:rasterizationSamples and |
| pname:sampleLocationsInfo are not dynamic, and |
| slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable |
| the included in the pname:pNext chain of pname:pMultisampleState is |
| ename:VK_TRUE or ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT is |
| used, 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-07612]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> or <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:rasterizationSamples and |
| pname:sampleLocationsInfo are not dynamic, and |
| slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable |
| included in the pname:pNext chain of pname:pMultisampleState is |
| ename:VK_TRUE or ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT is |
| used, pname:sampleLocationsInfo.sampleLocationsPerPixel must: equal |
| pname:rasterizationSamples |
| * [[VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524]] |
| If the pipeline requires <<pipelines-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[] |
| ifdef::VK_EXT_multisampled_render_to_single_sampled[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-multisampledRenderToSingleSampled-06853]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and none of the |
| `apiext:VK_AMD_mixed_attachment_samples` extension, the |
| `apiext:VK_NV_framebuffer_mixed_samples` extension, or the |
| <<features-multisampledRenderToSingleSampled, |
| pname:multisampledRenderToSingleSampled>> feature are enabled, |
| pname:rasterizationSamples is not dynamic, 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 |
| endif::VK_EXT_multisampled_render_to_single_sampled[] |
| ifdef::VK_AMD_mixed_attachment_samples[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-subpass-01505]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and the |
| `apiext:VK_AMD_mixed_attachment_samples` extension is enabled, |
| pname:rasterizationSamples is not dynamic, 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_EXT_multisampled_render_to_single_sampled[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06854]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the |
| `apiext:VK_EXT_multisampled_render_to_single_sampled` extension is |
| enabled, pname:rasterizationSamples is not dynamic, and pname:subpass |
| has a slink:VkMultisampledRenderToSingleSampledInfoEXT structure |
| included in the slink:VkSubpassDescription2::pname:pNext chain with |
| pname:multisampledRenderToSingleSampledEnable equal to ename:VK_TRUE, |
| then the pname:rasterizationSamples member of pname:pMultisampleState |
| must: be equal to |
| slink:VkMultisampledRenderToSingleSampledInfoEXT::pname:rasterizationSamples |
| endif::VK_EXT_multisampled_render_to_single_sampled[] |
| ifdef::VK_NV_framebuffer_mixed_samples[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-subpass-01411]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, the |
| `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled, |
| pname:rasterizationSamples is not dynamic, 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 requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, the |
| `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled, |
| pname:rasterizationSamples is not dynamic, 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 requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, the |
| `apiext:VK_NV_coverage_reduction_mode` extension is enabled, and |
| pname:rasterizationSamples is not dynamic, 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 requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:rasterizationSamples is not |
| dynamic, 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 not dlink:VK_NULL_HANDLE, 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 not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, pname:subpass viewMask is not `0`, and |
| pname:multiviewTessellationShader is not enabled, then pname:pStages |
| must: not include tessellation shaders |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06048]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, pname:subpass viewMask is not `0`, and |
| pname:multiviewGeometryShader is not enabled, then pname:pStages must: |
| not include a geometry shader |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06049]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and pname:subpass viewMask is not `0`, |
| all of the shaders in the pipeline must: not write to the code:Layer |
| built-in output |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06050]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is |
| being created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and pname:subpass viewMask is not `0`, |
| then all of the shaders in the pipeline must: not include variables |
| decorated with the code:Layer built-in decoration in their interfaces |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-07717]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is |
| being created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and pname:subpass viewMask is not `0`, |
| then all of the shaders in the pipeline must: not include variables |
| decorated with the code:ViewMask built-in decoration in their interfaces |
| ifdef::VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-07064]] |
| If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, pname:subpass viewMask is not `0`, and |
| pname:multiviewMeshShader is not enabled, then pname:pStages must: not |
| include a mesh shader |
| endif::VK_EXT_mesh_shader[] |
| 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 requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-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 |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07854]] |
| If ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV is included in the |
| pname:pDynamicStates array then the implementation must: support at |
| least pname:specVersion `2` of the `apiext:VK_NV_scissor_exclusive` |
| extension |
| endif::VK_NV_scissor_exclusive[] |
| ifdef::VK_NV_shading_rate_image[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057]] |
| If the pipeline requires <<pipelines-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 requires <<pipelines-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 |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07855]] |
| If ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT is included in |
| the pname:pDynamicStates array then the implementation must: support at |
| least pname:specVersion `2` of the `apiext:VK_EXT_discard_rectangles` |
| extension |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07856]] |
| If ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT is included in the |
| pname:pDynamicStates array then the implementation must: support at |
| least pname:specVersion `2` of the `apiext:VK_EXT_discard_rectangles` |
| extension |
| endif::VK_EXT_discard_rectangles[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02097]] |
| If the pipeline requires <<pipelines-graphics-subsets-vertex-input, |
| vertex input state>>, and pname:pVertexInputState is not dynamic, then |
| pname:pVertexInputState must: be a valid pointer to a valid |
| slink:VkPipelineVertexInputStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-Input-07904]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>> and |
| pname:pVertexInputState is not dynamic, then all variables with the |
| code:Input storage class decorated with code:Location in the code:Vertex |
| {ExecutionModel} code:OpEntryPoint must: contain a location in |
| slink:VkVertexInputAttributeDescription::pname:location |
| * [[VUID-VkGraphicsPipelineCreateInfo-Input-08733]] |
| If the pipeline requires <<pipelines-graphics-subsets-vertex-input, |
| vertex input state>> and pname:pVertexInputState is not dynamic, then |
| the numeric type associated with all code:Input variables of the |
| corresponding code:Location in the code:Vertex {ExecutionModel} |
| code:OpEntryPoint must: be the same as |
| slink:VkVertexInputAttributeDescription::pname:format |
| * [[VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-08929]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>> and |
| pname:pVertexInputState is not dynamic, and |
| slink:VkVertexInputAttributeDescription::pname:format has a 64-bit |
| component, then the scalar width associated with all code:Input |
| variables of the corresponding code:Location in the code:Vertex |
| {ExecutionModel} code:OpEntryPoint must: be 64-bit |
| * [[VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-08930]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>> and |
| pname:pVertexInputState is not dynamic, and the scalar width associated |
| with a code:Location decorated code:Input variable in the code:Vertex |
| {ExecutionModel} code:OpEntryPoint is 64-bit, then the corresponding |
| slink:VkVertexInputAttributeDescription::pname:format must: have a |
| 64-bit component |
| * [[VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-09198]] |
| If the pipeline is being created with |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>> and |
| pname:pVertexInputState is not dynamic, and |
| slink:VkVertexInputAttributeDescription::pname:format has a 64-bit |
| component, then all code:Input variables at the corresponding |
| code:Location in the code:Vertex {ExecutionModel} code:OpEntryPoint |
| must: not use components that are not present in the format |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02098]] |
| If the pipeline requires <<pipelines-graphics-subsets-vertex-input, |
| vertex input state>>, pname:pInputAssemblyState must: be a valid pointer |
| to a valid slink:VkPipelineInputAssemblyStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-dynamicPrimitiveTopologyUnrestricted-09031]] |
| If the pipeline requires <<pipelines-graphics-subsets-vertex-input, |
| vertex input state>>, and the `apiext:VK_EXT_extended_dynamic_state3` |
| extension is not enabled, or either |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, or |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY dynamic states are not set, or |
| <<limits-dynamicPrimitiveTopologyUnrestricted, |
| pname:dynamicPrimitiveTopologyUnrestricted>> is ename:VK_FALSE, |
| pname:pInputAssemblyState must: be a valid pointer to a valid |
| slink:VkPipelineInputAssemblyStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pInputAssemblyState-09032]] |
| If pname:pInputAssemblyState is not `NULL` it must: be a valid pointer |
| to a valid slink:VkPipelineInputAssemblyStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_transform_feedback[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02317]] |
| If the pipeline requires <<pipelines-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 requires <<pipelines-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 |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization shader |
| stage>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319]] |
| If the pipeline requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and the last |
| <<pipelines-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,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-None-02322]] |
| If the pipeline requires <<pipelines-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,VK_EXT_mesh_shader[] |
| endif::VK_EXT_transform_feedback[] |
| ifdef::VK_EXT_line_rasterization[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> and at least one of |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>> or <<pipelines-graphics-subsets-fragment-shader, fragment shader |
| state>>, and pname:pMultisampleState is not `NULL`, 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 requires <<pipelines-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[] |
| ifndef::VK_EXT_graphics_pipeline_library[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-03371]] |
| pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| endif::VK_EXT_graphics_pipeline_library[] |
| 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_VERSION_1_3,VK_EXT_extended_dynamic_state[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378]] |
| If |
| ifdef::VK_EXT_extended_dynamic_state[] |
| the <<features-extendedDynamicState, pname:extendedDynamicState>> |
| feature is not enabled, |
| endif::VK_EXT_extended_dynamic_state[] |
| ifdef::VK_VERSION_1_3+VK_EXT_extended_dynamic_state[and] |
| ifdef::VK_VERSION_1_3[] |
| the value of slink:VkApplicationInfo::pname:apiVersion used to create |
| the slink:VkInstance is less than Version 1.3 |
| endif::VK_VERSION_1_3[] |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_CULL_MODE, |
| ename:VK_DYNAMIC_STATE_FRONT_FACE, |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY, |
| ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT, |
| ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT, |
| ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE, |
| ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP, |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE, or |
| ename:VK_DYNAMIC_STATE_STENCIL_OP |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT is included in the |
| pname:pDynamicStates array then pname:viewportCount must: be zero |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT is included in the |
| pname:pDynamicStates array then pname:scissorCount must: be zero |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04132]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT is included in the |
| pname:pDynamicStates array then ename:VK_DYNAMIC_STATE_VIEWPORT must: |
| not be present |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04133]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT is included in the |
| pname:pDynamicStates array then ename:VK_DYNAMIC_STATE_SCISSOR must: not |
| be present |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07065]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and includes a mesh shader, there |
| must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY, or |
| ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| endif::VK_VERSION_1_3,VK_EXT_extended_dynamic_state[] |
| ifdef::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04868]] |
| If |
| ifdef::VK_EXT_extended_dynamic_state[] |
| the <<features-extendedDynamicState2, pname:extendedDynamicState2>> |
| feature is not enabled, |
| endif::VK_EXT_extended_dynamic_state[] |
| ifdef::VK_VERSION_1_3+VK_EXT_extended_dynamic_state[and] |
| ifdef::VK_VERSION_1_3[] |
| the value of slink:VkApplicationInfo::pname:apiVersion used to create |
| the slink:VkInstance is less than Version 1.3 |
| endif::VK_VERSION_1_3[] |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE, |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, or |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04869]] |
| If the <<features-extendedDynamicState2LogicOp, |
| pname: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, |
| pname: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 |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07066]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and includes a mesh shader, there |
| must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, or |
| ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| endif::VK_VERSION_1_3,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, pname:deviceGeneratedCommands>> |
| feature must: be enabled |
| ifdef::VK_EXT_transform_feedback[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-02966]] |
| If the pipeline requires <<pipelines-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[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-libraryCount-06648]] |
| If the pipeline is not created with a |
| <<pipelines-graphics-subsets-complete, complete set of state>>, |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| or slink:VkPipelineLibraryCreateInfoKHR::pname:libraryCount is not `0`, |
| endif::VK_EXT_graphics_pipeline_library[] |
| slink:VkGraphicsPipelineShaderGroupsCreateInfoNV::pname:groupCount and |
| slink:VkGraphicsPipelineShaderGroupsCreateInfoNV::pname:pipelineCount |
| must: be `0` |
| * [[VUID-VkGraphicsPipelineCreateInfo-libraryCount-06649]] |
| If the pipeline is created with a <<pipelines-graphics-subsets-complete, |
| complete set of state>>, |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| and slink:VkPipelineLibraryCreateInfoKHR::pname:libraryCount is `0`, |
| endif::VK_EXT_graphics_pipeline_library[] |
| and the pname:pNext chain includes an instance of |
| slink:VkGraphicsPipelineShaderGroupsCreateInfoNV, |
| slink:VkGraphicsPipelineShaderGroupsCreateInfoNV::pname:groupCount must: |
| be greater than `0` |
| endif::VK_NV_device_generated_commands[] |
| ifdef::VK_VERSION_1_3,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 or |
| ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| ifdef::VK_EXT_pipeline_protected_access[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pipelineProtectedAccess-07368]] |
| If the <<features-pipelineProtectedAccess, |
| pname:pipelineProtectedAccess>> feature is not enabled, pname:flags |
| must: not include ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT |
| or ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-07369]] |
| pname:flags must: not include both |
| ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT and |
| ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT |
| endif::VK_EXT_pipeline_protected_access[] |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04494]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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-06567]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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:combinerOps[0] |
| must: be a valid elink:VkFragmentShadingRateCombinerOpKHR value |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06568]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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:combinerOps[1] |
| must: be a valid elink:VkFragmentShadingRateCombinerOpKHR value |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04501]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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_VERSION_1_3,VK_EXT_extended_dynamic_state[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04503]] |
| If the pipeline requires <<pipelines-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 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_VERSION_1_3,VK_EXT_extended_dynamic_state[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04504]] |
| If the pipeline requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-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-None-06569]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> |
| and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in |
| pname:pDynamicState->pDynamicStates, |
| slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRateType |
| must: be a valid elink:VkFragmentShadingRateTypeNV value |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06570]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in |
| pname:pDynamicState->pDynamicStates, |
| slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate |
| must: be a valid elink:VkFragmentShadingRateNV value |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06571]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in |
| pname:pDynamicState->pDynamicStates, |
| slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps[0] |
| must: be a valid elink:VkFragmentShadingRateCombinerOpKHR value |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06572]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in |
| pname:pDynamicState->pDynamicStates, |
| slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps[1] |
| must: be a valid elink:VkFragmentShadingRateCombinerOpKHR value |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04569]] |
| If the pipeline requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-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 requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>>, and the |
| <<features-supersampleFragmentShadingRates, |
| pname: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 requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>>, and the |
| <<features-noInvocationFragmentShadingRates, |
| pname: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 requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> and the |
| <<features-vertexInputDynamicState, pname: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 |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07067]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and includes a mesh shader, there |
| must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| endif::VK_EXT_vertex_input_dynamic_state[] |
| ifdef::VK_EXT_color_write_enable[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04800]] |
| If the <<features-colorWriteEnable, pname: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 requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>>, and the |
| `apiext:VK_QCOM_render_pass_shader_resolve` extension is enabled, |
| pname:rasterizationSamples is not dynamic, 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 requires <<pipelines-graphics-subsets-fragment-shader, |
| 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_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06574]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| or <<pipelines-graphics-subsets-fragment-output, fragment output |
| interface state>>, pname:renderPass must: be a valid render pass object |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-dynamicRendering-06576]] |
| If the <<features-dynamicRendering, pname:dynamicRendering>> feature is |
| not enabled and the pipeline requires |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>, <<pipelines-graphics-subsets-fragment-shader, fragment shader |
| state>>, or <<pipelines-graphics-subsets-fragment-output, fragment |
| output interface state>>, pname:renderPass must: not be |
| dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-multiview-06577]] |
| If the <<features-multiview, pname:multiview>> feature is not enabled, |
| the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| or <<pipelines-graphics-subsets-fragment-output, fragment output |
| interface state>>, and pname:renderPass is dlink:VK_NULL_HANDLE, |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask must: be `0` |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06578]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| or <<pipelines-graphics-subsets-fragment-output, fragment output |
| interface state>>, and pname:renderPass is dlink:VK_NULL_HANDLE, the |
| index of the most significant bit in |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask must: be less than |
| <<limits-maxMultiviewViewCount, pname:maxMultiviewViewCount>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06579]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:renderPass is |
| dlink:VK_NULL_HANDLE, and |
| slink:VkPipelineRenderingCreateInfo::pname:colorAttachmentCount is not |
| 0, slink:VkPipelineRenderingCreateInfo::pname:pColorAttachmentFormats |
| must: be a valid pointer to an array of pname:colorAttachmentCount valid |
| elink:VkFormat values |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06580]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:renderPass is |
| dlink:VK_NULL_HANDLE, each element of |
| slink:VkPipelineRenderingCreateInfo::pname:pColorAttachmentFormats must: |
| be a valid elink:VkFormat value |
| ifndef::VK_NV_linear_color_attachment[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06581]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, and any element of |
| slink:VkPipelineRenderingCreateInfo::pname:pColorAttachmentFormats is |
| not ename:VK_FORMAT_UNDEFINED, that format must: be a format with |
| <<potential-format-features, potential format features>> that include |
| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
| endif::VK_NV_linear_color_attachment[] |
| ifdef::VK_NV_linear_color_attachment[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06582]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, and any element of |
| slink:VkPipelineRenderingCreateInfo::pname:pColorAttachmentFormats is |
| not ename:VK_FORMAT_UNDEFINED, that format must: be a format with |
| <<potential-format-features, potential format features>> that include |
| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or |
| ename:VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV |
| endif::VK_NV_linear_color_attachment[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06583]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:renderPass is |
| dlink:VK_NULL_HANDLE, |
| slink:VkPipelineRenderingCreateInfo::pname:depthAttachmentFormat must: |
| be a valid elink:VkFormat value |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06584]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and pname:renderPass is |
| dlink:VK_NULL_HANDLE, |
| slink:VkPipelineRenderingCreateInfo::pname:stencilAttachmentFormat must: |
| be a valid elink:VkFormat value |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06585]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, and |
| slink:VkPipelineRenderingCreateInfo::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-VkGraphicsPipelineCreateInfo-renderPass-06586]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, and |
| slink:VkPipelineRenderingCreateInfo::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-VkGraphicsPipelineCreateInfo-renderPass-06587]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, and |
| slink:VkPipelineRenderingCreateInfo::pname:depthAttachmentFormat is not |
| ename:VK_FORMAT_UNDEFINED, it must: be a format that includes a depth |
| component |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06588]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, and |
| slink:VkPipelineRenderingCreateInfo::pname:stencilAttachmentFormat is |
| not ename:VK_FORMAT_UNDEFINED, it must: be a format that includes a |
| stencil component |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06589]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:renderPass is |
| dlink:VK_NULL_HANDLE, |
| slink:VkPipelineRenderingCreateInfo::pname:depthAttachmentFormat is not |
| ename:VK_FORMAT_UNDEFINED, and |
| slink:VkPipelineRenderingCreateInfo::pname:stencilAttachmentFormat is |
| not ename:VK_FORMAT_UNDEFINED, pname:depthAttachmentFormat must: equal |
| pname:stencilAttachmentFormat |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06053]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>> and <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and either of |
| slink:VkPipelineRenderingCreateInfo::pname:depthAttachmentFormat or |
| slink:VkPipelineRenderingCreateInfo::pname:stencilAttachmentFormat are |
| not ename:VK_FORMAT_UNDEFINED, pname:pDepthStencilState must: be a valid |
| pointer to a valid slink:VkPipelineDepthStencilStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-09033]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>> and <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and either of |
| slink:VkPipelineRenderingCreateInfo::pname:depthAttachmentFormat or |
| slink:VkPipelineRenderingCreateInfo::pname:stencilAttachmentFormat are |
| not ename:VK_FORMAT_UNDEFINED, and the |
| `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled or any |
| of the ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP, |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_OP, or |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic states are not set, |
| pname:pDepthStencilState must: be a valid pointer to a valid |
| slink:VkPipelineDepthStencilStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDepthStencilState-09034]] |
| If pname:pDepthStencilState is not `NULL` it must: be a valid pointer to |
| a valid slink:VkPipelineDepthStencilStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06590]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE and the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>> but not <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, pname:pDepthStencilState must: be a |
| valid pointer to a valid slink:VkPipelineDepthStencilStateCreateInfo |
| structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-09035]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE and the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>> but not <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>>, and the |
| `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled, or any |
| of the ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE, |
| ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP, |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE, |
| ename:VK_DYNAMIC_STATE_STENCIL_OP, or |
| ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic states are not set, |
| pname:pDepthStencilState must: be a valid pointer to a valid |
| slink:VkPipelineDepthStencilStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDepthStencilState-09036]] |
| If pname:pDepthStencilState is not `NULL` it must: be a valid pointer to |
| a valid slink:VkPipelineDepthStencilStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06054]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-output, fragment |
| output interface state>>, and |
| slink:VkPipelineRenderingCreateInfo::pname:colorAttachmentCount is not |
| equal to `0`, pname:pColorBlendState must: be a valid pointer to a valid |
| slink:VkPipelineColorBlendStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-09037]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-fragment-output, fragment |
| output interface state>>, and |
| slink:VkPipelineRenderingCreateInfo::pname:colorAttachmentCount is not |
| equal to `0`, and the `apiext:VK_EXT_extended_dynamic_state3` extension |
| is not enabled, or any of the |
| ename:VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT, |
| ename:VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT, or |
| ename:VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic states are not set, |
| pname:pColorBlendState must: be a valid pointer to a valid |
| slink:VkPipelineColorBlendStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pColorBlendState-09038]] |
| If pname:pColorBlendState is not `NULL` it must: be a valid pointer to a |
| valid slink:VkPipelineColorBlendStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06055]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, pname:pColorBlendState is |
| not dynamic, and the pipeline is being created with |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:pColorBlendState->attachmentCount must: be equal to |
| slink:VkPipelineRenderingCreateInfo::pname:colorAttachmentCount |
| 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 <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask 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 <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask 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-07718]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask is not `0`, all of |
| the shaders in the pipeline must: not write to the code:Layer built-in |
| output |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06059]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask is not `0`, all of |
| the shaders in the pipeline must: not include variables decorated with |
| the code:Layer built-in decoration in their interfaces |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-07719]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask is not `0`, all of |
| the shaders in the pipeline must: not include variables decorated with |
| the code:ViewIndex built-in decoration in their interfaces |
| ifdef::VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-07720]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask is not `0`, and |
| pname:multiviewMeshShader is not enabled, then pname:pStages must: not |
| include a mesh shader |
| endif::VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06061]] |
| If the pipeline requires <<pipelines-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 |
| ifdef::VK_EXT_shader_tile_image[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-08710]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and pname:renderPass is not |
| dlink:VK_NULL_HANDLE, fragment shaders in pname:pStages must: not |
| include any of the code:TileImageColorReadAccessEXT, |
| code:TileImageDepthReadAccessEXT, or code:TileImageStencilReadAccessEXT |
| capabilities |
| endif::VK_EXT_shader_tile_image[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06062]] |
| If the pipeline requires <<pipelines-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:VkPipelineRenderingCreateInfo, 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 requires <<pipelines-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:VkPipelineRenderingCreateInfo::pname:colorAttachmentCount |
| endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[] |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_EXT_rasterization_order_attachment_access,VK_ARM_rasterization_order_attachment_access[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06591]] |
| If pname:pStages includes a fragment shader stage, and the fragment |
| shader declares the code:EarlyFragmentTests execution mode, the |
| pname:flags member of slink:VkPipelineDepthStencilStateCreateInfo must: |
| not include |
| ename:VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT |
| or |
| ename:VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06482]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>> and the pname:flags member of |
| slink:VkPipelineColorBlendStateCreateInfo includes |
| ename:VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT, |
| pname:renderpass must: not be dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06483]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>> and the pname:flags member of |
| slink:VkPipelineDepthStencilStateCreateInfo includes |
| ename:VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT |
| or |
| ename:VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, |
| pname:renderpass must: not be dlink:VK_NULL_HANDLE |
| ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pColorAttachmentSamples-06592]] |
| If the <<pipelines-graphics-subsets-fragment-output, fragment output |
| interface state>>, elements of the pname:pColorAttachmentSamples member |
| of slink:VkAttachmentSampleCountInfoAMD or |
| slink:VkAttachmentSampleCountInfoNV must: be valid |
| elink:VkSampleCountFlagBits values |
| * [[VUID-VkGraphicsPipelineCreateInfo-depthStencilAttachmentSamples-06593]] |
| If the <<pipelines-graphics-subsets-fragment-output, fragment output |
| interface state>> and the pname:depthStencilAttachmentSamples member of |
| slink:VkAttachmentSampleCountInfoAMD or |
| slink:VkAttachmentSampleCountInfoNV is not 0, it must: be a valid |
| elink:VkSampleCountFlagBits value |
| endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[] |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06484]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-output, |
| fragment output interface state>> and the pname:flags member of |
| slink:VkPipelineColorBlendStateCreateInfo includes |
| ename:VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT |
| pname:subpass must: have been created with |
| ename:VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06485]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and the pname:flags member of |
| slink:VkPipelineDepthStencilStateCreateInfo includes |
| ename:VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT, |
| pname:subpass must: have been created with |
| ename:VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06486]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and the pname:flags member of |
| slink:VkPipelineDepthStencilStateCreateInfo includes |
| ename:VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, |
| pname:subpass must: have been created with |
| ename:VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT |
| endif::VK_EXT_rasterization_order_attachment_access,VK_ARM_rasterization_order_attachment_access[] |
| ifdef::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pipelineStageCreationFeedbackCount-06594]] |
| If |
| slink:VkPipelineCreationFeedbackCreateInfo::pname:pipelineStageCreationFeedbackCount |
| is not `0`, it must: be equal to pname:stageCount |
| endif::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| ifdef::VK_NVX_multiview_per_view_attributes[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06595]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being |
| created with <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| and |
| slink:VkMultiviewPerViewAttributesInfoNVX::pname:perViewAttributesPositionXOnly |
| is ename:VK_TRUE then |
| slink:VkMultiviewPerViewAttributesInfoNVX::pname:perViewAttributes must: |
| also be ename:VK_TRUE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06596]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes the other flag, the value of |
| slink:VkMultiviewPerViewAttributesInfoNVX::pname:perViewAttributes |
| specified in both this pipeline and the library must: be equal |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06597]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, the value of |
| slink:VkMultiviewPerViewAttributesInfoNVX::pname:perViewAttributes |
| specified in both libraries must: be equal |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06598]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes the other flag, the value of |
| slink:VkMultiviewPerViewAttributesInfoNVX::pname:perViewAttributesPositionXOnly |
| specified in both this pipeline and the library must: be equal |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06599]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, the value of |
| slink:VkMultiviewPerViewAttributesInfoNVX::pname:perViewAttributesPositionXOnly |
| specified in both libraries must: be equal |
| endif::VK_NVX_multiview_per_view_attributes[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-06600]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| pname:pStages must: be a valid pointer to an array of pname:stageCount |
| valid slink:VkPipelineShaderStageCreateInfo structures |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-06601]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, pname:pRasterizationState must: be a |
| valid pointer to a valid slink:VkPipelineRasterizationStateCreateInfo |
| structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-09039]] |
| If the `apiext:VK_EXT_extended_dynamic_state3` extension is not enabled, |
| or any of the ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT, |
| ename:VK_DYNAMIC_STATE_SAMPLE_MASK_EXT, or |
| ename:VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT dynamic states are |
| not set, or <<features-alphaToOne,alphaToOne>> is enabled on the device |
| and ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT is not set, then |
| pname:pMultisampleState must: be a valid pointer to a valid |
| slink:VkPipelineMultisampleStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-09040]] |
| If pname:pRasterizationState is not `NULL` it must: be a valid pointer |
| to a valid slink:VkPipelineRasterizationStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-layout-06602]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> or |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>, pname:layout must: be a valid slink:VkPipelineLayout handle |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06603]] |
| If <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization |
| shader state>>, <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>>, or <<pipelines-graphics-subsets-fragment-output, |
| fragment output state>>, |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| and pname:renderPass is not dlink:VK_NULL_HANDLE, |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| pname:renderPass must: be a valid slink:VkRenderPass handle |
| * [[VUID-VkGraphicsPipelineCreateInfo-stageCount-06604]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> or |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| pname:stageCount must: be greater than `0` |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-graphicsPipelineLibrary-06606]] |
| If the <<features-graphicsPipelineLibrary, |
| pname:graphicsPipelineLibrary>> feature is not enabled, pname:flags |
| must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06608]] |
| If the pipeline defines, or includes as libraries, all the state subsets |
| required for a <<pipelines-graphics-subsets-complete, complete graphics |
| pipeline>>, pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06609]] |
| If pname:flags includes |
| ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT, pipeline |
| libraries included via slink:VkPipelineLibraryCreateInfoKHR must: have |
| been created with |
| ename:VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-09245]] |
| If pname:flags includes |
| ename:VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT, |
| pname:flags must: also include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06610]] |
| If pname:flags includes |
| ename:VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT, |
| pipeline libraries included via slink:VkPipelineLibraryCreateInfoKHR |
| must: have been created with |
| ename:VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06611]] |
| Any pipeline libraries included via |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries must: not include |
| any <<pipelines-graphics-subsets, state subset>> already defined by this |
| structure or defined by any other pipeline library in |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06612]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes the other flag, and pname:layout was not created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then the |
| pname:layout used by this pipeline and the library must: be _identically |
| defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06613]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and the |
| pname:layout specified by either library was not created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then the |
| pname:layout used by each library must: be _identically defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06614]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes the |
| other subset, and pname:layout was created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then the |
| pname:layout used by the library must: also have been created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06615]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and the |
| pname:layout specified by either library was created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then the |
| pname:layout used by both libraries must: have been created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06616]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes the |
| other subset, and pname:layout was created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, elements of |
| the pname:pSetLayouts array which pname:layout was created with that are |
| not dlink:VK_NULL_HANDLE must: be _identically defined_ to the element |
| at the same index of pname:pSetLayouts used to create the library's |
| pname:layout |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06617]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and the |
| pname:layout specified by either library was created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, elements of |
| the pname:pSetLayouts array which either pname:layout was created with |
| that are not dlink:VK_NULL_HANDLE must: be _identically defined_ to the |
| element at the same index of pname:pSetLayouts used to create the other |
| library's pname:layout |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06618]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes the other flag, any descriptor set layout _N_ specified by |
| pname:layout in both this pipeline and the library which include |
| bindings accessed by shader stages in each must: be _identically |
| defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06619]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, any |
| descriptor set layout _N_ specified by pname:layout in both libraries |
| which include bindings accessed by shader stages in each must: be |
| _identically defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06620]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes the other flag, push constants specified in pname:layout in |
| both this pipeline and the library which are available to shader stages |
| in each must: be _identically defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06621]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, push |
| constants specified in pname:layout in both this pipeline and the |
| library which are available to shader stages in each must: be |
| _identically defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06679]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes the |
| other subset, and any element of the pname:pSetLayouts array which |
| pname:layout was created with was dlink:VK_NULL_HANDLE, then the |
| corresponding element of the pname:pSetLayouts array used to create the |
| library's pname:layout must: not be dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06680]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes the |
| other subset, and any element of the pname:pSetLayouts array used to |
| create the library's pname:layout was dlink:VK_NULL_HANDLE, then the |
| corresponding element of the pname:pSetLayouts array used to create this |
| pipeline's pname:layout must: not be dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06681]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and any |
| element of the pname:pSetLayouts array used to create each library's |
| pname:layout was dlink:VK_NULL_HANDLE, then the corresponding element of |
| the pname:pSetLayouts array used to create the other library's |
| pname:layout must: not be dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06756]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes the |
| other subset, and any element of the pname:pSetLayouts array which |
| pname:layout was created with was dlink:VK_NULL_HANDLE, then the |
| corresponding element of the pname:pSetLayouts array used to create the |
| library's pname:layout must: not have shader bindings for shaders in the |
| other subset |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06757]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes the |
| other subset, and any element of the pname:pSetLayouts array used to |
| create the library's pname:layout was dlink:VK_NULL_HANDLE, then the |
| corresponding element of the pname:pSetLayouts array used to create this |
| pipeline's pname:layout must: not have shader bindings for shaders in |
| the other subset |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06758]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and any |
| element of the pname:pSetLayouts array used to create each library's |
| pname:layout was dlink:VK_NULL_HANDLE, then the corresponding element of |
| the pname:pSetLayouts array used to create the other library's |
| pname:layout must: not have shader bindings for shaders in the other |
| subset |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06682]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| both |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, pname:layout |
| must: have been created with no elements of the pname:pSetLayouts array |
| set to dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06683]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| pname:pRasterizationState->rasterizerDiscardEnable is ename:VK_TRUE, |
| pname:layout must: have been created with no elements of the |
| pname:pSetLayouts array set to dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06684]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes at |
| least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and an element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes one of the other flags, the value of pname:subpass must: be |
| equal to that used to create the library |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06623]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes at least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and another element of |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes one of |
| the other flags, the value of pname:subpass used to create each library |
| must: be identical |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderpass-06624]] |
| If pname:renderpass is not dlink:VK_NULL_HANDLE, |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes at |
| least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and an element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes one of the other flags, pname:renderPass must: be compatible |
| with that used to create the library |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderpass-06625]] |
| If pname:renderpass is dlink:VK_NULL_HANDLE, |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes at |
| least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and an element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes one of the other flags, the value of pname:renderPass used to |
| create that library must: also be dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06626]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes at |
| least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes one of the other flags, and pname:renderPass is |
| dlink:VK_NULL_HANDLE, the value of |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask used by this |
| pipeline and that specified by the library must: be identical |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06627]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes at least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| another element of |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes one of |
| the other flags, and pname:renderPass was dlink:VK_NULL_HANDLE for both |
| libraries, the value of |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask set by each library |
| must: be identical |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06628]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes at least one of and no more than two of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and another element of |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes one of |
| the other flags, the pname:renderPass objects used to create each |
| library must: be compatible or all equal to dlink:VK_NULL_HANDLE |
| * [[VUID-VkGraphicsPipelineCreateInfo-pMultisampleState-06629]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> pname:pMultisampleState must: be `NULL` or a |
| valid pointer to a valid slink:VkPipelineMultisampleStateCreateInfo |
| structure |
| ifndef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pMultisampleState-06630]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> pname:pMultisampleState must: not be `NULL` |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderpass-06631]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and pname:renderpass is not |
| dlink:VK_NULL_HANDLE, then pname:pMultisampleState must: not be `NULL` |
| * [[VUID-VkGraphicsPipelineCreateInfo-Input-06632]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> with a fragment shader that either enables |
| <<primsrast-sampleshading, sample shading>> or decorates any variable in |
| the code:Input storage class with code:Sample, then |
| pname:pMultisampleState must: not be `NULL` |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06633]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT with a |
| pname:pMultisampleState that was not `NULL`, and an element of |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries was created with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| pname:pMultisampleState must: be _identically defined_ to that used to |
| create the library |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06634]] |
| If an element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| was created with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT with a |
| pname:pMultisampleState that was not `NULL`, and if |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| pname:pMultisampleState must: be _identically defined_ to that used to |
| create the library |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06635]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| was created with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT with a |
| pname:pMultisampleState that was not `NULL`, and if a different element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries was created |
| with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| the pname:pMultisampleState used to create each library must: be |
| _identically defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06636]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| was created with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT and |
| a value of pname:pMultisampleState->sampleShading equal ename:VK_TRUE, |
| and if a different element of |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries was created with |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, the |
| pname:pMultisampleState used to create each library must: be |
| _identically defined_ |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06637]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| pname:pMultisampleState->sampleShading is ename:VK_TRUE, and an element |
| of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries was created |
| with ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, the |
| pname:pMultisampleState used to create that library must: be |
| _identically defined_ pname:pMultisampleState |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06638]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| only one of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and an |
| element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes the other flag, values specified in |
| slink:VkPipelineFragmentShadingRateStateCreateInfoKHR for both this |
| pipeline and that library must: be identical |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06639]] |
| If one element of slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries |
| includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT and |
| another element includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, values |
| specified in slink:VkPipelineFragmentShadingRateStateCreateInfoKHR for |
| both this pipeline and that library must: be identical |
| endif::VK_KHR_fragment_shading_rate[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06640]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| pname:pStages must: be a valid pointer to an array of pname:stageCount |
| valid slink:VkPipelineShaderStageCreateInfo structures |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06641]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| pname:pRasterizationState must: be a valid pointer to a valid |
| slink:VkPipelineRasterizationStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-09041]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and the `apiext:VK_EXT_extended_dynamic_state3` extension is not |
| enabled, or any of the ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT, |
| ename:VK_DYNAMIC_STATE_SAMPLE_MASK_EXT, or |
| ename:VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT dynamic states are |
| not set, or <<features-alphaToOne,alphaToOne>> is enabled on the device |
| and ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT is not set, |
| pname:pMultisampleState must: be a valid pointer to a valid |
| slink:VkPipelineMultisampleStateCreateInfo structure |
| * [[VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-09042]] |
| If pname:pRasterizationState is not `NULL` it must: be a valid pointer |
| to a valid slink:VkPipelineRasterizationStateCreateInfo structure |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06642]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, pname:layout |
| must: be a valid slink:VkPipelineLayout handle |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06643]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and pname:renderPass is not dlink:VK_NULL_HANDLE, pname:renderPass must: |
| be a valid slink:VkRenderPass handle |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06644]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT or |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| pname:stageCount must: be greater than `0` |
| ifdef::VK_KHR_pipeline_executable_properties[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06645]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags is |
| non-zero, if pname:flags includes |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR, any |
| libraries must: have also been created with |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06646]] |
| If slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes more |
| than one library, and any library was created with |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR, all |
| libraries must: have also been created with |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR |
| * [[VUID-VkGraphicsPipelineCreateInfo-pLibraries-06647]] |
| If slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries includes at |
| least one library, |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags is non-zero, |
| and any library was created with |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR, |
| pname:flags must: include |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR |
| endif::VK_KHR_pipeline_executable_properties[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-None-07826]] |
| If the pipeline includes a <<pipelines-graphics-subsets-complete, |
| complete set of state>>, and there are no libraries included in |
| slink:VkPipelineLibraryCreateInfoKHR::pname:pLibraries, then |
| slink:VkPipelineLayout must: be a valid pipeline layout |
| * [[VUID-VkGraphicsPipelineCreateInfo-layout-07827]] |
| If the pipeline includes a <<pipelines-graphics-subsets-complete, |
| complete set of state>> specified entirely by libraries, and each |
| library was created with a slink:VkPipelineLayout created without |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then |
| pname:layout must: be <<descriptorsets-compatibility,compatible>> with |
| the layouts in those libraries |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06729]] |
| If pname:flags includes |
| ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT, the pipeline |
| includes a <<pipelines-graphics-subsets-complete, complete set of |
| state>> specified entirely by libraries, and each library was created |
| with a slink:VkPipelineLayout created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then |
| pname:layout must: be <<descriptorsets-compatibility,compatible>> with |
| the union of the libraries' pipeline layouts other than the |
| inclusion/exclusion of |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-06730]] |
| If pname:flags does not include |
| ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT, the pipeline |
| includes a <<pipelines-graphics-subsets-complete, complete set of |
| state>> specified entirely by libraries, and each library was created |
| with a slink:VkPipelineLayout created with |
| ename:VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT, then |
| pname:layout must: be <<descriptorsets-compatibility, compatible>> with |
| the union of the libraries' pipeline layouts |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifdef::VK_EXT_conservative_rasterization[] |
| ifndef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-06759]] |
| If <<limits-conservativePointAndLineRasterization, |
| pname:conservativePointAndLineRasterization>> is not supported; the |
| pipeline requires <<pipelines-graphics-subsets-vertex-input, vertex |
| input state>> and <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>; the pipeline does not include a |
| geometry shader; and the value of |
| slink:VkPipelineInputAssemblyStateCreateInfo::pname:topology is |
| ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST, |
| ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST, or |
| ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, then |
| slink:VkPipelineRasterizationConservativeStateCreateInfoEXT::pname:conservativeRasterizationMode |
| must: be ename:VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-08892]] |
| If <<limits-conservativePointAndLineRasterization, |
| pname:conservativePointAndLineRasterization>> is not supported; the |
| pipeline is being created with |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>> and |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>; the pipeline does not include a geometry shader; and the value |
| of slink:VkPipelineInputAssemblyStateCreateInfo::pname:topology is |
| ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST, |
| ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST, or |
| ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, and either |
| ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY dynamic state is not enabled |
| or |
| <<limits-dynamicPrimitiveTopologyUnrestricted,pname:dynamicPrimitiveTopologyUnrestricted>> |
| is ename:VK_FALSE, then |
| slink:VkPipelineRasterizationConservativeStateCreateInfoEXT::pname:conservativeRasterizationMode |
| must: be ename:VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT |
| endif::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-06760]] |
| If <<limits-conservativePointAndLineRasterization, |
| pname:conservativePointAndLineRasterization>> is not supported, the |
| pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and the pipeline includes a geometry |
| shader with either the code:OutputPoints or code:OutputLineStrip |
| execution modes, |
| slink:VkPipelineRasterizationConservativeStateCreateInfoEXT::pname:conservativeRasterizationMode |
| must: be ename:VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT |
| ifdef::VK_NV_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-06761]] |
| If <<limits-conservativePointAndLineRasterization, |
| pname:conservativePointAndLineRasterization>> is not supported, the |
| pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, and the pipeline includes a mesh |
| shader with either the code:OutputPoints or code:OutputLinesNV execution |
| modes, |
| slink:VkPipelineRasterizationConservativeStateCreateInfoEXT::pname:conservativeRasterizationMode |
| must: be ename:VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT |
| endif::VK_NV_mesh_shader[] |
| endif::VK_EXT_conservative_rasterization[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-06894]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> but not |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| elements of pname:pStages must: not have pname:stage set to |
| ename:VK_SHADER_STAGE_FRAGMENT_BIT |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-06895]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> but not |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>, elements of pname:pStages must: not have pname:stage set to a |
| shader stage which participates in pre-rasterization |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-06896]] |
| If the pipeline requires <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>>, all elements of pname:pStages must: |
| have a pname:stage set to a shader stage which participates in |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> or |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-stage-06897]] |
| If the pipeline requires <<pipelines-graphics-subsets-fragment-shader, |
| fragment shader state>> and/or |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>>, any value of pname:stage must: not be set in more than one |
| element of pname:pStages |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3TessellationDomainOrigin-07370]] |
| If the <<features-extendedDynamicState3TessellationDomainOrigin, |
| pname:extendedDynamicState3TessellationDomainOrigin>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3DepthClampEnable-07371]] |
| If the <<features-extendedDynamicState3DepthClampEnable, |
| pname:extendedDynamicState3DepthClampEnable>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3PolygonMode-07372]] |
| If the <<features-extendedDynamicState3PolygonMode, |
| pname:extendedDynamicState3PolygonMode>> feature is not enabled, there |
| must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_POLYGON_MODE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3RasterizationSamples-07373]] |
| If the <<features-extendedDynamicState3RasterizationSamples, |
| pname:extendedDynamicState3RasterizationSamples>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3SampleMask-07374]] |
| If the <<features-extendedDynamicState3SampleMask, |
| pname:extendedDynamicState3SampleMask>> feature is not enabled, there |
| must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_SAMPLE_MASK_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3AlphaToCoverageEnable-07375]] |
| If the <<features-extendedDynamicState3AlphaToCoverageEnable, |
| pname:extendedDynamicState3AlphaToCoverageEnable>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3AlphaToOneEnable-07376]] |
| If the <<features-extendedDynamicState3AlphaToOneEnable, |
| pname:extendedDynamicState3AlphaToOneEnable>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3LogicOpEnable-07377]] |
| If the <<features-extendedDynamicState3LogicOpEnable, |
| pname:extendedDynamicState3LogicOpEnable>> 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_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorBlendEnable-07378]] |
| If the <<features-extendedDynamicState3ColorBlendEnable, |
| pname:extendedDynamicState3ColorBlendEnable>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorBlendEquation-07379]] |
| If the <<features-extendedDynamicState3ColorBlendEquation, |
| pname:extendedDynamicState3ColorBlendEquation>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorWriteMask-07380]] |
| If the <<features-extendedDynamicState3ColorWriteMask, |
| pname:extendedDynamicState3ColorWriteMask>> 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_MASK_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3RasterizationStream-07381]] |
| If the <<features-extendedDynamicState3RasterizationStream, |
| pname:extendedDynamicState3RasterizationStream>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ConservativeRasterizationMode-07382]] |
| If the <<features-extendedDynamicState3ConservativeRasterizationMode, |
| pname:extendedDynamicState3ConservativeRasterizationMode>> feature is |
| not enabled, there must: be no element of the pname:pDynamicStates |
| member of pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ExtraPrimitiveOverestimationSize-07383]] |
| If the <<features-extendedDynamicState3ExtraPrimitiveOverestimationSize, |
| pname:extendedDynamicState3ExtraPrimitiveOverestimationSize>> feature is |
| not enabled, there must: be no element of the pname:pDynamicStates |
| member of pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3DepthClipEnable-07384]] |
| If the <<features-extendedDynamicState3DepthClipEnable, |
| pname:extendedDynamicState3DepthClipEnable>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3SampleLocationsEnable-07385]] |
| If the <<features-extendedDynamicState3SampleLocationsEnable, |
| pname:extendedDynamicState3SampleLocationsEnable>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorBlendAdvanced-07386]] |
| If the <<features-extendedDynamicState3ColorBlendAdvanced, |
| pname:extendedDynamicState3ColorBlendAdvanced>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ProvokingVertexMode-07387]] |
| If the <<features-extendedDynamicState3ProvokingVertexMode, |
| pname:extendedDynamicState3ProvokingVertexMode>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3LineRasterizationMode-07388]] |
| If the <<features-extendedDynamicState3LineRasterizationMode, |
| pname:extendedDynamicState3LineRasterizationMode>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3LineStippleEnable-07389]] |
| If the <<features-extendedDynamicState3LineStippleEnable, |
| pname:extendedDynamicState3LineStippleEnable>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3DepthClipNegativeOneToOne-07390]] |
| If the <<features-extendedDynamicState3DepthClipNegativeOneToOne, |
| pname:extendedDynamicState3DepthClipNegativeOneToOne>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ViewportWScalingEnable-07391]] |
| If the <<features-extendedDynamicState3ViewportWScalingEnable, |
| pname:extendedDynamicState3ViewportWScalingEnable>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ViewportSwizzle-07392]] |
| If the <<features-extendedDynamicState3ViewportSwizzle, |
| pname:extendedDynamicState3ViewportSwizzle>> feature is not enabled, |
| there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to ename:VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageToColorEnable-07393]] |
| If the <<features-extendedDynamicState3CoverageToColorEnable, |
| pname:extendedDynamicState3CoverageToColorEnable>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageToColorLocation-07394]] |
| If the <<features-extendedDynamicState3CoverageToColorLocation, |
| pname:extendedDynamicState3CoverageToColorLocation>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageModulationMode-07395]] |
| If the <<features-extendedDynamicState3CoverageModulationMode, |
| pname:extendedDynamicState3CoverageModulationMode>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageModulationTableEnable-07396]] |
| If the <<features-extendedDynamicState3CoverageModulationTableEnable, |
| pname:extendedDynamicState3CoverageModulationTableEnable>> feature is |
| not enabled, there must: be no element of the pname:pDynamicStates |
| member of pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageModulationTable-07397]] |
| If the <<features-extendedDynamicState3CoverageModulationTable, |
| pname:extendedDynamicState3CoverageModulationTable>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageReductionMode-07398]] |
| If the <<features-extendedDynamicState3CoverageReductionMode, |
| pname:extendedDynamicState3CoverageReductionMode>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3RepresentativeFragmentTestEnable-07399]] |
| If the <<features-extendedDynamicState3RepresentativeFragmentTestEnable, |
| pname:extendedDynamicState3RepresentativeFragmentTestEnable>> feature is |
| not enabled, there must: be no element of the pname:pDynamicStates |
| member of pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV |
| * [[VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ShadingRateImageEnable-07400]] |
| If the <<features-extendedDynamicState3ShadingRateImageEnable, |
| pname:extendedDynamicState3ShadingRateImageEnable>> feature is not |
| enabled, there must: be no element of the pname:pDynamicStates member of |
| pname:pDynamicState set to |
| ename:VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV |
| endif::VK_EXT_extended_dynamic_state3[] |
| ifdef::VK_EXT_opacity_micromap[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-07401]] |
| pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT |
| endif::VK_EXT_opacity_micromap[] |
| ifdef::VK_NV_displacement_micromap[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-07997]] |
| pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV |
| endif::VK_NV_displacement_micromap[] |
| ifdef::VK_QCOM_multiview_per_view_viewports[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07730]] |
| If the pipeline requires <<pipelines-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, and if |
| <<features-multiview-per-view-viewports, |
| pname:multiviewPerViewViewports>> is enabled, then the index of the most |
| significant bit in each element of |
| slink:VkRenderPassMultiviewCreateInfo::pname:pViewMasks must: be less |
| than pname:pViewportState::pname:viewportCount |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07731]] |
| If the pipeline requires <<pipelines-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, and if |
| <<features-multiview-per-view-viewports, |
| pname:multiviewPerViewViewports>> is enabled, then the index of the most |
| significant bit in each element of |
| slink:VkRenderPassMultiviewCreateInfo::pname:pViewMasks must: be less |
| than pname:pViewportState::pname:scissorCount |
| endif::VK_QCOM_multiview_per_view_viewports[] |
| ifdef::VK_EXT_shader_tile_image[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-08711]] |
| If pname:pStages includes a fragment shader stage, |
| ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE is not set in |
| slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates, and the |
| fragment shader declares the code:EarlyFragmentTests execution mode and |
| uses code:OpDepthAttachmentReadEXT, the pname:depthWriteEnable member of |
| slink:VkPipelineDepthStencilStateCreateInfo must: be ename:VK_FALSE |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-08712]] |
| If pname:pStages includes a fragment shader stage, |
| ename:VK_DYNAMIC_STATE_STENCIL_WRITE_MASK is not set in |
| slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates, and the |
| fragment shader declares the code:EarlyFragmentTests execution mode and |
| uses code:OpStencilAttachmentReadEXT, the value of |
| slink:VkStencilOpState::pname:writeMask for both pname:front and |
| pname:back in slink:VkPipelineDepthStencilStateCreateInfo must: be `0` |
| endif::VK_EXT_shader_tile_image[] |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-08744]] |
| If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output state>> or |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>, |
| the pipeline enables <<primsrast-sampleshading, sample shading>>, |
| pname:rasterizationSamples is not dynamic, and the pname:pNext chain |
| includes a slink:VkPipelineRenderingCreateInfo structure, |
| pname:rasterizationSamples must: be a bit value that is set in |
| pname:imageCreateSampleCounts (as defined in |
| <<resources-image-creation-limits,Image Creation Limits>>) for every |
| element of pname:depthAttachmentFormat, pname:stencilAttachmentFormat |
| and the pname:pColorAttachmentFormats array which is not |
| ename:VK_FORMAT_UNDEFINED |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifndef::VK_EXT_graphics_pipeline_library[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-None-08893]] |
| The pipeline must: be created with |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-pStages-08894]] |
| If pname:pStages includes a vertex shader stage, the pipeline must: be |
| created with <<pipelines-graphics-subsets-vertex-input, vertex input |
| state>> |
| ifndef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-08895]] |
| If pname:pRasterizationState->rasterizerDiscardEnable is ename:VK_FALSE, |
| the pipeline must: be created with |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> |
| and <<pipelines-graphics-subsets-fragment-output,fragment output |
| interface state>> |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| ifdef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-08896]] |
| If pname:pDynamicState->pDynamicStates includes |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE, or if it does not and |
| pname:pRasterizationState->rasterizerDiscardEnable is ename:VK_FALSE, |
| the pipeline must: be created with |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> |
| and <<pipelines-graphics-subsets-fragment-output,fragment output |
| interface state>> |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08897]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and that state includes a vertex shader stage in pname:pStages, the |
| pipeline must: define <<pipelines-graphics-subsets-vertex-input, vertex |
| input state>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08898]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT, and |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is not specified, the pipeline must: define |
| <<pipelines-graphics-subsets-vertex-input, vertex input state>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08899]] |
| If pname:flags does not include |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and that state includes a vertex shader stage in pname:pStages, the |
| pipeline must: either define |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> or include that state in a linked pipeline library |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08900]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT the |
| pipeline must: define <<pipelines-graphics-subsets-pre-rasterization, |
| pre-rasterization shader state>> |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08901]] |
| If pname:flags does not include |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, the pipeline must: either |
| define <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization |
| shader state>> or include that state in a linked pipeline library |
| ifndef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08902]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and that state has pname:pRasterizationState->rasterizerDiscardEnable |
| set to ename:VK_FALSE, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| ifdef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08903]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and that state either includes |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE or has |
| pname:pRasterizationState->rasterizerDiscardEnable set to |
| ename:VK_FALSE, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08904]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is not specified, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> |
| ifndef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08905]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and that state has pname:pRasterizationState->rasterizerDiscardEnable |
| set to ename:VK_FALSE, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-output,fragment output interface |
| state>> |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| ifdef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08906]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT, |
| and that state either includes |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE or has |
| pname:pRasterizationState->rasterizerDiscardEnable set to |
| ename:VK_FALSE, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-output,fragment output interface |
| state>> |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08907]] |
| If slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags includes |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, and |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is not specified, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-output,fragment output interface |
| state>> |
| ifndef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08908]] |
| If pname:flags does not include |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and that state has pname:pRasterizationState->rasterizerDiscardEnable |
| set to ename:VK_FALSE, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-output,fragment output interface |
| state>> and <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>> or include those states in linked pipeline libraries |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| ifndef::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-flags-08909]] |
| If pname:flags does not include |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| state>> is specified either in a library or by the inclusion of |
| ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT, |
| and that state either includes |
| ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE or has |
| pname:pRasterizationState->rasterizerDiscardEnable set to |
| ename:VK_FALSE, the pipeline must: define |
| <<pipelines-graphics-subsets-fragment-output,fragment output interface |
| state>> and <<pipelines-graphics-subsets-fragment-shader, fragment |
| shader state>> or include those states in linked pipeline libraries |
| endif::VK_EXT_extended_dynamic_state3,VK_VERSION_1_3[] |
| endif::VK_EXT_graphics_pipeline_library[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-None-09043]] |
| If |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| pname:pDynamicState->pDynamicStates does not include |
| ename:VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT, and |
| endif::VK_EXT_extended_dynamic_state3[] |
| the format of any color attachment is |
| ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, the pname:colorWriteMask member |
| of the corresponding element of pname:pColorBlendState->pAttachments |
| must: either include all of ename:VK_COLOR_COMPONENT_R_BIT, |
| ename:VK_COLOR_COMPONENT_G_BIT, and ename:VK_COLOR_COMPONENT_B_BIT, or |
| none of them |
| ifdef::VK_ANDROID_external_format_resolve[] |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09301]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, |
| slink:VkPipelineRenderingCreateInfo::pname:viewMask must: be `0` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09304]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is dlink:VK_NULL_HANDLE, |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, and |
| pname:rasterizationSamples is not dynamic, |
| slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples |
| must: be `1` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09305]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, and |
| pname:blendEnable is not dynamic, the pname:blendEnable member of each |
| element of pname:pColorBlendState->pAttachments must: be ename:VK_FALSE |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09306]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, and |
| pname:pDynamicState->pDynamicStates does not include |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR, |
| slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:width must: |
| be `1` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09307]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, and |
| pname:pDynamicState->pDynamicStates does not include |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR, |
| slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:height |
| must: be `1` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09308]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, pre-rasterization shader |
| state>> and <<pipelines-graphics-subsets-fragment-output, fragment |
| output interface state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, the last |
| <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization shader |
| stage>> must: not statically use a variable with the |
| code:PrimitiveShadingRateKHR built-in |
| endif::VK_KHR_fragment_shading_rate[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09309]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, |
| slink:VkPipelineRenderingCreateInfo::pname:colorAttachmentCount must: be |
| `1` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09310]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-shader, fragment shader state>> |
| and <<pipelines-graphics-subsets-fragment-output, fragment output |
| interface state>>, pname:renderPass is dlink:VK_NULL_HANDLE, and |
| slink:VkExternalFormatANDROID::pname:externalFormat is not `0`, the |
| fragment shader must: not declare the code:DepthReplacing or |
| code:StencilRefReplacingEXT execution modes |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09313]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is not dlink:VK_NULL_HANDLE, pname:subpass |
| includes an external format resolve attachment, and |
| pname:rasterizationSamples is not dynamic, |
| slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples |
| must: be ename:VK_SAMPLE_COUNT_1_BIT |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09314]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is not dlink:VK_NULL_HANDLE, pname:subpass |
| includes an external format resolve attachment, and pname:blendEnable is |
| not dynamic, the pname:blendEnable member of each element of |
| pname:pColorBlendState->pAttachments must: be ename:VK_FALSE |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09315]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is not dlink:VK_NULL_HANDLE, pname:subpass |
| includes an external format resolve attachment, and |
| pname:pDynamicState->pDynamicStates does not include |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR, |
| slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:width must: |
| be `1` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09316]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, fragment output interface |
| state>>, pname:renderPass is not dlink:VK_NULL_HANDLE, pname:subpass |
| includes an external format resolve attachment, and |
| pname:pDynamicState->pDynamicStates does not include |
| ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR, |
| slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:height |
| must: be `1` |
| * [[VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09317]] |
| If the <<features-externalFormatResolve, pname:externalFormatResolve>> |
| feature is enabled, the pipeline requires |
| <<pipelines-graphics-subsets-fragment-output, pre-rasterization shader |
| state>> and <<pipelines-graphics-subsets-fragment-output, fragment |
| output interface state>>, pname:renderPass is not dlink:VK_NULL_HANDLE, |
| and pname:subpass includes an external format resolve attachment, the |
| last <<pipelines-graphics-subsets-pre-rasterization, pre-rasterization |
| shader stage>> must: not statically use a variable with the |
| code:PrimitiveShadingRateKHR built-in |
| endif::VK_KHR_fragment_shading_rate[] |
| endif::VK_ANDROID_external_format_resolve[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * slink:VkGraphicsPipelineCreateInfo::pname:basePipelineHandle must: be |
| dlink:VK_NULL_HANDLE <<SCID-8>>. |
| * slink:VkGraphicsPipelineCreateInfo::pname:basePipelineIndex must: be |
| zero <<SCID-8>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/structs/VkGraphicsPipelineCreateInfo.adoc[] |
| -- |
| |
| ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| [open,refpage='VkPipelineRenderingCreateInfo',desc='Structure specifying attachment formats',type='structs',alias='VkPipelineRenderingCreateInfoKHR'] |
| -- |
| The sname:VkPipelineRenderingCreateInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineRenderingCreateInfo.adoc[] |
| |
| ifdef::VK_KHR_dynamic_rendering[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkPipelineRenderingCreateInfoKHR.adoc[] |
| endif::VK_KHR_dynamic_rendering[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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 a pointer to 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 the pname:pNext |
| chain of slink:VkGraphicsPipelineCreateInfo includes this structure, 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. |
| |
| ifdef::VK_ANDROID_external_format_resolve[] |
| If the render pass is going to be used with an external format resolve |
| attachment, a slink:VkExternalFormatANDROID structure must: also be included |
| in the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo, defining the |
| external format of the resolve attachment that will be used. |
| endif::VK_ANDROID_external_format_resolve[] |
| |
| include::{generated}/validity/structs/VkPipelineRenderingCreateInfo.adoc[] |
| -- |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| |
| ifdef::VK_KHR_maintenance5[] |
| [open,refpage='VkPipelineCreateFlags2CreateInfoKHR',desc='Extended pipeline create flags',type='structs'] |
| -- |
| The sname:VkPipelineCreateFlags2CreateInfoKHR structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineCreateFlags2CreateInfoKHR.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:flags is a bitmask of elink:VkPipelineCreateFlagBits2KHR |
| specifying how a pipeline will be generated. |
| |
| If this structure is included in the pname:pNext chain of a pipeline |
| creation structure, pname:flags is used instead of the corresponding |
| pname:flags value passed in that creation structure, allowing additional |
| creation flags to be specified. |
| |
| include::{generated}/validity/structs/VkPipelineCreateFlags2CreateInfoKHR.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineCreateFlagBits2KHR',desc='Bitmask controlling how a pipeline is created',type='enums'] |
| -- |
| Bits which can: be set in |
| slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags, specifying how a |
| pipeline is created, are: |
| |
| include::{generated}/api/enums/VkPipelineCreateFlagBits2KHR.adoc[] |
| |
| // Note - when editing this section, make sure that any relevant changes |
| // are mirrored in VkPipelineCreateFlagBits2KHR/VkPipelineCreateFlagBits |
| |
| * ename:VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR 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_2_ALLOW_DERIVATIVES_BIT_KHR 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_2_DERIVATIVE_BIT_KHR 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_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR |
| 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_2_DISPATCH_BASE_BIT_KHR 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_2_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_2_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_2_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. |
| ifdef::VK_KHR_pipeline_library[] |
| When capturing IR from pipelines created with pipeline libraries, there |
| is no guarantee that IR from libraries can: be retrieved from the linked |
| pipeline. |
| Applications should: retrieve IR from each library, and any linked |
| pipelines, separately. |
| endif::VK_KHR_pipeline_library[] |
| endif::VK_KHR_pipeline_executable_properties[] |
| ifdef::VK_KHR_pipeline_library[] |
| * ename:VK_PIPELINE_CREATE_2_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,VK_EXT_graphics_pipeline_library[] |
| This is available in |
| ifdef::VK_KHR_ray_tracing_pipeline[ray tracing] |
| ifdef::VK_KHR_ray_tracing_pipeline+VK_EXT_graphics_pipeline_library[and] |
| ifdef::VK_EXT_graphics_pipeline_library[graphics] |
| pipelines. |
| endif::VK_KHR_ray_tracing_pipeline,VK_EXT_graphics_pipeline_library[] |
| endif::VK_KHR_pipeline_library[] |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| * ename:VK_PIPELINE_CREATE_2_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_2_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_2_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_2_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_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR specifies |
| that triangle primitives will be skipped during traversal using |
| code:OpTraceRayKHR. |
| * ename:VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR specifies that |
| AABB primitives will be skipped during traversal using |
| code:OpTraceRayKHR. |
| * ename:VK_PIPELINE_CREATE_2_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_2_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_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| * ename:VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR |
| specifies that pipeline creation will fail if a compile is required for |
| creation of a valid slink:VkPipeline object; |
| ename:VK_PIPELINE_COMPILE_REQUIRED 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_2_EARLY_RETURN_ON_FAILURE_BIT_KHR specifies |
| that control will be returned to the application if any individual |
| pipeline returns a result which is not ename:VK_SUCCESS rather than |
| continuing to create additional pipelines. |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| ifdef::VK_NV_ray_tracing_motion_blur[] |
| * ename:VK_PIPELINE_CREATE_2_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_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * ename:VK_PIPELINE_CREATE_2_RENDERING_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_CREATE_2_RENDERING_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_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| * ename:VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT specifies that |
| pipeline libraries being linked into this library should: have link time |
| optimizations applied. |
| If this bit is omitted, implementations should: instead perform linking |
| as rapidly as possible. |
| * ename:VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT |
| specifies that pipeline libraries should retain any information |
| necessary to later perform an optimal link with |
| ename:VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT. |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifdef::VK_EXT_descriptor_buffer[] |
| * ename:VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT specifies that a |
| pipeline will be used with <<descriptorbuffers,descriptor buffers>>, |
| rather than <<descriptorsets,descriptor sets>>. |
| endif::VK_EXT_descriptor_buffer[] |
| ifdef::VK_EXT_attachment_feedback_loop_layout[] |
| * ename:VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| specifies that the pipeline may: be used with an attachment feedback |
| loop including color attachments. |
| * ename:VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| specifies that the pipeline may: be used with an attachment feedback |
| loop including depth-stencil attachments. |
| endif::VK_EXT_attachment_feedback_loop_layout[] |
| ifdef::VK_EXT_opacity_micromap[] |
| * ename:VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT |
| specifies that the pipeline can: be used with acceleration structures |
| which reference an opacity micromap array. |
| endif::VK_EXT_opacity_micromap[] |
| ifdef::VK_NV_displacement_micromap[] |
| * ename:VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV |
| specifies that the pipeline can: be used with aceleration structures |
| which reference a displacement micromap array. |
| endif::VK_NV_displacement_micromap[] |
| ifdef::VK_EXT_pipeline_protected_access[] |
| * ename:VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT specifies that |
| the pipeline must: not be bound to a protected command buffer. |
| * ename:VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT specifies that |
| the pipeline must: not be bound to an unprotected command buffer. |
| endif::VK_EXT_pipeline_protected_access[] |
| |
| It is valid to set both ename:VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT_KHR |
| and ename:VK_PIPELINE_CREATE_2_DERIVATIVE_BIT_KHR. |
| 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. |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| When an implementation is looking up a pipeline in a |
| <<pipelines-cache,pipeline cache>>, if that pipeline is being created using |
| linked libraries, implementations should: always return an equivalent |
| pipeline created with |
| ename:VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT if available, |
| whether or not that bit was specified. |
| |
| [NOTE] |
| .Note |
| ==== |
| Using ename:VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT (or not) |
| when linking pipeline libraries is intended as a performance tradeoff |
| between host and device. |
| If the bit is omitted, linking should be faster and produce a pipeline more |
| rapidly, but performance of the pipeline on the target device may be |
| reduced. |
| If the bit is included, linking may be slower but should produce a pipeline |
| with device performance comparable to a monolithically created pipeline. |
| Using both options can allow latency-sensitive applications to generate a |
| suboptimal but usable pipeline quickly, and then perform an optimal link in |
| the background, substituting the result for the suboptimally linked pipeline |
| as soon as it is available. |
| ==== |
| endif::VK_EXT_graphics_pipeline_library[] |
| -- |
| |
| [open,refpage='VkPipelineCreateFlags2KHR',desc='Bitmask of VkPipelineCreateFlagBits2KHR',type='flags'] |
| -- |
| include::{generated}/api/flags/VkPipelineCreateFlags2KHR.adoc[] |
| |
| tname:VkPipelineCreateFlags2KHR is a bitmask type for setting a mask of zero |
| or more elink:VkPipelineCreateFlagBits2KHR. |
| -- |
| endif::VK_KHR_maintenance5[] |
| |
| [open,refpage='VkPipelineCreateFlagBits',desc='Bitmask controlling how a pipeline is created',type='enums'] |
| -- |
| Bits which can: be set in |
| |
| * slink:VkGraphicsPipelineCreateInfo::pname:flags |
| * slink:VkComputePipelineCreateInfo::pname:flags |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| * slink:VkRayTracingPipelineCreateInfoKHR::pname:flags |
| endif::VK_KHR_ray_tracing_pipeline[] |
| ifdef::VK_NV_ray_tracing[] |
| * slink:VkRayTracingPipelineCreateInfoNV::pname:flags |
| endif::VK_NV_ray_tracing[] |
| |
| specify how a pipeline is created, and are: |
| |
| include::{generated}/api/enums/VkPipelineCreateFlagBits.adoc[] |
| |
| // Note - when editing this section, make sure that any relevant changes |
| // are mirrored in VkPipelineCreateFlagBits2KHR/VkPipelineCreateFlagBits |
| |
| * 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. |
| ifndef::VKSC_VERSION_1_0[] |
| * 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scremoved[] |
| * elink:VkPipelineCreateFlagBits |
| ** ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT <<SCID-8>> |
| ** ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT <<SCID-8>> |
| // end::scremoved[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| 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. |
| ifdef::VK_KHR_pipeline_library[] |
| When capturing IR from pipelines created with pipeline libraries, there |
| is no guarantee that IR from libraries can: be retrieved from the linked |
| pipeline. |
| Applications should: retrieve IR from each library, and any linked |
| pipelines, separately. |
| endif::VK_KHR_pipeline_library[] |
| 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,VK_EXT_graphics_pipeline_library[] |
| This is available in |
| ifdef::VK_KHR_ray_tracing_pipeline[ray tracing] |
| ifdef::VK_KHR_ray_tracing_pipeline+VK_EXT_graphics_pipeline_library[and] |
| ifdef::VK_EXT_graphics_pipeline_library[graphics] |
| pipelines. |
| endif::VK_KHR_ray_tracing_pipeline,VK_EXT_graphics_pipeline_library[] |
| 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_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| * ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT specifies |
| that pipeline creation will fail if a compile is required for creation |
| of a valid slink:VkPipeline object; ename:VK_PIPELINE_COMPILE_REQUIRED |
| 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 specifies that |
| control will be returned to the application if any individual pipeline |
| returns a result which is not ename:VK_SUCCESS rather than continuing to |
| create additional pipelines. |
| endif::VK_VERSION_1_3,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_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_KHR_fragment_shading_rate[] |
| * ename:VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR |
| specifies that the pipeline will be used with a fragment shading rate |
| attachment and dynamic rendering. |
| endif::VK_KHR_fragment_shading_rate[] |
| ifdef::VK_EXT_fragment_density_map[] |
| * ename:VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT |
| specifies that the pipeline will be used with a fragment density map |
| attachment and dynamic rendering. |
| endif::VK_EXT_fragment_density_map[] |
| endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| * ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT specifies that |
| pipeline libraries being linked into this library should: have link time |
| optimizations applied. |
| If this bit is omitted, implementations should: instead perform linking |
| as rapidly as possible. |
| * ename:VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT |
| specifies that pipeline libraries should retain any information |
| necessary to later perform an optimal link with |
| ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT. |
| endif::VK_EXT_graphics_pipeline_library[] |
| ifdef::VK_EXT_descriptor_buffer[] |
| * ename:VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT specifies that a |
| pipeline will be used with <<descriptorbuffers,descriptor buffers>>, |
| rather than <<descriptorsets,descriptor sets>>. |
| endif::VK_EXT_descriptor_buffer[] |
| ifdef::VK_EXT_attachment_feedback_loop_layout[] |
| * ename:VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| specifies that the pipeline may: be used with an attachment feedback |
| loop including color attachments. |
| ifdef::VK_EXT_attachment_feedback_loop_dynamic_state[] |
| It is ignored if |
| ename:VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT is set in |
| pname:pDynamicStates. |
| endif::VK_EXT_attachment_feedback_loop_dynamic_state[] |
| * ename:VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| specifies that the pipeline may: be used with an attachment feedback |
| loop including depth-stencil attachments. |
| ifdef::VK_EXT_attachment_feedback_loop_dynamic_state[] |
| It is ignored if |
| ename:VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT is set in |
| pname:pDynamicStates. |
| endif::VK_EXT_attachment_feedback_loop_dynamic_state[] |
| endif::VK_EXT_attachment_feedback_loop_layout[] |
| ifdef::VK_EXT_opacity_micromap[] |
| * ename:VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT specifies |
| that the pipeline can: be used with acceleration structures which |
| reference an opacity micromap array. |
| endif::VK_EXT_opacity_micromap[] |
| ifdef::VK_NV_displacement_micromap[] |
| * ename:VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV |
| specifies that the pipeline can: be used with aceleration structures |
| which reference a displacement micromap array. |
| endif::VK_NV_displacement_micromap[] |
| ifdef::VK_EXT_pipeline_protected_access[] |
| * ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT specifies that the |
| pipeline must: not be bound to a protected command buffer. |
| * ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT specifies that |
| the pipeline must: not be bound to an unprotected command buffer. |
| endif::VK_EXT_pipeline_protected_access[] |
| |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| When an implementation is looking up a pipeline in a |
| <<pipelines-cache,pipeline cache>>, if that pipeline is being created using |
| linked libraries, implementations should: always return an equivalent |
| pipeline created with |
| ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT if available, |
| whether or not that bit was specified. |
| |
| [NOTE] |
| .Note |
| ==== |
| Using ename:VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT (or not) when |
| linking pipeline libraries is intended as a performance tradeoff between |
| host and device. |
| If the bit is omitted, linking should be faster and produce a pipeline more |
| rapidly, but performance of the pipeline on the target device may be |
| reduced. |
| If the bit is included, linking may be slower but should produce a pipeline |
| with device performance comparable to a monolithically created pipeline. |
| Using both options can allow latency-sensitive applications to generate a |
| suboptimal but usable pipeline quickly, and then perform an optimal link in |
| the background, substituting the result for the suboptimally linked pipeline |
| as soon as it is available. |
| ==== |
| endif::VK_EXT_graphics_pipeline_library[] |
| -- |
| |
| [open,refpage='VkPipelineCreateFlags',desc='Bitmask of VkPipelineCreateFlagBits',type='flags'] |
| -- |
| include::{generated}/api/flags/VkPipelineCreateFlags.adoc[] |
| |
| tname:VkPipelineCreateFlags is a bitmask type for setting a mask of zero or |
| more elink:VkPipelineCreateFlagBits. |
| -- |
| |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| [open,refpage='VkGraphicsPipelineLibraryCreateInfoEXT',desc='Structure specifying the subsets of the graphics pipeline being compiled',type='structs'] |
| -- |
| The sname:VkGraphicsPipelineLibraryCreateInfoEXT structure is defined as: |
| |
| include::{generated}/api/structs/VkGraphicsPipelineLibraryCreateInfoEXT.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:flags is a bitmask of elink:VkGraphicsPipelineLibraryFlagBitsEXT |
| specifying the subsets of the graphics pipeline that are being compiled. |
| |
| If a sname:VkGraphicsPipelineLibraryCreateInfoEXT structure is included in |
| the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo, it specifies |
| the <<pipelines-graphics-subsets,subsets of the graphics pipeline>> being |
| created, excluding any subsets from linked pipeline libraries. |
| If the pipeline is created with pipeline libraries, state from those |
| libraries is aggregated with said subset. |
| |
| If this structure is omitted, and either |
| slink:VkGraphicsPipelineCreateInfo::pname:flags includes |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR or the |
| slink:VkGraphicsPipelineCreateInfo::pname:pNext chain includes a |
| slink:VkPipelineLibraryCreateInfoKHR structure with a pname:libraryCount |
| greater than `0`, it is as if pname:flags is `0`. |
| Otherwise if this structure is omitted, it is as if pname:flags includes all |
| possible subsets of the graphics pipeline (i.e. a |
| <<pipelines-graphics-subsets-complete,complete graphics pipeline>>). |
| |
| include::{generated}/validity/structs/VkGraphicsPipelineLibraryCreateInfoEXT.adoc[] |
| -- |
| |
| [open,refpage='VkGraphicsPipelineLibraryFlagsEXT', desc='Bitmask of VkGraphicsPipelineLibraryFlagBitsEXT', type='flags'] |
| -- |
| include::{generated}/api/flags/VkGraphicsPipelineLibraryFlagsEXT.adoc[] |
| |
| tname:VkGraphicsPipelineLibraryFlagsEXT is a bitmask type for setting a mask |
| of zero or more elink:VkGraphicsPipelineLibraryFlagBitsEXT. |
| -- |
| |
| [open,refpage='VkGraphicsPipelineLibraryFlagBitsEXT',desc='Bitmask specifying the subset of a graphics pipeline to compile',type='enums'] |
| -- |
| Possible values of the pname:flags member of |
| slink:VkGraphicsPipelineLibraryCreateInfoEXT, specifying the subsets of a |
| graphics pipeline to compile are: |
| |
| include::{generated}/api/enums/VkGraphicsPipelineLibraryFlagBitsEXT.adoc[] |
| |
| * ename:VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT |
| specifies that a pipeline will include |
| <<pipelines-graphics-subsets-vertex-input,vertex input interface |
| state>>. |
| * ename:VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT |
| specifies that a pipeline will include |
| <<pipelines-graphics-subsets-pre-rasterization,pre-rasterization shader |
| state>>. |
| * ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT specifies |
| that a pipeline will include |
| <<pipelines-graphics-subsets-fragment-shader,fragment shader state>>. |
| * ename:VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT |
| specifies that a pipeline will include |
| <<pipelines-graphics-subsets-fragment-output,fragment output interface |
| state>>. |
| -- |
| endif::VK_EXT_graphics_pipeline_library[] |
| |
| [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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineDynamicStateCreateFlags',desc='Reserved for future use',type='flags'] |
| -- |
| include::{generated}/api/flags/VkPipelineDynamicStateCreateFlags.adoc[] |
| |
| 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.adoc[] |
| |
| * 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. |
| ifdef::VK_EXT_depth_bias_control[] |
| * ename:VK_DYNAMIC_STATE_DEPTH_BIAS specifies that any instance of |
| slink:VkDepthBiasRepresentationInfoEXT included in the pname:pNext chain |
| of slink:VkPipelineRasterizationStateCreateInfo as well as the |
| pname:depthBiasConstantFactor, pname:depthBiasClamp and |
| pname:depthBiasSlopeFactor states in |
| slink:VkPipelineRasterizationStateCreateInfo will be ignored and must: |
| be set dynamically with either flink:vkCmdSetDepthBias or |
| flink:vkCmdSetDepthBias2EXT before any draws are performed with |
| <<primsrast-depthbias-enable, depth bias enabled>>. |
| endif::VK_EXT_depth_bias_control[] |
| ifndef::VK_EXT_depth_bias_control[] |
| * 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 <<primsrast-depthbias-enable, depth bias enabled>>. |
| endif::VK_EXT_depth_bias_control[] |
| * 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:pViewportWScalings 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. |
| * ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT specifies that the |
| presence of the slink:VkPipelineDiscardRectangleStateCreateInfoEXT |
| structure in the slink:VkGraphicsPipelineCreateInfo chain with a |
| pname:discardRectangleCount greater than zero does not implicitly enable |
| discard rectangles and they must: be enabled dynamically with |
| flink:vkCmdSetDiscardRectangleEnableEXT before any draw commands. |
| This is available on implementations that support at least |
| pname:specVersion `2` of the `apiext:VK_EXT_discard_rectangles` |
| extension. |
| * ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT specifies that the |
| pname:discardRectangleMode state in |
| slink:VkPipelineDiscardRectangleStateCreateInfoEXT will be ignored and |
| must: be set dynamically with flink:vkCmdSetDiscardRectangleModeEXT |
| before any draw commands. |
| This is available on implementations that support at least |
| pname:specVersion `2` of the `apiext:VK_EXT_discard_rectangles` |
| extension. |
| 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. |
| * ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV specifies that the |
| the exclusive scissors must: be explicitly enabled with |
| flink:vkCmdSetExclusiveScissorEnableNV and the |
| pname:exclusiveScissorCount value in |
| slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV will not |
| implicitly enable them. |
| This is available on implementations that support at least |
| pname:specVersion `2` of the `apiext:VK_NV_scissor_exclusive` extension. |
| 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_VERSION_1_3,VK_EXT_extended_dynamic_state[] |
| * ename:VK_DYNAMIC_STATE_CULL_MODE specifies that the pname:cullMode state |
| in slink:VkPipelineRasterizationStateCreateInfo will be ignored and |
| must: be set dynamically with flink:vkCmdSetCullMode before any drawing |
| commands. |
| * ename:VK_DYNAMIC_STATE_FRONT_FACE specifies that the pname:frontFace |
| state in slink:VkPipelineRasterizationStateCreateInfo will be ignored |
| and must: be set dynamically with flink:vkCmdSetFrontFace before any |
| drawing commands. |
| * ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY 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:vkCmdSetPrimitiveTopology before any drawing commands. |
| * ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT specifies that the |
| pname:viewportCount and pname:pViewports state in |
| slink:VkPipelineViewportStateCreateInfo will be ignored and must: be set |
| dynamically with flink:vkCmdSetViewportWithCount before any draw call. |
| * ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT specifies that the |
| pname:scissorCount and pname:pScissors state in |
| slink:VkPipelineViewportStateCreateInfo will be ignored and must: be set |
| dynamically with flink:vkCmdSetScissorWithCount before any draw call. |
| * ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE specifies that the |
| pname:stride state in slink:VkVertexInputBindingDescription will be |
| ignored and must: be set dynamically with flink:vkCmdBindVertexBuffers2 |
| before any draw call. |
| * ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE specifies that the |
| pname:depthTestEnable state in |
| slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetDepthTestEnable before any draw call. |
| * ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE specifies that the |
| pname:depthWriteEnable state in |
| slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetDepthWriteEnable before any draw |
| call. |
| * ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP specifies that the |
| pname:depthCompareOp state in |
| slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetDepthCompareOp before any draw call. |
| * ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE specifies that the |
| pname:depthBoundsTestEnable state in |
| slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetDepthBoundsTestEnable before any draw |
| call. |
| * ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE specifies that the |
| pname:stencilTestEnable state in |
| slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetStencilTestEnable before any draw |
| call. |
| * ename:VK_DYNAMIC_STATE_STENCIL_OP 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:vkCmdSetStencilOp before any draws are performed with a pipeline |
| state with sname:VkPipelineDepthStencilStateCreateInfo member |
| pname:stencilTestEnable set to ename:VK_TRUE |
| endif::VK_VERSION_1_3,VK_EXT_extended_dynamic_state[] |
| ifdef::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2[] |
| 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. |
| endif::VK_EXT_extended_dynamic_state2[] |
| * ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE specifies that the |
| pname:rasterizerDiscardEnable state in |
| slink:VkPipelineRasterizationStateCreateInfo will be ignored and must: |
| be set dynamically with flink:vkCmdSetRasterizerDiscardEnable before any |
| drawing commands. |
| * ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE specifies that the |
| pname:depthBiasEnable state in |
| slink:VkPipelineRasterizationStateCreateInfo will be ignored and must: |
| be set dynamically with flink:vkCmdSetDepthBiasEnable before any drawing |
| commands. |
| ifdef::VK_EXT_extended_dynamic_state2[] |
| * 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. |
| endif::VK_EXT_extended_dynamic_state2[] |
| * ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE specifies that the |
| pname:primitiveRestartEnable state in |
| slink:VkPipelineInputAssemblyStateCreateInfo will be ignored and must: |
| be set dynamically with flink:vkCmdSetPrimitiveRestartEnable before any |
| drawing commands. |
| endif::VK_VERSION_1_3,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[] |
| ifdef::VK_EXT_extended_dynamic_state3[] |
| * ename:VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT specifies that the |
| pname:domainOrigin state in |
| slink:VkPipelineTessellationDomainOriginStateCreateInfo will be ignored |
| and must: be set dynamically with |
| flink:vkCmdSetTessellationDomainOriginEXT before any draw call. |
| * ename:VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT specifies that the |
| pname:depthClampEnable state in |
| slink:VkPipelineRasterizationStateCreateInfo will be ignored and must: |
| be set dynamically with flink:vkCmdSetDepthClampEnableEXT before any |
| draw call. |
| * ename:VK_DYNAMIC_STATE_POLYGON_MODE_EXT specifies that the |
| pname:polygonMode state in slink:VkPipelineRasterizationStateCreateInfo |
| will be ignored and must: be set dynamically with |
| flink:vkCmdSetPolygonModeEXT before any draw call. |
| * ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT specifies that the |
| pname:rasterizationSamples state in |
| slink:VkPipelineMultisampleStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetRasterizationSamplesEXT before any |
| draw call. |
| * ename:VK_DYNAMIC_STATE_SAMPLE_MASK_EXT specifies that the |
| pname:pSampleMask state in slink:VkPipelineMultisampleStateCreateInfo |
| will be ignored and must: be set dynamically with |
| flink:vkCmdSetSampleMaskEXT before any draw call. |
| * ename:VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT specifies that the |
| pname:alphaToCoverageEnable state in |
| slink:VkPipelineMultisampleStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetAlphaToCoverageEnableEXT before any |
| draw call. |
| * ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT specifies that the |
| pname:alphaToOneEnable state in |
| slink:VkPipelineMultisampleStateCreateInfo will be ignored and must: be |
| set dynamically with flink:vkCmdSetAlphaToOneEnableEXT before any draw |
| call. |
| * ename:VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT specifies that the |
| pname:logicOpEnable state in slink:VkPipelineColorBlendStateCreateInfo |
| will be ignored and must: be set dynamically with |
| flink:vkCmdSetLogicOpEnableEXT before any draw call. |
| * ename:VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT specifies that the |
| pname:blendEnable state in slink:VkPipelineColorBlendAttachmentState |
| will be ignored and must: be set dynamically with |
| flink:vkCmdSetColorBlendEnableEXT before any draw call. |
| * ename:VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT specifies that the |
| pname:srcColorBlendFactor, pname:dstColorBlendFactor, |
| pname:colorBlendOp, pname:srcAlphaBlendFactor, |
| pname:dstAlphaBlendFactor, and pname:alphaBlendOp states in |
| slink:VkPipelineColorBlendAttachmentState will be ignored and must: be |
| set dynamically with flink:vkCmdSetColorBlendEquationEXT before any draw |
| call. |
| * ename:VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT specifies that the |
| pname:colorWriteMask state in slink:VkPipelineColorBlendAttachmentState |
| will be ignored and must: be set dynamically with |
| flink:vkCmdSetColorWriteMaskEXT before any draw call. |
| ifdef::VK_EXT_transform_feedback[] |
| * ename:VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT specifies that the |
| pname:rasterizationStream state in |
| slink:VkPipelineRasterizationStateStreamCreateInfoEXT will be ignored |
| and must: be set dynamically with flink:vkCmdSetRasterizationStreamEXT |
| before any draw call. |
| endif::VK_EXT_transform_feedback[] |
| ifdef::VK_EXT_conservative_rasterization[] |
| * ename:VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT specifies |
| that the pname:conservativeRasterizationMode state in |
| slink:VkPipelineRasterizationConservativeStateCreateInfoEXT will be |
| ignored and must: be set dynamically with |
| flink:vkCmdSetConservativeRasterizationModeEXT before any draw call. |
| * ename:VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT specifies |
| that the pname:extraPrimitiveOverestimationSize state in |
| slink:VkPipelineRasterizationConservativeStateCreateInfoEXT will be |
| ignored and must: be set dynamically with |
| flink:vkCmdSetExtraPrimitiveOverestimationSizeEXT before any draw call. |
| endif::VK_EXT_conservative_rasterization[] |
| ifdef::VK_EXT_depth_clip_enable[] |
| * ename:VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT specifies that the |
| pname:depthClipEnable state in |
| slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT will be ignored |
| and must: be set dynamically with flink:vkCmdSetDepthClipEnableEXT |
| before any draw call. |
| endif::VK_EXT_depth_clip_enable[] |
| ifdef::VK_EXT_sample_locations[] |
| * ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT specifies that the |
| pname:sampleLocationsEnable state in |
| slink:VkPipelineSampleLocationsStateCreateInfoEXT will be ignored and |
| must: be set dynamically with flink:vkCmdSetSampleLocationsEnableEXT |
| before any draw call. |
| endif::VK_EXT_sample_locations[] |
| ifdef::VK_EXT_blend_operation_advanced[] |
| * ename:VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT specifies that the |
| pname:colorBlendOp state in slink:VkPipelineColorBlendAttachmentState, |
| and pname:srcPremultiplied, pname:dstPremultiplied, and |
| pname:blendOverlap states in |
| slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT will be ignored and |
| must: be set dynamically with flink:vkCmdSetColorBlendAdvancedEXT before |
| any draw call. |
| endif::VK_EXT_blend_operation_advanced[] |
| ifdef::VK_EXT_provoking_vertex[] |
| * ename:VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT specifies that the |
| pname:provokingVertexMode state in |
| slink:VkPipelineRasterizationProvokingVertexStateCreateInfoEXT will be |
| ignored and must: be set dynamically with |
| flink:vkCmdSetProvokingVertexModeEXT before any draw call. |
| endif::VK_EXT_provoking_vertex[] |
| ifdef::VK_EXT_line_rasterization[] |
| * ename:VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT specifies that the |
| pname:lineRasterizationMode state in |
| slink:VkPipelineRasterizationLineStateCreateInfoEXT will be ignored and |
| must: be set dynamically with flink:vkCmdSetLineRasterizationModeEXT |
| before any draw call. |
| * ename:VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT specifies that the |
| pname:stippledLineEnable state in |
| slink:VkPipelineRasterizationLineStateCreateInfoEXT will be ignored and |
| must: be set dynamically with flink:vkCmdSetLineStippleEnableEXT before |
| any draw call. |
| endif::VK_EXT_line_rasterization[] |
| ifdef::VK_EXT_depth_clip_control[] |
| * ename:VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT specifies that |
| the pname:negativeOneToOne state in |
| slink:VkPipelineViewportDepthClipControlCreateInfoEXT will be ignored |
| and must: be set dynamically with |
| flink:vkCmdSetDepthClipNegativeOneToOneEXT before any draw call. |
| endif::VK_EXT_depth_clip_control[] |
| ifdef::VK_NV_clip_space_w_scaling[] |
| * ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV specifies that the |
| pname:viewportWScalingEnable state in |
| slink:VkPipelineViewportWScalingStateCreateInfoNV will be ignored and |
| must: be set dynamically with flink:vkCmdSetViewportWScalingEnableNV |
| before any draw call. |
| endif::VK_NV_clip_space_w_scaling[] |
| ifdef::VK_NV_viewport_swizzle[] |
| * ename:VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV specifies that the |
| pname:viewportCount, and pname:pViewportSwizzles states in |
| slink:VkPipelineViewportSwizzleStateCreateInfoNV will be ignored and |
| must: be set dynamically with flink:vkCmdSetViewportSwizzleNV before any |
| draw call. |
| endif::VK_NV_viewport_swizzle[] |
| ifdef::VK_NV_fragment_coverage_to_color[] |
| * ename:VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV specifies that the |
| pname:coverageToColorEnable state in |
| slink:VkPipelineCoverageToColorStateCreateInfoNV will be ignored and |
| must: be set dynamically with flink:vkCmdSetCoverageToColorEnableNV |
| before any draw call. |
| * ename:VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV specifies that the |
| pname:coverageToColorLocation state in |
| slink:VkPipelineCoverageToColorStateCreateInfoNV will be ignored and |
| must: be set dynamically with flink:vkCmdSetCoverageToColorLocationNV |
| before any draw call. |
| endif::VK_NV_fragment_coverage_to_color[] |
| ifdef::VK_NV_framebuffer_mixed_samples[] |
| * ename:VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV specifies that the |
| pname:coverageModulationMode state in |
| slink:VkPipelineCoverageModulationStateCreateInfoNV will be ignored and |
| must: be set dynamically with flink:vkCmdSetCoverageModulationModeNV |
| before any draw call. |
| * ename:VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV specifies |
| that the pname:coverageModulationTableEnable state in |
| slink:VkPipelineCoverageModulationStateCreateInfoNV will be ignored and |
| must: be set dynamically with |
| flink:vkCmdSetCoverageModulationTableEnableNV before any draw call. |
| * ename:VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV specifies that the |
| pname:coverageModulationTableCount, and pname:pCoverageModulationTable |
| states in slink:VkPipelineCoverageModulationStateCreateInfoNV will be |
| ignored and must: be set dynamically with |
| flink:vkCmdSetCoverageModulationTableNV before any draw call. |
| endif::VK_NV_framebuffer_mixed_samples[] |
| ifdef::VK_NV_shading_rate_image[] |
| * ename:VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV specifies that the |
| pname:shadingRateImageEnable state in |
| slink:VkPipelineViewportShadingRateImageStateCreateInfoNV will be |
| ignored and must: be set dynamically with |
| flink:vkCmdSetShadingRateImageEnableNV before any draw call. |
| endif::VK_NV_shading_rate_image[] |
| ifdef::VK_NV_representative_fragment_test[] |
| * ename:VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV specifies |
| that the pname:representativeFragmentTestEnable state in |
| slink:VkPipelineRepresentativeFragmentTestStateCreateInfoNV will be |
| ignored and must: be set dynamically with |
| flink:vkCmdSetRepresentativeFragmentTestEnableNV before any draw call. |
| endif::VK_NV_representative_fragment_test[] |
| ifdef::VK_NV_coverage_reduction_mode[] |
| * ename:VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV specifies that the |
| pname:coverageReductionMode state in |
| slink:VkPipelineCoverageReductionStateCreateInfoNV will be ignored and |
| must: be set dynamically with flink:vkCmdSetCoverageReductionModeNV |
| before any draw call. |
| endif::VK_NV_coverage_reduction_mode[] |
| ifdef::VK_EXT_attachment_feedback_loop_dynamic_state[] |
| * ename:VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT specifies |
| that the ename:VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| and |
| ename:VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT |
| flags will be ignored and must: be set dynamically with |
| flink:vkCmdSetAttachmentFeedbackLoopEnableEXT before any draw call. |
| endif::VK_EXT_attachment_feedback_loop_dynamic_state[] |
| endif::VK_EXT_extended_dynamic_state3[] |
| -- |
| |
| |
| === Valid Combinations of Stages for Graphics Pipelines |
| |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| Primitive processing can be handled either 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,VK_EXT_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 determined by <<fragops, Fragment |
| Operations>> state. |
| 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,VK_EXT_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,VK_EXT_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 |
| individual 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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,VK_EXT_mesh_shader[] |
| * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02883]] |
| All elements of pname:pGroups must: use the same shader stage |
| combinations |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| ifdef::VK_NV_mesh_shader,VK_EXT_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,VK_EXT_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, pname:deviceGeneratedCommands>> |
| feature must: be enabled |
| **** |
| |
| include::{generated}/validity/structs/VkGraphicsPipelineShaderGroupsCreateInfoNV.adoc[] |
| -- |
| |
| [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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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.adoc[] |
| -- |
| 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.adoc[] |
| |
| ifdef::VK_NV_ray_tracing[] |
| or the equivalent |
| |
| include::{generated}/api/enums/VK_SHADER_UNUSED_NV.adoc[] |
| 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.adoc[] |
| |
| * pname:device is the logical device that creates the ray tracing |
| pipelines. |
| ifndef::VKSC_VERSION_1_0[] |
| * 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| * pname:pipelineCache is the handle of a valid <<pipelines-cache,pipeline |
| cache>> object. |
| endif::VKSC_VERSION_1_0[] |
| * 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. |
| |
| ifdef::VKSC_VERSION_1_0[] |
| If a pipeline creation fails due to: |
| |
| * The identified pipeline not being present in pname:pipelineCache |
| * The pname:pNext chain not including a slink:VkPipelineOfflineCreateInfo |
| structure |
| |
| the operation will continue as specified in <<pipelines-multiple, Multiple |
| Pipeline Creation>> and the command will return |
| ename:VK_ERROR_NO_PIPELINE_MATCH. |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| ifdef::VK_NV_ray_tracing[] |
| * flink:vkCreateRayTracingPipelinesNV returns |
| ename:VK_ERROR_NO_PIPELINE_MATCH if the |
| slink:VkRayTracingPipelineCreateInfoNV::pname:pNext chain does not |
| include a valid slink:VkPipelineOfflineCreateInfo structure <<SCID-1>>. |
| endif::VK_NV_ray_tracing[] |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| .Valid Usage |
| **** |
| include::{chapters}/commonvalidity/create_ray_tracing_pipelines_common.adoc[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| ifdef::VK_NV_ray_tracing[] |
| * flink:vkCreateRayTracingPipelinesNV::pname:pipelineCache must: not be |
| dlink:VK_NULL_HANDLE <<SCID-1>>, <<SCID-8>>. |
| endif::VK_NV_ray_tracing[] |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/protos/vkCreateRayTracingPipelinesNV.adoc[] |
| -- |
| 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.adoc[] |
| |
| * 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. |
| ifndef::VKSC_VERSION_1_0[] |
| * 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| * pname:pipelineCache is the handle of a valid <<pipelines-cache,pipeline |
| cache>> object. |
| endif::VKSC_VERSION_1_0[] |
| * 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 reuse the shader group handles provided in |
| slink:VkRayTracingShaderGroupCreateInfoKHR::pname:pShaderGroupCaptureReplayHandle |
| when |
| slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay |
| is enabled. |
| |
| ifdef::VKSC_VERSION_1_0[] |
| If a pipeline creation fails due to: |
| |
| * The identified pipeline not being present in pname:pipelineCache |
| * The pname:pNext chain not including a slink:VkPipelineOfflineCreateInfo |
| structure |
| |
| the operation will continue as specified in <<pipelines-multiple, Multiple |
| Pipeline Creation>> and the command will return |
| ename:VK_ERROR_NO_PIPELINE_MATCH. |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| * flink:vkCreateRayTracingPipelinesKHR returns |
| ename:VK_ERROR_NO_PIPELINE_MATCH if the |
| slink:VkRayTracingPipelineCreateInfoKHR::pname:pNext chain does not |
| include a valid slink:VkPipelineOfflineCreateInfo structure <<SCID-1>>. |
| endif::VK_KHR_ray_tracing_pipeline[] |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| .Valid Usage |
| **** |
| include::{chapters}/commonvalidity/create_ray_tracing_pipelines_common.adoc[] |
| include::{chapters}/commonvalidity/deferred_operations_common.adoc[] |
| * [[VUID-vkCreateRayTracingPipelinesKHR-rayTracingPipeline-03586]] |
| The <<features-rayTracingPipeline, pname:rayTracingPipeline>> feature |
| must: be enabled |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| ifdef::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 |
| endif::VK_KHR_deferred_host_operations[] |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| * flink:vkCreateRayTracingPipelinesKHR::pname:pipelineCache must: not be |
| dlink:VK_NULL_HANDLE <<SCID-1>>, <<SCID-8>>. |
| endif::VK_KHR_ray_tracing_pipeline[] |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/protos/vkCreateRayTracingPipelinesKHR.adoc[] |
| -- |
| 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| * pname:basePipelineIndex is an index into the pname:pCreateInfos |
| parameter to use as a pipeline to derive from. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| |
| The parameters pname:basePipelineHandle and pname:basePipelineIndex are |
| described in more detail in <<pipelines-pipeline-derivatives,Pipeline |
| Derivatives>>. |
| |
| ifdef::VK_KHR_maintenance5[] |
| If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the |
| pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags |
| from that structure is used instead of pname:flags from this structure. |
| endif::VK_KHR_maintenance5[] |
| |
| .Valid Usage |
| **** |
| :pipelineType: ray tracing |
| include::{chapters}/commonvalidity/pipeline_create_info_common.adoc[] |
| include::{chapters}/commonvalidity/ray_tracing_pipeline_create_info_common.adoc[] |
| * [[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_VERSION_1_3,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 at the |
| same time |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| ifdef::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| * [[VUID-VkRayTracingPipelineCreateInfoNV-pipelineStageCreationFeedbackCount-06651]] |
| If |
| slink:VkPipelineCreationFeedbackCreateInfo::pname:pipelineStageCreationFeedbackCount |
| is not `0`, it must: be equal to pname:stageCount |
| endif::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| * [[VUID-VkRayTracingPipelineCreateInfoNV-stage-06898]] |
| The pname:stage value in all pname:pStages elements must: be one of |
| ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR, |
| ename:VK_SHADER_STAGE_ANY_HIT_BIT_KHR, |
| ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, |
| ename:VK_SHADER_STAGE_MISS_BIT_KHR, |
| ename:VK_SHADER_STAGE_INTERSECTION_BIT_KHR, or |
| ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR |
| ifdef::VK_EXT_opacity_micromap[] |
| * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-07402]] |
| pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT |
| endif::VK_EXT_opacity_micromap[] |
| ifdef::VK_NV_displacement_micromap[] |
| * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-07998]] |
| pname:flags must: not include |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV |
| endif::VK_NV_displacement_micromap[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| ifdef::VK_NV_ray_tracing[] |
| * slink:VkRayTracingPipelineCreateInfoNV::pname:basePipelineHandle must: |
| be dlink:VK_NULL_HANDLE <<SCID-8>>. |
| * slink:VkRayTracingPipelineCreateInfoNV::pname:basePipelineIndex must: be |
| zero <<SCID-8>>. |
| endif::VK_NV_ray_tracing[] |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/structs/VkRayTracingPipelineCreateInfoNV.adoc[] |
| -- |
| 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| * pname:basePipelineIndex is an index into the pname:pCreateInfos |
| parameter to use as a pipeline to derive from. |
| ifdef::VKSC_VERSION_1_0[] |
| This is not used in Vulkan SC <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| |
| 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>>. |
| |
| ifdef::VK_KHR_maintenance5[] |
| If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the |
| pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags |
| from that structure is used instead of pname:flags from this structure. |
| endif::VK_KHR_maintenance5[] |
| |
| .Valid Usage |
| **** |
| :pipelineType: ray tracing |
| include::{chapters}/commonvalidity/pipeline_create_info_common.adoc[] |
| include::{chapters}/commonvalidity/ray_tracing_pipeline_create_info_common.adoc[] |
| * [[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`, pname:pLibraryInterface 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-06546]] |
| pname:flags must: not include both |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR and |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_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-07999]] |
| If pname:pLibraryInfo is `NULL` or its pname:libraryCount is `0`, |
| pname:stageCount must: not be `0` |
| * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-08700]] |
| If pname:flags does not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| and either pname:pLibraryInfo is `NULL` or 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 |
| ifdef::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| * [[VUID-VkRayTracingPipelineCreateInfoKHR-pipelineStageCreationFeedbackCount-06652]] |
| If |
| slink:VkPipelineCreationFeedbackCreateInfo::pname:pipelineStageCreationFeedbackCount |
| is not `0`, it must: be equal to pname:stageCount |
| endif::VK_EXT_pipeline_creation_feedback,VK_VERSION_1_3[] |
| * [[VUID-VkRayTracingPipelineCreateInfoKHR-stage-06899]] |
| The pname:stage value in all pname:pStages elements must: be one of |
| ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR, |
| ename:VK_SHADER_STAGE_ANY_HIT_BIT_KHR, |
| ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, |
| ename:VK_SHADER_STAGE_MISS_BIT_KHR, |
| ename:VK_SHADER_STAGE_INTERSECTION_BIT_KHR, or |
| ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR |
| ifdef::VK_EXT_opacity_micromap[] |
| * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-07403]] |
| If pname:flags includes |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT, each |
| element of pname:pLibraryInfo->pLibraries must: have been created with |
| the ename:VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT bit |
| set |
| endif::VK_EXT_opacity_micromap[] |
| ifdef::VK_NV_displacement_micromap[] |
| * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-08701]] |
| If pname:flags includes |
| ename:VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV, each |
| element of pname:pLibraryInfo->pLibraries must: have been created with |
| the ename:VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV |
| bit set |
| endif::VK_NV_displacement_micromap[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| * slink:VkRayTracingPipelineCreateInfoKHR::pname:flags must: not contain |
| the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag <<SCID-8>>. |
| * slink:VkRayTracingPipelineCreateInfoKHR::pname:basePipelineHandle must: |
| be dlink:VK_NULL_HANDLE <<SCID-8>>. |
| * slink:VkRayTracingPipelineCreateInfoKHR::pname:basePipelineIndex must: |
| be zero <<SCID-8>>. |
| endif::VK_KHR_ray_tracing_pipeline[] |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/structs/VkRayTracingPipelineCreateInfoKHR.adoc[] |
| -- |
| 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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.adoc[] |
| -- |
| |
| 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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 queried from |
| flink:vkGetRayTracingCaptureReplayShaderGroupHandlesKHR, as described in |
| <<ray-tracing-capture-replay, Ray Tracing Capture Replay>>. |
| Ignored if |
| slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay |
| is ename:VK_FALSE. |
| |
| ifdef::VK_EXT_pipeline_library_group_handles[] |
| If the pipeline is created with ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR and |
| the <<features-pipelineLibraryGroupHandles,pipelineLibraryGroupHandles>> |
| feature is enabled, pname:pShaderGroupCaptureReplayHandle is inherited by |
| all pipelines which link against this pipeline and remains bitwise identical |
| for any pipeline which references this pipeline library. |
| endif::VK_EXT_pipeline_library_group_handles[] |
| |
| .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.adoc[] |
| -- |
| 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.adoc[] |
| |
| ifdef::VK_NV_ray_tracing[] |
| or the equivalent |
| |
| include::{generated}/api/enums/VkRayTracingShaderGroupTypeNV.adoc[] |
| 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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.adoc[] |
| -- |
| 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.adoc[] |
| 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.adoc[] |
| 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. |
| |
| ifdef::VK_EXT_pipeline_library_group_handles[] |
| If pname:pipeline was created with ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| and the <<features-pipelineLibraryGroupHandles,pipelineLibraryGroupHandles>> |
| feature is enabled applications can: query group handles from that pipeline, |
| even if the pipeline is a library and is never bound to a command buffer. |
| These group handles remain bitwise identical for any pname:pipeline which |
| references the pipeline library. |
| Group indices are assigned as-if the pipeline was created without |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR. |
| endif::VK_EXT_pipeline_library_group_handles[] |
| |
| .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[] |
| ifdef::VK_EXT_pipeline_library_group_handles[] |
| * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-07828]] |
| If the |
| <<features-pipelineLibraryGroupHandles,pipelineLibraryGroupHandles>> |
| feature is not enabled, pname:pipeline must: not have been created with |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| endif::VK_EXT_pipeline_library_group_handles[] |
| ifndef::VK_EXT_pipeline_library_group_handles[] |
| * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482]] |
| pname:pipeline must: not have been created with |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| endif::VK_EXT_pipeline_library_group_handles[] |
| endif::VK_KHR_pipeline_library[] |
| **** |
| |
| include::{generated}/validity/protos/vkGetRayTracingShaderGroupHandlesKHR.adoc[] |
| -- |
| |
| ifdef::VK_KHR_ray_tracing_pipeline[] |
| [open,refpage='vkGetRayTracingCaptureReplayShaderGroupHandlesKHR',desc='Query opaque capture replay data for pipeline shader group handles',type='protos'] |
| -- |
| :refpage: vkGetRayTracingCaptureReplayShaderGroupHandlesKHR |
| |
| To query the opaque capture data of shader groups in a ray tracing pipeline, |
| call: |
| |
| include::{generated}/api/protos/vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.adoc[] |
| |
| * 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. |
| |
| Once queried, this opaque data can: be provided at pipeline creation time |
| (in a subsequent execution), using |
| slink:VkRayTracingShaderGroupCreateInfoKHR::pname:pShaderGroupCaptureReplayHandle, |
| as described in <<ray-tracing-capture-replay, Ray Tracing Capture Replay>>. |
| |
| ifdef::VK_EXT_pipeline_library_group_handles[] |
| If pname:pipeline was created with ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| and the <<features-pipelineLibraryGroupHandles,pipelineLibraryGroupHandles>> |
| feature is enabled applications can: query capture replay group handles from |
| that pipeline. |
| The capture replay handle remains bitwise identical for any pname:pipeline |
| which references the pipeline library. |
| Group indices are assigned as-if the pipeline was created without |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR. |
| endif::VK_EXT_pipeline_library_group_handles[] |
| |
| .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 |
| ifdef::VK_KHR_pipeline_library[] |
| ifdef::VK_EXT_pipeline_library_group_handles[] |
| * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-07829]] |
| If the |
| <<features-pipelineLibraryGroupHandles,pipelineLibraryGroupHandles>> |
| feature is not enabled, pname:pipeline must: not have been created with |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| endif::VK_EXT_pipeline_library_group_handles[] |
| ifndef::VK_EXT_pipeline_library_group_handles[] |
| * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-07830]] |
| pname:pipeline must: not have been created with |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| endif::VK_EXT_pipeline_library_group_handles[] |
| endif::VK_KHR_pipeline_library[] |
| **** |
| |
| include::{generated}/validity/protos/vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.adoc[] |
| -- |
| 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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| 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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| |
| [open,refpage='VkShaderGroupShaderKHR',desc='Shader group shaders',type='enums'] |
| -- |
| Possible values of pname:groupShader in |
| flink:vkGetRayTracingShaderGroupStackSizeKHR are: |
| |
| include::{generated}/api/enums/VkShaderGroupShaderKHR.adoc[] |
| |
| * 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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| 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.adoc[] |
| |
| * 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 |
| ifndef::VKSC_VERSION_1_0[] |
| * [[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` |
| endif::VKSC_VERSION_1_0[] |
| **** |
| |
| include::{generated}/validity/protos/vkDestroyPipeline.adoc[] |
| -- |
| |
| |
| [[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_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| If creation fails for a pipeline that had |
| ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT 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_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| |
| If multiple pipelines fail to be created, the elink:VkResult must: be the |
| return value of any of the pipelines which did not return ename:VK_SUCCESS. |
| |
| |
| [[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. |
| |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| Pipeline derivatives are not supported in Vulkan SC due to the use of |
| read-only offline generated pipeline caches <<SCID-8>>. |
| endif::VKSC_VERSION_1_0[] |
| |
| [[pipelines-cache]] |
| == Pipeline Cache |
| |
| [open,refpage='VkPipelineCache',desc='Opaque handle to a pipeline cache object',type='handles'] |
| -- |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| Pipeline cache objects allow the application to load multiple binary |
| pipeline objects generated by an offline cache creation tool into pipeline |
| cache objects. |
| The cache can then be used during pipeline creation to load offline pipeline |
| data. |
| endif::VKSC_VERSION_1_0[] |
| |
| Pipeline cache objects are represented by sname:VkPipelineCache handles: |
| |
| include::{generated}/api/handles/VkPipelineCache.adoc[] |
| -- |
| |
| |
| [[pipelines-cache-create]] |
| === Creating a Pipeline Cache |
| |
| [open,refpage='vkCreatePipelineCache',desc='Creates a new pipeline cache',type='protos'] |
| -- |
| :refpage: vkCreatePipelineCache |
| :objectnameplural: pipeline caches |
| :objectnamecamelcase: pipelineCache |
| :objectcount: 1 |
| |
| To create pipeline cache objects, call: |
| |
| include::{generated}/api/protos/vkCreatePipelineCache.adoc[] |
| |
| * 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. |
| |
| ifndef::VKSC_VERSION_1_0[] |
| [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. |
| ==== |
| endif::VKSC_VERSION_1_0[] |
| |
| ifdef::VKSC_VERSION_1_0[] |
| If the pipeline cache data pointed to by |
| slink:VkPipelineCacheCreateInfo::pname:pInitialData is not compatible with |
| the device, pipeline cache creation will fail and |
| ename:VK_ERROR_INVALID_PIPELINE_CACHE_DATA will be returned. |
| endif::VKSC_VERSION_1_0[] |
| |
| 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. |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| The pipeline cache passed into these commands will be queried by the |
| implementation for matching pipelines on pipeline creation. |
| After the cache is created, its contents cannot be updated. |
| endif::VKSC_VERSION_1_0[] |
| 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_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| If pname:flags of pname:pCreateInfo includes |
| ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT, all commands |
| that modify the returned pipeline cache object must: be |
| <<fundamentals-threadingbehavior,externally synchronized>>. |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| |
| ifndef::VKSC_VERSION_1_0[] |
| [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. |
| ==== |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{chapters}/commonvalidity/no_dynamic_allocations_common.adoc[] |
| |
| ifdef::VKSC_VERSION_1_0[] |
| .Valid Usage |
| **** |
| * [[VUID-vkCreatePipelineCache-pCreateInfo-05045]] |
| The contents of the structure pointed to by pname:pCreateInfo and the |
| data pointed to by pname:pCreateInfo->pInitialData must: be the same as |
| specified in one of the |
| slink:VkDeviceObjectReservationCreateInfo::pname:pPipelineCacheCreateInfos |
| structures when the device was created |
| include::{chapters}/commonvalidity/memory_reservation_request_count_common.adoc[] |
| **** |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/protos/vkCreatePipelineCache.adoc[] |
| -- |
| |
| [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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| * pname:flags is a bitmask of elink:VkPipelineCacheCreateFlagBits |
| specifying the behavior of the pipeline cache. |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| ifndef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| * pname:flags is reserved for future use. |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| * pname:initialDataSize is the number of bytes in pname:pInitialData. |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| * pname:pInitialData is a pointer to pipeline cache data that has been |
| generated offline. |
| If the pipeline cache data is incompatible (as defined below) with the |
| device, ename:VK_ERROR_INVALID_PIPELINE_CACHE_DATA is returned. |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * slink:VkPipelineCacheCreateInfo::pname:pInitialData must: point to a |
| valid pipeline cache that has been generated offline <<SCID-1>>, |
| <<SCID-8>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| .Valid Usage |
| **** |
| ifndef::VKSC_VERSION_1_0[] |
| * [[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 |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VK_VERSION_1_3,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 |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| ifdef::VKSC_VERSION_1_0[] |
| * [[VUID-VkPipelineCacheCreateInfo-flags-05043]] |
| pname:flags must: include ename:VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT |
| * [[VUID-VkPipelineCacheCreateInfo-flags-05044]] |
| pname:flags must: include |
| ename:VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT |
| * [[VUID-VkPipelineCacheCreateInfo-pInitialData-05139]] |
| The pipeline cache data pointed to by pname:pInitialData must: not |
| contain any pipelines with duplicate pipeline identifiers. |
| endif::VKSC_VERSION_1_0[] |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * slink:VkPipelineCacheCreateInfo::pname:initialDataSize must: not be `0` |
| <<SCID-1>>, <<SCID-8>>. |
| * slink:VkPipelineCacheCreateInfo::pname:pInitialData must: not be `NULL` |
| <<SCID-1>>, <<SCID-8>>. |
| * slink:VkPipelineCacheCreateInfo::pname:flags must: include |
| ename:VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT <<SCID-1>>, <<SCID-8>>. |
| * slink:VkPipelineCacheCreateInfo::pname:flags must: include |
| ename:VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT <<SCID-2>>. |
| * The contents of slink:VkPipelineCacheCreateInfo, including the data |
| pointed to by slink:VkPipelineCacheCreateInfo::pname:pInitialData, |
| passed to flink:vkCreatePipelineCache must: be the same as specified in |
| one of the |
| slink:VkDeviceObjectReservationCreateInfo::pname:pPipelineCacheCreateInfos |
| structures when the device was created <<SCID-1>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/structs/VkPipelineCacheCreateInfo.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineCacheCreateFlags', desc='Bitmask of VkPipelineCreateFlagBits', type='flags'] |
| -- |
| include::{generated}/api/flags/VkPipelineCacheCreateFlags.adoc[] |
| |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| tname:VkPipelineCacheCreateFlags is a bitmask type for setting a mask of |
| zero or more elink:VkPipelineCacheCreateFlagBits. |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| ifndef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| tname:VkPipelineCacheCreateFlags is a bitmask type for setting a mask, but |
| is currently reserved for future use. |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| -- |
| |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| [open,refpage='VkPipelineCacheCreateFlagBits',desc='Bitmask specifying the behavior of the pipeline cache',type='enums'] |
| -- |
| Bits which can: be set in slink:VkPipelineCacheCreateInfo::pname:flags, |
| specifying behavior of the pipeline cache, are: |
| |
| include::{generated}/api/enums/VkPipelineCacheCreateFlagBits.adoc[] |
| |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| * ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 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_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] |
| ifdef::VKSC_VERSION_1_0[] |
| * ename:VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT specifies that the new |
| pipeline cache will be read-only. |
| * ename:VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT specifies |
| that the application will maintain the contents of the memory pointed to |
| by pname:pInitialData for the lifetime of the pipeline cache object |
| created, avoiding the need for the implementation to make a copy of the |
| data. |
| The memory pointed to by pname:pInitialData can: be modified or released |
| by the application only after any pipeline cache objects created using |
| it have been destroyed. |
| ifdef::hidden[] |
| // tag::scaddition[] |
| * extending elink:VkPipelineCacheCreateFlagBits |
| ** ename:VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT <<SCID-1>>, <<SCID-8>> |
| ** ename:VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT <<SCID-2>> |
| // end::scaddition[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| -- |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control,VKSC_VERSION_1_0[] |
| |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scremoved[] |
| * fname:vkMergePipelineCaches, fname:vkGetPipelineCacheData <<SCID-1>>, |
| <<SCID-8>> |
| // end::scremoved[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| ifndef::VKSC_VERSION_1_0[] |
| |
| |
| [[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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| endif::VKSC_VERSION_1_0[] |
| ifndef::VKSC_VERSION_1_0[] |
| |
| |
| [[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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| endif::VKSC_VERSION_1_0[] |
| |
| |
| [[pipelines-cache-header]] |
| === Pipeline Cache Header |
| |
| ifdef::VKSC_VERSION_1_0[] |
| Applications must: load data from <<pipelines-offline-compilation,offline |
| compiled>> pipeline caches into pipeline cache objects. |
| The results of pipeline compilations may: depend on the vendor ID, device |
| ID, driver version, and other details of the target device. |
| To allow detection of pipeline cache data that is incompatible with the |
| device, the pipeline cache data must: begin with a valid pipeline cache |
| header. |
| endif::VKSC_VERSION_1_0[] |
| |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| endif::VKSC_VERSION_1_0[] |
| |
| [NOTE] |
| .Note |
| ==== |
| Structures described in this section are not part of the Vulkan API and are |
| only used to describe the representation of data elements in pipeline cache |
| data. |
| Accordingly, the valid usage clauses defined for structures defined in this |
| section do not define valid usage conditions for APIs accepting pipeline |
| cache data as input, as providing invalid pipeline cache data as input to |
| any Vulkan API commands will result |
| ifndef::VKSC_VERSION_1_0[] |
| in the provided pipeline cache data being ignored. |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| in the runtime error ename:VK_ERROR_INVALID_PIPELINE_CACHE_DATA. |
| endif::VKSC_VERSION_1_0[] |
| ==== |
| |
| [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.adoc[] |
| |
| * pname:headerSize is the length in bytes of the pipeline cache header. |
| * pname:headerVersion is a elink:VkPipelineCacheHeaderVersion 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 |
| **** |
| ifndef::VKSC_VERSION_1_0[] |
| * [[VUID-VkPipelineCacheHeaderVersionOne-headerSize-04967]] |
| pname:headerSize must: be 32 |
| * [[VUID-VkPipelineCacheHeaderVersionOne-headerVersion-04968]] |
| pname:headerVersion must: be ename:VK_PIPELINE_CACHE_HEADER_VERSION_ONE |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| * [[VUID-VkPipelineCacheHeaderVersionOne-headerSize-05075]] |
| pname:headerSize must: be 56 |
| * [[VUID-VkPipelineCacheHeaderVersionOne-headerVersion-05076]] |
| pname:headerVersion must: be |
| ename:VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE |
| endif::VKSC_VERSION_1_0[] |
| * [[VUID-VkPipelineCacheHeaderVersionOne-headerSize-08990]] |
| pname:headerSize must: not exceed the size of the pipeline cache |
| **** |
| ifdef::VKSC_VERSION_1_0[] |
| ifdef::hidden[] |
| // tag::scdeviation[] |
| * slink:VkPipelineCacheHeaderVersionOne::pname:headerSize must: be 56 |
| <<SCID-1>>. |
| * slink:VkPipelineCacheHeaderVersionOne::pname:headerVersion must: be |
| ename:VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE <<SCID-1>>. |
| // end::scdeviation[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/structs/VkPipelineCacheHeaderVersionOne.adoc[] |
| -- |
| |
| [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.adoc[] |
| |
| * ename:VK_PIPELINE_CACHE_HEADER_VERSION_ONE specifies version one of the |
| pipeline cache, described by slink:VkPipelineCacheHeaderVersionOne. |
| ifdef::VKSC_VERSION_1_0[] |
| * ename:VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE specifies |
| version one of the pipeline cache for Vulkan SC, described by |
| slink:VkPipelineCacheHeaderVersionSafetyCriticalOne. |
| endif::VKSC_VERSION_1_0[] |
| -- |
| |
| ifdef::VKSC_VERSION_1_0[] |
| [open,refpage='VkPipelineCacheHeaderVersionSafetyCriticalOne',desc='Structure describing the layout of the pipeline cache header for safety critical',type='structs'] |
| -- |
| Version one of the pipeline cache header for Vulkan SC is defined as: |
| |
| include::{generated}/api/structs/VkPipelineCacheHeaderVersionSafetyCriticalOne.adoc[] |
| |
| * pname:headerVersionOne is a slink:VkPipelineCacheHeaderVersionOne |
| structure. |
| * pname:validationVersion is a elink:VkPipelineCacheValidationVersion enum |
| value specifying the version of any validation information that is |
| included in this pipeline cache. |
| * pname:implementationData is 4 bytes of padding to ensure structure |
| members are consistently aligned on all platforms. |
| The contents of this field may: be used for implementation-specific |
| information. |
| * pname:pipelineIndexCount is the number of entries contained in the |
| pipeline cache index. |
| * pname:pipelineIndexStride is the number of bytes between consecutive |
| pipeline cache index entries. |
| * pname:pipelineIndexOffset is the offset in bytes from the beginning of |
| the pipeline cache header to the pipeline cache index. |
| |
| The <<pipelines-cache-index, pipeline cache index>> consists of |
| pname:pipelineIndexCount slink:VkPipelineCacheSafetyCriticalIndexEntry |
| structures containing an index of all the pipelines in this cache. |
| The pipeline cache index is located starting at pname:pipelineIndexOffset |
| bytes into the cache and the location of pipeline code:i is calculated as: |
| [eq]#pname:pipelineIndexOffset + code:i {times} pname:pipelineIndexStride#. |
| The slink:VkPipelineCacheSafetyCriticalIndexEntry structures may: not be |
| tightly packed, enabling additional implementation-specific data to be |
| stored with each entry, or for future extensibility. |
| |
| [NOTE] |
| .Note |
| ==== |
| Because the pipeline cache index is keyed by pipeline identifier, |
| applications and offline compilers must ensure that there are no pipelines |
| with identical pipeline indentifiers in the same pipeline cache. |
| ==== |
| |
| 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 |
| 56 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-VkPipelineCacheHeaderVersionSafetyCriticalOne-validationVersion-05077]] |
| pname:validationVersion must: be |
| ename:VK_PIPELINE_CACHE_VALIDATION_VERSION_SAFETY_CRITICAL_ONE |
| * [[VUID-VkPipelineCacheHeaderVersionSafetyCriticalOne-pipelineIndexStride-05078]] |
| pname:pipelineIndexStride must: be greater than or equal to 56 (the size |
| of the slink:VkPipelineCacheSafetyCriticalIndexEntry structure) |
| * [[VUID-VkPipelineCacheHeaderVersionSafetyCriticalOne-pipelineIndexOffset-05079]] |
| [eq]#pname:pipelineIndexOffset + pname:pipelineIndexCount {times} |
| pname:pipelineIndexStride# must: not exceed the size of the pipeline |
| cache |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineCacheHeaderVersionSafetyCriticalOne.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineCacheValidationVersion',desc='Encode pipeline cache validation version',type='enums'] |
| -- |
| The elink:VkPipelineCacheValidationVersion enumeration determines the |
| contents of the pipeline cache validation information. |
| Possible values are: |
| |
| include::{generated}/api/enums/VkPipelineCacheValidationVersion.adoc[] |
| |
| * ename:VK_PIPELINE_CACHE_VALIDATION_VERSION_SAFETY_CRITICAL_ONE specifies |
| version one of the pipeline cache validation information for Vulkan SC. |
| -- |
| |
| [[pipelines-cache-index]] |
| [open,refpage='VkPipelineCacheSafetyCriticalIndexEntry',desc='Structure describing the pipeline cache index entry',type='structs'] |
| -- |
| Each pipeline cache index entry consists of a |
| sname:VkPipelineCacheSafetyCriticalIndexEntry structure: |
| |
| include::{generated}/api/structs/VkPipelineCacheSafetyCriticalIndexEntry.adoc[] |
| |
| * pname:pipelineIdentifier is the <<pipelines-identifier, pipeline |
| identifier>> indicating which pipeline the information is associated |
| with. |
| * pname:pipelineMemorySize is the number of bytes of pipeline memory |
| required for this pipeline. |
| This is the minimum value that can: be successfully used for |
| slink:VkPipelineOfflineCreateInfo::pname:poolEntrySize when this |
| pipeline is used. |
| * pname:jsonSize is the size in bytes of the pipeline JSON data |
| representing the pipeline state for this pipeline. |
| This value may: be zero, indicating the JSON data is not present in the |
| pipeline cache for this pipeline. |
| * pname:jsonOffset is the offset in bytes from the beginning of the |
| pipeline cache header to the pipeline JSON data for this pipeline. |
| This value must: be zero if the JSON data is not present in the pipeline |
| cache for this pipeline. |
| * pname:stageIndexCount is the number of entries in the pipeline cache |
| stage validation index for this pipeline. |
| This value may: be zero, indicating that no stage validation information |
| is present in the pipeline cache for this pipeline. |
| * pname:stageIndexStride is the number of bytes between consecutive stage |
| validation index entries. |
| * pname:stageIndexOffset is the offset in bytes from the beginning of the |
| pipeline cache header to the <<pipelines-cache-stage-validation-index, |
| stage validation index>> for this pipeline. |
| This value must: be zero if no stage validation information is present |
| for this pipeline. |
| |
| The JSON data and the stage validation index are optionally: included in the |
| pipeline cache index entry. |
| They are only intended to be used for validation and debugging. |
| If present they must: include both the JSON data and the corresponding |
| SPIR-V modules that were used by the offline compiler to compile the |
| pipeline cache entry. |
| |
| The data at pname:jsonOffset consists of a byte stream of pname:jsonSize |
| bytes of UTF-8 encoded JSON that was used by the |
| <<pipelines-offline-compilation, offline pipeline compiler>> to create this |
| pipeline cache entry. |
| |
| The <<pipelines-cache-stage-validation-index, stage validation index>> |
| consists of pname:stageIndexCount |
| slink:VkPipelineCacheStageValidationIndexEntry structures which provide the |
| SPIR-V modules used by this pipeline and these are provided in the same |
| order as provided to the slink:VkPipelineShaderStageCreateInfo structure(s) |
| in the stext:Vk*PipelineCreateInfo structure for this pipeline. |
| The stage validation index is located at pname:stageIndexOffset bytes into |
| the cache and the location of stage code:i is calculated as: |
| [eq]#pname:stageIndexOffset {plus} code:i {times} pname:stageIndexStride#. |
| The slink:VkPipelineCacheStageValidationIndexEntry structures may: not be |
| tightly packed, enabling additional implementation-specific data to be |
| stored with each entry, or for future extensibility. |
| |
| 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 |
| 56 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-VkPipelineCacheSafetyCriticalIndexEntry-jsonSize-05080]] |
| If pname:jsonSize is 0, pname:jsonOffset must: be 0 |
| * [[VUID-VkPipelineCacheSafetyCriticalIndexEntry-jsonSize-05081]] |
| If pname:jsonSize is 0, pname:stageIndexCount must: be 0 |
| * [[VUID-VkPipelineCacheSafetyCriticalIndexEntry-jsonSize-08991]] |
| If pname:jsonSize is not 0, [eq]#pname:jsonOffset {plus} pname:jsonSize# |
| must: not exceed the size of the pipeline cache |
| * [[VUID-VkPipelineCacheSafetyCriticalIndexEntry-stageIndexCount-05082]] |
| If pname:stageIndexCount is 0, pname:stageIndexOffset and |
| pname:stageIndexStride must: be 0 |
| * [[VUID-VkPipelineCacheSafetyCriticalIndexEntry-stageIndexCount-05083]] |
| If pname:stageIndexCount is not 0, pname:stageIndexStride must: be |
| greater than or equal to 16 (the size of the |
| slink:VkPipelineCacheStageValidationIndexEntry structure) |
| * [[VUID-VkPipelineCacheSafetyCriticalIndexEntry-stageIndexCount-05084]] |
| If pname:stageIndexCount is not 0, [eq]#pname:stageIndexOffset {plus} |
| pname:stageIndexCount {times} pname:stageIndexStride# must: not exceed |
| the size of the pipeline cache |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineCacheSafetyCriticalIndexEntry.adoc[] |
| -- |
| |
| [[pipelines-cache-stage-validation-index]] |
| [open,refpage='VkPipelineCacheStageValidationIndexEntry',desc='Structure describing the pipeline cache stage validation index',type='structs'] |
| -- |
| Each pipeline cache stage validation index entry consists of a |
| sname:VkPipelineCacheStageValidationIndexEntry structure: |
| |
| include::{generated}/api/structs/VkPipelineCacheStageValidationIndexEntry.adoc[] |
| |
| * pname:codeSize is the size in bytes of the SPIR-V module for this |
| pipeline stage. |
| * pname:codeOffset is the offset in bytes from the beginning of the |
| pipeline cache header to the SPIR-V module for this pipeline stage. |
| |
| The data at pname:codeOffset consists of pname:codeSize bytes of SPIR-V |
| module as described in <<spirvenv, Appendix A>> that was used by the |
| <<pipelines-offline-compilation, offline pipeline compiler>> for this shader |
| stage when creating this pipeline cache entry. |
| |
| 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 |
| 16 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-VkPipelineCacheStageValidationIndexEntry-codeSize-05085]] |
| pname:codeSize must: be greater than 0 |
| * [[VUID-VkPipelineCacheStageValidationIndexEntry-codeSize-05086]] |
| pname:codeSize must: be a multiple of 4 |
| * [[VUID-VkPipelineCacheStageValidationIndexEntry-codeOffset-05087]] |
| [eq]#pname:codeOffset {plus} pname:codeSize# must: not exceed the size |
| of the pipeline cache |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineCacheStageValidationIndexEntry.adoc[] |
| -- |
| |
| ifdef::hidden[] |
| // tag::scaddition[] |
| * extending elink:VkPipelineCacheHeaderVersion |
| ** ename:VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE <<SCID-1>>, |
| <<SCID-8>> |
| * slink:VkPipelineCacheHeaderVersionSafetyCriticalOne <<SCID-1>>, |
| <<SCID-8>> |
| * elink:VkPipelineCacheValidationVersion <<SCID-1>>, <<SCID-8>> |
| * slink:VkPipelineCacheSafetyCriticalIndexEntry <<SCID-1>>, <<SCID-8>> |
| * slink:VkPipelineCacheStageValidationIndexEntry<<SCID-1>>, <<SCID-8>> |
| // end::scaddition[] |
| endif::hidden[] |
| endif::VKSC_VERSION_1_0[] |
| |
| |
| [[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.adoc[] |
| |
| * 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. |
| |
| ifndef::VKSC_VERSION_1_0[] |
| .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` |
| **** |
| endif::VKSC_VERSION_1_0[] |
| |
| include::{generated}/validity/protos/vkDestroyPipelineCache.adoc[] |
| -- |
| |
| ifdef::VKSC_VERSION_1_0[] |
| [[pipelines-offline-compilation]] |
| == Offline Pipeline Compilation |
| |
| In Vulkan SC, the pipeline compilation process occurs offline <<SCID-8>>. |
| |
| The <<shader-modules,SPIR-V shader module>> and pipeline state are supplied |
| to an offline pipeline cache compiler which creates a pipeline cache entry |
| for the pipeline. |
| The set of pipeline cache entries are combined offline into one or more |
| <<pipelines-cache, pipeline caches>>. |
| At application run-time, the offline generated pipeline cache is provided to |
| device creation as part of the slink:VkDeviceObjectReservationCreateInfo |
| structure and then loaded into a slink:VkPipelineCache object by the |
| application. |
| The device, pipeline, and pipeline cache creation functions can: extract |
| implementation-specific information from the pipeline cache. |
| The specific pipeline to be loaded from the cache is specified at pipeline |
| creation time using a <<pipelines-identifier,pipeline identifier>>. |
| The pipeline state that is provided at runtime to pipeline creation must: |
| match the state that was specified to the offline pipeline cache compiler |
| when the pipeline cache entry was created offline (with the exception of the |
| slink:VkPipelineShaderStageCreateInfo structure). |
| |
| In order to assist with the specification of pipeline state for the offline |
| pipeline cache compiler, Khronos has defined a _pipeline JSON schema_ to |
| represent the pipeline state required to compile a SPIR-V module to |
| device-specific machine code and a set of utilities to help with reading and |
| writing of the JSON files. |
| See https://github.com/KhronosGroup/VulkanSC-Docs/wiki/JSON-schema for more |
| information. |
| |
| [[pipelines-memory-reservation]] |
| == Pipeline Memory Reservation |
| |
| Pipeline memory is allocated from a pool that is reserved at device creation |
| time. |
| The offline pipeline cache compiler writes the pipeline memory size |
| requirements for each pipeline into the pipeline's |
| slink:VkPipelineCacheSafetyCriticalIndexEntry::pname:pipelineMemorySize |
| entry in the <<pipelines-cache-index,pipeline cache index>>. |
| The offline pipeline cache compiler may: also report it separately. |
| The elements of |
| slink:VkDeviceObjectReservationCreateInfo::pname:pPipelinePoolSizes are |
| requests for pname:poolEntryCount pool entries each of pool size |
| pname:poolEntrySize, and any pipeline with a |
| slink:VkPipelineCacheSafetyCriticalIndexEntry::pname:pipelineMemorySize less |
| than or equal to slink:VkPipelineOfflineCreateInfo::pname:poolEntrySize can: |
| be placed in one of those pool entries. |
| The application should: request a set of pool sizes that best suits its |
| anticipated worst-case usage. |
| |
| On implementations where |
| slink:VkPhysicalDeviceVulkanSC10Properties::pname:recyclePipelineMemory is |
| ename:VK_FALSE, the memory for the pipeline pool is not recycled when a |
| pipeline is destroyed, and once an entry has been used it cannot: be reused. |
| On implementations where |
| slink:VkPhysicalDeviceVulkanSC10Properties::pname:recyclePipelineMemory is |
| ename:VK_TRUE, the memory for the pipeline pool is recycled when a pipeline |
| is destroyed, and the entry it was using becomes available to be reused. |
| |
| [[pipelines-identifier]] |
| == Pipeline Identifier |
| |
| A _pipeline identifier_ is an identifier that can be used to identify a |
| specific pipeline independently from the pipeline description, shader stages |
| and any relevant fixed-function stages, that were used to create the |
| pipeline object. |
| |
| The slink:VkPipelineOfflineCreateInfo structure allows an identifier to be |
| specified for the pipeline at pipeline creation via the pname:pNext field of |
| the slink:VkGraphicsPipelineCreateInfo, |
| ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,] |
| ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,] |
| and slink:VkComputePipelineCreateInfo structures. |
| If a sname:VkPipelineOfflineCreateInfo structure is not included in the |
| pname:pNext chain then pipeline creation will fail and |
| ename:VK_ERROR_NO_PIPELINE_MATCH will be returned by the corresponding |
| ftext:vkCreate*Pipelines command. |
| |
| The identifier must: be used by the implementation to match against the |
| existing content of the pipeline cache at pipeline creation. |
| This is required for Vulkan SC where pipelines are generated offline and |
| there is no shader code in the pipeline cache to match at runtime. |
| |
| [NOTE] |
| .Note |
| ==== |
| The identifier values must be specified or generated during the offline |
| pipeline cache generation and embedded in to the pipeline cache blob. |
| ==== |
| |
| [open,refpage='VkPipelineOfflineCreateInfo',desc='Structure specifying pipeline UUID and pipeline pool size to use',type='structs'] |
| -- |
| The sname:VkPipelineOfflineCreateInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineOfflineCreateInfo.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:pipelineIdentifier is an array of ename:VK_UUID_SIZE code:uint8_t |
| values representing an identifier for the pipeline. |
| * pname:matchControl is a elink:VkPipelineMatchControl value specifying |
| the type of identifier being used and how the match should be performed. |
| * pname:poolEntrySize is the size of the entry in pipeline memory to use |
| for this pipeline. |
| It must: be a size that was requested via slink:VkPipelinePoolSize when |
| the device was created. |
| |
| If a match in the pipeline cache is not found then |
| ename:VK_ERROR_NO_PIPELINE_MATCH will be returned to the application. |
| |
| If pname:poolEntrySize is too small for the pipeline, or the number of |
| entries for the requested pool size exceeds the reserved count for that pool |
| size, pipeline creation will fail and ename:VK_ERROR_OUT_OF_POOL_MEMORY will |
| be returned by the corresponding ftext:vkCreate*Pipelines command. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineOfflineCreateInfo-poolEntrySize-05028]] |
| pname:poolEntrySize must: be one of the sizes requested via |
| slink:VkPipelinePoolSize when the device was created |
| * [[VUID-VkPipelineOfflineCreateInfo-recyclePipelineMemory-05029]] |
| If |
| slink:VkPhysicalDeviceVulkanSC10Properties::pname:recyclePipelineMemory |
| is ename:VK_TRUE, the number of currently existing pipelines created |
| with this same value of pname:poolEntrySize plus 1 must: be less than or |
| equal to the sum of the slink:VkPipelinePoolSize::pname:poolEntryCount |
| values with the same value of pname:poolEntrySize |
| * [[VUID-VkPipelineOfflineCreateInfo-recyclePipelineMemory-05030]] |
| If |
| slink:VkPhysicalDeviceVulkanSC10Properties::pname:recyclePipelineMemory |
| is ename:VK_FALSE, the total number of pipelines ever created with this |
| same value of pname:poolEntrySize plus 1 must: be less than or equal to |
| the sum of the slink:VkPipelinePoolSize::pname:poolEntryCount values |
| with the same value of pname:poolEntrySize |
| **** |
| ifdef::hidden[] |
| // tag::scaddition[] |
| * slink:VkPipelineOfflineCreateInfo <<SCID-1>>, <<SCID-8>> |
| * elink:VkPipelineMatchControl <<SCID-1>> |
| // end::scaddition[] |
| endif::hidden[] |
| |
| include::{generated}/validity/structs/VkPipelineOfflineCreateInfo.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineMatchControl',desc='Describes the type of Identifier and Match being used',type='enums',xrefs='VkPipelineOfflineCreateInfo'] |
| -- |
| Possible values of the pname:matchControl member of |
| sname:VkPipelineOfflineCreateInfo |
| |
| include::{generated}/api/enums/VkPipelineMatchControl.adoc[] |
| |
| are: |
| |
| * ename:VK_PIPELINE_MATCH_CONTROL_APPLICATION_UUID_EXACT_MATCH specifies |
| that the identifier is a UUID generated by the application and the |
| identifiers must be an exact match. |
| |
| -- |
| endif::VKSC_VERSION_1_0[] |
| |
| [[pipelines-specialization-constants]] |
| == Specialization Constants |
| |
| ifndef::VKSC_VERSION_1_0[] |
| 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. |
| ==== |
| |
| endif::VKSC_VERSION_1_0[] |
| ifdef::VKSC_VERSION_1_0[] |
| 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 compiled offline. |
| This allows a SPIR-V module to have constants that can: be modified at |
| compilation time rather than in the SPIR-V source. |
| The pname:pSpecializationInfo parameters are not used at runtime and should: |
| be ignored by the implementation. |
| If provided, the application must: set the pname:pSpecializationInfo |
| parameters to the values that were specified for the offline compilation of |
| this pipeline. |
| |
| [NOTE] |
| .Note |
| ==== |
| Specialization constants are useful to allow a compute shader to have its |
| local workgroup size changed at pipeline compilation time, for example. |
| ==== |
| endif::VKSC_VERSION_1_0[] |
| |
| 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.adoc[] |
| |
| * 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.adoc[] |
| -- |
| |
| [open,refpage='VkSpecializationMapEntry',desc='Structure specifying a specialization map entry',type='structs'] |
| -- |
| The sname:VkSpecializationMapEntry structure is defined as: |
| |
| include::{generated}/api/structs/VkSpecializationMapEntry.adoc[] |
| |
| * 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.adoc[] |
| -- |
| |
| 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[] = |
| { |
| { |
| .constantID = 13, |
| .offset = 0 * sizeof(uint32_t), |
| .size = sizeof(uint32_t) |
| }, |
| { |
| .constantID = 42, |
| .offset = 1 * sizeof(uint32_t), |
| .size = sizeof(uint32_t) |
| }, |
| { |
| .constantID = 3, |
| .offset = 2 * sizeof(uint32_t), |
| .size = sizeof(uint32_t) |
| } |
| }; |
| |
| const uint32_t data[] = { 16, 8, 4 }; // our workgroup size is 16x8x4 |
| |
| const VkSpecializationInfo info = |
| { |
| .mapEntryCount = 3, |
| .pMapEntries = entries, |
| .dataSize = 3 * sizeof(uint32_t), |
| .pData = data, |
| }; |
| ---- |
| |
| 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[] = |
| { |
| { |
| .constantID = 0, |
| .offset = offsetof(SpecializationData, data0), |
| .size = sizeof(SpecializationData::data0) |
| }, |
| { |
| .constantID = 12, |
| .offset = offsetof(SpecializationData, data1), |
| .size = sizeof(SpecializationData::data1) |
| } |
| }; |
| |
| 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 = |
| { |
| .mapEntryCount = 2, |
| .pMapEntries = entries, |
| .dataSize = sizeof(data), |
| .pdata = &data, |
| }; |
| ---- |
| |
| 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[] |
| [[pipelines-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[] |
| ifdef::VK_EXT_graphics_pipeline_library[] |
| For graphics pipelines this includes distinct library types defined by |
| elink:VkGraphicsPipelineLibraryFlagBitsEXT. |
| endif::VK_EXT_graphics_pipeline_library[] |
| The application must: maintain the lifetime of a pipeline library based on |
| the pipelines that link with it. |
| |
| 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.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying 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 |
| ifdef::VK_EXT_shader_module_identifier[] |
| * [[VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-06855]] |
| If any library in pname:pLibraries was created with a shader stage with |
| slink:VkPipelineShaderStageModuleIdentifierCreateInfoEXT and |
| pname:identifierSize not equal to 0, the pipeline must: be created with |
| the ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT flag |
| set |
| endif::VK_EXT_shader_module_identifier[] |
| ifdef::VK_EXT_descriptor_buffer[] |
| * [[VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-08096]] |
| If any element of pname:pLibraries was created with |
| ename:VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, all elements must: |
| have been created with |
| ename:VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT |
| endif::VK_EXT_descriptor_buffer[] |
| ifdef::VK_EXT_pipeline_protected_access[] |
| * [[VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07404]] |
| If pname:pipeline is being created with |
| ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT, every element of |
| pname:pLibraries must: have been created with |
| ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT |
| * [[VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07405]] |
| If pname:pipeline is being created without |
| ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT, every element of |
| pname:pLibraries must: have been created without |
| ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT |
| * [[VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07406]] |
| If pname:pipeline is being created with |
| ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT, every element of |
| pname:pLibraries must: have been created with |
| ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT |
| * [[VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07407]] |
| If pname:pipeline is being created without |
| ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT, every element of |
| pname:pLibraries must: have been created without |
| ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT |
| endif::VK_EXT_pipeline_protected_access[] |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineLibraryCreateInfoKHR.adoc[] |
| -- |
| |
| Pipelines created with ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR libraries |
| can: depend on other pipeline libraries in |
| slink:VkPipelineLibraryCreateInfoKHR. |
| |
| A pipeline library is considered in-use, as long as one of the linking |
| pipelines is in-use. |
| This applies recursively if a pipeline library includes other pipeline |
| libraries. |
| |
| 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.adoc[] |
| |
| * 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. |
| |
| [[pipelines-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 |
| ifdef::VK_EXT_shader_object[] |
| point, or until the pipeline bind point is disturbed by binding a |
| <<shaders-objects, shader object>> as described in |
| <<shaders-objects-pipeline-interaction, Interaction with Pipelines>>. |
| endif::VK_EXT_shader_object[] |
| ifndef::VK_EXT_shader_object[] |
| point. |
| endif::VK_EXT_shader_object[] |
| Commands that do not interact with the <<shaders-binding,given pipeline>> |
| type must: not be affected by the pipeline state. |
| |
| .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, |
| pname:variableMultisampleRate>> 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 |
| * [[VUID-vkCmdBindPipeline-pipelineBindPoint-06721]] |
| If pname:pipelineBindPoint is |
| ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pname:commandBuffer must: |
| not be a protected command buffer |
| endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[] |
| ifdef::VK_EXT_pipeline_protected_access[] |
| * [[VUID-vkCmdBindPipeline-pipelineProtectedAccess-07408]] |
| If the <<features-pipelineProtectedAccess, |
| pname:pipelineProtectedAccess>> feature is enabled, and |
| pname:commandBuffer is a protected command buffer, pname:pipeline must: |
| have been created without |
| ename:VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT |
| * [[VUID-vkCmdBindPipeline-pipelineProtectedAccess-07409]] |
| If the <<features-pipelineProtectedAccess, |
| pname:pipelineProtectedAccess>> feature is enabled, and |
| pname:commandBuffer is not a protected command buffer, pname:pipeline |
| must: have been created without |
| ename:VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT |
| endif::VK_EXT_pipeline_protected_access[] |
| 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 or |
| ename:VK_DYNAMIC_STATE_VIEWPORT, and |
| ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT 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`, or the pipeline was |
| created with ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT |
| enabled, 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, |
| pname: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_EXT_graphics_pipeline_library[] |
| * [[VUID-vkCmdBindPipeline-pipelineBindPoint-06653]] |
| If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS, |
| pname:pipeline must: have been created without |
| ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
| endif::VK_EXT_graphics_pipeline_library[] |
| **** |
| |
| include::{generated}/validity/protos/vkCmdBindPipeline.adoc[] |
| -- |
| |
| [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.adoc[] |
| |
| * 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_AMDX_shader_enqueue[] |
| * ename:VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX specifies binding as |
| an <<executiongraphs, execution graph pipeline>>. |
| endif::VK_AMDX_shader_enqueue[] |
| -- |
| |
| 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.adoc[] |
| |
| * 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, pname:deviceGeneratedCommands>> |
| feature must: be enabled |
| **** |
| |
| include::{generated}/validity/protos/vkCmdBindPipelineShaderGroupNV.adoc[] |
| -- |
| endif::VK_NV_device_generated_commands[] |
| |
| ifdef::VK_EXT_shader_object[] |
| [[pipelines-shader-object-interaction]] |
| === Interaction With Shader Objects |
| |
| If the <<features-shaderObject, pname:shaderObject>> feature is enabled, |
| applications can: use both pipelines and <<shaders-objects, shader objects>> |
| at the same time. |
| The interaction between pipelines and shader objects is described in |
| <<shaders-objects-pipeline-interaction, Interaction with Pipelines>>. |
| endif::VK_EXT_shader_object[] |
| |
| [[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 made invalid by another pipeline bind with that state |
| specified as static. |
| |
| 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. |
| The state-setting commands must: be recorded after command buffer |
| recording was begun, or after the last command binding a pipeline object |
| with that state specified as static, whichever was the latter. |
| * If the state is not included (corresponding pointer in |
| slink:VkGraphicsPipelineCreateInfo was `NULL` or was ignored) in the new |
| pipeline object, then that command buffer state is not disturbed. |
| ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| For example, mesh shading pipelines do not include vertex input state |
| and therefore do not disturb any such command buffer state. |
| endif::VK_NV_mesh_shader,VK_EXT_mesh_shader[] |
| |
| 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,VK_EXT_pipeline_properties[] |
| [[pipelines-shader-information]] |
| == Pipeline Properties and Shader Information |
| endif::VK_AMD_shader_info,VK_KHR_pipeline_executable_properties,VK_EXT_pipeline_properties[] |
| |
| ifdef::VK_KHR_pipeline_executable_properties[] |
| [open,refpage='vkGetPipelineExecutablePropertiesKHR',desc='Get the executables associated with a pipeline',type='protos'] |
| -- |
| When a pipeline is created, its state and shaders are compiled into zero or |
| more device-specific executables, which are used when executing commands |
| against that pipeline. |
| To query the properties of these pipeline executables, call: |
| |
| include::{generated}/api/protos/vkGetPipelineExecutablePropertiesKHR.adoc[] |
| |
| * pname:device is the device that created the pipeline. |
| * pname:pPipelineInfo describes the pipeline being queried. |
| * pname:pExecutableCount is a pointer to an integer related to the number |
| of pipeline executables available or queried, as described below. |
| * pname:pProperties is either `NULL` or a pointer to an array of |
| slink:VkPipelineExecutablePropertiesKHR structures. |
| |
| If pname:pProperties is `NULL`, then the number of pipeline executables |
| associated with the pipeline is returned in pname:pExecutableCount. |
| Otherwise, pname:pExecutableCount must: point to a variable set by the user |
| to the number of elements in the pname:pProperties array, and on return the |
| variable is overwritten with the number of structures actually written to |
| pname:pProperties. |
| If pname:pExecutableCount is less than the number of pipeline executables |
| associated with the pipeline, at most pname:pExecutableCount structures will |
| be written, and ename:VK_INCOMPLETE will be returned instead of |
| ename:VK_SUCCESS, to indicate that not all the available properties were |
| returned. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetPipelineExecutablePropertiesKHR-pipelineExecutableInfo-03270]] |
| The <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>> |
| feature must: be enabled |
| * [[VUID-vkGetPipelineExecutablePropertiesKHR-pipeline-03271]] |
| The pname:pipeline member of pname:pPipelineInfo must: have been created |
| with pname:device |
| **** |
| |
| include::{generated}/validity/protos/vkGetPipelineExecutablePropertiesKHR.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineExecutablePropertiesKHR',desc='Structure describing a pipeline executable',type='structs'] |
| -- |
| The sname:VkPipelineExecutablePropertiesKHR structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineExecutablePropertiesKHR.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:stages is a bitmask of zero or more elink:VkShaderStageFlagBits |
| indicating which shader stages (if any) were principally used as inputs |
| to compile this pipeline executable. |
| * pname:name is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char |
| containing a null-terminated UTF-8 string which is a short human |
| readable name for this pipeline executable. |
| * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char |
| containing a null-terminated UTF-8 string which is a human readable |
| description for this pipeline executable. |
| * pname:subgroupSize is the subgroup size with which this pipeline |
| executable is dispatched. |
| |
| Not all implementations have a 1:1 mapping between shader stages and |
| pipeline executables and some implementations may: reduce a given shader |
| stage to fixed function hardware programming such that no pipeline |
| executable is available. |
| No guarantees are provided about the mapping between shader stages and |
| pipeline executables and pname:stages should: be considered a best effort |
| hint. |
| Because the application cannot: rely on the pname:stages field to provide an |
| exact description, pname:name and pname:description provide a human readable |
| name and description which more accurately describes the given pipeline |
| executable. |
| |
| include::{generated}/validity/structs/VkPipelineExecutablePropertiesKHR.adoc[] |
| -- |
| endif::VK_KHR_pipeline_executable_properties[] |
| |
| ifdef::VK_EXT_pipeline_properties[] |
| [open,refpage='vkGetPipelinePropertiesEXT',desc='Query pipeline properties',type='protos'] |
| -- |
| To query the pipeline properties call: |
| |
| include::{generated}/api/protos/vkGetPipelinePropertiesEXT.adoc[] |
| |
| * pname:device is the logical device that created the pipeline. |
| * pname:pPipelineInfo is a pointer to a slink:VkPipelineInfoEXT structure |
| which describes the pipeline being queried. |
| * pname:pPipelineProperties is a pointer to a slink:VkBaseOutStructure |
| structure in which the pipeline properties will be written. |
| |
| To query a pipeline's pname:pipelineIdentifier pass a |
| slink:VkPipelinePropertiesIdentifierEXT structure in |
| pname:pPipelineProperties. |
| Each pipeline is associated with a pname:pipelineIdentifier and the |
| identifier is implementation specific. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetPipelinePropertiesEXT-pipeline-06738]] |
| The pname:pipeline member of pname:pPipelineInfo must have been created |
| with pname:device |
| * [[VUID-vkGetPipelinePropertiesEXT-pPipelineProperties-06739]] |
| pname:pPipelineProperties must: be a valid pointer to a |
| slink:VkPipelinePropertiesIdentifierEXT structure |
| * [[VUID-vkGetPipelinePropertiesEXT-None-06766]] |
| The <<features-pipelinePropertiesIdentifier, |
| pname:pipelinePropertiesIdentifier>> feature must: be enabled |
| **** |
| |
| include::{generated}/validity/protos/vkGetPipelinePropertiesEXT.adoc[] |
| -- |
| |
| [open,refpage='VkPipelinePropertiesIdentifierEXT',desc='Structure used to retrieve pipeline properties',type='structs'] |
| -- |
| The sname:VkPipelinePropertiesIdentifierEXT structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelinePropertiesIdentifierEXT.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:pipelineIdentifier is an array of ename:VK_UUID_SIZE code:uint8_t |
| values into which the pipeline identifier will be written. |
| |
| include::{generated}/validity/structs/VkPipelinePropertiesIdentifierEXT.adoc[] |
| -- |
| endif::VK_EXT_pipeline_properties[] |
| |
| // This structure is used by both vkGetPipelineExecutablePropertiesKHR and |
| // vkGetPipelinePropertiesEXT above, placing it in a nonstandard position. |
| ifdef::VK_KHR_pipeline_executable_properties,VK_EXT_pipeline_properties[] |
| [open,refpage='VkPipelineInfoKHR',desc='Structure describing a pipeline',type='structs',alias='VkPipelineInfoEXT'] |
| -- |
| The sname:VkPipelineInfoKHR structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineInfoKHR.adoc[] |
| |
| ifdef::VK_EXT_pipeline_properties[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkPipelineInfoEXT.adoc[] |
| endif::VK_EXT_pipeline_properties[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:pipeline is a sname:VkPipeline handle. |
| |
| include::{generated}/validity/structs/VkPipelineInfoKHR.adoc[] |
| -- |
| endif::VK_KHR_pipeline_executable_properties,VK_EXT_pipeline_properties[] |
| |
| ifdef::VK_KHR_pipeline_executable_properties[] |
| [open,refpage='vkGetPipelineExecutableStatisticsKHR',desc='Get compile time statistics associated with a pipeline executable',type='protos'] |
| -- |
| Each pipeline executable may: have a set of statistics associated with it |
| that are generated by the pipeline compilation process. |
| These statistics may: include things such as instruction counts, amount of |
| spilling (if any), maximum number of simultaneous threads, or anything else |
| which may: aid developers in evaluating the expected performance of a |
| shader. |
| To query the compile time statistics associated with a pipeline executable, |
| call: |
| |
| include::{generated}/api/protos/vkGetPipelineExecutableStatisticsKHR.adoc[] |
| |
| * pname:device is the device that created the pipeline. |
| * pname:pExecutableInfo describes the pipeline executable being queried. |
| * pname:pStatisticCount is a pointer to an integer related to the number |
| of statistics available or queried, as described below. |
| * pname:pStatistics is either `NULL` or a pointer to an array of |
| slink:VkPipelineExecutableStatisticKHR structures. |
| |
| If pname:pStatistics is `NULL`, then the number of statistics associated |
| with the pipeline executable is returned in pname:pStatisticCount. |
| Otherwise, pname:pStatisticCount must: point to a variable set by the user |
| to the number of elements in the pname:pStatistics array, and on return the |
| variable is overwritten with the number of structures actually written to |
| pname:pStatistics. |
| If pname:pStatisticCount is less than the number of statistics associated |
| with the pipeline executable, at most pname:pStatisticCount structures will |
| be written, and ename:VK_INCOMPLETE will be returned instead of |
| ename:VK_SUCCESS, to indicate that not all the available statistics were |
| returned. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetPipelineExecutableStatisticsKHR-pipelineExecutableInfo-03272]] |
| The <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>> |
| feature must: be enabled |
| * [[VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03273]] |
| The pname:pipeline member of pname:pExecutableInfo must: have been |
| created with pname:device |
| * [[VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03274]] |
| The pname:pipeline member of pname:pExecutableInfo must: have been |
| created with ename:VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR |
| **** |
| |
| include::{generated}/validity/protos/vkGetPipelineExecutableStatisticsKHR.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineExecutableInfoKHR',desc='Structure describing a pipeline executable to query for associated statistics or internal representations',type='structs'] |
| -- |
| The sname:VkPipelineExecutableInfoKHR structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineExecutableInfoKHR.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:pipeline is the pipeline to query. |
| * pname:executableIndex is the index of the pipeline executable to query |
| in the array of executable properties returned by |
| flink:vkGetPipelineExecutablePropertiesKHR. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineExecutableInfoKHR-executableIndex-03275]] |
| pname:executableIndex must: be less than the number of pipeline |
| executables associated with pname:pipeline as returned in the |
| pname:pExecutableCount parameter of |
| fname:vkGetPipelineExecutablePropertiesKHR |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineExecutableInfoKHR.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineExecutableStatisticKHR',desc='Structure describing a compile time pipeline executable statistic',type='structs'] |
| -- |
| The sname:VkPipelineExecutableStatisticKHR structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineExecutableStatisticKHR.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:name is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char |
| containing a null-terminated UTF-8 string which is a short human |
| readable name for this statistic. |
| * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char |
| containing a null-terminated UTF-8 string which is a human readable |
| description for this statistic. |
| * pname:format is a elink:VkPipelineExecutableStatisticFormatKHR value |
| specifying the format of the data found in pname:value. |
| * pname:value is the value of this statistic. |
| |
| include::{generated}/validity/structs/VkPipelineExecutableStatisticKHR.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineExecutableStatisticFormatKHR',desc='Enum describing a pipeline executable statistic's data format',type='enums'] |
| -- |
| The ename:VkPipelineExecutableStatisticFormatKHR enum is defined as: |
| |
| include::{generated}/api/enums/VkPipelineExecutableStatisticFormatKHR.adoc[] |
| |
| * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR specifies that |
| the statistic is returned as a 32-bit boolean value which must: be |
| either ename:VK_TRUE or ename:VK_FALSE and should: be read from the |
| fname:b32 field of sname:VkPipelineExecutableStatisticValueKHR. |
| * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR specifies that |
| the statistic is returned as a signed 64-bit integer and should: be read |
| from the fname:i64 field of sname:VkPipelineExecutableStatisticValueKHR. |
| * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR specifies that |
| the statistic is returned as an unsigned 64-bit integer and should: be |
| read from the fname:u64 field of |
| sname:VkPipelineExecutableStatisticValueKHR. |
| * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR specifies that |
| the statistic is returned as a 64-bit floating-point value and should: |
| be read from the fname:f64 field of |
| sname:VkPipelineExecutableStatisticValueKHR. |
| -- |
| |
| [open,refpage='VkPipelineExecutableStatisticValueKHR',desc='A union describing a pipeline executable statistic's value',type='structs'] |
| -- |
| The sname:VkPipelineExecutableStatisticValueKHR union is defined as: |
| |
| include::{generated}/api/structs/VkPipelineExecutableStatisticValueKHR.adoc[] |
| |
| * pname:b32 is the 32-bit boolean value if the |
| ename:VkPipelineExecutableStatisticFormatKHR is |
| ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR. |
| * pname:i64 is the signed 64-bit integer value if the |
| ename:VkPipelineExecutableStatisticFormatKHR is |
| ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR. |
| * pname:u64 is the unsigned 64-bit integer value if the |
| ename:VkPipelineExecutableStatisticFormatKHR is |
| ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR. |
| * pname:f64 is the 64-bit floating-point value if the |
| ename:VkPipelineExecutableStatisticFormatKHR is |
| ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR. |
| |
| include::{generated}/validity/structs/VkPipelineExecutableStatisticValueKHR.adoc[] |
| -- |
| |
| [open,refpage='vkGetPipelineExecutableInternalRepresentationsKHR',desc='Get internal representations of the pipeline executable',type='protos'] |
| -- |
| Each pipeline executable may: have one or more text or binary internal |
| representations associated with it which are generated as part of the |
| compile process. |
| These may: include the final shader assembly, a binary form of the compiled |
| shader, or the shader compiler's internal representation at any number of |
| intermediate compile steps. |
| To query the internal representations associated with a pipeline executable, |
| call: |
| |
| include::{generated}/api/protos/vkGetPipelineExecutableInternalRepresentationsKHR.adoc[] |
| |
| * pname:device is the device that created the pipeline. |
| * pname:pExecutableInfo describes the pipeline executable being queried. |
| * pname:pInternalRepresentationCount is a pointer to an integer related to |
| the number of internal representations available or queried, as |
| described below. |
| * pname:pInternalRepresentations is either `NULL` or a pointer to an array |
| of slink:VkPipelineExecutableInternalRepresentationKHR structures. |
| |
| If pname:pInternalRepresentations is `NULL`, then the number of internal |
| representations associated with the pipeline executable is returned in |
| pname:pInternalRepresentationCount. |
| Otherwise, pname:pInternalRepresentationCount must: point to a variable set |
| by the user to the number of elements in the pname:pInternalRepresentations |
| array, and on return the variable is overwritten with the number of |
| structures actually written to pname:pInternalRepresentations. |
| If pname:pInternalRepresentationCount is less than the number of internal |
| representations associated with the pipeline executable, at most |
| pname:pInternalRepresentationCount structures will be written, and |
| ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to |
| indicate that not all the available representations were returned. |
| |
| While the details of the internal representations remain |
| implementation-dependent, the implementation should: order the internal |
| representations in the order in which they occur in the compiled pipeline |
| with the final shader assembly (if any) last. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipelineExecutableInfo-03276]] |
| The <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>> |
| feature must: be enabled |
| * [[VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03277]] |
| The pname:pipeline member of pname:pExecutableInfo must: have been |
| created with pname:device |
| * [[VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03278]] |
| The pname:pipeline member of pname:pExecutableInfo must: have been |
| created with |
| ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR |
| **** |
| |
| include::{generated}/validity/protos/vkGetPipelineExecutableInternalRepresentationsKHR.adoc[] |
| -- |
| |
| [open,refpage='VkPipelineExecutableInternalRepresentationKHR',desc='Structure describing the textual form of a pipeline executable internal representation',type='structs'] |
| -- |
| The sname:VkPipelineExecutableInternalRepresentationKHR structure is defined |
| as: |
| |
| include::{generated}/api/structs/VkPipelineExecutableInternalRepresentationKHR.adoc[] |
| |
| * pname:sType is a elink:VkStructureType value identifying this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:name is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char |
| containing a null-terminated UTF-8 string which is a short human |
| readable name for this internal representation. |
| * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char |
| containing a null-terminated UTF-8 string which is a human readable |
| description for this internal representation. |
| * pname:isText specifies whether the returned data is text or opaque data. |
| If pname:isText is ename:VK_TRUE then the data returned in pname:pData |
| is text and is guaranteed to be a null-terminated UTF-8 string. |
| * pname:dataSize is an integer related to the size, in bytes, of the |
| internal representation's data, as described below. |
| * pname:pData is either `NULL` or a pointer to a block of data into which |
| the implementation will write the internal representation. |
| |
| If pname:pData is `NULL`, then the size, in bytes, of the internal |
| representation data is returned in pname:dataSize. |
| Otherwise, pname:dataSize must be the size of the buffer, in bytes, pointed |
| to by pname:pData and on return pname:dataSize is overwritten with the |
| number of bytes of data actually written to pname:pData including any |
| trailing null character. |
| If pname:dataSize is less than the size, in bytes, of the internal |
| representation's data, at most pname:dataSize bytes of data will be written |
| to pname:pData, and ename:VK_INCOMPLETE will be returned instead of |
| ename:VK_SUCCESS, to indicate that not all the available representation was |
| returned. |
| |
| If pname:isText is ename:VK_TRUE and pname:pData is not `NULL` and |
| pname:dataSize is not zero, the last byte written to pname:pData will be a |
| null character. |
| |
| include::{generated}/validity/structs/VkPipelineExecutableInternalRepresentationKHR.adoc[] |
| -- |
| endif::VK_KHR_pipeline_executable_properties[] |
| |
| |
| ifdef::VK_AMD_shader_info[] |
| include::{chapters}/VK_AMD_shader_info.adoc[] |
| endif::VK_AMD_shader_info[] |
| |
| |
| // These includes have their own section headers |
| |
| ifdef::VK_AMD_pipeline_compiler_control[] |
| include::{chapters}/VK_AMD_pipeline_compiler_control.adoc[] |
| endif::VK_AMD_pipeline_compiler_control[] |
| |
| ifdef::VK_VERSION_1_3,VK_EXT_pipeline_creation_feedback[] |
| include::{chapters}/VK_EXT_pipeline_creation_feedback/pipelines.adoc[] |
| endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_feedback[] |