管线

以下显示了 Vulkan 管线的框图。一些 Vulkan 命令指定要绘制的几何对象或要执行的计算工作,而另一些命令指定状态,控制各个管线阶段如何处理对象,或控制组织为图像和缓冲区的内存之间的数据传输。命令有效地通过处理管线发送,要么是图形管线光线追踪管线计算管线

图形管线可以在两种模式下运行,分别是图元着色网格着色管线。

图元着色

图形管线的第一个阶段(输入汇编器)根据请求的图元拓扑,将顶点组装成几何图元,如点、线和三角形。在下一个阶段(顶点着色器)中,顶点可以被变换,计算每个顶点的位置和属性。如果支持细分曲面和/或几何着色器,它们可以从单个输入图元生成多个图元,并可能在此过程中更改图元拓扑或生成额外的属性数据。

集群剔除着色

当使用集群剔除着色器时,类似计算着色器的着色器将执行基于集群的剔除,一组新的内置输出变量用于表示可见的集群,此外,还使用新的内置函数将这些变量从集群剔除着色器发送到输入汇编器 (IA) 阶段,然后 IA 可以使用这些变量来获取可见集群的顶点并驱动顶点着色器工作。

网格着色

当使用 网格着色 管线时,输入图元不是隐式组装的,而是通过 (网格着色器) 显式组装的。网格管线上的工作由应用程序绘制一组网格任务来启动。

如果可选的 (任务着色器) 处于活动状态,则每个任务都会触发一个任务着色器工作组的执行,该工作组在完成时将生成一组新任务。如果不存在任务着色器,则每个生成的任务或每个原始分派的任务都会触发网格着色器工作组的执行,该工作组会生成一个输出网格,该网格具有从存储在输出网格中的顶点组装而成的可变大小的图元数量。

通用

最终生成的图元在为下一个阶段(光栅化)做准备时被裁剪到裁剪体。光栅化器从点、线段或三角形的二维描述中生成与帧缓冲区区域关联的一系列片段。这些片段由片段操作处理,以确定生成的值是否将写入帧缓冲区。片段着色确定要写入帧缓冲区附件的值。然后,帧缓冲区操作读取和写入渲染通道实例的给定子通道的颜色和深度/模板附件。附件可以在同一渲染通道的后续子通道中用作片段着色器中的输入附件。

计算管线是一个与图形管线分开的管线,它在可以从缓冲区和图像内存读取和写入的一维、二维或三维工作组上运行。

此排序仅用作描述 Vulkan 的工具,而不是 Vulkan 如何实现的严格规则,我们仅将其作为组织管线的各种操作的手段。管线阶段之间的实际排序保证在同步章节中详细解释。

pipelinemesh
图 1. Vulkan 管线的框图

每个管线都由一个整体对象控制,该对象由所有着色器阶段的描述和任何相关的固定功能阶段创建。链接整个管线允许基于着色器的输入/输出优化着色器,并消除昂贵的绘制时状态验证。

管线对象使用 vkCmdBindPipeline 绑定到当前状态。任何指定为动态的管线对象状态都不会在绑定管线对象时应用于当前状态,而是由动态状态设置命令设置。

如果 commandBufferInheritance 特性未启用,则不会在命令缓冲区之间继承任何状态,包括动态状态。

如果 commandBufferInheritance 特性已启用,则在一个队列中执行的命令缓冲区末尾有效的全部图形和计算状态,将被继承并在同一队列中接下来执行的命令缓冲区的开头有效。这适用于主命令缓冲区和二级命令缓冲区。提交到队列的主命令缓冲区将从先前提交到该队列的命令缓冲区继承状态,二级命令缓冲区将从执行它们的主命令缓冲区或二级命令缓冲区继承状态,并且在执行二级命令缓冲区后,它的状态将被执行它的主命令缓冲区或二级命令缓冲区继承。在一个队列中执行的命令缓冲区不会从任何其他队列中执行的命令缓冲区继承状态。

计算、光线追踪和图形管线分别由 VkPipeline 句柄表示。

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline)

多管线创建

创建命令传递一个 pCreateInfos 数组,该数组包含 Vk*PipelineCreateInfo 结构,指定要创建的每个管线的参数,并在 pPipelines 中返回相应的句柄数组。pPipelines 的每个元素索引 i 都是基于 pCreateInfos 的对应元素 i 创建的。

应用程序可以将相似的管线分组在一起,以便在单个调用中创建,并且鼓励实现查找在创建组时进行重用的机会。

当尝试在单个命令中创建多个管线时,可能会出现仅部分管线创建失败的情况。在这种情况下,pPipelines 的相应元素将为 VK_NULL_HANDLE。如果由于参数有效而创建管线失败(例如,由于内存不足错误),则管线创建命令返回的 VkResult 代码将指示原因。实现将尝试创建所有管线,并且仅为那些实际失败的管线返回 VK_NULL_HANDLE 值。

如果创建的管线的 Vk*PipelineCreateInfo 中的 VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT 被设置,则在 pPipelines 数组中索引大于或等于失败管线的索引的管线将为 VK_NULL_HANDLE

如果多个管线创建失败,则返回的 VkResult 必须是任何一个未成功管线的返回值。应用程序可以通过迭代 pPipelines 数组并销毁每个不是 VK_NULL_HANDLE 的元素来可靠地从失败的调用中清理。

如果整个命令失败且未创建任何管线,则 pPipelines 的所有元素将为 VK_NULL_HANDLE

计算管线

计算管线由单个静态计算着色器阶段和管线布局组成。

计算管线表示计算着色器,并通过调用 vkCreateComputePipelines,并使用 modulepName 从着色器模块中选择一个入口点来创建,其中该入口点在 VkComputePipelineCreateInfo 结构中包含的 VkPipelineShaderStageCreateInfo 结构中定义了一个有效的计算着色器。

要创建计算管线,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateComputePipelines(
    VkDevice                                    device,
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkComputePipelineCreateInfo*          pCreateInfos,
    const VkAllocationCallbacks*                pAllocator,
    VkPipeline*                                 pPipelines);
  • device 是创建计算管线的逻辑设备。

  • pipelineCacheVK_NULL_HANDLE,表示禁用管线缓存;或者是有效的 管线缓存 对象的句柄,在这种情况下,在该命令的执行期间启用该缓存的使用。

  • createInfoCountpCreateInfospPipelines 数组的长度。

  • pCreateInfos 是指向 VkComputePipelineCreateInfo 结构数组的指针。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

  • pPipelines 是指向 VkPipeline 句柄数组的指针,其中返回生成的计算管线对象。

管线的创建和返回方式如 多管线创建 所述。

有效使用
  • VUID-vkCreateComputePipelines-device-09661
    device 必须支持至少一个具有 VK_QUEUE_COMPUTE_BIT 功能的队列族

  • VUID-vkCreateComputePipelines-flags-00695
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且该元素的 basePipelineIndex 成员不是 -1,则 basePipelineIndex 必须小于 pCreateInfos 中对应于该元素的索引

  • VUID-vkCreateComputePipelines-flags-00696
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则基本管线必须已使用设置了 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 标志创建

  • VUID-vkCreateComputePipelines-pipelineCache-02873
    如果 pipelineCache 是使用 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 创建的,则对 pipelineCache 的主机访问必须外部同步的

  • VUID-vkCreateComputePipelines-pNext-09616
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateComputePipelines-pNext-09617
    如果在 pCreateInfos 的任何元素的 pNext 链中包含设置了 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的 VkPipelineCreateFlags2CreateInfoKHR 结构,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateComputePipelines-binaryCount-09620
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateComputePipelines-binaryCount-09621
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateComputePipelines-binaryCount-09622
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT 必须不设置在该元素的 flags

有效用法(隐式)
  • VUID-vkCreateComputePipelines-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateComputePipelines-pipelineCache-parameter
    如果 pipelineCache 不是 VK_NULL_HANDLE,则 pipelineCache 必须是有效的 VkPipelineCache 句柄

  • VUID-vkCreateComputePipelines-pCreateInfos-parameter
    pCreateInfos 必须是指向 createInfoCount 个有效 VkComputePipelineCreateInfo 结构的数组的有效指针

  • VUID-vkCreateComputePipelines-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateComputePipelines-pPipelines-parameter
    pPipelines 必须是指向 createInfoCountVkPipeline 句柄的数组的有效指针

  • VUID-vkCreateComputePipelines-createInfoCount-arraylength
    createInfoCount 必须大于 0

  • VUID-vkCreateComputePipelines-pipelineCache-parent
    如果 pipelineCache 是有效句柄,则它必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

  • VK_PIPELINE_COMPILE_REQUIRED_EXT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_SHADER_NV

VkComputePipelineCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkComputePipelineCreateInfo {
    VkStructureType                    sType;
    const void*                        pNext;
    VkPipelineCreateFlags              flags;
    VkPipelineShaderStageCreateInfo    stage;
    VkPipelineLayout                   layout;
    VkPipeline                         basePipelineHandle;
    int32_t                            basePipelineIndex;
} VkComputePipelineCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。

  • stage 是一个 VkPipelineShaderStageCreateInfo 结构,描述计算着色器。

  • layout 是描述管线和与管线一起使用的描述符集的绑定位置。

  • basePipelineHandle 是一个要从中派生的管线。

  • basePipelineIndex 是一个索引,指向 pCreateInfos 参数中要用作派生管线的管线。

参数 basePipelineHandlebasePipelineIndex管线派生中进行了更详细的描述。

如果 pNext 链包含 VkPipelineCreateFlags2CreateInfo 结构,则使用该结构的 VkPipelineCreateFlags2CreateInfo::flags,而不是此结构中的 flags

有效使用
  • VUID-VkComputePipelineCreateInfo-None-09497
    如果 pNext 链不包含 VkPipelineCreateFlags2CreateInfo 结构,则 flags 必须VkPipelineCreateFlagBits 值的有效组合

  • VUID-VkComputePipelineCreateInfo-flags-07984
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineIndex 为 -1,则 basePipelineHandle 必须是有效的计算 VkPipeline 句柄

  • VUID-VkComputePipelineCreateInfo-flags-07985
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineHandleVK_NULL_HANDLE,则 basePipelineIndex 必须是调用命令的 pCreateInfos 参数中的有效索引

  • VUID-VkComputePipelineCreateInfo-flags-07986
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则 basePipelineIndex 必须为 -1 或 basePipelineHandle 必须VK_NULL_HANDLE

  • VUID-VkComputePipelineCreateInfo-layout-07987
    如果在着色器中声明了推送常量块,则 layout 中的推送常量范围必须与着色器阶段匹配

  • VUID-VkComputePipelineCreateInfo-layout-10069
    如果在着色器中声明了推送常量块,则该块必须包含在 layout 中与该阶段匹配的推送常量范围内

  • VUID-VkComputePipelineCreateInfo-layout-07988
    如果在着色器中声明了资源变量,则 layout 中相应的描述符集必须与着色器阶段匹配

  • VUID-VkComputePipelineCreateInfo-layout-07990
    如果在着色器中声明了资源变量,并且描述符类型不是 VK_DESCRIPTOR_TYPE_MUTABLE_EXT,则 layout 中相应的描述符集必须与描述符类型匹配

  • VUID-VkComputePipelineCreateInfo-layout-07991
    如果在着色器中将资源变量声明为数组,则 layout 中相应的描述符集必须与描述符计数匹配

  • VUID-VkComputePipelineCreateInfo-None-10391
    如果将 资源变量在着色器中声明为描述符数组,则该变量的描述符类型必须不是 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

  • VUID-VkComputePipelineCreateInfo-flags-03365
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-03366
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-03367
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-03368
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-03369
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-03370
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-03576
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-04945
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV

  • VUID-VkComputePipelineCreateInfo-flags-09007
    如果 VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputePipelines 特性未启用,则 flags 必须 不包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV

  • VUID-VkComputePipelineCreateInfo-flags-09008
    如果 flags 包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV,则 pNext必须 包含指向 VkComputePipelineIndirectBufferInfoNV 的有效实例的指针,该实例指定管道元数据将保存到的地址。

  • VUID-VkComputePipelineCreateInfo-flags-11007
    如果 flags 包含 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT,则 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands 特性 必须 启用。

  • VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875
    如果 pipelineCreationCacheControl 特性未启用,则 flags 必须 不包含 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BITVK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT

  • VUID-VkComputePipelineCreateInfo-stage-00701
    stagestage 成员 必须VK_SHADER_STAGE_COMPUTE_BIT

  • VUID-VkComputePipelineCreateInfo-stage-00702
    stage 标识的入口点的着色器代码以及此结构标识的其余状态 必须 遵守 着色器接口 章节中描述的管道链接规则。

  • VUID-VkComputePipelineCreateInfo-layout-01687
    layout 中计算着色器阶段可访问的资源数量 必须 小于或等于 VkPhysicalDeviceLimits::maxPerStageResources

  • VUID-VkComputePipelineCreateInfo-shaderEnqueue-09177
    如果 shaderEnqueue 特性未启用,则 flags 必须 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR

  • VUID-VkComputePipelineCreateInfo-flags-09178
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,则 stage 指定的着色器 必须 不声明 ShaderEnqueueAMDX 功能。

  • VUID-VkComputePipelineCreateInfo-pipelineStageCreationFeedbackCount-06566
    如果 VkPipelineCreationFeedbackCreateInfo::pipelineStageCreationFeedbackCount 不为 0,则它 必须1

  • VUID-VkComputePipelineCreateInfo-flags-07367
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT

  • VUID-VkComputePipelineCreateInfo-flags-07996
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV

有效用法(隐式)

VkPipelineShaderStageCreateInfo 结构定义为:

// Provided by VK_VERSION_1_0
typedef struct VkPipelineShaderStageCreateInfo {
    VkStructureType                     sType;
    const void*                         pNext;
    VkPipelineShaderStageCreateFlags    flags;
    VkShaderStageFlagBits               stage;
    VkShaderModule                      module;
    const char*                         pName;
    const VkSpecializationInfo*         pSpecializationInfo;
} VkPipelineShaderStageCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkPipelineShaderStageCreateFlagBits 的位掩码,指定如何生成管道着色器阶段。

  • stage 是一个 VkShaderStageFlagBits 值,指定单个管道阶段。

  • module 是可选的 VkShaderModule 对象,其中包含此阶段的着色器代码。

  • pName 是一个指向以 null 结尾的 UTF-8 字符串的指针,该字符串指定此阶段着色器的入口点名称。

  • pSpecializationInfo 是指向 VkSpecializationInfo 结构的指针,如 特化常量 中所述,或 NULL

如果 module 不是 VK_NULL_HANDLE,则管道使用的着色器代码由 module 定义。如果 moduleVK_NULL_HANDLE,则着色器代码由链式的 VkShaderModuleCreateInfo(如果存在)定义。

如果启用了shaderModuleIdentifier特性,应用程序可以省略stage的着色器代码,而是提供模块标识符。这通过在pNext链中包含一个identifierSize不等于 0 的 VkPipelineShaderStageModuleIdentifierCreateInfoEXT 结构体来实现。以这种方式创建的着色器阶段等同于使用具有相同标识符的着色器模块创建的阶段。该标识符允许实现查找管道,而无需消耗有效的 SPIR-V 模块。如果未找到管道,则无法进行管道编译,并且实现必须按照 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 的规定失败。

当使用标识符代替着色器模块时,实现可能由于任何原因而导致管道编译失败并返回 VK_PIPELINE_COMPILE_REQUIRED

对于实现使用 VkPipelineShaderStageModuleIdentifierCreateInfoEXT 返回管道的宽松要求,其原因是层或工具可能会拦截管道创建调用,并需要完整的 SPIR-V 上下文才能正确运行。如果管道存在于某个缓存中,则 ICD 不应导致管道编译失败。

应用程序可以在使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建管道时使用标识符。在创建此类管道时,可能会返回 VK_SUCCESS,但在 VkPipelineLibraryCreateInfoKHR 结构中引用该管道时随后会失败。应用程序必须允许在链接步骤中使用 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 导致管道编译失败,因为在链接步骤之前,可能无法确定是否可以从标识符创建管道。

有效使用
  • VUID-VkPipelineShaderStageCreateInfo-stage-00704
    如果未启用 geometryShader 特性,则 stage 必须不是 VK_SHADER_STAGE_GEOMETRY_BIT

  • VUID-VkPipelineShaderStageCreateInfo-stage-00705
    如果未启用 tessellationShader 特性,则 stage 必须不是 VK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT

  • VUID-VkPipelineShaderStageCreateInfo-stage-02091
    如果未启用 meshShaders 特性,则 stage 必须不是 VK_SHADER_STAGE_MESH_BIT_EXT

  • VUID-VkPipelineShaderStageCreateInfo-stage-02092
    如果未启用 taskShaders 特性,则 stage 必须不是 VK_SHADER_STAGE_TASK_BIT_EXT

  • VUID-VkPipelineShaderStageCreateInfo-clustercullingShader-07813
    如果未启用 clustercullingShader 特性,则 stage 必须不是 VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI

  • VUID-VkPipelineShaderStageCreateInfo-stage-00706
    stage 必须不是 VK_SHADER_STAGE_ALL_GRAPHICSVK_SHADER_STAGE_ALL

  • VUID-VkPipelineShaderStageCreateInfo-pName-00707
    pName 必须moduleOpEntryPoint 的名称,并且其执行模型与 stage 相匹配

  • VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708
    如果标识的入口点在其接口中包含任何使用 ClipDistance BuiltIn 修饰符声明的变量,则该变量的数组大小必须不大于 VkPhysicalDeviceLimits::maxClipDistances

  • VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709
    如果标识的入口点在其接口中包含任何使用 CullDistance BuiltIn 修饰符声明的变量,则该变量的数组大小必须不大于 VkPhysicalDeviceLimits::maxCullDistances

  • VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710
    如果标识的入口点在其接口中包含使用 ClipDistance BuiltIn 修饰符声明的变量以及使用 CullDistance BuiltIn 修饰符声明的变量,则这些变量的数组大小总和必须不大于 VkPhysicalDeviceLimits::maxCombinedClipAndCullDistances

  • VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711
    如果标识的入口点在其接口中包含任何使用 SampleMask BuiltIn 修饰符声明的变量,则该变量的数组大小必须不大于 VkPhysicalDeviceLimits::maxSampleMaskWords

  • VUID-VkPipelineShaderStageCreateInfo-stage-00713
    如果 stageVK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,并且标识的入口点具有一个使用 OutputVertices 指定面片大小的 OpExecutionMode 指令,则面片大小必须大于 0 且小于或等于 VkPhysicalDeviceLimits::maxTessellationPatchSize

  • VUID-VkPipelineShaderStageCreateInfo-stage-00714
    如果 stageVK_SHADER_STAGE_GEOMETRY_BIT,则标识的入口点必须具有一个 OpExecutionMode 指令,该指令指定的最大输出顶点计数大于 0 且小于或等于 VkPhysicalDeviceLimits::maxGeometryOutputVertices

  • VUID-VkPipelineShaderStageCreateInfo-stage-00715
    如果 stageVK_SHADER_STAGE_GEOMETRY_BIT,则标识的入口点必须具有一个 OpExecutionMode 指令,该指令指定的大于 0 且小于或等于 VkPhysicalDeviceLimits::maxGeometryShaderInvocations 的调用计数

  • VUID-VkPipelineShaderStageCreateInfo-stage-02596
    如果 stageVK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT,并且标识的入口点为任何图元写入 Layer,则对于给定图元的所有顶点,它必须写入相同的 Layer

  • VUID-VkPipelineShaderStageCreateInfo-stage-02597
    如果 stageVK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT,并且标识的入口点为任何图元写入 ViewportIndex,则对于给定图元的所有顶点,它必须写入相同的 ViewportIndex

  • VUID-VkPipelineShaderStageCreateInfo-stage-06685
    如果 stageVK_SHADER_STAGE_FRAGMENT_BIT,并且标识的入口点在任何执行路径中写入 FragDepth,则所有非助手调用的独占执行路径必须放弃片段,或者写入或初始化 FragDepth 的值

  • VUID-VkPipelineShaderStageCreateInfo-stage-06686
    如果 stageVK_SHADER_STAGE_FRAGMENT_BIT,并且标识的入口点在任何执行路径中写入 FragStencilRefEXT,则所有非助手调用的独占执行路径必须放弃片段,或者写入或初始化 FragStencilRefEXT 的值

  • VUID-VkPipelineShaderStageCreateInfo-flags-02784
    如果 flags 设置了 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 标志,则必须启用 subgroupSizeControl 特性。

  • VUID-VkPipelineShaderStageCreateInfo-flags-02785
    如果 flags 设置了 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT 标志,则必须启用 computeFullSubgroups 特性。

  • VUID-VkPipelineShaderStageCreateInfo-flags-08988
    如果 flags 包含 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT,则 stage 必须VK_SHADER_STAGE_MESH_BIT_EXTVK_SHADER_STAGE_TASK_BIT_EXTVK_SHADER_STAGE_COMPUTE_BIT 之一。

  • VUID-VkPipelineShaderStageCreateInfo-pNext-02754
    如果 pNext 链中包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,则 flags 必须不能设置 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 标志。

  • VUID-VkPipelineShaderStageCreateInfo-pNext-02755
    如果 pNext 链中包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,则必须启用 subgroupSizeControl 特性,并且 stage 必须requiredSubgroupSizeStages 中指定的有效位。

  • VUID-VkPipelineShaderStageCreateInfo-pNext-02756
    如果 pNext 链中包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,并且 stageVK_SHADER_STAGE_COMPUTE_BITVK_SHADER_STAGE_MESH_BIT_EXTVK_SHADER_STAGE_TASK_BIT_EXT,则着色器的本地工作组大小必须小于或等于 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo::requiredSubgroupSizemaxComputeWorkgroupSubgroups 的乘积。

  • VUID-VkPipelineShaderStageCreateInfo-pNext-02757
    如果 pNext 链中包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,并且 flags 设置了 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT 标志,则管线 X 维的本地工作组大小必须VkPipelineShaderStageRequiredSubgroupSizeCreateInfo::requiredSubgroupSize 的倍数。

  • VUID-VkPipelineShaderStageCreateInfo-flags-02758
    如果 flags 同时设置了 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BITVK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 标志,则管线 X 维的本地工作组大小必须maxSubgroupSize 的倍数。

  • VUID-VkPipelineShaderStageCreateInfo-flags-02759
    如果 flags 设置了 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT 标志,并且 flags 没有设置 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 标志,并且 pNext 链中没有包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,则管线 X 维的本地工作组大小必须subgroupSize 的倍数。

  • VUID-VkPipelineShaderStageCreateInfo-module-08987
    如果 module 使用了 OpTypeCooperativeMatrixKHR 指令,且 Scope 等于 Subgroup,则管线 X 维的本地工作组大小必须subgroupSize 的倍数。

  • VUID-VkPipelineShaderStageCreateInfo-module-10169
    如果 module 使用了 OpTypeCooperativeMatrixKHR 指令,且 Scope 等于 Workgroup,则管线 X 维的本地工作组大小必须subgroupSize 的倍数,并且本地工作组总大小必须subgroupSize 的 2 的幂次倍数,且必须小于或等于 cooperativeMatrixWorkgroupScopeMaxWorkgroupSize

  • VUID-VkPipelineShaderStageCreateInfo-stage-08771
    如果未为此 stage 指定着色器模块标识符,则 module 必须是有效的 VkShaderModule,或者父 Vk*CreateInfo 结构的 pNext必须VkPipelineBinaryInfoKHR::binaryCount 设置为大于 0 的值,如果未启用以下任何特性:

  • VUID-VkPipelineShaderStageCreateInfo-stage-06845
    如果未为此 stage 指定着色器模块标识符,则 module 必须是有效的 VkShaderModule,或者 pNext 链中必须存在有效的 VkShaderModuleCreateInfo 结构,或者父 Vk*CreateInfo 结构的 pNext必须VkPipelineBinaryInfoKHR::binaryCount 设置为大于 0 的值。

  • VUID-VkPipelineShaderStageCreateInfo-stage-06844
    如果为此 stage 指定了着色器模块标识符,则 pNext必须不包含 VkShaderModuleCreateInfo 结构。

  • VUID-VkPipelineShaderStageCreateInfo-stage-06848
    如果为此 stage 指定了着色器模块标识符,则 module 必须VK_NULL_HANDLE

  • VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-06849
    如果未指定着色器模块标识符,则管线使用的着色器代码必须在应用 pSpecializationInfo 中提供的任何特化之后,并将所有特化常量转换为固定常量之后,符合 Khronos SPIR-V 规范 的描述。

有效用法(隐式)
// Provided by VK_VERSION_1_0
typedef VkFlags VkPipelineShaderStageCreateFlags;

VkPipelineShaderStageCreateFlags 是一个位掩码类型,用于设置零个或多个 VkPipelineShaderStageCreateFlagBits 的掩码。

指定如何创建管线着色器阶段的 VkPipelineShaderStageCreateInfoflags 成员的可能值是:

// Provided by VK_VERSION_1_0
typedef enum VkPipelineShaderStageCreateFlagBits {
  // Provided by VK_VERSION_1_3
    VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT = 0x00000001,
  // Provided by VK_VERSION_1_3
    VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT = 0x00000002,
  // Provided by VK_EXT_subgroup_size_control
    VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT,
  // Provided by VK_EXT_subgroup_size_control
    VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT,
} VkPipelineShaderStageCreateFlagBits;
  • VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 指定 SubgroupSize 在着色器阶段可能会变化。

  • VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT 指定子组大小在任务、网格或计算阶段启动时,必须 所有调用都是活跃的。

如果指定了 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXTVK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT,并且 minSubgroupSize 不等于 maxSubgroupSize,并且没有指定所需子组大小,那么保证本地工作组大小的“X”维度是SubgroupSize 的倍数的唯一方法是使其成为 maxSubgroupSize 的倍数。在这些条件下,可以保证完整的子组,但不能保证任何特定的子组大小。

可以通过命令和结构设置的,指定一个或多个着色器阶段的位是:

// Provided by VK_VERSION_1_0
typedef enum VkShaderStageFlagBits {
    VK_SHADER_STAGE_VERTEX_BIT = 0x00000001,
    VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002,
    VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004,
    VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008,
    VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010,
    VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020,
    VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F,
    VK_SHADER_STAGE_ALL = 0x7FFFFFFF,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_SHADER_STAGE_RAYGEN_BIT_KHR = 0x00000100,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_SHADER_STAGE_ANY_HIT_BIT_KHR = 0x00000200,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR = 0x00000400,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_SHADER_STAGE_MISS_BIT_KHR = 0x00000800,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_SHADER_STAGE_INTERSECTION_BIT_KHR = 0x00001000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_SHADER_STAGE_CALLABLE_BIT_KHR = 0x00002000,
  // Provided by VK_EXT_mesh_shader
    VK_SHADER_STAGE_TASK_BIT_EXT = 0x00000040,
  // Provided by VK_EXT_mesh_shader
    VK_SHADER_STAGE_MESH_BIT_EXT = 0x00000080,
  // Provided by VK_HUAWEI_subpass_shading
    VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0x00004000,
  // Provided by VK_HUAWEI_cluster_culling_shader
    VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI = 0x00080000,
  // Provided by VK_NV_ray_tracing
    VK_SHADER_STAGE_RAYGEN_BIT_NV = VK_SHADER_STAGE_RAYGEN_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_SHADER_STAGE_ANY_HIT_BIT_NV = VK_SHADER_STAGE_ANY_HIT_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_SHADER_STAGE_MISS_BIT_NV = VK_SHADER_STAGE_MISS_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_SHADER_STAGE_INTERSECTION_BIT_NV = VK_SHADER_STAGE_INTERSECTION_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_SHADER_STAGE_CALLABLE_BIT_NV = VK_SHADER_STAGE_CALLABLE_BIT_KHR,
  // Provided by VK_NV_mesh_shader
    VK_SHADER_STAGE_TASK_BIT_NV = VK_SHADER_STAGE_TASK_BIT_EXT,
  // Provided by VK_NV_mesh_shader
    VK_SHADER_STAGE_MESH_BIT_NV = VK_SHADER_STAGE_MESH_BIT_EXT,
} VkShaderStageFlagBits;
  • VK_SHADER_STAGE_VERTEX_BIT 指定顶点阶段。

  • VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT 指定细分控制阶段。

  • VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT 指定细分评估阶段。

  • VK_SHADER_STAGE_GEOMETRY_BIT 指定几何阶段。

  • VK_SHADER_STAGE_FRAGMENT_BIT 指定片段阶段。

  • VK_SHADER_STAGE_COMPUTE_BIT 指定计算阶段。

  • VK_SHADER_STAGE_ALL_GRAPHICS 是一个位组合,用作指定上述所有图形阶段(不包括计算阶段)的简写。

  • VK_SHADER_STAGE_ALL 是一个位组合,用作指定设备支持的所有着色器阶段的简写,包括由扩展引入的所有附加阶段。

  • VK_SHADER_STAGE_TASK_BIT_EXT 指定任务阶段。

  • VK_SHADER_STAGE_MESH_BIT_EXT 指定网格阶段。

  • VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI 指定集群剔除阶段。

  • VK_SHADER_STAGE_RAYGEN_BIT_KHR 指定光线生成阶段。

  • VK_SHADER_STAGE_ANY_HIT_BIT_KHR 指定任意命中阶段。

  • VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR 指定最近命中阶段。

  • VK_SHADER_STAGE_MISS_BIT_KHR 指定未命中阶段。

  • VK_SHADER_STAGE_INTERSECTION_BIT_KHR 指定相交阶段。

  • VK_SHADER_STAGE_CALLABLE_BIT_KHR 指定可调用阶段。

VK_SHADER_STAGE_ALL_GRAPHICS 仅包括 Vulkan 1.0 中包含的原始五个图形阶段,而不包括扩展添加的任何阶段。因此,在所有情况下,它可能没有预期的效果。

// Provided by VK_VERSION_1_0
typedef VkFlags VkShaderStageFlags;

VkShaderStageFlags 是一个位掩码类型,用于设置零个或多个 VkShaderStageFlagBits 的掩码。

VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构定义为

// Provided by VK_VERSION_1_3
typedef struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfo {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           requiredSubgroupSize;
} VkPipelineShaderStageRequiredSubgroupSizeCreateInfo;

或等效的

// Provided by VK_EXT_subgroup_size_control
typedef VkPipelineShaderStageRequiredSubgroupSizeCreateInfo VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT;

或等效的

// Provided by VK_EXT_shader_object
typedef VkPipelineShaderStageRequiredSubgroupSizeCreateInfo VkShaderRequiredSubgroupSizeCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • requiredSubgroupSize 是一个无符号整数值,指定新创建的管线着色器阶段所需的子组大小。

如果 VkPipelineShaderStageCreateInfopNext 链中包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,则指定正在编译的管线着色器阶段具有所需的子组大小。

如果 VkShaderCreateInfoEXTpNext 链中包含 VkShaderRequiredSubgroupSizeCreateInfoEXT 结构,则指定正在编译的着色器具有所需的子组大小。

有效使用
  • VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-requiredSubgroupSize-02760
    requiredSubgroupSize 必须 是 2 的幂的整数。

  • VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-requiredSubgroupSize-02761
    requiredSubgroupSize 必须 大于或等于 minSubgroupSize

  • VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-requiredSubgroupSize-02762
    requiredSubgroupSize 必须 小于或等于 maxSubgroupSize

有效用法(隐式)
  • VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO

子通道着色管线是一个计算管线,它必须仅在渲染通道的子通道中调用,其工作维度由渲染区域大小指定。子通道着色管线着色器是一个计算着色器,允许访问调用子通道中指定的输入附件。要创建子通道着色管线,请在 VkComputePipelineCreateInfopNext 链中使用 VkSubpassShadingPipelineCreateInfoHUAWEI 调用 vkCreateComputePipelines

VkSubpassShadingPipelineCreateInfoHUAWEI 结构定义为

// Provided by VK_HUAWEI_subpass_shading
typedef struct VkSubpassShadingPipelineCreateInfoHUAWEI {
    VkStructureType    sType;
    void*              pNext;
    VkRenderPass       renderPass;
    uint32_t           subpass;
} VkSubpassShadingPipelineCreateInfoHUAWEI;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • renderPass 是一个渲染通道对象的句柄,描述了将在其中使用该管线的环境。该管线必须仅与提供的渲染通道实例兼容的渲染通道一起使用。有关更多信息,请参阅 渲染通道兼容性

  • subpass 是将在其中使用此管线的渲染通道中子通道的索引。

有效使用
  • VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-subpass-04946
    创建 subpass必须使用 VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI 绑定点。

有效用法(隐式)
  • VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI

  • VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-renderPass-parameter
    renderPass 必须 是一个有效的 VkRenderPass 句柄

子通道着色管线的工作组大小是一个 2D 向量,宽度和高度均为 2 的幂。宽度和高度的最大值取决于具体实现,并且可能因渲染通道中附件的不同格式和采样计数而异。

要查询最大工作组大小,请调用

// Provided by VK_HUAWEI_subpass_shading
VkResult vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
    VkDevice                                    device,
    VkRenderPass                                renderpass,
    VkExtent2D*                                 pMaxWorkgroupSize);
  • device 是一个本地设备对象的句柄,该对象用于创建给定的渲染通道。

  • renderPass 是一个渲染通道对象的句柄,描述了将在其中使用该管线的环境。该管线必须仅与提供的渲染通道实例兼容的渲染通道一起使用。有关更多信息,请参阅 渲染通道兼容性

  • pMaxWorkgroupSize 是指向 VkExtent2D 结构的指针。

有效用法(隐式)
  • VUID-vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI-renderpass-parameter
    renderpass 必须 是一个有效的 VkRenderPass 句柄

  • VUID-vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI-pMaxWorkgroupSize-parameter
    pMaxWorkgroupSize 必须 是指向 VkExtent2D 结构的有效指针

  • VUID-vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI-renderpass-parent
    renderpass 必须 已从 device 创建、分配或检索

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_SURFACE_LOST_KHR

VkPipelineRobustnessCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkPipelineRobustnessCreateInfo {
    VkStructureType                       sType;
    const void*                           pNext;
    VkPipelineRobustnessBufferBehavior    storageBuffers;
    VkPipelineRobustnessBufferBehavior    uniformBuffers;
    VkPipelineRobustnessBufferBehavior    vertexInputs;
    VkPipelineRobustnessImageBehavior     images;
} VkPipelineRobustnessCreateInfo;

或等效的

// Provided by VK_EXT_pipeline_robustness
typedef VkPipelineRobustnessCreateInfo VkPipelineRobustnessCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • storageBuffers 设置对绑定为以下资源的越界访问行为:

    • VK_DESCRIPTOR_TYPE_STORAGE_BUFFER

    • VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER

    • VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC

  • uniformBuffers 描述对绑定为以下资源的越界访问行为:

    • VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER

    • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER

    • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC

    • VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

  • vertexInputs 描述对顶点输入属性的越界访问行为

  • images 描述对绑定为以下资源的越界访问行为:

    • VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE

    • VK_DESCRIPTOR_TYPE_STORAGE_IMAGE

绑定为 VK_DESCRIPTOR_TYPE_MUTABLE_EXT 的资源将具有覆盖其活动描述符类型的鲁棒性行为。

VkPipelineRobustnessCreateInfo 的影响范围取决于它包含在哪个结构的 pNext 链中。

  • VkGraphicsPipelineCreateInfoVkRayTracingPipelineCreateInfoKHRVkComputePipelineCreateInfo
    VkPipelineRobustnessCreateInfo 描述的鲁棒性行为适用于通过此管线的所有访问

  • VkPipelineShaderStageCreateInfo:
    VkPipelineRobustnessCreateInfo 描述的鲁棒性行为适用于源自此着色器阶段的着色器代码的所有访问

如果为管线和管线阶段都指定了 VkPipelineRobustnessCreateInfo,则为管线阶段指定的 VkPipelineRobustnessCreateInfo 将优先。

当为管线指定 VkPipelineRobustnessCreateInfo 时,它仅影响创建信息指定的管线子集,而不是从管线库链接的子集。 对于 VkGraphicsPipelineCreateInfo,该子集由 VkGraphicsPipelineLibraryCreateInfoEXT::flags 指定。 对于 VkRayTracingPipelineCreateInfoKHR,该子集由 VkRayTracingPipelineCreateInfoKHR::pStages 中的特定阶段指定。

有效使用
  • VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06926
    如果未启用 pipelineRobustness 功能,则 storageBuffers 必须VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT

  • VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06927
    如果未启用 pipelineRobustness 功能,则 uniformBuffers 必须VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT

  • VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06928
    如果未启用 pipelineRobustness 功能,则 vertexInputs 必须VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT

  • VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06929
    如果未启用 pipelineRobustness 功能,则 images 必须VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT

  • VUID-VkPipelineRobustnessCreateInfo-robustImageAccess-06930
    如果不支持 robustImageAccess 功能,则 images 必须 不为 VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS

  • VUID-VkPipelineRobustnessCreateInfo-robustBufferAccess2-06931
    如果不支持 robustBufferAccess2 功能,则 storageBuffers 必须 不为 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2

  • VUID-VkPipelineRobustnessCreateInfo-robustBufferAccess2-06932
    如果不支持 robustBufferAccess2 功能,则 uniformBuffers 必须 不为 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2

  • VUID-VkPipelineRobustnessCreateInfo-robustBufferAccess2-06933
    如果不支持 robustBufferAccess2 功能,则 vertexInputs 必须 不为 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2

  • VUID-VkPipelineRobustnessCreateInfo-robustImageAccess2-06934
    如果不支持 robustImageAccess2 功能,则 images 必须 不为 VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2

有效用法(隐式)

VkPipelineRobustnessCreateInfostorageBuffersuniformBuffersvertexInputs 成员的可能值是:

// Provided by VK_VERSION_1_4
typedef enum VkPipelineRobustnessBufferBehavior {
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT = 0,
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED = 1,
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS = 2,
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 = 3,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,
} VkPipelineRobustnessBufferBehavior;

或等效的

// Provided by VK_EXT_pipeline_robustness
typedef VkPipelineRobustnessBufferBehavior VkPipelineRobustnessBufferBehaviorEXT;
  • VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT 指定此管线阶段遵循创建此管线的设备上启用的鲁棒性功能的行为。

  • VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED 指定此管线阶段对相关资源类型的缓冲区访问必须不超出边界。

  • VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS 指定此管线阶段对相关资源类型的超出边界的访问行为,如同启用了 robustBufferAccess 功能一样。

  • VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 指定此管线阶段对相关资源类型的超出边界的访问行为,如同启用了 robustBufferAccess2 功能一样。

VkPipelineRobustnessCreateInfoimages 成员的可能值是:

// Provided by VK_VERSION_1_4
typedef enum VkPipelineRobustnessImageBehavior {
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT = 0,
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED = 1,
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS = 2,
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2 = 3,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS,
  // Provided by VK_EXT_pipeline_robustness
    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2,
} VkPipelineRobustnessImageBehavior;

或等效的

// Provided by VK_EXT_pipeline_robustness
typedef VkPipelineRobustnessImageBehavior VkPipelineRobustnessImageBehaviorEXT;
  • VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT 指定此管线阶段遵循创建此管线的设备上启用的鲁棒性功能的行为。

  • VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED 指定此管线阶段对相关资源类型的图像访问必须不超出边界。

  • VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS 指定此管线阶段对图像的超出边界的访问行为,如同启用了 robustImageAccess 功能一样。

  • VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2 指定此管线阶段对图像的超出边界的访问行为,如同启用了 robustImageAccess2 功能一样。

可以提供标识符而不是着色器代码,以便在不向实现提供完整的 SPIR-V 的情况下尝试编译管线。

VkPipelineShaderStageModuleIdentifierCreateInfoEXT 结构定义如下:

// Provided by VK_EXT_shader_module_identifier
typedef struct VkPipelineShaderStageModuleIdentifierCreateInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           identifierSize;
    const uint8_t*     pIdentifier;
} VkPipelineShaderStageModuleIdentifierCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • identifierSizepIdentifier 指向的缓冲区的大小,以字节为单位。

  • pIdentifier 是指向包含不透明数据的缓冲区的指针,该数据指定标识符。

可以使用任何标识符。如果使用标识符创建的管线需要编译才能完成管线创建调用,则管线编译必须失败,如 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 定义。

pIdentifieridentifierSize 可以从先前查询的 VkShaderModuleIdentifierEXT 获取。

有效使用
  • VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-pNext-06850
    如果此结构包含在 pNext 链中,且 identifierSize 不等于 0,则必须启用 shaderModuleIdentifier 功能。

  • VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-pNext-06851
    如果此结构包含在 VkPipelineShaderStageCreateInfopNext 链中,且 identifierSize 不等于 0,则在创建管线时必须设置 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 标志。

  • VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-identifierSize-06852
    identifierSize 必须小于或等于 VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT

有效用法(隐式)
  • VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT

  • VUID-VkPipelineShaderStageModuleIdentifierCreateInfoEXT-pIdentifier-parameter
    如果 identifierSize 不为 0,则 pIdentifier 必须是指向包含 identifierSizeuint8_t 值的数组的有效指针。

如果要在 设备生成的命令中使用计算管线,方法是用 VkBindPipelineIndirectCommandNV 指定其管线令牌,那么该管线的关联元数据必须保存在指定的缓冲区设备地址,以便稍后用于间接命令生成。缓冲区设备地址必须在创建计算管线时使用 VkComputePipelineIndirectBufferInfoNV 结构在 VkComputePipelineCreateInfopNext 链中指定。

VkComputePipelineIndirectBufferInfoNV 结构定义如下:

// Provided by VK_NV_device_generated_commands_compute
typedef struct VkComputePipelineIndirectBufferInfoNV {
    VkStructureType    sType;
    const void*        pNext;
    VkDeviceAddress    deviceAddress;
    VkDeviceSize       size;
    VkDeviceAddress    pipelineDeviceAddressCaptureReplay;
} VkComputePipelineIndirectBufferInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • deviceAddress 是存储管线元数据的地址。

  • size 是使用 vkGetPipelineIndirectMemoryRequirementsNV 查询的管线元数据的大小。

  • pipelineDeviceAddressCaptureReplay 是管线元数据最初保存的设备地址,现在可以用于重新填充 deviceAddress 以进行重放。

如果 pipelineDeviceAddressCaptureReplay 为零,则不请求特定地址。如果 pipelineDeviceAddressCaptureReplay 不为零,则它必须是从同一实现中相同创建的管线检索到的地址。管线元数据必须也放置在相同创建的缓冲区上,并使用 vkCmdUpdatePipelineIndirectBufferNV 命令放在相同偏移量处。

有效使用
  • VUID-VkComputePipelineIndirectBufferInfoNV-deviceGeneratedComputePipelines-09009
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputePipelines 功能。

  • VUID-VkComputePipelineIndirectBufferInfoNV-flags-09010
    VkComputePipelineCreateInfo::flags 中的管线创建标志必须包括 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV

  • VUID-VkComputePipelineIndirectBufferInfoNV-deviceAddress-09011
    deviceAddress 必须VkMemoryRequirements2::alignment 对齐,如 vkGetPipelineIndirectMemoryRequirementsNV 返回。

  • VUID-VkComputePipelineIndirectBufferInfoNV-deviceAddress-09012
    deviceAddress 必须已从使用 VK_BUFFER_USAGE_TRANSFER_DST_BITVK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 用途创建的缓冲区中分配。

  • VUID-VkComputePipelineIndirectBufferInfoNV-size-09013
    size 必须大于或等于 VkMemoryRequirements2::size,如 vkGetPipelineIndirectMemoryRequirementsNV 返回。

  • VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09014
    如果 pipelineDeviceAddressCaptureReplay 非零,则 必须 启用 VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputeCaptureReplay 功能。

  • VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09015
    如果 pipelineDeviceAddressCaptureReplay 非零,则该地址 必须 使用设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 标志进行分配。

  • VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09016
    如果 pipelineDeviceAddressCaptureReplay 非零,则 pipeline 必须 已被重新创建以进行重放。

  • VUID-VkComputePipelineIndirectBufferInfoNV-pipelineDeviceAddressCaptureReplay-09017
    pipelineDeviceAddressCaptureReplay 必须 满足类似于 deviceAddressalignmentsize 要求。

有效用法(隐式)
  • VUID-VkComputePipelineIndirectBufferInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV

要在设备地址保存计算管线的元数据,请调用

// Provided by VK_NV_device_generated_commands_compute
void vkCmdUpdatePipelineIndirectBufferNV(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipeline                                  pipeline);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pipelineBindPoint 是一个 VkPipelineBindPoint 值,指定将保存其元数据的管线的类型。

  • pipeline 是将保存其元数据的管线。

vkCmdUpdatePipelineIndirectBufferNV 仅允许在渲染通道之外使用。此命令在同步屏障方面被视为“传输”操作。在使用预处理结果之前,对地址的写入 必须 使用 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV 阶段以及分别使用 VK_ACCESS_MEMORY_WRITE_BITVK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV 访问掩码进行同步。

有效使用
  • VUID-vkCmdUpdatePipelineIndirectBufferNV-pipelineBindPoint-09018
    pipelineBindPoint 必须VK_PIPELINE_BIND_POINT_COMPUTE

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-pipeline-09019
    创建 pipeline必须 设置 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV 标志。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-pipeline-09020
    创建 pipeline必须 使用 VkComputePipelineIndirectBufferInfoNV 结构,指定将保存其元数据的有效地址。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-deviceGeneratedComputePipelines-09021
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputePipelines 功能。

有效用法(隐式)
  • VUID-vkCmdUpdatePipelineIndirectBufferNV-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-commandBuffer-recording
    commandBuffer 必须 处于 记录状态

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须 支持传输、图形或计算操作。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-renderpass
    此命令 必须 仅在渲染通道实例之外调用。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-videocoding
    此命令 必须 仅在视频编码范围之外调用。

  • VUID-vkCmdUpdatePipelineIndirectBufferNV-commonparent
    commandBufferpipeline必须 从同一个 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

操作

图形管线

图形管线由多个着色器阶段、多个固定功能管线阶段和一个管线布局组成。

要创建图形管线,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateGraphicsPipelines(
    VkDevice                                    device,
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkGraphicsPipelineCreateInfo*         pCreateInfos,
    const VkAllocationCallbacks*                pAllocator,
    VkPipeline*                                 pPipelines);
  • device 是创建图形管线的逻辑设备。

  • pipelineCacheVK_NULL_HANDLE,表示禁用管线缓存;或者是有效的 管线缓存 对象的句柄,在这种情况下,在该命令的执行期间启用该缓存的使用。

  • createInfoCountpCreateInfospPipelines 数组的长度。

  • pCreateInfos 是指向 VkGraphicsPipelineCreateInfo 结构数组的指针。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

  • pPipelines 是指向 VkPipeline 句柄数组的指针,其中返回生成的图形管线对象。

VkGraphicsPipelineCreateInfo 结构包括一个 VkPipelineShaderStageCreateInfo 结构数组,用于每个所需的活动着色器阶段,以及所有相关固定功能阶段的创建信息和一个管线布局。

管线的创建和返回方式如 多管线创建 所述。

有效使用
  • VUID-vkCreateGraphicsPipelines-device-09662
    device 必须 支持至少一个具有 VK_QUEUE_GRAPHICS_BIT 功能的队列族。

  • VUID-vkCreateGraphicsPipelines-flags-00720
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且该元素的 basePipelineIndex 成员不是 -1,则 basePipelineIndex 必须小于 pCreateInfos 中对应于该元素的索引

  • VUID-vkCreateGraphicsPipelines-flags-00721
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则基本管线必须已使用设置了 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 标志创建

  • VUID-vkCreateGraphicsPipelines-pipelineCache-02876
    如果 pipelineCache 是使用 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 创建的,则对 pipelineCache 的主机访问必须外部同步的

  • VUID-vkCreateGraphicsPipelines-pNext-09616
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateGraphicsPipelines-pNext-09617
    如果在 pCreateInfos 的任何元素的 pNext 链中包含设置了 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的 VkPipelineCreateFlags2CreateInfoKHR 结构,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateGraphicsPipelines-binaryCount-09620
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateGraphicsPipelines-binaryCount-09621
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateGraphicsPipelines-binaryCount-09622
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT 必须不设置在该元素的 flags

实现或层可能提供隐式缓存。因此,在将 VK_NULL_HANDLE 传递给 pipelineCache 的同时,为 pCreateInfos 的任何元素在 flags 上设置 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 仍然有效。

有效用法(隐式)
  • VUID-vkCreateGraphicsPipelines-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateGraphicsPipelines-pipelineCache-parameter
    如果 pipelineCache 不是 VK_NULL_HANDLE,则 pipelineCache 必须是有效的 VkPipelineCache 句柄

  • VUID-vkCreateGraphicsPipelines-pCreateInfos-parameter
    pCreateInfos 必须是一个有效的指针,指向一个包含 createInfoCount 个有效 VkGraphicsPipelineCreateInfo 结构的数组

  • VUID-vkCreateGraphicsPipelines-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateGraphicsPipelines-pPipelines-parameter
    pPipelines 必须是指向 createInfoCountVkPipeline 句柄的数组的有效指针

  • VUID-vkCreateGraphicsPipelines-createInfoCount-arraylength
    createInfoCount 必须大于 0

  • VUID-vkCreateGraphicsPipelines-pipelineCache-parent
    如果 pipelineCache 是有效句柄,则它必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

  • VK_PIPELINE_COMPILE_REQUIRED_EXT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_SHADER_NV

VkGraphicsPipelineCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkGraphicsPipelineCreateInfo {
    VkStructureType                                  sType;
    const void*                                      pNext;
    VkPipelineCreateFlags                            flags;
    uint32_t                                         stageCount;
    const VkPipelineShaderStageCreateInfo*           pStages;
    const VkPipelineVertexInputStateCreateInfo*      pVertexInputState;
    const VkPipelineInputAssemblyStateCreateInfo*    pInputAssemblyState;
    const VkPipelineTessellationStateCreateInfo*     pTessellationState;
    const VkPipelineViewportStateCreateInfo*         pViewportState;
    const VkPipelineRasterizationStateCreateInfo*    pRasterizationState;
    const VkPipelineMultisampleStateCreateInfo*      pMultisampleState;
    const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState;
    const VkPipelineColorBlendStateCreateInfo*       pColorBlendState;
    const VkPipelineDynamicStateCreateInfo*          pDynamicState;
    VkPipelineLayout                                 layout;
    VkRenderPass                                     renderPass;
    uint32_t                                         subpass;
    VkPipeline                                       basePipelineHandle;
    int32_t                                          basePipelineIndex;
} VkGraphicsPipelineCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。

  • stageCountpStages 数组中的条目数。

  • pStages 是一个指向 stageCountVkPipelineShaderStageCreateInfo 结构的数组的指针,描述了图形管线中包含的着色器阶段集合。

  • pVertexInputState 是一个指向 VkPipelineVertexInputStateCreateInfo 结构的指针。如果管线包含网格着色器阶段,则会被忽略。如果管线是通过设置 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态创建的,则它可以NULL

  • pInputAssemblyState 是一个指向 VkPipelineInputAssemblyStateCreateInfo 结构的指针,该结构决定了顶点着色的输入汇编行为,如 绘制命令 中所述。 如果启用了 VK_EXT_extended_dynamic_state3 扩展,并且在创建管线时同时设置了 VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLEVK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY 动态状态,并且 dynamicPrimitiveTopologyUnrestrictedVK_TRUE,则它可以NULL。如果管线包含网格着色器阶段,则会被忽略。

  • pTessellationState 是一个指向 VkPipelineTessellationStateCreateInfo 结构的指针,该结构定义了细分着色器使用的细分状态。如果管线是通过设置 VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT 动态状态创建的,则它可以NULL

  • pViewportState 是一个指向 VkPipelineViewportStateCreateInfo 结构的指针,该结构定义了在启用光栅化时使用的视口状态。 如果启用了 VK_EXT_extended_dynamic_state3 扩展,并且在创建管线时同时设置了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_SCISSOR_WITH_COUNT 动态状态,则它可以NULL

  • pRasterizationState 是一个指向 VkPipelineRasterizationStateCreateInfo 结构的指针,该结构定义了光栅化状态。 如果启用了 VK_EXT_extended_dynamic_state3 扩展,并且在创建管线时同时设置了 VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXTVK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLEVK_DYNAMIC_STATE_POLYGON_MODE_EXTVK_DYNAMIC_STATE_CULL_MODEVK_DYNAMIC_STATE_FRONT_FACEVK_DYNAMIC_STATE_DEPTH_BIAS_ENABLEVK_DYNAMIC_STATE_DEPTH_BIASVK_DYNAMIC_STATE_LINE_WIDTH 动态状态,则它可以NULL

  • pMultisampleState 是一个指向 VkPipelineMultisampleStateCreateInfo 结构的指针,该结构定义了在启用光栅化时使用的多重采样状态。 如果启用了 VK_EXT_extended_dynamic_state3 扩展,并且在创建管线时同时设置了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXTVK_DYNAMIC_STATE_SAMPLE_MASK_EXTVK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态,并且 alphaToOne 功能未启用,或者设置了 VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT,则 VkPipelineMultisampleStateCreateInfo::sampleShadingEnable 假定为 VK_FALSE,此时它可以NULL

  • pDepthStencilState 是一个指向 VkPipelineDepthStencilStateCreateInfo 结构的指针,该结构定义了在渲染期间访问深度或模板附件时,启用光栅化时使用的深度/模板状态。 如果启用了 VK_EXT_extended_dynamic_state3 扩展,并且在创建管线时同时设置了 VK_DYNAMIC_STATE_DEPTH_TEST_ENABLEVK_DYNAMIC_STATE_DEPTH_WRITE_ENABLEVK_DYNAMIC_STATE_DEPTH_COMPARE_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS 动态状态,则它可以NULL

  • pColorBlendState 是一个指向 VkPipelineColorBlendStateCreateInfo 结构的指针,该结构定义了在渲染期间访问任何颜色附件时启用光栅化时使用的颜色混合状态。 如果启用了 VK_EXT_extended_dynamic_state3 扩展,并且在创建管线时同时设置了 VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXTVK_DYNAMIC_STATE_LOGIC_OP_EXTVK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXTVK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXTVK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXTVK_DYNAMIC_STATE_BLEND_CONSTANTS 动态状态,则它可以NULL

  • pDynamicState 是一个指向 VkPipelineDynamicStateCreateInfo 结构的指针,该结构定义了管线状态对象的哪些属性是动态的,并且可以独立于管线状态进行更改。 这可以NULL,这意味着管线中没有状态被认为是动态的。

  • layout 是描述管线和与管线一起使用的描述符集的绑定位置。

  • renderPass 是一个渲染通道对象的句柄,描述了将在其中使用该管线的环境。该管线必须仅与提供的渲染通道实例兼容的渲染通道一起使用。有关更多信息,请参阅 渲染通道兼容性

  • subpass 是将在其中使用此管线的渲染通道中子通道的索引。

  • basePipelineHandle 是一个要从中派生的管线。

  • basePipelineIndex 是一个索引,指向 pCreateInfos 参数中要用作派生管线的管线。

参数 basePipelineHandlebasePipelineIndex管线派生中进行了更详细的描述。

如果任何着色器阶段编译失败,编译日志将报告回应用程序,并生成 VK_ERROR_INVALID_SHADER_NV

使用 VK_EXT_extended_dynamic_state3,以上许多 VkGraphicsPipelineCreateInfo 成员都可以NULL,因为它们的所有状态都是动态的,因此会被忽略。这是可选的,因此如果应用程序需要设置 pNextflags 字段来指定其他扩展的状态,则仍可以使用有效的指针。

顶点输入状态

顶点输入状态由以下内容定义:

如果此管线指定了 光栅化前状态,无论是直接指定还是通过将其作为管线库包含,并且其 pStages 包含顶点着色器,则必须指定此状态才能创建完整的图形管线

如果管线在 VkGraphicsPipelineLibraryCreateInfoEXT::flags 中显式或作为默认值包含 VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT,并且满足创建完整的图形管线所需要的此状态的条件,或者此管线未以任何方式指定光栅化前状态,则该管线必须直接指定此状态。

光栅化前着色器状态

光栅化前着色器状态由以下内容定义:

必须指定此状态才能创建完整的图形管线

如果 pNext 链包含一个 VkGraphicsPipelineLibraryCreateInfoEXT 结构,其中 flags 中包含了 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,或者未指定并默认为包含该值,则必须在管线中指定此状态。

片段着色器状态

片段着色器状态由以下内容定义:

如果管线直接或通过将其作为管线库包含来指定预光栅化状态,并且 rasterizerDiscardEnableVK_FALSE 或使用了 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE,则必须指定此状态才能创建完整的图形管线

如果管线在 VkGraphicsPipelineLibraryCreateInfoEXT::flags 中显式或默认包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且满足了 完整的图形管线 需要此状态的条件,或者此管线未以任何方式指定预光栅化状态,则该管线必须直接指定此状态。

片段输出状态

片段输出状态由以下内容定义:

如果管线直接或通过将其作为管线库包含来指定预光栅化状态,并且 rasterizerDiscardEnableVK_FALSE 或使用了 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE,则必须指定此状态才能创建完整的图形管线

如果管线在 VkGraphicsPipelineLibraryCreateInfoEXT::flags 中显式或默认包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT,并且满足了 完整的图形管线 需要此状态的条件,或者此管线未以任何方式指定预光栅化状态,则该管线必须直接指定此状态。

动态状态

如果通过 pDynamicState 设置的动态状态值对应的状态未被用于创建管线的状态子集静态设置,则必须忽略这些动态状态值。此外,设置动态状态值不得修改链接库中的状态是静态的还是动态的;这在创建库时设置且不可更改。例如,如果管线仅包含预光栅化着色器状态,则任何对应于深度或模板测试的动态状态值都无效。任何已启用动态状态的链接库,其应用的相同动态状态必须也在所有其他链接库中启用。

完整的图形管线

完整的图形管线始终包含预光栅化着色器状态,其他子集根据上述各节中指定的该状态包含。

图形管线库布局

如果不同的子集与使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建的管线布局链接在一起,则最终有效的管线布局实际上是链接管线布局的并集。当为该管线绑定描述符集时,使用的管线布局必须与此并集兼容。当使用 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT 链接时,可以通过提供一个 VkPipelineLayout 来覆盖此管线布局,该 VkPipelineLayout 除了 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 之外与此并集 兼容,或者当不使用 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT 链接时,可以通过提供一个与此并集完全兼容VkPipelineLayout 来覆盖此管线布局。

如果 pNext 链包含 VkPipelineCreateFlags2CreateInfo 结构,则使用该结构的 VkPipelineCreateFlags2CreateInfo::flags,而不是此结构中的 flags

有效使用
  • VUID-VkGraphicsPipelineCreateInfo-None-09497
    如果 pNext 链不包含 VkPipelineCreateFlags2CreateInfo 结构,则 flags 必须VkPipelineCreateFlagBits 值的有效组合

  • VUID-VkGraphicsPipelineCreateInfo-flags-07984
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineIndex 为 -1,则 basePipelineHandle 必须是有效的图形 VkPipeline 句柄

  • VUID-VkGraphicsPipelineCreateInfo-flags-07985
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineHandleVK_NULL_HANDLE,则 basePipelineIndex 必须是调用命令的 pCreateInfos 参数中的有效索引

  • VUID-VkGraphicsPipelineCreateInfo-flags-07986
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则 basePipelineIndex 必须为 -1 或 basePipelineHandle 必须VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-layout-07987
    如果在着色器中声明了推送常量块,则 layout 中的推送常量范围必须与着色器阶段匹配

  • VUID-VkGraphicsPipelineCreateInfo-layout-10069
    如果在着色器中声明了推送常量块,则该块必须包含在 layout 中与该阶段匹配的推送常量范围内

  • VUID-VkGraphicsPipelineCreateInfo-layout-07988
    如果在着色器中声明了资源变量,则 layout 中相应的描述符集必须与着色器阶段匹配

  • VUID-VkGraphicsPipelineCreateInfo-layout-07990
    如果在着色器中声明了资源变量,并且描述符类型不是 VK_DESCRIPTOR_TYPE_MUTABLE_EXT,则 layout 中相应的描述符集必须与描述符类型匹配

  • VUID-VkGraphicsPipelineCreateInfo-layout-07991
    如果在着色器中将资源变量声明为数组,则 layout 中相应的描述符集必须与描述符计数匹配

  • VUID-VkGraphicsPipelineCreateInfo-None-10391
    如果将 资源变量在着色器中声明为描述符数组,则该变量的描述符类型必须不是 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

  • VUID-VkGraphicsPipelineCreateInfo-stage-02096
    如果管线需要预光栅化着色器状态,则 pStages 的一个元素的 stage 成员必须VK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_MESH_BIT_EXT

  • VUID-VkGraphicsPipelineCreateInfo-pStages-02095
    如果管线需要预光栅化着色器状态,则 pStages 中提供的几何着色器阶段必须来自网格着色管线(stageVK_SHADER_STAGE_TASK_BIT_EXTVK_SHADER_STAGE_MESH_BIT_EXT),或来自图元着色管线(stageVK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT

  • VUID-VkGraphicsPipelineCreateInfo-pStages-09631
    如果管线需要预光栅化着色器状态,并且pStages同时包含VK_SHADER_STAGE_TASK_BIT_EXTVK_SHADER_STAGE_MESH_BIT_EXT,那么网格着色器的入口点必须不能声明带有DrawIndex BuiltIn修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-TaskNV-07063
    VK_SHADER_STAGE_TASK_BIT_EXTVK_SHADER_STAGE_MESH_BIT_EXT的着色器阶段必须使用TaskNVMeshNV Execution Model,或者使用TaskEXTMeshEXT Execution Model,但必须不能同时使用两者。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00729
    如果管线需要预光栅化着色器状态,并且pStages包含细分控制着色器阶段,那么它必须包含细分评估着色器阶段。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00730
    如果管线需要预光栅化着色器状态,并且pStages包含细分评估着色器阶段,那么它必须包含细分控制着色器阶段。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-09022
    如果管线需要预光栅化着色器状态,并且pStages包含细分控制着色器阶段,并且未启用VK_EXT_extended_dynamic_state3扩展,或者未设置VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT动态状态,则pTessellationState必须是指向有效的VkPipelineTessellationStateCreateInfo结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pTessellationState-09023
    如果pTessellationState不是NULL,则它必须是指向有效的VkPipelineTessellationStateCreateInfo结构的指针。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00732
    如果管线需要预光栅化着色器状态,并且pStages包含细分着色器阶段,则至少一个阶段的着色器代码必须包含一个OpExecutionMode指令,指定管线中的细分类型。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00733
    如果管线需要预光栅化着色器状态,并且pStages包含细分着色器阶段,并且两个阶段的着色器代码都包含一个OpExecutionMode指令,指定管线中的细分类型,则它们必须都指定相同的细分模式。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00734
    如果管线需要预光栅化着色器状态,并且pStages包含细分着色器阶段,则至少一个阶段的着色器代码必须包含一个OpExecutionMode指令,指定管线中的输出面片大小。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00735
    如果管线需要预光栅化着色器状态,并且pStages包含细分着色器阶段,并且两者的着色器代码都包含一个OpExecutionMode指令,指定管线中的输出面片大小,则它们必须都指定相同的面片大小。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-08888
    如果管线是使用预光栅化着色器状态顶点输入状态创建的,并且pStages包含细分着色器阶段,并且VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY动态状态未启用或者dynamicPrimitiveTopologyUnrestrictedVK_FALSE,则pInputAssemblytopology成员必须VK_PRIMITIVE_TOPOLOGY_PATCH_LIST

  • VUID-VkGraphicsPipelineCreateInfo-topology-08889
    如果管线是使用预光栅化着色器状态顶点输入状态创建的,并且pInputAssemblytopology成员为VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,并且VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY动态状态未启用或者dynamicPrimitiveTopologyUnrestrictedVK_FALSE,则pStages必须包含细分着色器阶段。

  • VUID-VkGraphicsPipelineCreateInfo-TessellationEvaluation-07723
    如果管线是使用TessellationEvaluation Execution Model创建的,没有Geometry Execution Model,使用PointMode Execution Mode,并且启用了shaderTessellationAndGeometryPointSize特性,则如果没有启用maintenance5特性,则必须写入一个带有PointSize修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-topology-08773
    如果管线是使用Vertex Execution Model创建的,并且没有TessellationEvaluationGeometry Execution Model,并且pInputAssemblytopology成员是VK_PRIMITIVE_TOPOLOGY_POINT_LIST,并且VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY动态状态未启用或者dynamicPrimitiveTopologyUnrestrictedVK_FALSE,则如果没有启用maintenance5特性,则必须写入一个带有PointSize修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-maintenance5-08775
    如果启用了maintenance5特性并且写入了一个带有PointSize修饰的变量,则所有执行路径必须写入一个带有PointSize修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-TessellationEvaluation-07724
    如果管线是使用TessellationEvaluation Execution Model创建的,没有Geometry Execution Model,使用PointMode Execution Mode,并且未启用shaderTessellationAndGeometryPointSize特性,则必须不写入带有PointSize修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-shaderTessellationAndGeometryPointSize-08776
    如果管线是使用Geometry Execution Model创建的,使用OutputPoints Execution Mode,并且启用了shaderTessellationAndGeometryPointSize特性,则如果没有启用maintenance5特性,则对于每个发射的顶点必须写入一个带有PointSize修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-Geometry-07726
    如果管线使用Geometry Execution Model创建,使用 OutputPoints Execution Mode,并且shaderTessellationAndGeometryPointSize 功能未启用,则必须不写入带有 PointSize 修饰的变量

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00738
    如果管线需要光栅化前着色器状态,并且pStages包含几何着色器阶段,但不包含任何细分着色器阶段,则其着色器代码必须包含一个OpExecutionMode指令,指定与pInputAssembly中指定的图元拓扑兼容的输入图元类型

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00739
    如果管线需要光栅化前着色器状态,并且pStages包含几何着色器阶段,并且还包含细分着色器阶段,则其着色器代码必须包含一个OpExecutionMode指令,指定与细分阶段输出的图元拓扑兼容的输入图元类型

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00740
    如果管线需要光栅化前着色器状态片段着色器状态,它同时包含片段着色器和几何着色器,并且片段着色器代码从使用PrimitiveId修饰的输入变量读取,那么几何着色器代码必须在所有执行路径中写入一个匹配的、使用PrimitiveId修饰的输出变量

  • VUID-VkGraphicsPipelineCreateInfo-PrimitiveId-06264
    如果管线需要光栅化前着色器状态,它包含网格着色器,并且片段着色器代码从使用PrimitiveId修饰的输入变量读取,那么网格着色器代码必须在所有执行路径中写入一个匹配的、使用PrimitiveId修饰的输出变量

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06038
    如果renderPass不是VK_NULL_HANDLE,并且管线使用片段着色器状态创建,则片段着色器必须不从在subpass中定义为VK_ATTACHMENT_UNUSED的任何输入附件读取

  • VUID-VkGraphicsPipelineCreateInfo-pStages-00742
    如果管线需要光栅化前着色器状态,并且pStages中包含多个光栅化前着色器阶段,则由这些pStages标识的入口点着色器代码以及此结构标识的其余状态必须遵守着色器接口章节中描述的管线链接规则

  • VUID-VkGraphicsPipelineCreateInfo-None-04889
    如果管线需要光栅化前着色器状态片段着色器状态,则片段着色器和最后一个光栅化前着色器阶段以及任何相关状态必须遵守着色器接口章节中描述的管线链接规则

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06041
    如果renderPass不是VK_NULL_HANDLE,并且管线使用片段输出接口状态创建,那么对于子通道中的每个颜色附件,如果对应附件描述的格式的潜在格式特性不包含VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,则pColorBlendStatepAttachments成员的对应元素的blendEnable成员必须VK_FALSE

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-07609
    如果renderPass不是VK_NULL_HANDLE,管线使用片段输出接口状态创建,pColorBlendState指针不是NULLpColorBlendStateattachmentCount成员未被忽略,并且子通道使用颜色附件,则pColorBlendStateattachmentCount成员必须等于用于创建subpasscolorAttachmentCount

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04130
    如果管线需要光栅化前着色器状态,并且pViewportState->pViewports不是动态的,那么pViewportState->pViewports必须是指向pViewportState->viewportCount个有效的VkViewport结构数组的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04131
    如果管线需要光栅化前着色器状态,并且pViewportState->pScissors不是动态的,那么pViewportState->pScissors必须是指向pViewportState->scissorCountVkRect2D结构数组的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749
    如果管线需要光栅化前着色器状态,并且未启用wideLines功能,并且pDynamicStatepDynamicStates成员的任何元素都不是VK_DYNAMIC_STATE_LINE_WIDTH,则pRasterizationStatelineWidth成员必须1.0

  • VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-09024
    如果管线需要光栅化前着色器状态,并且启用了VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE动态状态,或者pRasterizationStaterasterizerDiscardEnable成员为VK_FALSE,并且未设置相关动态状态,则pViewportState必须是指向有效的VkPipelineViewportStateCreateInfo结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pViewportState-09025
    如果pViewportState不是NULL,它必须是指向有效的VkPipelineViewportStateCreateInfo结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pMultisampleState-09026
    如果管线需要片段输出接口状态,并且未启用VK_EXT_extended_dynamic_state3扩展,或者未设置VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXTVK_DYNAMIC_STATE_SAMPLE_MASK_EXTVK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT中的任何一个动态状态,或者启用了alphaToOne功能且未设置VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT,则pMultisampleState必须是指向有效的VkPipelineMultisampleStateCreateInfo结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pMultisampleState-09027
    如果 pMultisampleState 不为 NULL,则它必须是指向有效 VkPipelineMultisampleStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-alphaToCoverageEnable-08891
    如果管线是使用片元着色器状态创建的,VkPipelineMultisampleStateCreateInfo::alphaToCoverageEnable 不被忽略且为 VK_TRUE,则片元输出接口必须Location 0 的 Index 0 处包含用于 alpha Component 字的变量。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09028
    如果 renderPass 不为 VK_NULL_HANDLE,管线是使用片元着色器状态创建的,且 subpass 使用深度/模板附件,并且未设置相关的动态状态,则 pDepthStencilState 必须是指向有效 VkPipelineDepthStencilStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pDepthStencilState-09029
    如果 pDepthStencilState 不为 NULL,则它必须是指向有效 VkPipelineDepthStencilStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09030
    如果 renderPass 不为 VK_NULL_HANDLE,管线是使用片元输出接口状态创建的,且 subpass 使用颜色附件,并且未设置相关的动态状态,则 pColorBlendState 必须是指向有效 VkPipelineColorBlendStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754
    如果管线需要预光栅化着色器状态,未启用depthBiasClamp 功能,pDynamicStatepDynamicStates 成员中没有元素为 VK_DYNAMIC_STATE_DEPTH_BIAS,并且 pRasterizationStatedepthBiasEnable 成员为 VK_TRUE,则 pRasterizationStatedepthBiasClamp 成员必须0.0

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-02510
    如果管线需要片元着色器状态,未启用 VK_EXT_depth_range_unrestricted 扩展,并且 pDynamicStatepDynamicStates 成员中没有元素为 VK_DYNAMIC_STATE_DEPTH_BOUNDS,并且 pDepthStencilStatedepthBoundsTestEnable 成员为 VK_TRUE,则 pDepthStencilStateminDepthBoundsmaxDepthBounds 成员必须0.01.0 之间(包含 0.01.0)。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07610
    如果管线需要片元着色器状态片元输出接口状态,并且 rasterizationSamplessampleLocationsInfo 不是动态的,并且 VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable(包含在 pMultisampleStatepNext 链中)为 VK_TRUE,则 sampleLocationsInfo.sampleLocationGridSize.width 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.width 整除,此 VkMultisamplePropertiesEXT 是通过 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回的,并且 samples 参数等于 rasterizationSamples

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07611
    如果管线需要片元着色器状态片元输出接口状态,并且 rasterizationSamplessampleLocationsInfo 不是动态的,并且 VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable(包含在 pMultisampleStatepNext 链中)为 VK_TRUE 或者使用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT,则 sampleLocationsInfo.sampleLocationGridSize.height 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.height 整除,此 VkMultisamplePropertiesEXT 是通过 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回的,并且 samples 参数等于 rasterizationSamples

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07612
    如果管线需要片元着色器状态片元输出接口状态,并且 rasterizationSamplessampleLocationsInfo 不是动态的,并且 VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable(包含在 pMultisampleStatepNext 链中)为 VK_TRUE 或者使用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT,则 sampleLocationsInfo.sampleLocationsPerPixel 必须等于 rasterizationSamples

  • VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524
    如果管线需要片元着色器状态,并且包含在 pMultisampleStatepNext 链中的 VkPipelineSampleLocationsStateCreateInfoEXT 结构的 sampleLocationsEnable 成员为 VK_TRUE,则片元着色器代码必须不能静态使用扩展指令 InterpolateAtSample

  • VUID-VkGraphicsPipelineCreateInfo-multisampledRenderToSingleSampled-06853
    如果管线需要片元输出接口状态,并且没有启用VK_AMD_mixed_attachment_samples扩展、VK_NV_framebuffer_mixed_samples扩展或 multisampledRenderToSingleSampled特性,则rasterizationSamples不是动态的,并且如果subpass使用了颜色和/或深度/模板附件,则pMultisampleStaterasterizationSamples成员必须与这些子通道附件的采样计数相同。

  • VUID-VkGraphicsPipelineCreateInfo-subpass-01505
    如果管线需要片元输出接口状态,并且启用了VK_AMD_mixed_attachment_samples扩展,则rasterizationSamples不是动态的,并且如果subpass使用了颜色和/或深度/模板附件,则pMultisampleStaterasterizationSamples成员必须等于这些子通道附件的采样计数的最大值。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06854
    如果renderPass不是VK_NULL_HANDLE,启用了VK_EXT_multisampled_render_to_single_sampled扩展,rasterizationSamples不是动态的,并且subpassVkSubpassDescription2::pNext链中包含一个VkMultisampledRenderToSingleSampledInfoEXT结构,且multisampledRenderToSingleSampledEnable等于VK_TRUE,则pMultisampleStaterasterizationSamples成员必须等于VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples

  • VUID-VkGraphicsPipelineCreateInfo-subpass-01411
    如果管线需要片元输出接口状态,启用了VK_NV_framebuffer_mixed_samples扩展,rasterizationSamples不是动态的,并且如果subpass有一个深度/模板附件并且启用了深度测试、模板测试或深度边界测试,则pMultisampleStaterasterizationSamples成员必须与深度/模板附件的采样计数相同。

  • VUID-VkGraphicsPipelineCreateInfo-subpass-01412
    如果管线需要片元输出接口状态,启用了VK_NV_framebuffer_mixed_samples扩展,rasterizationSamples不是动态的,并且如果subpass有任何颜色附件,则pMultisampleStaterasterizationSamples成员必须大于或等于这些子通道附件的采样计数。

  • VUID-VkGraphicsPipelineCreateInfo-coverageReductionMode-02722
    如果管线需要片元输出接口状态,启用了VK_NV_coverage_reduction_mode扩展,并且rasterizationSamples不是动态的,则由VkPipelineCoverageReductionStateCreateInfoNV::coverageReductionMode指定的覆盖率减少模式,pMultisampleStaterasterizationSamples成员以及颜色和深度/模板附件(如果子通道有这些附件)的采样计数必须是由vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV返回的有效组合。

  • VUID-VkGraphicsPipelineCreateInfo-subpass-00758
    如果管线需要片元输出接口状态rasterizationSamples不是动态的,并且subpass不使用任何颜色和/或深度/模板附件,则pMultisampleStaterasterizationSamples成员必须遵循零附件子通道的规则。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06046
    如果renderPass不是VK_NULL_HANDLE,则subpass必须renderPass内的有效子通道。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06047
    如果renderPass不是VK_NULL_HANDLE,该管线正在使用光栅化前着色器状态创建,subpass的viewMask不是0,并且multiviewTessellationShader未启用,则pStages必须不包含细分着色器。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06048
    如果renderPass不是VK_NULL_HANDLE,该管线正在使用光栅化前着色器状态创建,subpass的viewMask不是0,并且multiviewGeometryShader未启用,则pStages必须不包含几何着色器。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06050
    如果renderPass不是VK_NULL_HANDLE,并且该管线正在使用光栅化前着色器状态创建,并且subpass的viewMask不是0,则管线中的所有着色器必须不在其接口中包含使用Layer内置修饰符修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-07064
    如果renderPass不是VK_NULL_HANDLE,该管线正在使用光栅化前着色器状态创建,subpass的viewMask不是0,并且multiviewMeshShader未启用,则pStages必须不包含网格着色器。

  • VUID-VkGraphicsPipelineCreateInfo-flags-00764
    flags必须不包含VK_PIPELINE_CREATE_DISPATCH_BASE标志。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-01565
    如果管线需要片元着色器状态,并且在renderPass创建时,一个输入附件被一个aspectMask引用,则片元着色器必须只读取为该输入附件指定的方面。

  • VUID-VkGraphicsPipelineCreateInfo-layout-01688
    管道使用的每个着色器阶段可以访问的 layout 中的资源数量必须小于或等于 VkPhysicalDeviceLimits::maxPerStageResources

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715
    如果管道需要光栅化前着色器状态,并且 pDynamicStatepDynamicStates 成员中没有元素是 VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV,并且包含在 pViewportStatepNext 链中的 VkPipelineViewportWScalingStateCreateInfoNV 结构的 viewportWScalingEnable 成员为 VK_TRUE,则 VkPipelineViewportWScalingStateCreateInfoNVpViewportWScalings 成员必须是指向 VkPipelineViewportWScalingStateCreateInfoNV::viewportCount 个有效的 VkViewportWScalingNV 结构体的数组的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056
    如果管道需要光栅化前着色器状态,并且 pDynamicStatepDynamicStates 成员中没有元素是 VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV,并且如果 pViewportState->pNext 链中包含一个 VkPipelineViewportExclusiveScissorStateCreateInfoNV 结构,且其 exclusiveScissorCount 成员不为 0,则其 pExclusiveScissors 成员必须是指向 exclusiveScissorCountVkRect2D 结构体的数组的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07854
    如果 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV,则实现必须支持 VK_NV_scissor_exclusive 扩展的至少 specVersion 2 版本

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057
    如果管道需要光栅化前着色器状态,并且 pDynamicStatepDynamicStates 成员中没有元素是 VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV,并且如果 pViewportState->pNext 链中包含一个 VkPipelineViewportShadingRateImageStateCreateInfoNV 结构,则其 pShadingRatePalettes 成员必须是指向 viewportCount 个有效的 VkShadingRatePaletteNV 结构体的数组的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04058
    如果管道需要光栅化前着色器状态,并且 pDynamicStatepDynamicStates 成员中没有元素是 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT,并且如果 pNext 链中包含一个 VkPipelineDiscardRectangleStateCreateInfoEXT 结构,且其 discardRectangleCount 成员不为 0,则其 pDiscardRectangles 成员必须是指向 discardRectangleCountVkRect2D 结构体的数组的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07855
    如果 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT,则实现必须支持 VK_EXT_discard_rectangles 扩展的至少 specVersion 2 版本

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07856
    如果 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT,则实现必须支持 VK_EXT_discard_rectangles 扩展的至少 specVersion 2 版本

  • VUID-VkGraphicsPipelineCreateInfo-pStages-02097
    如果管道需要顶点输入状态,并且 pVertexInputState 不是动态的,则 pVertexInputState 必须是指向有效的 VkPipelineVertexInputStateCreateInfo 结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-Input-07904
    如果 vertexAttributeRobustness 未启用,并且管道正在使用顶点输入状态创建,且 pVertexInputState 不是动态的,则在 Vertex Execution Model OpEntryPoint 中,所有带有 Input 存储类并用 Location 修饰的变量必须VkVertexInputAttributeDescription::location 中包含一个位置

  • VUID-VkGraphicsPipelineCreateInfo-Input-08733
    如果管道需要顶点输入状态,并且 pVertexInputState 不是动态的,则 Vertex Execution Model OpEntryPoint 中,对应 Location 的所有 Input 变量的关联数值类型必须VkVertexInputAttributeDescription::format 相同

  • VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-08929
    如果管道正在使用顶点输入状态创建,并且 pVertexInputState 不是动态的,并且 VkVertexInputAttributeDescription::format 具有 64 位分量,则 Vertex Execution Model OpEntryPoint 中,对应 Location 的所有 Input 变量的标量宽度必须是 64 位

  • VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-08930
    如果使用顶点输入状态创建管线,且pVertexInputState不是动态的,并且在Vertex Execution Model OpEntryPoint中,使用Location修饰的Input变量的标量宽度是 64 位,则相应的VkVertexInputAttributeDescription::format必须具有 64 位分量。

  • VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-09198
    如果使用顶点输入状态创建管线,且pVertexInputState不是动态的,并且VkVertexInputAttributeDescription::format具有 64 位分量,则Vertex Execution Model OpEntryPoint中对应Location的所有Input变量必须不使用格式中不存在的分量。

  • VUID-VkGraphicsPipelineCreateInfo-dynamicPrimitiveTopologyUnrestricted-09031
    如果管线需要顶点输入状态,并且相关的动态状态未设置,则pInputAssemblyState必须是指向有效VkPipelineInputAssemblyStateCreateInfo结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pInputAssemblyState-09032
    如果pInputAssemblyState不是NULL,则它必须是指向有效的VkPipelineInputAssemblyStateCreateInfo结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-02317
    如果管线需要光栅化前着色器状态,则Xfb执行模式只能pStages中的一个着色器阶段指定。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-02318
    如果管线需要光栅化前着色器状态,并且pStages中的任何着色器阶段指定了Xfb执行模式,则它必须是最后一个光栅化前着色器阶段

  • VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319
    如果管线需要光栅化前着色器状态,并且指定了VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream的值(零除外),则正在编译的入口点的输出接口中所有使用PositionPointSizeClipDistanceCullDistance修饰的变量必须使用与rasterizationStream匹配的相同的Stream值进行修饰。

  • VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02320
    如果管线需要光栅化前着色器状态,并且VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream为零,或未指定,则正在编译的入口点的输出接口中所有使用PositionPointSizeClipDistanceCullDistance修饰的变量必须使用零的Stream值进行修饰,或必须不指定Stream修饰。

  • VUID-VkGraphicsPipelineCreateInfo-geometryStreams-02321
    如果管线需要光栅化前着色器状态,并且最后一个光栅化前着色器阶段是几何着色器,并且该几何着色器使用GeometryStreams功能,则必须启用VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams功能。

  • VUID-VkGraphicsPipelineCreateInfo-None-02322
    如果管线需要光栅化前着色器状态,并且管线中有任何网格着色器阶段,则管线中必须不存在任何具有Xfb执行模式的着色器阶段。

  • VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766
    如果管线需要光栅化前着色器状态,并且至少需要片元输出接口状态片元着色器状态之一,且pMultisampleState不是NULL,则包含在pRasterizationStatepNext链中的VkPipelineRasterizationLineStateCreateInfo结构的lineRasterizationMode成员是VK_LINE_RASTERIZATION_MODE_BRESENHAMVK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH,那么pMultisampleStatealphaToCoverageEnablealphaToOneEnablesampleShadingEnable成员必须全部为VK_FALSE

  • VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767
    如果管线需要光栅化前着色器状态VkPipelineRasterizationLineStateCreateInfostippledLineEnable成员是VK_TRUE,且pDynamicStatepDynamicStates成员中没有元素是VK_DYNAMIC_STATE_LINE_STIPPLE,则VkPipelineRasterizationLineStateCreateInfolineStippleFactor成员必须在范围[1,256]内。

  • VUID-VkGraphicsPipelineCreateInfo-shaderMeshEnqueue-10187
    如果未启用shaderMeshEnqueue功能,则由pStages指定的着色器必须不声明ShaderEnqueueAMDX功能。

  • VUID-VkGraphicsPipelineCreateInfo-flags-10188
    如果flags不包含VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,则由pStages指定的着色器必须不声明ShaderEnqueueAMDX功能。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-10189
    如果pStages中的任何着色器阶段声明了ShaderEnqueueAMDX功能,则flags必须包含VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDXVK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-10190
    如果flags中包含VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX,并且管线需要光栅化前着色器状态,则在pStages必须没有指定任务或顶点着色器。

  • VUID-VkGraphicsPipelineCreateInfo-flags-10191
    如果 flags 中包含 VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX,则 VkPipelineLibraryCreateInfoKHR::pLibraries 的所有元素必须已使用 VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX 创建。

  • VUID-VkGraphicsPipelineCreateInfo-flags-03372
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-03373
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-03374
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-03375
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-03376
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-03377
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-03577
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-04947
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378
    如果未启用 extendedDynamicState 功能,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的最小值以及物理设备支持的 apiVersion 小于 1.3 版本,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_CULL_MODEVK_DYNAMIC_STATE_FRONT_FACEVK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGYVK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_SCISSOR_WITH_COUNTVK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDEVK_DYNAMIC_STATE_DEPTH_TEST_ENABLEVK_DYNAMIC_STATE_DEPTH_WRITE_ENABLEVK_DYNAMIC_STATE_DEPTH_COMPARE_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_OP

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379
    如果管线需要预光栅化着色器状态,并且 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,则 viewportCount 必须为零。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380
    如果管线需要预光栅化着色器状态,并且 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,则 scissorCount 必须为零。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04132
    如果管线需要预光栅化着色器状态,并且 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,则 必须不存在 VK_DYNAMIC_STATE_VIEWPORT

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04133
    如果管线需要预光栅化着色器状态,并且 pDynamicStates 数组中包含 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,则 必须不存在 VK_DYNAMIC_STATE_SCISSOR

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07065
    如果管线需要预光栅化着色器状态,并且包含网格着色器,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGYVK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04868
    如果未启用 extendedDynamicState2 功能,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的最小值以及物理设备支持的 apiVersion 小于 1.3 版本,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLEVK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLEVK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04869
    如果未启用 extendedDynamicState2LogicOp 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_LOGIC_OP_EXT

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04870
    如果未启用 extendedDynamicState2PatchControlPoints 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07066
    如果管线需要预光栅化着色器状态,并且包含网格着色器,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLEVK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT

  • VUID-VkGraphicsPipelineCreateInfo-flags-02877
    如果 flags 包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV,则必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands 功能。

  • VUID-VkGraphicsPipelineCreateInfo-flags-02966
    如果管线需要预光栅化着色器状态,并且 flags 包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV,则所有阶段必须不指定 Xfb 执行模式。

  • VUID-VkGraphicsPipelineCreateInfo-libraryCount-06648
    如果管线不是使用完整状态集创建的,或者 VkPipelineLibraryCreateInfoKHR::libraryCount 不为 0,则 VkGraphicsPipelineShaderGroupsCreateInfoNV::groupCountVkGraphicsPipelineShaderGroupsCreateInfoNV::pipelineCount 必须0

  • VUID-VkGraphicsPipelineCreateInfo-libraryCount-06649
    如果管线使用完整的状态集合创建,并且VkPipelineLibraryCreateInfoKHR::libraryCount0,并且 pNext 链包含 VkGraphicsPipelineShaderGroupsCreateInfoNV 的实例,则 VkGraphicsPipelineShaderGroupsCreateInfoNV::groupCount 必须大于 0

  • VUID-VkGraphicsPipelineCreateInfo-flags-11000
    如果 flags 包含 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT,则 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands 特性 必须 启用。

  • VUID-VkGraphicsPipelineCreateInfo-flags-11001
    如果管线需要光栅化前着色器状态,并且 flags 包含 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT,则所有阶段必须不指定 Xfb 执行模式

  • VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878
    如果 pipelineCreationCacheControl 特性未启用,则 flags 必须 不包含 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BITVK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT

  • VUID-VkGraphicsPipelineCreateInfo-pipelineProtectedAccess-07368
    如果pipelineProtectedAccess功能未启用,则 flags 必须不包含 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BITVK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT

  • VUID-VkGraphicsPipelineCreateInfo-flags-07369
    flags 必须不同时包含 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BITVK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04494
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.width 必须大于或等于 1

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04495
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.height 必须大于或等于 1

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04496
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.width 必须是 2 的幂值

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04497
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.height 必须是 2 的幂值

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04498
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.width 必须小于或等于 4

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04499
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.height 必须小于或等于 4

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04500
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,并且pipelineFragmentShadingRate功能未启用,则VkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.widthVkPipelineFragmentShadingRateStateCreateInfoKHR::fragmentSize.height 必须都等于 1

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06567
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::combinerOps[0] 必须是有效的 VkFragmentShadingRateCombinerOpKHR

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06568
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::combinerOps[1] 必须是有效的 VkFragmentShadingRateCombinerOpKHR

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04501
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,并且primitiveFragmentShadingRate功能未启用,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::combinerOps[0] 必须VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04502
    如果管线需要光栅化前着色器状态片段着色器状态,并且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,并且attachmentFragmentShadingRate功能未启用,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::combinerOps[1] 必须VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR

  • VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04503
    如果管线需要光栅化前着色器状态,并且不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 未包含在 pDynamicState->pDynamicStates 中,并且VkPipelineViewportStateCreateInfo::viewportCount 大于 1,则在 pStages 中指定的入口点不得写入 PrimitiveShadingRateKHR 内建变量。

  • VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04504
    如果管线需要光栅化前着色器状态,并且不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,并且在 pStages 中指定的入口点写入 ViewportIndex 内建变量,则它们不得同时写入 PrimitiveShadingRateKHR 内建变量。

  • VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04505
    如果管线需要光栅化前着色器状态,并且不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,并且在 pStages 中指定的入口点写入 ViewportMaskNV 内建变量,则它们不得同时写入 PrimitiveShadingRateKHR 内建变量。

  • VUID-VkGraphicsPipelineCreateInfo-fragmentShadingRateNonTrivialCombinerOps-04506
    如果管线需要光栅化前着色器状态片段着色器状态,并且不支持 fragmentShadingRateNonTrivialCombinerOps 限制,且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,则 VkPipelineFragmentShadingRateStateCreateInfoKHR::combinerOps 的元素必须VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHRVK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR

  • VUID-VkGraphicsPipelineCreateInfo-None-06569
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::shadingRateType 必须为有效的 VkFragmentShadingRateTypeNV 值。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06570
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::shadingRate 必须为有效的 VkFragmentShadingRateNV 值。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06571
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::combinerOps[0] 必须为有效的 VkFragmentShadingRateCombinerOpKHR 值。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-06572
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::combinerOps[1] 必须为有效的 VkFragmentShadingRateCombinerOpKHR 值。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04569
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,且未启用 fragmentShadingRateEnums 功能,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::shadingRateType 必须等于 VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04570
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,且未启用 pipelineFragmentShadingRate 功能,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::shadingRate 必须等于 VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04571
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,且未启用 primitiveFragmentShadingRate 功能,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::combinerOps[0] 必须VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04572
    如果管线需要片段着色器状态,并且 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 未包含在 pDynamicState->pDynamicStates 中,且未启用 attachmentFragmentShadingRate 功能,则 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::combinerOps[1] 必须VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR

  • VUID-VkGraphicsPipelineCreateInfo-fragmentShadingRateNonTrivialCombinerOps-04573
    如果管线需要片元着色器状态,并且不支持 fragmentShadingRateNonTrivialCombinerOps 限制,且 pDynamicState->pDynamicStates 中不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,那么 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::combinerOps 的元素必须VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHRVK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR

  • VUID-VkGraphicsPipelineCreateInfo-None-04574
    如果管线需要片元着色器状态,并且 supersampleFragmentShadingRates 特性未启用,那么 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::shadingRate 必须不等于 VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NVVK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NVVK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NVVK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV

  • VUID-VkGraphicsPipelineCreateInfo-None-04575
    如果管线需要片元着色器状态,并且 noInvocationFragmentShadingRates 特性未启用,那么 VkPipelineFragmentShadingRateEnumStateCreateInfoNV::shadingRate 必须不等于 VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03578
    pDynamicStatepDynamicStates 成员的所有元素必须不是 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04807
    如果管线需要预光栅化着色器状态,并且 vertexInputDynamicState 特性未启用,那么 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07067
    如果管线需要预光栅化着色器状态,并且包含网格着色器,那么 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04800
    如果 colorWriteEnable 特性未启用,那么 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT

  • VUID-VkGraphicsPipelineCreateInfo-rasterizationSamples-04899
    如果管线需要片元着色器状态,并且启用了 VK_QCOM_render_pass_shader_resolve 扩展,rasterizationSamples 不是动态的,并且如果子通道有任何输入附件,且如果子通道描述包含 VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM,那么输入附件的采样计数必须等于 rasterizationSamples

  • VUID-VkGraphicsPipelineCreateInfo-sampleShadingEnable-04900
    如果管线需要片元着色器状态,并且启用了 VK_QCOM_render_pass_shader_resolve 扩展,且如果子通道描述包含 VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM,那么 sampleShadingEnable 必须为 false。

  • VUID-VkGraphicsPipelineCreateInfo-flags-04901
    如果 flags 包含 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,那么该子通道必须是子通道依赖链中的最后一个子通道。

  • VUID-VkGraphicsPipelineCreateInfo-flags-04902
    如果 flags 包含 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,并且如果 pResolveAttachments 不是 NULL,那么每个解析附件必须VK_ATTACHMENT_UNUSED

  • VUID-VkGraphicsPipelineCreateInfo-dynamicRendering-06576
    如果 dynamicRendering 特性未启用,并且管线需要预光栅化着色器状态片元着色器状态片元输出接口状态,那么 renderPass 必须不是 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-multiview-06577
    如果 multiview 特性未启用,管线需要预光栅化着色器状态片元着色器状态片元输出接口状态,并且 renderPassVK_NULL_HANDLE,那么 VkPipelineRenderingCreateInfo::viewMask 必须0

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06578
    如果管线需要预光栅化着色器状态片元着色器状态片元输出接口状态,并且 renderPassVK_NULL_HANDLE,那么 VkPipelineRenderingCreateInfo::viewMask 中最高有效位的索引必须小于 maxMultiviewViewCount

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06579
    如果管线需要片段输出接口状态,且renderPassVK_NULL_HANDLE,并且VkPipelineRenderingCreateInfo::colorAttachmentCount 不为 0,则 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 必须是一个指向 colorAttachmentCount 个有效的 VkFormat 值的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06580
    如果管线需要片段输出接口状态,且renderPassVK_NULL_HANDLE,则 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的每个元素必须是一个有效的 VkFormat 值。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06582
    如果管线需要片段输出接口状态renderPassVK_NULL_HANDLE,并且 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的任何元素不为 VK_FORMAT_UNDEFINED,则该格式必须是具有潜在格式特性的格式,且该特性包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITVK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06583
    如果管线需要片段输出接口状态,且renderPassVK_NULL_HANDLE,则 VkPipelineRenderingCreateInfo::depthAttachmentFormat 必须是一个有效的 VkFormat 值。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06584
    如果管线需要片段输出接口状态,且renderPassVK_NULL_HANDLE,则 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 必须是一个有效的 VkFormat 值。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06585
    如果管线需要片段输出接口状态renderPassVK_NULL_HANDLE,并且 VkPipelineRenderingCreateInfo::depthAttachmentFormat 不为 VK_FORMAT_UNDEFINED,则它必须是具有潜在格式特性的格式,且该特性包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06586
    如果管线需要片段输出接口状态renderPassVK_NULL_HANDLE,并且 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 不为 VK_FORMAT_UNDEFINED,则它必须是具有潜在格式特性的格式,且该特性包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06587
    如果管线需要片段输出接口状态renderPassVK_NULL_HANDLE,并且 VkPipelineRenderingCreateInfo::depthAttachmentFormat 不为 VK_FORMAT_UNDEFINED,则它必须是包含深度分量的格式。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06588
    如果管线需要片段输出接口状态renderPassVK_NULL_HANDLE,并且 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 不为 VK_FORMAT_UNDEFINED,则它必须是包含模板分量的格式。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06589
    如果管线需要片段输出接口状态renderPassVK_NULL_HANDLE,并且 VkPipelineRenderingCreateInfo::depthAttachmentFormat 不为 VK_FORMAT_UNDEFINED,且 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 不为 VK_FORMAT_UNDEFINED,则 depthAttachmentFormat 必须等于 stencilAttachmentFormat

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09033
    如果 renderPassVK_NULL_HANDLE,且管线正在使用片段着色器状态片段输出接口状态创建,并且 VkPipelineRenderingCreateInfo::depthAttachmentFormatVkPipelineRenderingCreateInfo::stencilAttachmentFormat 均不为 VK_FORMAT_UNDEFINED,且 VK_EXT_extended_dynamic_state3 扩展未启用,或者未设置任何 VK_DYNAMIC_STATE_DEPTH_TEST_ENABLEVK_DYNAMIC_STATE_DEPTH_WRITE_ENABLEVK_DYNAMIC_STATE_DEPTH_COMPARE_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS 动态状态,则 pDepthStencilState 必须是指向有效 VkPipelineDepthStencilStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pDepthStencilState-09034
    如果 pDepthStencilState 不为 NULL,则它必须是指向有效 VkPipelineDepthStencilStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09035
    如果 renderPassVK_NULL_HANDLE,并且管线正在使用片段着色器状态创建,但未使用片段输出接口状态,且 VK_EXT_extended_dynamic_state3 扩展未启用,或者未设置任何 VK_DYNAMIC_STATE_DEPTH_TEST_ENABLEVK_DYNAMIC_STATE_DEPTH_WRITE_ENABLEVK_DYNAMIC_STATE_DEPTH_COMPARE_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_TEST_ENABLEVK_DYNAMIC_STATE_STENCIL_OPVK_DYNAMIC_STATE_DEPTH_BOUNDS 动态状态,则 pDepthStencilState 必须是指向有效 VkPipelineDepthStencilStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pDepthStencilState-09036
    如果 pDepthStencilState 不为 NULL,则它必须是指向有效 VkPipelineDepthStencilStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09037
    如果 renderPassVK_NULL_HANDLE,则管道创建时带有片段输出接口状态,并且 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的任何元素都不是 VK_FORMAT_UNDEFINED,并且未启用 VK_EXT_extended_dynamic_state3 扩展,或者未设置任何 VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXTVK_DYNAMIC_STATE_LOGIC_OP_EXTVK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXTVK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXTVK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXTVK_DYNAMIC_STATE_BLEND_CONSTANTS 动态状态,则 pColorBlendState 必须是指向有效的 VkPipelineColorBlendStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-pColorBlendState-09038
    如果 pColorBlendState 不是 NULL,则它必须是指向有效的 VkPipelineColorBlendStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06055
    如果 renderPassVK_NULL_HANDLEpColorBlendState 不是动态的,并且管道创建时带有片段输出接口状态,则 pColorBlendState->attachmentCount 必须等于 VkPipelineRenderingCreateInfo::colorAttachmentCount

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06057
    如果 renderPassVK_NULL_HANDLE,管道创建时带有光栅化前着色器状态VkPipelineRenderingCreateInfo::viewMask 不是 0,并且未启用 multiviewTessellationShader 功能,则 pStages 必须不包含细分着色器。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06058
    如果 renderPassVK_NULL_HANDLE,管道创建时带有光栅化前着色器状态VkPipelineRenderingCreateInfo::viewMask 不是 0,并且未启用 multiviewGeometryShader 功能,则 pStages 必须不包含几何着色器。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06059
    如果 renderPassVK_NULL_HANDLE,管道创建时带有光栅化前着色器状态,并且 VkPipelineRenderingCreateInfo::viewMask 不是 0,则管道中的所有着色器在其接口中必须不包含使用 Layer 内置修饰符修饰的变量。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-07720
    如果 renderPassVK_NULL_HANDLE,管道创建时带有光栅化前着色器状态,并且 VkPipelineRenderingCreateInfo::viewMask 不是 0,并且未启用 multiviewMeshShader,则 pStages 必须不包含网格着色器。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06061
    如果未启用 dynamicRenderingLocalRead 功能,管道需要片段着色器状态,并且 renderPassVK_NULL_HANDLE,则 pStages 中的片段着色器必须不包含 InputAttachment 功能。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-08710
    如果管道需要片段着色器状态renderPass 不是 VK_NULL_HANDLE,则 pStages 中的片段着色器必须不包含任何 TileImageColorReadAccessEXTTileImageDepthReadAccessEXTTileImageStencilReadAccessEXT 功能。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06062
    如果管道需要片段输出接口状态renderPassVK_NULL_HANDLE,对于 VkPipelineRenderingCreateInfopColorAttachmentFormats 成员定义的每个颜色附件格式,如果其潜在格式功能不包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,则 pColorBlendStatepAttachments 成员的相应元素的 blendEnable 成员必须VK_FALSE

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06063
    如果管道需要片段输出接口状态renderPassVK_NULL_HANDLE,如果 pNext 链包含 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV,则该结构的 colorAttachmentCount 成员必须等于 VkPipelineRenderingCreateInfo::colorAttachmentCount 的值。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06591
    如果 pStages 包含片段着色器阶段,并且片段着色器声明了 EarlyFragmentTests 执行模式,则 VkPipelineDepthStencilStateCreateInfoflags 成员必须不包含 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXTVK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT

  • VUID-VkGraphicsPipelineCreateInfo-flags-06482
    如果未启用 dynamicRenderingLocalRead 功能,管道需要片段输出接口状态,并且 VkPipelineColorBlendStateCreateInfoflags 成员包含 VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT,则 renderPass 必须不是 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-None-09526
    如果未启用 dynamicRenderingLocalRead 特性,则管线需要 片段输出接口状态,并且 VkPipelineDepthStencilStateCreateInfoflags 成员包含 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXTVK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,则 renderPass 必须 不是 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-pColorAttachmentSamples-06592
    如果存在片段输出接口状态,则 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVpColorAttachmentSamples 成员的元素必须是有效的 VkSampleCountFlagBits 值。

  • VUID-VkGraphicsPipelineCreateInfo-depthStencilAttachmentSamples-06593
    如果存在片段输出接口状态,并且 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVdepthStencilAttachmentSamples 成员不为 0,则它必须是有效的 VkSampleCountFlagBits 值。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09527
    如果管线需要片段输出接口状态renderPass 不是 VK_NULL_HANDLE,并且 VkPipelineColorBlendStateCreateInfoflags 成员包含 VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT,则 subpass 必须已使用 VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT 创建。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09528
    如果管线需要片段着色器状态renderPass 不是 VK_NULL_HANDLE,并且 VkPipelineDepthStencilStateCreateInfoflags 成员包含 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT,则 subpass 必须已使用 VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT 创建。

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09529
    如果管线需要片段着色器状态renderPass 不是 VK_NULL_HANDLE,并且 VkPipelineDepthStencilStateCreateInfoflags 成员包含 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,则 subpass 必须已使用 VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT 创建。

  • VUID-VkGraphicsPipelineCreateInfo-pipelineStageCreationFeedbackCount-06594
    如果 VkPipelineCreationFeedbackCreateInfo::pipelineStageCreationFeedbackCount 不为 0,则它必须等于 stageCount

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06595
    如果 renderPassVK_NULL_HANDLE,则正在使用预光栅化着色器状态片段着色器状态创建管线,并且 VkMultiviewPerViewAttributesInfoNVX::perViewAttributesPositionXOnlyVK_TRUE,则 VkMultiviewPerViewAttributesInfoNVX::perViewAttributes 必须也为 VK_TRUE

  • VUID-VkGraphicsPipelineCreateInfo-flags-06596
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个标志,则在此管线和库中指定的 VkMultiviewPerViewAttributesInfoNVX::perViewAttributes 的值必须相等。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06597
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则两个库中指定的 VkMultiviewPerViewAttributesInfoNVX::perViewAttributes 的值必须相等。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06598
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个标志,则在此管线和库中指定的 VkMultiviewPerViewAttributesInfoNVX::perViewAttributesPositionXOnly 的值必须相等。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06599
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则两个库中指定的 VkMultiviewPerViewAttributesInfoNVX::perViewAttributesPositionXOnly 的值必须相等。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-06600
    如果管线需要预光栅化着色器状态片段着色器状态,则 pStages 必须是指向 stageCount 个有效 VkPipelineShaderStageCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-stageCount-09587
    如果管线不需要光栅化前着色器状态片元着色器状态,则 stageCount 必须为零

  • VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-06601
    如果管线需要光栅化前着色器状态,且相关的动态状态未设置,则 pRasterizationState 必须是指向有效 VkPipelineRasterizationStateCreateInfo 结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-09039
    如果VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,且相关的动态状态未设置,则 pMultisampleState 必须是指向有效 VkPipelineMultisampleStateCreateInfo 结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-09040
    如果 pRasterizationState 不是 NULL,则它必须是指向有效 VkPipelineRasterizationStateCreateInfo 结构的有效指针

  • VUID-VkGraphicsPipelineCreateInfo-layout-06602
    如果管线需要片元着色器状态光栅化前着色器状态,则 layout 必须是有效的 VkPipelineLayout 句柄

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-06603
    如果管线需要光栅化前着色器状态片元着色器状态片元输出状态,且 renderPass 不是 VK_NULL_HANDLE,则 renderPass 必须是有效的 VkRenderPass 句柄

  • VUID-VkGraphicsPipelineCreateInfo-stageCount-09530
    如果管线需要光栅化前着色器状态,则 stageCount 必须大于 0

  • VUID-VkGraphicsPipelineCreateInfo-graphicsPipelineLibrary-06606
    如果 graphicsPipelineLibrary 功能未启用,且 shaderMeshEnqueue 功能未启用,则 flags 必须不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-06608
    如果 shaderMeshEnqueue 功能未启用,且管线正在使用所有可能的状态子集创建,则 flags 必须不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-06609
    如果 flags 包含 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT,则通过 VkPipelineLibraryCreateInfoKHR 包含的管线库必须使用 VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT 创建

  • VUID-VkGraphicsPipelineCreateInfo-flags-09245
    如果 flags 包含 VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT,则 flags 必须也包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-flags-06610
    如果 flags 包含 VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT,则通过 VkPipelineLibraryCreateInfoKHR 包含的管线库必须使用 VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT 创建

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06611
    通过 VkPipelineLibraryCreateInfoKHR::pLibraries 包含的任何管线库都必须不包含此结构或 VkPipelineLibraryCreateInfoKHR::pLibraries 中的任何其他管线库已定义的任何状态子集

  • VUID-VkGraphicsPipelineCreateInfo-flags-06612
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 其中之一,且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个标志,且 layout 未使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建,则此管线和库使用的 layout 必须完全相同定义的

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06613
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,且任一库指定的 layout 未使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建,则每个库使用的 layout 必须完全相同定义的

  • VUID-VkGraphicsPipelineCreateInfo-flags-06614
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 其中之一,且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个子集,且 layout 使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建,则库使用的 layout 必须也使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06615
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,且任一库指定的 layout 使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建,则两个库使用的 layout必须已使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建

  • VUID-VkGraphicsPipelineCreateInfo-flags-06616
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个子集,并且 layout 是使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建的,则使用 layout 创建的 pSetLayouts 数组中不是 VK_NULL_HANDLE 的元素必须与用于创建库的 layoutpSetLayouts 中相同索引的元素完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06617
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,且任一库指定的 layout 是使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建的,则用于创建任一 layoutpSetLayouts 数组中不是 VK_NULL_HANDLE 的元素必须与用于创建另一个库的 layoutpSetLayouts 中相同索引的元素完全相同

  • VUID-VkGraphicsPipelineCreateInfo-flags-06618
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个标志,则在此管线和库中由 layout 指定的,且包含每个着色器阶段访问的绑定的任何描述符集布局 N 必须完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06619
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则在两个库中由 layout 指定的,且包含每个着色器阶段访问的绑定的任何描述符集布局 N 必须完全相同

  • VUID-VkGraphicsPipelineCreateInfo-flags-06620
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个标志,则在此管线和库中 layout 中指定的,且对每个着色器阶段可用的推送常量必须完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06621
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则在此管线和库中 layout 中指定的,且对每个着色器阶段可用的推送常量必须完全相同

  • VUID-VkGraphicsPipelineCreateInfo-flags-06679
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个子集,则当创建 layout 时,pSetLayouts 数组的任何元素和用于创建库的 layoutpSetLayouts 数组的对应元素不得同时为 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06681
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且用于创建每个库的 layoutpSetLayouts 数组的任何元素为 VK_NULL_HANDLE,则用于创建另一个库的 layoutpSetLayouts 数组的对应元素不得VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-flags-06756
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个子集,并且使用 layout 创建的 pSetLayouts 数组的任何元素为 VK_NULL_HANDLE,则用于创建库的 layoutpSetLayouts 数组的对应元素不得具有另一个子集中着色器的着色器绑定。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06757
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个子集,并且用于创建库的 layoutpSetLayouts 数组的任何元素为 VK_NULL_HANDLE,则用于创建此管线的 layoutpSetLayouts 数组的对应元素不得具有另一个子集中着色器的着色器绑定。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06758
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且用于创建每个库的 layoutpSetLayouts 数组的任何元素为 VK_NULL_HANDLE,则用于创建另一个库的 layoutpSetLayouts 数组的对应元素不得具有另一个子集中着色器的着色器绑定。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06682
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 同时包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则 layout 的创建必须不将 pSetLayouts 数组的任何元素设置为 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-flags-06683
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT 并且 pRasterizationState->rasterizerDiscardEnableVK_TRUE,则 layout 必须 在创建时,pSetLayouts 数组中没有元素设置为 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-flags-06684
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的某个元素包含其他标志之一,则 subpass 的值必须等于用于创建库的值。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06623
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的另一个元素包含其他标志之一,则用于创建每个库的 subpass 的值必须相同。

  • VUID-VkGraphicsPipelineCreateInfo-renderpass-06624
    如果 renderpass 不是 VK_NULL_HANDLEVkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的某个元素包含其他标志之一,则 renderPass 必须与用于创建库的 renderPass 兼容。

  • VUID-VkGraphicsPipelineCreateInfo-renderpass-06625
    如果 renderpassVK_NULL_HANDLEVkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的某个元素包含其他标志之一,则用于创建该库的 renderPass 的值也必须VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-flags-06626
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,VkPipelineLibraryCreateInfoKHR::pLibraries 的某个元素包含其他标志之一,并且 renderPassVK_NULL_HANDLE,则此管线和库指定的 VkPipelineRenderingCreateInfo::viewMask 的值必须相同。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06627
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,VkPipelineLibraryCreateInfoKHR::pLibraries 的另一个元素包含其他标志之一,并且两个库的 renderPass 都是 VK_NULL_HANDLE,则每个库设置的 VkPipelineRenderingCreateInfo::viewMask 的值必须相同。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06628
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 中的至少一个且不超过两个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的另一个元素包含其他标志之一,则用于创建每个库的 renderPass 对象必须兼容或全部等于 VK_NULL_HANDLE

  • VUID-VkGraphicsPipelineCreateInfo-renderpass-06631
    如果 renderPass 不是 VK_NULL_HANDLE,管线需要 片段着色器状态,并且 VK_EXT_extended_dynamic_state3 扩展未启用,或者任何 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXTVK_DYNAMIC_STATE_SAMPLE_MASK_EXTVK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态未设置,或者启用了 alphaToOne 特性并且未设置 VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT,则 pMultisampleState 必须是指向有效的 VkPipelineMultisampleStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-Input-06632
    如果管线需要 片段着色器状态,且片段着色器启用 样本着色 或使用 Sample 修饰 Input 存储类中的任何变量,并且 VK_EXT_extended_dynamic_state3 扩展未启用,或者任何 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXTVK_DYNAMIC_STATE_SAMPLE_MASK_EXTVK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态未设置,或者启用了 alphaToOne 特性并且未设置 VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT,则 pMultisampleState 必须是指向有效的 VkPipelineMultisampleStateCreateInfo 结构的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06633
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTpMultisampleState 不为 NULL,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的某个元素是使用 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 创建的,则 pMultisampleState 必须与用于创建库的定义完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06634
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTpMultisampleState 不为 NULL,并且如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT,则 pMultisampleState 必须与创建库时使用的定义完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06635
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXTpMultisampleState 不为 NULL,并且如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的另一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT,则用于创建每个库的 pMultisampleState 必须定义完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06636
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXTpMultisampleState->sampleShadingEnable 的值等于 VK_TRUE,并且如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的另一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则用于创建每个库的 pMultisampleState 必须定义完全相同

  • VUID-VkGraphicsPipelineCreateInfo-flags-06637
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXTpMultisampleState->sampleShadingEnableVK_TRUE,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则 pMultisampleState 必须与创建库时使用的定义完全相同

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-09567
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素在创建时使用了 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXTpMultisampleState->sampleShadingEnable 的值等于 VK_TRUE,并且如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则 pMultisampleState 必须与创建库时使用的定义完全相同

  • VUID-VkGraphicsPipelineCreateInfo-flags-06638
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 仅包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT 中的一个,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含另一个标志,则此管线和该库的 VkPipelineFragmentShadingRateStateCreateInfoKHR 中指定的值必须相同。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06639
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 的一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,而另一个元素包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则此管线和该库的 VkPipelineFragmentShadingRateStateCreateInfoKHR 中指定的值必须相同。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06640
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则 pStages 必须是指向一个由 stageCount 个有效的 VkPipelineShaderStageCreateInfo 结构体组成的数组的有效指针。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06642
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则 layout 必须是有效的 VkPipelineLayout 句柄。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06643
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT, VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT,并且 renderPass 不为 VK_NULL_HANDLE,则 renderPass 必须是有效的 VkRenderPass 句柄。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06644
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXTVK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,则 stageCount 必须大于 0

  • VUID-VkGraphicsPipelineCreateInfo-flags-06645
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 非零,并且如果 flags 包含 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR,则所有库必须也使用 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 创建。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06646
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 包含多个库,并且任何库使用 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 创建,则所有库必须也使用 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 创建。

  • VUID-VkGraphicsPipelineCreateInfo-pLibraries-06647
    如果 VkPipelineLibraryCreateInfoKHR::pLibraries 至少包含一个库, VkGraphicsPipelineLibraryCreateInfoEXT::flags 非零,并且任何库使用 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 创建,则 flags 必须包含 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR

  • VUID-VkGraphicsPipelineCreateInfo-None-07826
    如果管线包含完整的状态集合,并且 VkPipelineLibraryCreateInfoKHR::pLibraries 中没有包含库,则 VkPipelineLayout 必须是有效的管线布局。

  • VUID-VkGraphicsPipelineCreateInfo-layout-07827
    如果管线包含一个由库完全指定的完整状态集,并且每个库都是使用一个没有VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT创建的VkPipelineLayout创建的,那么layout必须与这些库中的布局兼容

  • VUID-VkGraphicsPipelineCreateInfo-flags-06729
    如果 flags 包含 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT,该管线包含一个由库完全指定的完整状态集,并且每个库都是使用一个使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建的 VkPipelineLayout 创建的,那么 layout 必须与库的管线布局的并集兼容,但排除 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 的包含/排除。

  • VUID-VkGraphicsPipelineCreateInfo-flags-06730
    如果 flags 不包含 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT,该管线包含一个由库完全指定的完整状态集,并且每个库都是使用一个使用 VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT 创建的 VkPipelineLayout 创建的,那么 layout 必须与库的管线布局的并集兼容

  • VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-08892
    如果 conservativePointAndLineRasterization 不被支持;管线正使用顶点输入状态预光栅化着色器状态创建;管线不包含几何着色器;并且VkPipelineInputAssemblyStateCreateInfo::topology 的值是 VK_PRIMITIVE_TOPOLOGY_POINT_LISTVK_PRIMITIVE_TOPOLOGY_LINE_LISTVK_PRIMITIVE_TOPOLOGY_LINE_STRIP,并且要么 VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY 动态状态未启用,要么dynamicPrimitiveTopologyUnrestrictedVK_FALSE,那么VkPipelineRasterizationConservativeStateCreateInfoEXT::conservativeRasterizationMode必须VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT

  • VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-06760
    如果conservativePointAndLineRasterization 不被支持,管线需要预光栅化着色器状态,并且管线包含一个具有 OutputPointsOutputLineStrip 执行模式的几何着色器,那么VkPipelineRasterizationConservativeStateCreateInfoEXT::conservativeRasterizationMode必须VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT

  • VUID-VkGraphicsPipelineCreateInfo-conservativePointAndLineRasterization-06761
    如果 conservativePointAndLineRasterization 不被支持,管线需要预光栅化着色器状态,并且管线包含一个具有 OutputPointsOutputLinesNV 执行模式的网格着色器,那么VkPipelineRasterizationConservativeStateCreateInfoEXT::conservativeRasterizationMode必须VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT

  • VUID-VkGraphicsPipelineCreateInfo-pStages-06894
    如果管线需要预光栅化着色器状态,但不需要片段着色器状态,那么 pStages 的元素必须没有将 stage 设置为 VK_SHADER_STAGE_FRAGMENT_BIT

  • VUID-VkGraphicsPipelineCreateInfo-pStages-06895
    如果管线需要片段着色器状态,但不需要预光栅化着色器状态,那么 pStages 的元素必须没有将 stage 设置为参与预光栅化的着色器阶段。

  • VUID-VkGraphicsPipelineCreateInfo-pStages-06896
    如果管线需要预光栅化着色器状态,那么 pStages 的所有元素必须stage 设置为参与片段着色器状态预光栅化着色器状态的着色器阶段。

  • VUID-VkGraphicsPipelineCreateInfo-stage-06897
    如果管线需要片段着色器状态和/或预光栅化着色器状态,那么 stage 的任何值必须不在 pStages 的多个元素中设置。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3TessellationDomainOrigin-07370
    如果 extendedDynamicState3TessellationDomainOrigin 功能未启用,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3DepthClampEnable-07371
    如果 extendedDynamicState3DepthClampEnable 功能未启用,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3PolygonMode-07372
    如果 extendedDynamicState3PolygonMode 功能未启用,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_POLYGON_MODE_EXT

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3RasterizationSamples-07373
    如果未启用 extendedDynamicState3RasterizationSamples 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3SampleMask-07374
    如果未启用 extendedDynamicState3SampleMask 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3AlphaToCoverageEnable-07375
    如果未启用 extendedDynamicState3AlphaToCoverageEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3AlphaToOneEnable-07376
    如果未启用 extendedDynamicState3AlphaToOneEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3LogicOpEnable-07377
    如果未启用 extendedDynamicState3LogicOpEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorBlendEnable-07378
    如果未启用 extendedDynamicState3ColorBlendEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorBlendEquation-07379
    如果未启用 extendedDynamicState3ColorBlendEquation 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorWriteMask-07380
    如果未启用 extendedDynamicState3ColorWriteMask 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3RasterizationStream-07381
    如果未启用 extendedDynamicState3RasterizationStream 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ConservativeRasterizationMode-07382
    如果未启用 extendedDynamicState3ConservativeRasterizationMode 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ExtraPrimitiveOverestimationSize-07383
    如果未启用 extendedDynamicState3ExtraPrimitiveOverestimationSize 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicState-09639
    如果管线需要光栅化前着色器状态pDynamicState 包含 VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT,并且 pDynamicState 不包含 VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT,则 pRasterizationStatepNext 链中必须包含一个VkPipelineRasterizationConservativeStateCreateInfoEXT

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3DepthClipEnable-07384
    如果未启用 extendedDynamicState3DepthClipEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3SampleLocationsEnable-07385
    如果未启用 extendedDynamicState3SampleLocationsEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ColorBlendAdvanced-07386
    如果未启用 extendedDynamicState3ColorBlendAdvanced 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ProvokingVertexMode-07387
    如果未启用 extendedDynamicState3ProvokingVertexMode 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3LineRasterizationMode-07388
    如果未启用 extendedDynamicState3LineRasterizationMode 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3LineStippleEnable-07389
    如果未启用 extendedDynamicState3LineStippleEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有设置为 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3DepthClipNegativeOneToOne-07390
    如果未启用 extendedDynamicState3DepthClipNegativeOneToOne 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ViewportWScalingEnable-07391
    如果未启用 extendedDynamicState3ViewportWScalingEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ViewportSwizzle-07392
    如果未启用 extendedDynamicState3ViewportSwizzle 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageToColorEnable-07393
    如果未启用 extendedDynamicState3CoverageToColorEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageToColorLocation-07394
    如果未启用 extendedDynamicState3CoverageToColorLocation 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageModulationMode-07395
    如果未启用 extendedDynamicState3CoverageModulationMode 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageModulationTableEnable-07396
    如果未启用 extendedDynamicState3CoverageModulationTableEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageModulationTable-07397
    如果未启用 extendedDynamicState3CoverageModulationTable 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3CoverageReductionMode-07398
    如果未启用 extendedDynamicState3CoverageReductionMode 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3RepresentativeFragmentTestEnable-07399
    如果未启用 extendedDynamicState3RepresentativeFragmentTestEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-extendedDynamicState3ShadingRateImageEnable-07400
    如果未启用 extendedDynamicState3ShadingRateImageEnable 功能,则 pDynamicStatepDynamicStates 成员中必须没有元素设置为 VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV

  • VUID-VkGraphicsPipelineCreateInfo-flags-07401
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT

  • VUID-VkGraphicsPipelineCreateInfo-flags-07997
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07730
    如果管线需要光栅化前着色器状态,并且 pDynamicStatepDynamicStates 成员中没有元素是 VK_DYNAMIC_STATE_VIEWPORTVK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,且如果启用了 multiviewPerViewViewports 功能,则 VkRenderPassMultiviewCreateInfo::pViewMasks 每个元素中最高有效位的索引必须小于 pViewportState->viewportCount

  • VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-07731
    如果管线需要光栅化前着色器状态,并且 pDynamicStatepDynamicStates 成员中没有元素是 VK_DYNAMIC_STATE_SCISSORVK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,且如果启用了 multiviewPerViewViewports 功能,则 VkRenderPassMultiviewCreateInfo::pViewMasks 每个元素中最高有效位的索引必须小于 pViewportState->scissorCount

  • VUID-VkGraphicsPipelineCreateInfo-pStages-08711
    如果 pStages 包括片段着色器阶段,VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE 未在 VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置,并且片段着色器声明了 EarlyFragmentTests 执行模式并使用了 OpDepthAttachmentReadEXT,则 VkPipelineDepthStencilStateCreateInfodepthWriteEnable 成员必须VK_FALSE

  • VUID-VkGraphicsPipelineCreateInfo-pStages-08712
    如果 pStages 包含片段着色器阶段,且 VkPipelineDynamicStateCreateInfo::pDynamicStates 中未设置 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,并且片段着色器声明了 EarlyFragmentTests 执行模式并使用了 OpStencilAttachmentReadEXT,则 VkStencilOpState::writeMaskVkPipelineDepthStencilStateCreateInfo 中对于 frontback 的值必须0

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-08744
    如果 renderPassVK_NULL_HANDLE,管线需要片段输出状态片段着色器状态,管线启用了采样着色rasterizationSamples 不是动态的,并且 pNext 链中包含一个 VkPipelineRenderingCreateInfo 结构体,则 rasterizationSamples 必须是一个有效的 VkSampleCountFlagBits 值,该值在 imageCreateSampleCounts 中设置(如 图像创建限制 中所定义),对于 depthAttachmentFormatstencilAttachmentFormatpColorAttachmentFormats 数组中的每个不是 VK_FORMAT_UNDEFINED 的元素。

  • VUID-VkGraphicsPipelineCreateInfo-flags-08897
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT,并且在库中或通过包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT 指定了预光栅化着色器状态,并且该状态在 pStages 中包含顶点着色器阶段,则管线必须定义顶点输入状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08898
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT,并且未指定预光栅化着色器状态,则管线必须定义顶点输入状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08899
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,并且在库中或通过包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT 指定了预光栅化着色器状态,并且该状态在 pStages 中包含顶点着色器阶段,则管线必须定义顶点输入状态,或者在链接的管线库中包含该状态。

  • VUID-VkGraphicsPipelineCreateInfo-flags-08900
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,则管线必须定义预光栅化着色器状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08901
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,则管线必须定义预光栅化着色器状态,或者在链接的管线库中包含该状态。

  • VUID-VkGraphicsPipelineCreateInfo-flags-08903
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且在库中或通过包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT 指定了预光栅化着色器状态,并且该状态包含 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE 或者将 pRasterizationState->rasterizerDiscardEnable 设置为 VK_FALSE,则管线必须定义片段着色器状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08904
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且未指定预光栅化着色器状态,则管线必须定义片段着色器状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08906
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且在库中或通过包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT 指定了预光栅化着色器状态,并且该状态包含 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE 或者将 pRasterizationState->rasterizerDiscardEnable 设置为 VK_FALSE,则管线必须定义片段输出接口状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08907
    如果 VkGraphicsPipelineLibraryCreateInfoEXT::flags 包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,并且未指定预光栅化着色器状态,则管线必须定义片段输出接口状态

  • VUID-VkGraphicsPipelineCreateInfo-flags-08909
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,并且在库中或通过包含 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT 指定了预光栅化着色器状态,并且该状态包含 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE 或者将 pRasterizationState->rasterizerDiscardEnable 设置为 VK_FALSE,则管线必须定义片段输出接口状态片段着色器状态,或者在链接的管线库中包含这些状态。

  • VUID-VkGraphicsPipelineCreateInfo-None-09043
    如果 pDynamicState->pDynamicStates 不包含 VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT,并且任何颜色附件的格式为 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,则 pColorBlendState->pAttachments 中对应元素的 colorWriteMask 成员必须包含 VK_COLOR_COMPONENT_R_BITVK_COLOR_COMPONENT_G_BITVK_COLOR_COMPONENT_B_BIT 的全部或一个都不包含。

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09301
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,则VkPipelineRenderingCreateInfo::viewMask 必须0

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09304
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPassVK_NULL_HANDLEVkExternalFormatANDROID::externalFormat 不为 0,且rasterizationSamples 不是动态的,则VkPipelineMultisampleStateCreateInfo::rasterizationSamples 必须1

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09305
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,且blendEnable 不是动态的,则 pColorBlendState->pAttachments 的每个元素的 blendEnable 成员 必须VK_FALSE

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09306
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,且pDynamicState->pDynamicStates 不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则VkPipelineFragmentShadingRateStateCreateInfoKHR::width 必须1

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09307
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,且pDynamicState->pDynamicStates 不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则VkPipelineFragmentShadingRateStateCreateInfoKHR::height 必须1

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09308
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态预光栅化着色器状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,则最后的预光栅化着色器阶段 必须不能静态地使用带有 PrimitiveShadingRateKHR 内置变量的变量

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09309
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,则VkPipelineRenderingCreateInfo::colorAttachmentCount 必须1

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09310
    如果启用了externalFormatResolve特性,并且管线需要片元着色器状态片元输出接口状态renderPassVK_NULL_HANDLE,且VkExternalFormatANDROID::externalFormat 不为 0,则片元着色器 必须不能声明 DepthReplacingStencilRefReplacingEXT 执行模式

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09313
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPass 不为 VK_NULL_HANDLEsubpass 包含一个外部格式解析附件,且 rasterizationSamples 不是动态的,则VkPipelineMultisampleStateCreateInfo::rasterizationSamples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09314
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPass 不为 VK_NULL_HANDLEsubpass 包含一个外部格式解析附件,且 blendEnable 不是动态的,则 pColorBlendState->pAttachments 的每个元素的 blendEnable 成员 必须VK_FALSE

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09315
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPass 不为 VK_NULL_HANDLEsubpass 包含一个外部格式解析附件,且 pDynamicState->pDynamicStates 不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则VkPipelineFragmentShadingRateStateCreateInfoKHR::width 必须1

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09316
    如果启用了externalFormatResolve特性,并且管线需要片元输出接口状态renderPass 不为 VK_NULL_HANDLEsubpass 包含一个外部格式解析附件,且 pDynamicState->pDynamicStates 不包含 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,则VkPipelineFragmentShadingRateStateCreateInfoKHR::height 必须1

  • VUID-VkGraphicsPipelineCreateInfo-externalFormatResolve-09317
    如果启用了 externalFormatResolve 功能,并且管线需要 预光栅化着色器状态片段输出接口状态,并且 renderPass 不是 VK_NULL_HANDLE,并且 subpass 包含一个外部格式解析附件,则最后一个 预光栅化着色器阶段 必须 不静态使用带有 PrimitiveShadingRateKHR 内置变量的变量

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09531
    如果管线是使用 片段着色器状态片段输出状态 创建的,并且 renderPass 的值为 VK_NULL_HANDLE,并且包含了 VkRenderingInputAttachmentIndexInfo,则 VkRenderingInputAttachmentIndexInfo::colorAttachmentCount 必须 等于 VkPipelineRenderingCreateInfo::colorAttachmentCount

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09652
    如果管线是使用 片段着色器状态片段输出状态 创建的,并且 renderPass 的值为 VK_NULL_HANDLE,并且没有包含 VkRenderingInputAttachmentIndexInfo,则片段着色器 必须 不包含任何 InputAttachmentIndex 大于或等于 VkPipelineRenderingCreateInfo::colorAttachmentCount 的输入附件

  • VUID-VkGraphicsPipelineCreateInfo-renderPass-09532
    如果管线是使用 片段输出状态 创建的,并且 renderPass 的值为 VK_NULL_HANDLE,则 VkRenderingAttachmentLocationInfo::colorAttachmentCount 必须 等于 VkPipelineRenderingCreateInfo::colorAttachmentCount

有效用法(隐式)

VkPipelineRenderingCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkPipelineRenderingCreateInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           viewMask;
    uint32_t           colorAttachmentCount;
    const VkFormat*    pColorAttachmentFormats;
    VkFormat           depthAttachmentFormat;
    VkFormat           stencilAttachmentFormat;
} VkPipelineRenderingCreateInfo;

或等效的

// Provided by VK_KHR_dynamic_rendering
typedef VkPipelineRenderingCreateInfo VkPipelineRenderingCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • viewMask 是用于渲染的视图掩码。

  • colorAttachmentCountpColorAttachmentFormats 中的条目数

  • pColorAttachmentFormats 是指向 VkFormat 值数组的指针,该数组定义此管线中使用的颜色附件的格式。

  • depthAttachmentFormat 是定义此管线中使用的深度附件格式的 VkFormat 值。

  • stencilAttachmentFormat 是定义此管线中使用的模板附件格式的 VkFormat 值。

当创建一个没有 VkRenderPass 的管线时,如果 VkGraphicsPipelineCreateInfopNext 链中包含此结构,则它指定用于渲染的附件的视图掩码和格式。如果未指定此结构,并且管线不包含 VkRenderPass,则 viewMaskcolorAttachmentCount0depthAttachmentFormatstencilAttachmentFormatVK_FORMAT_UNDEFINED。如果使用有效的 VkRenderPass 创建图形管线,则忽略此结构的参数。

如果 depthAttachmentFormatstencilAttachmentFormatpColorAttachmentFormats 的任何元素为 VK_FORMAT_UNDEFINED,则表示相应的附件在渲染过程中未使用。有效的格式表示 可以 使用附件 - 但在开始渲染时将附件设置为 NULL 仍然是有效的。

如果渲染过程将与外部格式解析附件一起使用,则 VkExternalFormatANDROID 结构 必须 也包含在 VkGraphicsPipelineCreateInfopNext 链中,定义将使用的解析附件的外部格式。

有效使用
  • VUID-VkPipelineRenderingCreateInfo-colorAttachmentCount-09533
    colorAttachmentCount 必须 小于或等于 maxColorAttachments

有效用法(隐式)
  • VUID-VkPipelineRenderingCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO

VkPipelineCreateFlags2CreateInfo 结构定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkPipelineCreateFlags2CreateInfo {
    VkStructureType           sType;
    const void*               pNext;
    VkPipelineCreateFlags2    flags;
} VkPipelineCreateFlags2CreateInfo;

或等效的

// Provided by VK_KHR_maintenance5
typedef VkPipelineCreateFlags2CreateInfo VkPipelineCreateFlags2CreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkPipelineCreateFlagBits2 的位掩码,指定如何生成管线。

如果此结构包含在管线创建结构的 pNext 链中,则使用 flags 代替在该创建结构中传递的相应 flags 值,从而允许指定其他创建标志。

有效用法(隐式)
  • VUID-VkPipelineCreateFlags2CreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO

  • VUID-VkPipelineCreateFlags2CreateInfo-flags-parameter
    flags 必须VkPipelineCreateFlagBits2 值的有效组合

  • VUID-VkPipelineCreateFlags2CreateInfo-flags-requiredbitmask
    flags 不得0

VkPipelineCreateFlags2CreateInfo::flags可以设置的位,用于指定如何创建管线,包括

// Provided by VK_VERSION_1_4
// Flag bits for VkPipelineCreateFlagBits2
typedef VkFlags64 VkPipelineCreateFlagBits2;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT = 0x00000001ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT = 0x00000002ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT = 0x00000004ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT = 0x00000010ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT = 0x08000000ULL;
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT = 0x40000000ULL;
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Provided by VK_AMDX_shader_enqueue with VK_KHR_maintenance5 or VK_VERSION_1_4
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX = 0x100000000ULL;
#endif
// Provided by VK_EXT_legacy_dithering with (VK_KHR_dynamic_rendering or VK_VERSION_1_3) and (VK_KHR_maintenance5 or VK_VERSION_1_4)
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x400000000ULL;
// Provided by VK_KHR_maintenance5
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR = 0x00000001ULL;
// Provided by VK_KHR_maintenance5
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT_KHR = 0x00000002ULL;
// Provided by VK_KHR_maintenance5
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT_KHR = 0x00000004ULL;
// Provided by VK_KHR_maintenance5
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = 0x00000008ULL;
// Provided by VK_KHR_maintenance5
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT_KHR = 0x00000010ULL;
// Provided by VK_KHR_maintenance5 with VK_NV_ray_tracing
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV = 0x00000020ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_pipeline_executable_properties
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR = 0x00000040ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_pipeline_executable_properties
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080ULL;
// Provided by VK_KHR_maintenance5 with VK_VERSION_1_3 or VK_EXT_pipeline_creation_cache_control
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR = 0x00000100ULL;
// Provided by VK_KHR_maintenance5 with VK_VERSION_1_3 or VK_EXT_pipeline_creation_cache_control
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR = 0x00000200ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_graphics_pipeline_library
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_graphics_pipeline_library
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_pipeline_library
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR = 0x00000800ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0x00001000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0x00020000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000ULL;
// Provided by VK_KHR_maintenance5 with VK_NV_device_generated_commands
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV = 0x00040000ULL;
// Provided by VK_KHR_maintenance5 with VK_NV_ray_tracing_motion_blur
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000ULL;
// Provided by VK_KHR_maintenance5 with (VK_KHR_dynamic_rendering or VK_VERSION_1_3) and VK_KHR_fragment_shading_rate
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000ULL;
// Provided by VK_KHR_maintenance5 with (VK_KHR_dynamic_rendering or VK_VERSION_1_3) and VK_EXT_fragment_density_map
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_opacity_micromap
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_attachment_feedback_loop_layout
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_attachment_feedback_loop_layout
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000ULL;
// Provided by VK_KHR_maintenance5 with VK_VERSION_1_4 or VK_EXT_pipeline_protected_access
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT = 0x08000000ULL;
// Provided by VK_KHR_maintenance5 with VK_VERSION_1_4 or VK_EXT_pipeline_protected_access
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT = 0x40000000ULL;
// Provided by VK_KHR_maintenance5 with VK_NV_displacement_micromap
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000ULL;
// Provided by VK_KHR_maintenance5 with VK_ARM_pipeline_opacity_micromap, VK_ARM_pipeline_opacity_micromap
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISALLOW_OPACITY_MICROMAP_BIT_ARM = 0x2000000000ULL;
// Provided by VK_KHR_pipeline_binary
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR = 0x80000000ULL;
// Provided by VK_EXT_device_generated_commands
static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT = 0x4000000000ULL;

或等效的

// Provided by VK_KHR_maintenance5
typedef VkPipelineCreateFlagBits2 VkPipelineCreateFlagBits2KHR;
  • VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT 指定创建的管线将不会被优化。使用此标志可能会减少创建管线所花费的时间。

  • VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT 指定允许创建的管线成为后续管线创建调用中创建的管线的父管线。

  • VK_PIPELINE_CREATE_2_DERIVATIVE_BIT 指定创建的管线将是先前创建的父管线的子管线。

  • VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT 指定任何被修饰为 ViewIndex 的着色器输入变量的值都将如同它们被修饰为 DeviceIndex 一样进行赋值。

  • VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT 指定计算管线可以与具有非零基础工作组的 vkCmdDispatchBase 一起使用。

  • VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV 指定在延迟状态下创建包含所有着色器的管线。在使用管线之前,应用程序必须在使用管线之前,对管线中的每个着色器调用一次 vkCompileDeferredNV

  • VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR 指定着色器编译器应捕获编译过程生成的管线可执行文件的统计信息,这些信息稍后可以通过调用 vkGetPipelineExecutableStatisticsKHR 来检索。启用此标志必须不影响最终编译的管线,但可能会禁用管线缓存或以其他方式影响管线创建时间。

  • VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 指定着色器编译器应捕获编译过程生成的管线可执行文件的内部表示,这些信息稍后可以通过调用 vkGetPipelineExecutableInternalRepresentationsKHR 来检索。启用此标志必须不影响最终编译的管线,但可能会禁用管线缓存或以其他方式影响管线创建时间。当从使用管线库创建的管线捕获 IR 时,不保证可以从链接的管线中检索到库中的 IR。应用程序应该分别从每个库和任何链接的管线中检索 IR。

  • VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR 指定管线不能直接使用,而是定义一个管线库,该库可以使用 VkPipelineLibraryCreateInfoKHR 结构与其他管线组合。这在光线追踪和图形管线中可用。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR 指定当执行任何命中着色器时,始终会存在任何命中着色器。NULL 任何命中着色器是实际上为 VK_SHADER_UNUSED_KHR 的任何命中着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR 指定当执行最近命中着色器时,始终会存在最近命中着色器。NULL 最近命中着色器是实际上为 VK_SHADER_UNUSED_KHR 的最近命中着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR 指定当执行未命中着色器时,始终会存在未命中着色器。NULL 未命中着色器是实际上为 VK_SHADER_UNUSED_KHR 的未命中着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR 指定当执行交集着色器时,始终会存在交集着色器。NULL 交集着色器是实际上为 VK_SHADER_UNUSED_KHR 的交集着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR 指定在使用 管线跟踪射线 指令进行遍历时,将跳过三角形图元。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR 指定在使用 管线跟踪射线 指令进行遍历时,将跳过 AABB 图元。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR 指定着色器组句柄可以被保存并在后续运行中重复使用(例如,用于跟踪捕获和重放)。

  • VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV 指定该管线可以与设备生成的命令结合使用。

  • VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT 指定该管线可以VkIndirectExecutionSetEXT 中使用。

  • VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 指定如果创建有效的 VkPipeline 对象需要编译,则管线创建将失败;管线创建将返回 VK_PIPELINE_COMPILE_REQUIRED,并且 VkPipeline 将为 VK_NULL_HANDLE

  • 在创建多个管线时,如果任何单个管线返回的结果不是 VK_SUCCESSVK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT 指定将控制权返回给应用程序,而不是继续创建其他管线。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV 指定允许该管线使用 OpTraceRayMotionNV

  • VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 指定该管线将与片段着色率附件一起使用。

  • VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT 指定该管线将与片段密度图附件一起使用。

  • VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT 指定链接到此库中的管线库应该应用链接时优化。如果省略此位,则实现应该尽可能快地执行链接。

  • VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT 指定管线库应保留稍后执行与 VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT 的最佳链接所需的任何信息。

  • VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT 指定管线将与描述符缓冲区而不是描述符集一起使用。

  • VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 指定该管线可能与包括颜色附件的附件反馈循环一起使用。

  • VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 指定该管线可以与包含深度/模板附件的附件反馈环路一起使用。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT 指定光线追踪管线可以与引用不透明度微映射数组的加速结构一起使用。

  • VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV 指定光线追踪管线可以与引用位移微映射数组的加速结构一起使用。

  • VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT 指定该管线必须不绑定到受保护的命令缓冲区。

  • VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT 指定该管线必须不绑定到未受保护的命令缓冲区。

  • VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 指定可以从该管线创建 VkPipelineBinaryKHR 对象。如果使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR,则实现应该不将管线数据存储到内部缓存,如果存在此类缓存,如 pipelineBinaryInternalCache 所述。如果 pipelineBinaryPrefersInternalCacheVK_TRUE,则应用程序应该不使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR

  • VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT 指定该管线将在使用 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 开始的渲染通道中使用。

  • VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX 指定该管线将在 执行图 中使用。

  • VK_PIPELINE_CREATE_2_DISALLOW_OPACITY_MICROMAP_BIT_ARM 指定该管线必须不与引用不透明度微映射数组的加速结构一起使用。

同时设置 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BITVK_PIPELINE_CREATE_2_DERIVATIVE_BIT 是有效的。这允许一个管线既是父级,也可能是管线层次结构中的子级。有关更多信息,请参见 管线派生

当实现查找 管线缓存 中的管线时,如果该管线是使用链接库创建的,则实现应该始终返回使用 VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT 创建的等效管线(如果可用),无论是否指定了该位。

在链接管线库时使用(或不使用)VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT 旨在作为主机和设备之间的性能折衷。如果省略该位,则链接速度应该更快,并且可以更快地生成管线,但是目标设备上管线的性能可能会降低。如果包含该位,则链接速度可能会较慢,但应该生成一个与单片创建的管线具有可比设备性能的管线。同时使用这两个选项可以允许对延迟敏感的应用程序快速生成一个次优但可用的管线,然后在后台执行最佳链接,并在结果可用时将其替换为次优链接的管线。

// Provided by VK_VERSION_1_4
typedef VkFlags64 VkPipelineCreateFlags2;

或等效的

// Provided by VK_KHR_maintenance5
typedef VkPipelineCreateFlags2 VkPipelineCreateFlags2KHR;

VkPipelineCreateFlags2 是一个位掩码类型,用于设置零个或多个 VkPipelineCreateFlagBits2 的掩码。

可以设置的位在

指定如何创建管线,并且是

// Provided by VK_VERSION_1_0
typedef enum VkPipelineCreateFlagBits {
    VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001,
    VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002,
    VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004,
  // Provided by VK_VERSION_1_1
    VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008,
  // Provided by VK_VERSION_1_1
    VK_PIPELINE_CREATE_DISPATCH_BASE_BIT = 0x00000010,
  // Provided by VK_VERSION_1_3
    VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100,
  // Provided by VK_VERSION_1_3
    VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200,
  // Provided by VK_VERSION_1_4
    VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT = 0x08000000,
  // Provided by VK_VERSION_1_4
    VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT = 0x40000000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0x00020000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0x00001000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000,
  // Provided by VK_NV_ray_tracing
    VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV = 0x00000020,
  // Provided by VK_EXT_fragment_density_map with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
    VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000,
  // Provided by VK_KHR_fragment_shading_rate with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
    VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000,
  // Provided by VK_KHR_pipeline_executable_properties
    VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR = 0x00000040,
  // Provided by VK_KHR_pipeline_executable_properties
    VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080,
  // Provided by VK_NV_device_generated_commands
    VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV = 0x00040000,
  // Provided by VK_KHR_pipeline_library
    VK_PIPELINE_CREATE_LIBRARY_BIT_KHR = 0x00000800,
  // Provided by VK_EXT_descriptor_buffer
    VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000,
  // Provided by VK_EXT_graphics_pipeline_library
    VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000,
  // Provided by VK_EXT_graphics_pipeline_library
    VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400,
  // Provided by VK_NV_ray_tracing_motion_blur
    VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000,
  // Provided by VK_EXT_attachment_feedback_loop_layout
    VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000,
  // Provided by VK_EXT_attachment_feedback_loop_layout
    VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000,
  // Provided by VK_EXT_opacity_micromap
    VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000,
#ifdef VK_ENABLE_BETA_EXTENSIONS
  // Provided by VK_NV_displacement_micromap
    VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000,
#endif
  // Provided by VK_VERSION_1_1
    VK_PIPELINE_CREATE_DISPATCH_BASE = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT,
  // Provided by VK_KHR_device_group
    VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT,
  // Provided by VK_KHR_device_group
    VK_PIPELINE_CREATE_DISPATCH_BASE_KHR = VK_PIPELINE_CREATE_DISPATCH_BASE,
  // Provided by VK_EXT_fragment_density_map with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
  // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT is a deprecated alias
    VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT,
  // Provided by VK_KHR_fragment_shading_rate with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
  // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR is a deprecated alias
    VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
  // Provided by VK_EXT_pipeline_creation_cache_control
    VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT,
  // Provided by VK_EXT_pipeline_creation_cache_control
    VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT = VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT,
  // Provided by VK_EXT_pipeline_protected_access
    VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT = VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT,
  // Provided by VK_EXT_pipeline_protected_access
    VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT = VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT,
} VkPipelineCreateFlagBits;
  • VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT 指定创建的管线将不会被优化。使用此标志可能会减少创建管线所花费的时间。

  • VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 指定允许创建的管线成为在后续管线创建调用中创建的管线的父级。

  • VK_PIPELINE_CREATE_DERIVATIVE_BIT 指定要创建的管线将是先前创建的父级管线的子级。

  • VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT 指定任何被修饰为 ViewIndex 的着色器输入变量将被赋予值,就像它们被修饰为 DeviceIndex 一样。

  • VK_PIPELINE_CREATE_DISPATCH_BASE 指定计算管线可以与具有非零基础工作组的 vkCmdDispatchBase 一起使用。

  • VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV 指定在延迟状态下创建具有所有着色器的管线。在使用管线之前,应用程序必须在使用管线之前对管线中的每个着色器准确调用一次 vkCompileDeferredNV

  • VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR 指定着色器编译器应捕获编译过程生成的管线可执行文件的统计信息,这些统计信息稍后可以通过调用 vkGetPipelineExecutableStatisticsKHR 来检索。启用此标志必须不影响最终编译的管线,但是可能会禁用管线缓存或以其他方式影响管线的创建时间。

  • VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 指定着色器编译器应捕获编译过程生成的管线可执行文件的内部表示形式,这些表示形式稍后可以通过调用 vkGetPipelineExecutableInternalRepresentationsKHR 来检索。启用此标志必须不影响最终编译的管线,但是可能会禁用管线缓存或以其他方式影响管线的创建时间。当从使用管线库创建的管线捕获 IR 时,不能保证可以从链接的管线中检索库中的 IR。应用程序应该分别从每个库和任何链接的管线中检索 IR。

  • VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 指定该管线不能直接使用,而是定义一个管线库,该库可以与使用 VkPipelineLibraryCreateInfoKHR 结构的其他管线组合使用。这在光线追踪和图形管线中可用。

  • VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR 指定当执行任何命中着色器时,任何命中着色器将始终存在。NULL 任何命中着色器是实际上为 VK_SHADER_UNUSED_KHR 的任何命中着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR 指定当执行最近命中着色器时,最近命中着色器将始终存在。NULL 最近命中着色器是实际上为 VK_SHADER_UNUSED_KHR 的最近命中着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR 指定当执行未命中着色器时,未命中着色器将始终存在。NULL 未命中着色器是实际上为 VK_SHADER_UNUSED_KHR 的未命中着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR 指定当执行相交着色器时,相交着色器将始终存在。NULL 相交着色器是实际上为 VK_SHADER_UNUSED_KHR 的相交着色器,例如来自完全由零组成的着色器组。

  • VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR 指定在使用 管线跟踪射线 指令遍历期间将跳过三角形图元。

  • VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR 指定在使用 管线跟踪射线 指令遍历期间将跳过 AABB 图元。

  • VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR 指定着色器组句柄可以被保存并在后续运行中重用(例如,用于跟踪捕获和重放)。

  • VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV 指定该管线可以设备生成的命令 结合使用。

  • VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 指定如果创建有效的 VkPipeline 对象需要编译,则管道创建将失败;管道创建将返回 VK_PIPELINE_COMPILE_REQUIRED,并且 VkPipeline 将为 VK_NULL_HANDLE

  • 在创建多个管道时,VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT 指定如果任何单个管道返回的结果不是 VK_SUCCESS,则控制权将返回给应用程序,而不是继续创建其他管道。

  • VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV 指定该管道允许使用 OpTraceRayMotionNV

  • VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 指定该管道将与片元着色率附件和动态渲染一起使用。

  • VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT 指定该管道将与片元密度映射附件和动态渲染一起使用。

  • VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT 指定链接到此库中的管道库应该应用链接时优化。如果省略此位,则实现应该尽可能快地执行链接。

  • VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT 指定管道库应保留稍后使用 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT 执行最佳链接所需的任何信息。

  • VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 指定管道将与描述符缓冲区而不是描述符集一起使用。

  • VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 指定该管道可以与包括颜色附件的附件反馈循环一起使用。如果在 pDynamicStates 中设置了 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT,则忽略此标志。

  • VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 指定该管道可以与包括深度模板附件的附件反馈循环一起使用。如果在 pDynamicStates 中设置了 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT,则忽略此标志。

  • VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT 指定光线追踪管道可以与引用不透明度微映射数组的加速结构一起使用。

  • VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV 指定光线追踪管道可以与引用位移微映射数组的加速结构一起使用。

  • VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT 指定该管道必须不绑定到受保护的命令缓冲区。

  • VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT 指定该管道必须不绑定到不受保护的命令缓冲区。

同时设置 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BITVK_PIPELINE_CREATE_DERIVATIVE_BIT 是有效的。这允许管道在管道层次结构中既是父级,也可能是子级。有关详细信息,请参阅 管道派生

当实现查找管道缓存中的管道时,如果该管道是使用链接库创建的,则实现应该始终返回一个等效的、使用 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT 创建的管道(如果可用),无论是否指定了该位。

在链接管道库时使用 VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT(或不使用)旨在作为主机和设备之间的性能折衷。如果省略该位,链接应该更快并更快地生成管道,但目标设备上管道的性能可能会降低。如果包含该位,链接可能会较慢,但应该生成一个设备性能与整体创建的管道相当的管道。同时使用这两个选项可以让对延迟敏感的应用程序快速生成一个次优但可用的管道,然后在后台执行最佳链接,并在可用时将结果替换为次优链接的管道。

// Provided by VK_VERSION_1_0
typedef VkFlags VkPipelineCreateFlags;

VkPipelineCreateFlags 是一个位掩码类型,用于设置零个或多个 VkPipelineCreateFlagBits 的掩码。

VkPipelineBinaryInfoKHR 结构定义为

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryInfoKHR {
    VkStructureType               sType;
    const void*                   pNext;
    uint32_t                      binaryCount;
    const VkPipelineBinaryKHR*    pPipelineBinaries;
} VkPipelineBinaryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • binaryCountpPipelineBinaries 数组中元素的数量。

  • pPipelineBinaries 是指向 VkPipelineBinaryKHR 句柄数组的指针。

如果在创建管道时,任何 Vk*PipelineCreateInfo 结构的 pNext 链中包含 binaryCount 大于 0 的 VkPipelineBinaryInfoKHR 结构,则实现必须使用 pPipelineBinaries 中的数据,而不是重新计算它。VkPipelineShaderStageCreateInfo 实例中声明的任何着色器模块标识符或着色器模块都将被忽略。

如果此结构未包含在 pNext 链中,则相当于指定此结构的 binaryCount0

有效使用
  • VUID-VkPipelineBinaryInfoKHR-binaryCount-09603
    binaryCountpPipelineBinaries 中元素的顺序必须vkCreatePipelineBinariesKHR 返回的顺序完全匹配,对于匹配的 Vk*PipelineCreateInfo 结构及其 pNext 链,忽略 VkPipelineBinaryInfoKHR 结构的存在、VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的存在以及任何着色器模块标识符或着色器模块的缺失,对于来自以下的相同 全局管道密钥

有效用法(隐式)
  • VUID-VkPipelineBinaryInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_BINARY_INFO_KHR

  • VUID-VkPipelineBinaryInfoKHR-pPipelineBinaries-parameter
    如果 binaryCount 不为 0,则 pPipelineBinaries 必须是指向 binaryCount 个有效的 VkPipelineBinaryKHR 句柄数组的有效指针。

VkGraphicsPipelineLibraryCreateInfoEXT 结构定义为

// Provided by VK_EXT_graphics_pipeline_library
typedef struct VkGraphicsPipelineLibraryCreateInfoEXT {
    VkStructureType                      sType;
    const void*                          pNext;
    VkGraphicsPipelineLibraryFlagsEXT    flags;
} VkGraphicsPipelineLibraryCreateInfoEXT;

如果在 VkGraphicsPipelineCreateInfopNext 链中包含 VkGraphicsPipelineLibraryCreateInfoEXT 结构,则它指定了正在创建的图形管道的子集,不包括来自链接管道库的任何子集。如果使用管道库创建管道,则来自这些库的状态将与所述子集合并。

如果省略此结构,并且 VkGraphicsPipelineCreateInfo::flags 包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 或者 VkGraphicsPipelineCreateInfo::pNext 链包含 libraryCount 大于 0VkPipelineLibraryCreateInfoKHR 结构,则相当于 flags0。否则,如果省略此结构,则相当于 flags 包含图形管道的所有可能子集(即完整的图形管道)。

有效用法(隐式)
  • VUID-VkGraphicsPipelineLibraryCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT

  • VUID-VkGraphicsPipelineLibraryCreateInfoEXT-flags-parameter
    flags 必须VkGraphicsPipelineLibraryFlagBitsEXT 值的有效组合。

  • VUID-VkGraphicsPipelineLibraryCreateInfoEXT-flags-requiredbitmask
    flags 不得0

// Provided by VK_EXT_graphics_pipeline_library
typedef VkFlags VkGraphicsPipelineLibraryFlagsEXT;

VkGraphicsPipelineLibraryFlagsEXT 是一个位掩码类型,用于设置零个或多个 VkGraphicsPipelineLibraryFlagBitsEXT 的掩码。

VkGraphicsPipelineLibraryCreateInfoEXTflags 成员的可能值,用于指定要编译的图形管线的子集为:

// Provided by VK_EXT_graphics_pipeline_library
typedef enum VkGraphicsPipelineLibraryFlagBitsEXT {
    VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT = 0x00000001,
    VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT = 0x00000002,
    VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT = 0x00000004,
    VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT = 0x00000008,
} VkGraphicsPipelineLibraryFlagBitsEXT;

VkPipelineDynamicStateCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkPipelineDynamicStateCreateInfo {
    VkStructureType                      sType;
    const void*                          pNext;
    VkPipelineDynamicStateCreateFlags    flags;
    uint32_t                             dynamicStateCount;
    const VkDynamicState*                pDynamicStates;
} VkPipelineDynamicStateCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

  • dynamicStateCountpDynamicStates 数组中的元素数量。

  • pDynamicStates 是指向 VkDynamicState 值数组的指针,该数组指定哪些管线状态部分将使用动态状态命令中的值,而不是来自管线状态创建信息的值。

有效使用
  • VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442
    pDynamicStates 的每个元素必须是唯一的

有效用法(隐式)
  • VUID-VkPipelineDynamicStateCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO

  • VUID-VkPipelineDynamicStateCreateInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineDynamicStateCreateInfo-flags-zerobitmask
    flags 必须0

  • VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-parameter
    如果 dynamicStateCount 不为 0,则 pDynamicStates 必须是指向 dynamicStateCount 个有效 VkDynamicState 值的有效数组的有效指针

// Provided by VK_VERSION_1_0
typedef VkFlags VkPipelineDynamicStateCreateFlags;

VkPipelineDynamicStateCreateFlags 是一个位掩码类型,用于设置掩码,但目前保留供将来使用。

不同的动态状态部分的来源由当前活动的管线的 VkPipelineDynamicStateCreateInfo::pDynamicStates 属性指定,其每个元素必须是以下值之一

// Provided by VK_VERSION_1_0
typedef enum VkDynamicState {
    VK_DYNAMIC_STATE_VIEWPORT = 0,
    VK_DYNAMIC_STATE_SCISSOR = 1,
    VK_DYNAMIC_STATE_LINE_WIDTH = 2,
    VK_DYNAMIC_STATE_DEPTH_BIAS = 3,
    VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4,
    VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5,
    VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6,
    VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7,
    VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_CULL_MODE = 1000267000,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_FRONT_FACE = 1000267001,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY = 1000267002,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT = 1000267003,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT = 1000267004,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE = 1000267005,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE = 1000267006,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE = 1000267007,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_DEPTH_COMPARE_OP = 1000267008,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE = 1000267009,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE = 1000267010,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_STENCIL_OP = 1000267011,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE = 1000377001,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE = 1000377002,
  // Provided by VK_VERSION_1_3
    VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE = 1000377004,
  // Provided by VK_VERSION_1_4
    VK_DYNAMIC_STATE_LINE_STIPPLE = 1000259000,
  // Provided by VK_NV_clip_space_w_scaling
    VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV = 1000087000,
  // Provided by VK_EXT_discard_rectangles
    VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT = 1000099000,
  // Provided by VK_EXT_discard_rectangles
    VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT = 1000099001,
  // Provided by VK_EXT_discard_rectangles
    VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT = 1000099002,
  // Provided by VK_EXT_sample_locations
    VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT = 1000143000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR = 1000347000,
  // Provided by VK_NV_shading_rate_image
    VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV = 1000164004,
  // Provided by VK_NV_shading_rate_image
    VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV = 1000164006,
  // Provided by VK_NV_scissor_exclusive
    VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV = 1000205000,
  // Provided by VK_NV_scissor_exclusive
    VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV = 1000205001,
  // Provided by VK_KHR_fragment_shading_rate
    VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR = 1000226000,
  // Provided by VK_EXT_vertex_input_dynamic_state
    VK_DYNAMIC_STATE_VERTEX_INPUT_EXT = 1000352000,
  // Provided by VK_EXT_extended_dynamic_state2
    VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT = 1000377000,
  // Provided by VK_EXT_extended_dynamic_state2
    VK_DYNAMIC_STATE_LOGIC_OP_EXT = 1000377003,
  // Provided by VK_EXT_color_write_enable
    VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT = 1000381000,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT = 1000455003,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_POLYGON_MODE_EXT = 1000455004,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT = 1000455005,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_SAMPLE_MASK_EXT = 1000455006,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT = 1000455007,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT = 1000455008,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT = 1000455009,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT = 1000455010,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT = 1000455011,
  // Provided by VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT = 1000455012,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_KHR_maintenance2 or VK_VERSION_1_1
    VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT = 1000455002,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_EXT_transform_feedback
    VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT = 1000455013,
  // Provided by VK_EXT_conservative_rasterization with VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT = 1000455014,
  // Provided by VK_EXT_conservative_rasterization with VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT = 1000455015,
  // Provided by VK_EXT_depth_clip_enable with VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT = 1000455016,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_EXT_sample_locations
    VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT = 1000455017,
  // Provided by VK_EXT_blend_operation_advanced with VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT = 1000455018,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_EXT_provoking_vertex
    VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT = 1000455019,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_EXT_line_rasterization
    VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT = 1000455020,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_EXT_line_rasterization
    VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT = 1000455021,
  // Provided by VK_EXT_depth_clip_control with VK_EXT_extended_dynamic_state3
    VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT = 1000455022,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_clip_space_w_scaling
    VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV = 1000455023,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_viewport_swizzle
    VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV = 1000455024,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_fragment_coverage_to_color
    VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV = 1000455025,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_fragment_coverage_to_color
    VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV = 1000455026,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_framebuffer_mixed_samples
    VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV = 1000455027,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_framebuffer_mixed_samples
    VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV = 1000455028,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_framebuffer_mixed_samples
    VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV = 1000455029,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_shading_rate_image
    VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV = 1000455030,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_representative_fragment_test
    VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV = 1000455031,
  // Provided by VK_EXT_extended_dynamic_state3 with VK_NV_coverage_reduction_mode
    VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV = 1000455032,
  // Provided by VK_EXT_attachment_feedback_loop_dynamic_state
    VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT = 1000524000,
  // Provided by VK_EXT_depth_clamp_control
    VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT = 1000582000,
  // Provided by VK_EXT_line_rasterization
    VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = VK_DYNAMIC_STATE_LINE_STIPPLE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_CULL_MODE_EXT = VK_DYNAMIC_STATE_CULL_MODE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_FRONT_FACE_EXT = VK_DYNAMIC_STATE_FRONT_FACE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT = VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT = VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT = VK_DYNAMIC_STATE_DEPTH_COMPARE_OP,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT = VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE,
  // Provided by VK_EXT_extended_dynamic_state
    VK_DYNAMIC_STATE_STENCIL_OP_EXT = VK_DYNAMIC_STATE_STENCIL_OP,
  // Provided by VK_EXT_extended_dynamic_state2
    VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT = VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE,
  // Provided by VK_EXT_extended_dynamic_state2
    VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE,
  // Provided by VK_EXT_extended_dynamic_state2
    VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE,
  // Provided by VK_KHR_line_rasterization
    VK_DYNAMIC_STATE_LINE_STIPPLE_KHR = VK_DYNAMIC_STATE_LINE_STIPPLE,
} VkDynamicState;

图形管线阶段的有效组合

图元处理可以由顶点、细分和几何着色器阶段在每个图元的基础上处理,也可以使用任务和网格着色器阶段在每个网格的基础上处理。如果管线包含网格着色器阶段,则使用网格管线,否则使用图元管线。

如果省略任务着色器,则会跳过任务着色阶段。

如果省略细分着色器阶段,则会跳过管线的细分着色和固定功能阶段。

如果省略几何着色器,则会跳过几何着色阶段。

如果省略片元着色器,则片元颜色输出具有**未定义**的值,并且片元深度值由 片元操作 状态确定。这**可以**用于仅深度渲染。

管线中存在着色器阶段通过包含一个有效的 VkPipelineShaderStageCreateInfo 来指示,其中 modulepName 选择着色器模块中的入口点,并且该入口点对于 stage 指定的阶段有效。

管线中某些固定功能阶段的存在是隐式地从启用的着色器和提供的状态派生的。例如,当管线具有有效的细分控制和细分评估着色器时,固定功能细分器始终存在。

例如

图形管线着色器组

图形管线可以包含多个可以单独绑定的着色器组。每个着色器组的行为就像一个使用着色器组状态的管线。当通过常规方式绑定管线时,其行为就像组 0 的状态处于活动状态,使用 vkCmdBindPipelineShaderGroupNV 来绑定单个着色器组。

着色器组的主要目的是允许设备使用 设备生成命令 绑定不同的管线状态。

VkGraphicsPipelineShaderGroupsCreateInfoNV 结构定义如下:

// Provided by VK_NV_device_generated_commands
typedef struct VkGraphicsPipelineShaderGroupsCreateInfoNV {
    VkStructureType                             sType;
    const void*                                 pNext;
    uint32_t                                    groupCount;
    const VkGraphicsShaderGroupCreateInfoNV*    pGroups;
    uint32_t                                    pipelineCount;
    const VkPipeline*                           pPipelines;
} VkGraphicsPipelineShaderGroupsCreateInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • groupCountpGroups 数组中的元素数量。

  • pGroups 是指向 VkGraphicsShaderGroupCreateInfoNV 结构的数组的指针,该结构指定每个着色器组覆盖原始 VkGraphicsPipelineCreateInfo 的哪个状态。

  • pipelineCountpPipelines 数组中的元素数量。

  • pPipelines 是指向图形 VkPipeline 结构数组的指针,这些结构在创建的管线中被引用,包括它们的所有着色器组。

当通过索引引用着色器组时,在引用的管线中定义的组被视为好像它们被定义为 pGroups 中的附加条目。它们按照在 pPipelines 数组中出现的顺序以及在定义这些管线时在 pGroups 数组中出现的顺序附加。

应用程序**必须**基于使用它们的所有管线来维护所有此类被引用管线的生命周期。

有效使用
  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02879
    groupCount **必须**至少为 1,且最大值为 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02880
    groupCount 的总和(包括从引用的 pPipelines 添加的组)也**必须**小于等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02881
    pGroups 的第一个元素的状态**必须**与其父级的 VkGraphicsPipelineCreateInfo 中的等效状态匹配

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02882
    pGroups 的每个元素**必须**与管线状态的其余部分组合,产生有效的状态配置

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02884
    pGroups 的所有元素**必须**使用相同的着色器阶段组合,除非使用了任何网格着色器阶段,然后,任务和网格或仅网格着色器的组合有效

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02885
    网格和常规图元着色阶段不能在 pGroups 中混合使用

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886
    pPipelines 的每个元素**必须**使用与当前创建的管线相同的状态创建,除非该状态可以被 VkGraphicsShaderGroupCreateInfoNV 覆盖

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands 功能**必须**启用

有效用法(隐式)
  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-sType-sType
    sType **必须**为 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-parameter
    如果 groupCount 不为 0,则 pGroups **必须**是指向 groupCount 个有效 VkGraphicsShaderGroupCreateInfoNV 结构数组的有效指针

  • VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-parameter
    如果 pipelineCount 不为 0,则 pPipelines **必须**是指向 pipelineCount 个有效 VkPipeline 句柄数组的有效指针

VkGraphicsShaderGroupCreateInfoNV 结构为每个着色器组提供状态覆盖。每个着色器组的行为都类似于从其状态以及其余父状态创建的管线。它定义如下:

// Provided by VK_NV_device_generated_commands
typedef struct VkGraphicsShaderGroupCreateInfoNV {
    VkStructureType                                 sType;
    const void*                                     pNext;
    uint32_t                                        stageCount;
    const VkPipelineShaderStageCreateInfo*          pStages;
    const VkPipelineVertexInputStateCreateInfo*     pVertexInputState;
    const VkPipelineTessellationStateCreateInfo*    pTessellationState;
} VkGraphicsShaderGroupCreateInfoNV;
有效使用
  • VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-02888
    对于 stageCount,其限制与 VkGraphicsPipelineCreateInfo::stageCount 中的限制相同

  • VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-02889
    对于 pStages,其限制与 VkGraphicsPipelineCreateInfo::pStages 中的限制相同

  • VUID-VkGraphicsShaderGroupCreateInfoNV-pVertexInputState-02890
    对于 pVertexInputState,其限制与 VkGraphicsPipelineCreateInfo::pVertexInputState 中的限制相同

  • VUID-VkGraphicsShaderGroupCreateInfoNV-pTessellationState-02891
    对于 pTessellationState,其限制与 VkGraphicsPipelineCreateInfo::pTessellationState 中的限制相同

有效用法(隐式)
  • VUID-VkGraphicsShaderGroupCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV

  • VUID-VkGraphicsShaderGroupCreateInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-parameter
    pStages 必须 是指向 stageCount 个有效 VkPipelineShaderStageCreateInfo 结构体数组的有效指针

  • VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-arraylength
    stageCount 必须 大于 0

光线追踪管线

光线追踪管线由多个着色器阶段、固定功能遍历阶段以及管线布局组成。

VK_SHADER_UNUSED_KHR 是一个特殊的着色器索引,用于指示未使用光线生成、未命中或可调用着色器成员。

#define VK_SHADER_UNUSED_KHR              (~0U)

或等效的

#define VK_SHADER_UNUSED_NV               VK_SHADER_UNUSED_KHR

要创建光线追踪管线,请调用

// Provided by VK_NV_ray_tracing
VkResult vkCreateRayTracingPipelinesNV(
    VkDevice                                    device,
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkRayTracingPipelineCreateInfoNV*     pCreateInfos,
    const VkAllocationCallbacks*                pAllocator,
    VkPipeline*                                 pPipelines);
  • device 是创建光线追踪管线的逻辑设备。

  • pipelineCache 要么是 VK_NULL_HANDLE,表示禁用管线缓存,要么是有效的管线缓存对象的句柄,在这种情况下,在该命令执行期间启用该缓存的使用。

  • createInfoCountpCreateInfospPipelines 数组的长度。

  • pCreateInfos 是指向 VkRayTracingPipelineCreateInfoNV 结构体数组的指针。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

  • pPipelines 是指向将返回结果光线追踪管线对象的数组的指针。

管线的创建和返回方式如 多管线创建 所述。

有效使用
  • VUID-vkCreateRayTracingPipelinesNV-device-09677
    device 必须支持至少一个具有 VK_QUEUE_COMPUTE_BIT 功能的队列族

  • VUID-vkCreateRayTracingPipelinesNV-flags-03415
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且该元素的 basePipelineIndex 成员不是 -1,则 basePipelineIndex 必须小于 pCreateInfos 中对应于该元素的索引

  • VUID-vkCreateRayTracingPipelinesNV-flags-03416
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则基本管线必须已使用设置了 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 标志创建

  • VUID-vkCreateRayTracingPipelinesNV-flags-03816
    flags必须不包含VK_PIPELINE_CREATE_DISPATCH_BASE标志。

  • VUID-vkCreateRayTracingPipelinesNV-pipelineCache-02903
    如果 pipelineCache 是使用 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 创建的,则对 pipelineCache 的主机访问必须外部同步的

  • VUID-vkCreateRayTracingPipelinesNV-pNext-09616
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateRayTracingPipelinesNV-pNext-09617
    如果在 pCreateInfos 的任何元素的 pNext 链中包含设置了 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的 VkPipelineCreateFlags2CreateInfoKHR 结构,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateRayTracingPipelinesNV-binaryCount-09620
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateRayTracingPipelinesNV-binaryCount-09621
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateRayTracingPipelinesNV-binaryCount-09622
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT 必须不设置在该元素的 flags

  • VUID-vkCreateRayTracingPipelinesNV-pNext-10150
    如果在 pCreateInfos 的任何元素的 pNext 链中包含 VkPipelineCreateFlags2CreateInfoKHR 结构体,则 必须 未设置 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志

有效用法(隐式)
  • VUID-vkCreateRayTracingPipelinesNV-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parameter
    如果 pipelineCache 不是 VK_NULL_HANDLE,则 pipelineCache 必须是有效的 VkPipelineCache 句柄

  • VUID-vkCreateRayTracingPipelinesNV-pCreateInfos-parameter
    pCreateInfos 必须 是指向 createInfoCount 个有效 VkRayTracingPipelineCreateInfoNV 结构体的有效指针

  • VUID-vkCreateRayTracingPipelinesNV-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateRayTracingPipelinesNV-pPipelines-parameter
    pPipelines 必须是指向 createInfoCountVkPipeline 句柄的数组的有效指针

  • VUID-vkCreateRayTracingPipelinesNV-createInfoCount-arraylength
    createInfoCount 必须大于 0

  • VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parent
    如果 pipelineCache 是有效句柄,则它必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

  • VK_PIPELINE_COMPILE_REQUIRED_EXT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_SHADER_NV

要创建光线追踪管线,请调用

// Provided by VK_KHR_ray_tracing_pipeline
VkResult vkCreateRayTracingPipelinesKHR(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkRayTracingPipelineCreateInfoKHR*    pCreateInfos,
    const VkAllocationCallbacks*                pAllocator,
    VkPipeline*                                 pPipelines);
  • device 是创建光线追踪管线的逻辑设备。

  • deferredOperation 要么是 VK_NULL_HANDLE,要么是此命令的有效的 VkDeferredOperationKHR请求延迟对象的句柄。

  • pipelineCache 要么是 VK_NULL_HANDLE,表示禁用管线缓存,要么是有效的管线缓存对象的句柄,在这种情况下,在该命令执行期间启用该缓存的使用。

  • createInfoCountpCreateInfospPipelines 数组的长度。

  • pCreateInfos 是指向 VkRayTracingPipelineCreateInfoKHR 结构体数组的指针。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

  • pPipelines 是指向将返回结果光线追踪管线对象的数组的指针。

如果当 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplay 启用时,实现无法重用 VkRayTracingShaderGroupCreateInfoKHR::pShaderGroupCaptureReplayHandle 中提供的着色器组句柄,则会返回 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS 错误。

管线的创建和返回方式如 多管线创建 所述。

有效使用
  • VUID-vkCreateRayTracingPipelinesKHR-device-09677
    device 必须支持至少一个具有 VK_QUEUE_COMPUTE_BIT 功能的队列族

  • VUID-vkCreateRayTracingPipelinesKHR-flags-03415
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且该元素的 basePipelineIndex 成员不是 -1,则 basePipelineIndex 必须小于 pCreateInfos 中对应于该元素的索引

  • VUID-vkCreateRayTracingPipelinesKHR-flags-03416
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则基本管线必须已使用设置了 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 标志创建

  • VUID-vkCreateRayTracingPipelinesKHR-flags-03816
    flags必须不包含VK_PIPELINE_CREATE_DISPATCH_BASE标志。

  • VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-02903
    如果 pipelineCache 是使用 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 创建的,则对 pipelineCache 的主机访问必须外部同步的

  • VUID-vkCreateRayTracingPipelinesKHR-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作 必须 已完成

  • VUID-vkCreateRayTracingPipelinesKHR-pNext-09616
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateRayTracingPipelinesKHR-pNext-09617
    如果在 pCreateInfos 的任何元素的 pNext 链中包含设置了 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的 VkPipelineCreateFlags2CreateInfoKHR 结构,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateRayTracingPipelinesKHR-binaryCount-09620
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateRayTracingPipelinesKHR-binaryCount-09621
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT 必须不设置在该元素的 flags

  • VUID-vkCreateRayTracingPipelinesKHR-binaryCount-09622
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT 必须不设置在该元素的 flags

  • VUID-vkCreateRayTracingPipelinesKHR-rayTracingPipeline-03586
    rayTracingPipeline 功能必须启用

  • VUID-vkCreateRayTracingPipelinesKHR-deferredOperation-03587
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 pCreateInfos 元素的 flags 成员必须不包含 VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT

有效用法(隐式)
  • VUID-vkCreateRayTracingPipelinesKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateRayTracingPipelinesKHR-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation 必须是有效的 VkDeferredOperationKHR 句柄

  • VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parameter
    如果 pipelineCache 不是 VK_NULL_HANDLE,则 pipelineCache 必须是有效的 VkPipelineCache 句柄

  • VUID-vkCreateRayTracingPipelinesKHR-pCreateInfos-parameter
    pCreateInfos 必须是指向 createInfoCount 个有效 VkRayTracingPipelineCreateInfoKHR 结构体数组的有效指针

  • VUID-vkCreateRayTracingPipelinesKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateRayTracingPipelinesKHR-pPipelines-parameter
    pPipelines 必须是指向 createInfoCountVkPipeline 句柄的数组的有效指针

  • VUID-vkCreateRayTracingPipelinesKHR-createInfoCount-arraylength
    createInfoCount 必须大于 0

  • VUID-vkCreateRayTracingPipelinesKHR-deferredOperation-parent
    如果 deferredOperation 是有效的句柄,则它必须已从 device 创建、分配或检索

  • VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parent
    如果 pipelineCache 是有效句柄,则它必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

  • VK_PIPELINE_COMPILE_REQUIRED_EXT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS

VkRayTracingPipelineCreateInfoNV 结构的定义如下

// Provided by VK_NV_ray_tracing
typedef struct VkRayTracingPipelineCreateInfoNV {
    VkStructureType                               sType;
    const void*                                   pNext;
    VkPipelineCreateFlags                         flags;
    uint32_t                                      stageCount;
    const VkPipelineShaderStageCreateInfo*        pStages;
    uint32_t                                      groupCount;
    const VkRayTracingShaderGroupCreateInfoNV*    pGroups;
    uint32_t                                      maxRecursionDepth;
    VkPipelineLayout                              layout;
    VkPipeline                                    basePipelineHandle;
    int32_t                                       basePipelineIndex;
} VkRayTracingPipelineCreateInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。

  • stageCountpStages 数组中的条目数。

  • pStages 是指向 VkPipelineShaderStageCreateInfo 结构体数组的指针,该数组指定光线追踪管线中要包含的着色器阶段集。

  • groupCountpGroups 数组中的条目数。

  • pGroups 是指向 VkRayTracingShaderGroupCreateInfoNV 结构体数组的指针,该数组描述光线追踪管线中每个着色器组中要包含的着色器阶段集。

  • maxRecursionDepth 是此管线执行的着色器的最大递归深度

  • layout 是描述管线和与管线一起使用的描述符集的绑定位置。

  • basePipelineHandle 是一个要从中派生的管线。

  • basePipelineIndex 是一个索引,指向 pCreateInfos 参数中要用作派生管线的管线。

参数 basePipelineHandlebasePipelineIndex管线派生中进行了更详细的描述。

如果 pNext 链包含 VkPipelineCreateFlags2CreateInfo 结构,则使用该结构的 VkPipelineCreateFlags2CreateInfo::flags,而不是此结构中的 flags

有效使用
  • VUID-VkRayTracingPipelineCreateInfoNV-None-09497
    如果 pNext 链不包含 VkPipelineCreateFlags2CreateInfo 结构,则 flags 必须VkPipelineCreateFlagBits 值的有效组合

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-07984
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,且 basePipelineIndex 为 -1,则 basePipelineHandle 必须是有效的光线追踪 VkPipeline 句柄

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-07985
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineHandleVK_NULL_HANDLE,则 basePipelineIndex 必须是调用命令的 pCreateInfos 参数中的有效索引

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-07986
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则 basePipelineIndex 必须为 -1 或 basePipelineHandle 必须VK_NULL_HANDLE

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-07987
    如果在着色器中声明了推送常量块,则 layout 中的推送常量范围必须与着色器阶段匹配

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-10069
    如果在着色器中声明了推送常量块,则该块必须包含在 layout 中与该阶段匹配的推送常量范围内

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-07988
    如果在着色器中声明了资源变量,则 layout 中相应的描述符集必须与着色器阶段匹配

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-07990
    如果在着色器中声明了资源变量,并且描述符类型不是 VK_DESCRIPTOR_TYPE_MUTABLE_EXT,则 layout 中相应的描述符集必须与描述符类型匹配

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-07991
    如果在着色器中将资源变量声明为数组,则 layout 中相应的描述符集必须与描述符计数匹配

  • VUID-VkRayTracingPipelineCreateInfoNV-None-10391
    如果将 资源变量在着色器中声明为描述符数组,则该变量的描述符类型必须不是 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

  • VUID-VkRayTracingPipelineCreateInfoNV-pStages-03426
    pStages 标识的入口点的着色器代码,以及此结构标识的其余状态必须遵守着色器接口章节中描述的管线链接规则

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-03428
    layout 中可供管线使用的每个着色器阶段访问的资源数必须小于或等于 VkPhysicalDeviceLimits::maxPerStageResources

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-02904
    flags 必须不包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV

  • VUID-VkRayTracingPipelineCreateInfoNV-pipelineCreationCacheControl-02905
    如果 pipelineCreationCacheControl 特性未启用,则 flags 必须 不包含 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BITVK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT

  • VUID-VkRayTracingPipelineCreateInfoNV-stage-06232
    pStages 的至少一个元素的 stage 成员必须VK_SHADER_STAGE_RAYGEN_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03456
    flags 必须不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457
    maxRecursionDepth 必须小于或等于 VkPhysicalDeviceRayTracingPropertiesNV::maxRecursionDepth

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03458
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03459
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03460
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03461
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03462
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03463
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-03588
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-04948
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-02957
    flags 必须不同时包含 VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NVVK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT

  • VUID-VkRayTracingPipelineCreateInfoNV-pipelineStageCreationFeedbackCount-06651
    如果 VkPipelineCreationFeedbackCreateInfo::pipelineStageCreationFeedbackCount 不为 0,则它必须等于 stageCount

  • VUID-VkRayTracingPipelineCreateInfoNV-stage-06898
    所有 pStages 元素中的 stage必须VK_SHADER_STAGE_RAYGEN_BIT_KHRVK_SHADER_STAGE_ANY_HIT_BIT_KHRVK_SHADER_STAGE_CLOSEST_HIT_BIT_KHRVK_SHADER_STAGE_MISS_BIT_KHRVK_SHADER_STAGE_INTERSECTION_BIT_KHRVK_SHADER_STAGE_CALLABLE_BIT_KHR 之一

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-07402
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-07998
    flags 必须 不包含 VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV

  • VUID-VkRayTracingPipelineCreateInfoNV-flags-11008
    flags 必须不包含 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT

有效用法(隐式)
  • VUID-VkRayTracingPipelineCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV

  • VUID-VkRayTracingPipelineCreateInfoNV-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkPipelineCreateFlags2CreateInfoVkPipelineCreationFeedbackCreateInfo 的有效实例的指针

  • VUID-VkRayTracingPipelineCreateInfoNV-sType-unique
    pNext 链中每个结构的 sType必须 是唯一的。

  • VUID-VkRayTracingPipelineCreateInfoNV-pStages-parameter
    pStages 必须 是指向 stageCount 个有效 VkPipelineShaderStageCreateInfo 结构体数组的有效指针

  • VUID-VkRayTracingPipelineCreateInfoNV-pGroups-parameter
    pGroups 必须是指向 groupCount 个有效 VkRayTracingShaderGroupCreateInfoNV 结构的数组的有效指针

  • VUID-VkRayTracingPipelineCreateInfoNV-layout-parameter
    layout 必须 是有效的 VkPipelineLayout 句柄。

  • VUID-VkRayTracingPipelineCreateInfoNV-stageCount-arraylength
    stageCount 必须 大于 0

  • VUID-VkRayTracingPipelineCreateInfoNV-groupCount-arraylength
    groupCount 必须大于 0

  • VUID-VkRayTracingPipelineCreateInfoNV-commonparent
    basePipelineHandlelayout 这两个有效的、非忽略参数的句柄 必须 是从同一个 VkDevice 创建、分配或检索的。

VkRayTracingPipelineCreateInfoKHR 结构的定义如下

// Provided by VK_KHR_ray_tracing_pipeline
typedef struct VkRayTracingPipelineCreateInfoKHR {
    VkStructureType                                      sType;
    const void*                                          pNext;
    VkPipelineCreateFlags                                flags;
    uint32_t                                             stageCount;
    const VkPipelineShaderStageCreateInfo*               pStages;
    uint32_t                                             groupCount;
    const VkRayTracingShaderGroupCreateInfoKHR*          pGroups;
    uint32_t                                             maxPipelineRayRecursionDepth;
    const VkPipelineLibraryCreateInfoKHR*                pLibraryInfo;
    const VkRayTracingPipelineInterfaceCreateInfoKHR*    pLibraryInterface;
    const VkPipelineDynamicStateCreateInfo*              pDynamicState;
    VkPipelineLayout                                     layout;
    VkPipeline                                           basePipelineHandle;
    int32_t                                              basePipelineIndex;
} VkRayTracingPipelineCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。

  • stageCountpStages 数组中的条目数。

  • pStages 是指向 stageCountVkPipelineShaderStageCreateInfo 结构的数组的指针,这些结构描述了将包含在光线追踪管线中的着色器阶段的集合。

  • groupCountpGroups 数组中的条目数。

  • pGroups 是指向 groupCountVkRayTracingShaderGroupCreateInfoKHR 结构的数组的指针,这些结构描述了将包含在光线追踪管线中每个着色器组中的着色器阶段的集合。

  • maxPipelineRayRecursionDepth 是此管线执行的着色器的 最大递归深度

  • pLibraryInfo 是指向 VkPipelineLibraryCreateInfoKHR 结构的指针,该结构定义要包含的管线库。

  • pLibraryInterface 是指向 VkRayTracingPipelineInterfaceCreateInfoKHR 结构的指针,该结构定义使用管线库时的其他信息。

  • pDynamicState 是指向 VkPipelineDynamicStateCreateInfo 结构的指针,用于指示管线状态对象的哪些属性是动态的,并且可以独立于管线状态进行更改。 这可以NULL,这意味着管线中没有状态被视为动态的。

  • layout 是描述管线和与管线一起使用的描述符集的绑定位置。

  • basePipelineHandle 是一个要从中派生的管线。

  • basePipelineIndex 是一个索引,指向 pCreateInfos 参数中要用作派生管线的管线。

参数 basePipelineHandlebasePipelineIndex管线派生中进行了更详细的描述。

当指定 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 时,此管线定义了一个管线库,该库不能直接绑定为光线追踪管线。 相反,管线库定义了公共着色器和着色器组,这些着色器和着色器组可以包含在未来的管线创建中。

如果 pLibraryInfo 中包含管线库,则在这些库中定义的着色器将被视为在 pStages 中定义为附加条目,并按照它们在 pLibraries 数组中以及定义这些库时的 pStages 数组中的显示顺序追加。

当引用着色器组以获取着色器组句柄时,在这些库中定义的组将被视为在 pGroups 中定义为附加条目,并按照它们在 pLibraries 数组中以及定义这些库时的 pGroups 数组中的显示顺序追加。 这些组引用的着色器在创建管线库时设置,引用管线库中指定的着色器,而不是在包含它的管线中指定的着色器。

如果未提供 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR,则管线的默认堆栈大小将按照 光线追踪管线堆栈 中所述进行计算。

如果 pNext 链包含 VkPipelineCreateFlags2CreateInfo 结构,则使用该结构的 VkPipelineCreateFlags2CreateInfo::flags,而不是此结构中的 flags

有效使用
  • VUID-VkRayTracingPipelineCreateInfoKHR-None-09497
    如果 pNext 链不包含 VkPipelineCreateFlags2CreateInfo 结构,则 flags 必须VkPipelineCreateFlagBits 值的有效组合

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-07984
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,且 basePipelineIndex 为 -1,则 basePipelineHandle 必须是有效的光线追踪 VkPipeline 句柄

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-07985
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineHandleVK_NULL_HANDLE,则 basePipelineIndex 必须是调用命令的 pCreateInfos 参数中的有效索引

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-07986
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则 basePipelineIndex 必须为 -1 或 basePipelineHandle 必须VK_NULL_HANDLE

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-07987
    如果在着色器中声明了推送常量块,则 layout 中的推送常量范围必须与着色器阶段匹配

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-10069
    如果在着色器中声明了推送常量块,则该块必须包含在 layout 中与该阶段匹配的推送常量范围内

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-07988
    如果在着色器中声明了资源变量,则 layout 中相应的描述符集必须与着色器阶段匹配

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-07990
    如果在着色器中声明了资源变量,并且描述符类型不是 VK_DESCRIPTOR_TYPE_MUTABLE_EXT,则 layout 中相应的描述符集必须与描述符类型匹配

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-07991
    如果在着色器中将资源变量声明为数组,则 layout 中相应的描述符集必须与描述符计数匹配

  • VUID-VkRayTracingPipelineCreateInfoKHR-None-10391
    如果将 资源变量在着色器中声明为描述符数组,则该变量的描述符类型必须不是 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

  • VUID-VkRayTracingPipelineCreateInfoKHR-pStages-03426
    pStages 标识的入口点的着色器代码,以及此结构标识的其余状态必须遵守着色器接口章节中描述的管线链接规则

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-03428
    layout 中可供管线使用的每个着色器阶段访问的资源数必须小于或等于 VkPhysicalDeviceLimits::maxPerStageResources

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-02904
    flags 必须不包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV

  • VUID-VkRayTracingPipelineCreateInfoKHR-pipelineCreationCacheControl-02905
    如果 pipelineCreationCacheControl 特性未启用,则 flags 必须 不包含 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BITVK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT

  • VUID-VkRayTracingPipelineCreateInfoKHR-stage-03425
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,则 pStages 的至少一个元素(包括由 pLibraryInfo 隐式添加的元素)的 stage 成员必须VK_SHADER_STAGE_RAYGEN_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-maxPipelineRayRecursionDepth-03589
    maxPipelineRayRecursionDepth 必须 小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxRayRecursionDepth

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465
    如果 flags 包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,则 pLibraryInterface 必须 不能为 NULL

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03590
    如果 pLibraryInfo 不为 NULL 且其 libraryCount 成员大于 0,则 pLibraryInterface 必须 不能为 NULL

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03591
    pLibraryInfo->pLibraries 的每个元素必须使用与此管线中相同的 maxPipelineRayRecursionDepth 值创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03592
    如果 pLibraryInfo 不为 NULL,则其 pLibraries 成员的每个元素必须使用与此管线中的 layout 兼容的 layout 创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03593
    如果 pLibraryInfo 不为 NULL,则其 pLibraries 成员的每个元素必须使用与此管线中相同的 pLibraryInterfacemaxPipelineRayPayloadSizemaxPipelineRayHitAttributeSize 成员值创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-03594
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-04718
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-04719
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-04720
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-04721
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-04722
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-04723
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR,则 pLibraryInfo->pLibraries 的每个元素必须已设置 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR 位创建

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03595
    如果未启用 VK_KHR_pipeline_library 扩展,则 pLibraryInfopLibraryInterface 必须NULL

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,则对于 pGroupstypeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHRVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR 的任何元素,该元素的 anyHitShader 必须不能为 VK_SHADER_UNUSED_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,则对于 pGroupstypeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHRVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR 的任何元素,该元素的 closestHitShader 必须不能为 VK_SHADER_UNUSED_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-rayTraversalPrimitiveCulling-03596
    如果未启用 rayTraversalPrimitiveCulling 功能,则 flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-rayTraversalPrimitiveCulling-03597
    如果未启用 rayTraversalPrimitiveCulling 功能,则 flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-06546
    flags 必须不能同时包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHRVK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-03598
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,则必须启用 rayTracingPipelineShaderGroupHandleCaptureReplay

  • VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplay-03599
    如果 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplayVK_TRUEpGroups 的任何元素的 pShaderGroupCaptureReplayHandle 成员不为 NULL,则 flags 必须包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-07999
    如果 pLibraryInfoNULL 或其 libraryCount0,则 stageCount 必须不能为 0

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-08700
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHRpLibraryInfoNULL 或其 libraryCount0,则 groupCount 必须不能为 0

  • VUID-VkRayTracingPipelineCreateInfoKHR-pDynamicStates-03602
    pDynamicState 成员的 pDynamicStates 的任何元素必须VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-pipelineStageCreationFeedbackCount-06652
    如果 VkPipelineCreationFeedbackCreateInfo::pipelineStageCreationFeedbackCount 不为 0,则它必须等于 stageCount

  • VUID-VkRayTracingPipelineCreateInfoKHR-stage-06899
    所有 pStages 元素中的 stage必须VK_SHADER_STAGE_RAYGEN_BIT_KHRVK_SHADER_STAGE_ANY_HIT_BIT_KHRVK_SHADER_STAGE_CLOSEST_HIT_BIT_KHRVK_SHADER_STAGE_MISS_BIT_KHRVK_SHADER_STAGE_INTERSECTION_BIT_KHRVK_SHADER_STAGE_CALLABLE_BIT_KHR 之一

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-07403
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT,则 pLibraryInfo->pLibraries 的每个元素必须已使用设置了 VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT 位创建。

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-08701
    如果 flags 包含 VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV,则 pLibraryInfo->pLibraries 的每个元素必须已使用设置了 VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV 位创建。

  • VUID-VkRayTracingPipelineCreateInfoKHR-flags-10392
    flags 必须不能同时包含 VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXTVK_PIPELINE_CREATE_2_DISALLOW_OPACITY_MICROMAP_BIT_ARM

有效用法(隐式)
  • VUID-VkRayTracingPipelineCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR

  • VUID-VkRayTracingPipelineCreateInfoKHR-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkPipelineBinaryInfoKHRVkPipelineCreateFlags2CreateInfoVkPipelineCreationFeedbackCreateInfoVkPipelineRobustnessCreateInfo 有效实例的指针。

  • VUID-VkRayTracingPipelineCreateInfoKHR-sType-unique
    pNext 链中每个结构的 sType必须 是唯一的。

  • VUID-VkRayTracingPipelineCreateInfoKHR-pStages-parameter
    如果 stageCount 不为 0,则 pStages 必须是指向 stageCount 个有效 VkPipelineShaderStageCreateInfo 结构体的数组的有效指针。

  • VUID-VkRayTracingPipelineCreateInfoKHR-pGroups-parameter
    如果 groupCount 不为 0,则 pGroups 必须是指向 groupCount 个有效 VkRayTracingShaderGroupCreateInfoKHR 结构体的数组的有效指针。

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-parameter
    如果 pLibraryInfo 不为 NULL,则 pLibraryInfo 必须是指向有效 VkPipelineLibraryCreateInfoKHR 结构体的有效指针。

  • VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInterface-parameter
    如果 pLibraryInterface 不为 NULL,则 pLibraryInterface 必须是指向有效 VkRayTracingPipelineInterfaceCreateInfoKHR 结构体的有效指针。

  • VUID-VkRayTracingPipelineCreateInfoKHR-pDynamicState-parameter
    如果 pDynamicState 不是 NULL,则 pDynamicState 必须 是指向有效 VkPipelineDynamicStateCreateInfo 结构的有效指针

  • VUID-VkRayTracingPipelineCreateInfoKHR-layout-parameter
    layout 必须 是有效的 VkPipelineLayout 句柄。

  • VUID-VkRayTracingPipelineCreateInfoKHR-commonparent
    basePipelineHandlelayout 这两个有效的、非忽略参数的句柄 必须 是从同一个 VkDevice 创建、分配或检索的。

VkRayTracingShaderGroupCreateInfoNV 结构定义如下:

// Provided by VK_NV_ray_tracing
typedef struct VkRayTracingShaderGroupCreateInfoNV {
    VkStructureType                   sType;
    const void*                       pNext;
    VkRayTracingShaderGroupTypeKHR    type;
    uint32_t                          generalShader;
    uint32_t                          closestHitShader;
    uint32_t                          anyHitShader;
    uint32_t                          intersectionShader;
} VkRayTracingShaderGroupCreateInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • type 是此结构中指定的命中组类型。

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV,则 generalShader 是组中来自 VkRayTracingPipelineCreateInfoNV::pStages 的射线生成、未命中或可调用着色器的索引,否则为 VK_SHADER_UNUSED_NV

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NVVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV,则 closestHitShader 是组中来自 VkRayTracingPipelineCreateInfoNV::pStages 的最近命中着色器的可选索引,否则为 VK_SHADER_UNUSED_NV

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NVVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV,则 anyHitShader 是组中来自 VkRayTracingPipelineCreateInfoNV::pStages 的任意命中着色器的可选索引,否则为 VK_SHADER_UNUSED_NV

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV,则 intersectionShader 是组中来自 VkRayTracingPipelineCreateInfoNV::pStages 的相交着色器的索引,否则为 VK_SHADER_UNUSED_NV

有效使用
  • VUID-VkRayTracingShaderGroupCreateInfoNV-type-02413
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV,则 generalShader 必须VkRayTracingPipelineCreateInfoNV::pStages 中的有效索引,引用类型为 VK_SHADER_STAGE_RAYGEN_BIT_NVVK_SHADER_STAGE_MISS_BIT_NVVK_SHADER_STAGE_CALLABLE_BIT_NV 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoNV-type-02414
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV,则 closestHitShaderanyHitShaderintersectionShader 必须VK_SHADER_UNUSED_NV

  • VUID-VkRayTracingShaderGroupCreateInfoNV-type-02415
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV,则 intersectionShader 必须VkRayTracingPipelineCreateInfoNV::pStages 中的有效索引,引用类型为 VK_SHADER_STAGE_INTERSECTION_BIT_NV 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoNV-type-02416
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV,则 intersectionShader 必须VK_SHADER_UNUSED_NV

  • VUID-VkRayTracingShaderGroupCreateInfoNV-closestHitShader-02417
    closestHitShader 必须VK_SHADER_UNUSED_NV,或者是 VkRayTracingPipelineCreateInfoNV::pStages 的有效索引,指向一个类型为 VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoNV-anyHitShader-02418
    anyHitShader 必须VK_SHADER_UNUSED_NV,或者是 VkRayTracingPipelineCreateInfoNV::pStages 的有效索引,指向一个类型为 VK_SHADER_STAGE_ANY_HIT_BIT_NV 的着色器。

有效用法(隐式)
  • VUID-VkRayTracingShaderGroupCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV

  • VUID-VkRayTracingShaderGroupCreateInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkRayTracingShaderGroupCreateInfoNV-type-parameter
    type 必须是有效的 VkRayTracingShaderGroupTypeKHR 值。

VkRayTracingShaderGroupCreateInfoKHR 结构体的定义如下:

// Provided by VK_KHR_ray_tracing_pipeline
typedef struct VkRayTracingShaderGroupCreateInfoKHR {
    VkStructureType                   sType;
    const void*                       pNext;
    VkRayTracingShaderGroupTypeKHR    type;
    uint32_t                          generalShader;
    uint32_t                          closestHitShader;
    uint32_t                          anyHitShader;
    uint32_t                          intersectionShader;
    const void*                       pShaderGroupCaptureReplayHandle;
} VkRayTracingShaderGroupCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • type 是此结构中指定的命中组类型。

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR,则 generalShader 是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages 的光线生成、未命中或可调用着色器的索引;否则为 VK_SHADER_UNUSED_KHR

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHRVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR,则 closestHitShader 是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages 的最近命中着色器的可选索引;否则为 VK_SHADER_UNUSED_KHR

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHRVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR,则 anyHitShader 是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages 的任意命中着色器的可选索引;否则为 VK_SHADER_UNUSED_KHR

  • 如果着色器组的 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR,则 intersectionShader 是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages 的相交着色器的索引;否则为 VK_SHADER_UNUSED_KHR

  • pShaderGroupCaptureReplayHandleNULL,或者是指向此着色器组的重放信息的指针,该信息从 vkGetRayTracingCaptureReplayShaderGroupHandlesKHR 查询获得,如 光线追踪捕获重放 中所述。 如果 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplayVK_FALSE,则忽略此项。

如果管道创建时使用了 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 并且启用了 pipelineLibraryGroupHandles 特性,则 pShaderGroupCaptureReplayHandle 会被所有链接到此管道的管道继承,并且对于任何引用此管道库的管道,保持按位相同。

有效使用
  • VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03474
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR,则 generalShader 必须VkRayTracingPipelineCreateInfoKHR::pStages 的有效索引,指向一个类型为 VK_SHADER_STAGE_RAYGEN_BIT_KHRVK_SHADER_STAGE_MISS_BIT_KHRVK_SHADER_STAGE_CALLABLE_BIT_KHR 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03475
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR,则 closestHitShaderanyHitShaderintersectionShader 必须VK_SHADER_UNUSED_KHR

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03476
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR,则 intersectionShader 必须VkRayTracingPipelineCreateInfoKHR::pStages 的有效索引,指向一个类型为 VK_SHADER_STAGE_INTERSECTION_BIT_KHR 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03477
    如果 typeVK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,则 intersectionShader 必须VK_SHADER_UNUSED_KHR

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-closestHitShader-03478
    closestHitShader 必须VK_SHADER_UNUSED_KHR,或者是 VkRayTracingPipelineCreateInfoKHR::pStages 的有效索引,指向一个类型为 VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-anyHitShader-03479
    anyHitShader 必须VK_SHADER_UNUSED_KHR,或者是 VkRayTracingPipelineCreateInfoKHR::pStages 的有效索引,指向一个类型为 VK_SHADER_STAGE_ANY_HIT_BIT_KHR 的着色器。

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03603
    如果 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplayMixedVK_FALSE,则如果之前在光线追踪管道创建时未提供 pShaderGroupCaptureReplayHandle,则必须不提供该参数。

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03604
    如果 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplayMixedVK_FALSE,则调用者必须保证,在提供 pShaderGroupCaptureReplayHandle 的光线追踪管道创建命令与未提供 pShaderGroupCaptureReplayHandle 的光线追踪管道创建命令不会同时执行。

有效用法(隐式)
  • VUID-VkRayTracingShaderGroupCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkRayTracingShaderGroupCreateInfoKHR-type-parameter
    type 必须是有效的 VkRayTracingShaderGroupTypeKHR 值。

VkRayTracingShaderGroupTypeKHR 枚举的定义如下:

// Provided by VK_KHR_ray_tracing_pipeline
typedef enum VkRayTracingShaderGroupTypeKHR {
    VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR = 0,
    VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR = 1,
    VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR = 2,
  // Provided by VK_NV_ray_tracing
    VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR,
  // Provided by VK_NV_ray_tracing
    VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,
  // Provided by VK_NV_ray_tracing
    VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR,
} VkRayTracingShaderGroupTypeKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkRayTracingShaderGroupTypeKHR VkRayTracingShaderGroupTypeNV;
  • VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR 指定一个着色器组,其中包含单个 VK_SHADER_STAGE_RAYGEN_BIT_KHRVK_SHADER_STAGE_MISS_BIT_KHRVK_SHADER_STAGE_CALLABLE_BIT_KHR 着色器。

  • VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR 指定一个仅命中三角形的着色器组,并且必须不包含相交着色器,只包含最近命中和任意命中着色器。

  • VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR 指定一个仅与自定义几何体相交的着色器组,并且必须包含相交着色器,并且可以包含最近命中和任意命中着色器。

对于当前组类型,命中组类型可以通过是否存在相交着色器来推断,但是为了未来不具备此属性的命中组,我们显式地提供了类型。

VkRayTracingPipelineInterfaceCreateInfoKHR 结构定义如下:

// Provided by VK_KHR_ray_tracing_pipeline
typedef struct VkRayTracingPipelineInterfaceCreateInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           maxPipelineRayPayloadSize;
    uint32_t           maxPipelineRayHitAttributeSize;
} VkRayTracingPipelineInterfaceCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxPipelineRayPayloadSize 是管道中任何着色器使用的最大负载大小(以字节为单位)。

  • maxPipelineRayHitAttributeSize 是管道中任何着色器使用的最大属性结构大小(以字节为单位)。

maxPipelineRayPayloadSize 的计算方式是 RayPayloadKHRIncomingRayPayloadKHR 存储类中声明的块的最大大小(以字节为单位)。maxPipelineRayHitAttributeSize 的计算方式是 HitAttributeKHR 存储类中声明的任何块的最大大小(以字节为单位)。由于这些存储类中的变量没有显式的偏移量,因此大小的计算方式应假定每个变量都具有一个 标量对齐,该对齐等于该块的任何成员的最大标量对齐。

maxPipelineRayPayloadSize 没有显式的上限,但在实践中应尽可能保持小。与调用局部内存类似,它必须为每个着色器调用分配,并且对于支持许多同时调用的设备,此存储会迅速耗尽,从而导致失败。

有效使用
有效用法(隐式)
  • VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR

  • VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-pNext-pNext
    pNext 必须NULL

要查询光线追踪管道中着色器的不透明句柄,请调用

// Provided by VK_KHR_ray_tracing_pipeline
VkResult vkGetRayTracingShaderGroupHandlesKHR(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    uint32_t                                    firstGroup,
    uint32_t                                    groupCount,
    size_t                                      dataSize,
    void*                                       pData);

或等效命令

// Provided by VK_NV_ray_tracing
VkResult vkGetRayTracingShaderGroupHandlesNV(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    uint32_t                                    firstGroup,
    uint32_t                                    groupCount,
    size_t                                      dataSize,
    void*                                       pData);
  • device 是包含光线追踪管道的逻辑设备。

  • pipeline 是包含着色器的光线追踪管道对象。

  • firstGroup 是要从 VkRayTracingPipelineCreateInfoKHR::pGroupsVkRayTracingPipelineCreateInfoNV::pGroups 数组中检索句柄的第一个组的索引。

  • groupCount 是要检索的着色器句柄的数量。

  • dataSizepData 指向的缓冲区的大小(以字节为单位)。

  • pData 是指向应用程序分配的缓冲区的指针,结果将写入该缓冲区。

成功后,一个包含 groupCount 个着色器句柄的数组将被写入 pData,每个元素的大小为 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleSize

如果 pipeline 是使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建的,并且启用了 pipelineLibraryGroupHandles 功能,则应用程序可以从该管道中查询组句柄,即使该管道是一个库并且从未绑定到命令缓冲区。 对于任何引用管道库的 pipeline,这些组句柄的位值保持相同。组索引的分配方式与没有 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建管道的方式相同。

有效使用
  • VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-04619
    pipeline 必须 是一个光线追踪管道

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-04050
    firstGroup 必须 小于 pipeline 中的着色器组的数量

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419
    firstGroupgroupCount 的总和 必须 小于或等于 pipeline 中的着色器组的数量

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420
    dataSize 必须 至少为 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleSize × groupCount

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-07828
    如果未启用 pipelineLibraryGroupHandles 功能,则 pipeline 必须 未使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建

有效用法(隐式)
  • VUID-vkGetRayTracingShaderGroupHandlesKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-pData-parameter
    pData 必须 是指向 dataSize 字节数组的有效指针

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-arraylength
    dataSize 必须 大于 0

  • VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parent
    pipeline 必须 是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要查询光线追踪管道中着色器组的不透明捕获数据,请调用

// Provided by VK_KHR_ray_tracing_pipeline
VkResult vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    uint32_t                                    firstGroup,
    uint32_t                                    groupCount,
    size_t                                      dataSize,
    void*                                       pData);
  • device 是包含光线追踪管道的逻辑设备。

  • pipeline 是包含着色器的光线追踪管道对象。

  • firstGroup 是要从 VkRayTracingPipelineCreateInfoKHR::pGroups 数组中检索句柄的第一个组的索引。

  • groupCount 是要检索的着色器句柄的数量。

  • dataSizepData 指向的缓冲区的大小(以字节为单位)。

  • pData 是指向应用程序分配的缓冲区的指针,结果将写入该缓冲区。

成功后,一个包含 groupCount 个着色器句柄的数组将被写入 pData,每个元素的大小为 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleCaptureReplaySize

查询后,此不透明数据可以在管道创建时(在后续执行中)使用 VkRayTracingShaderGroupCreateInfoKHR::pShaderGroupCaptureReplayHandle 提供,如 光线追踪捕获/重放 中所述。

如果 pipeline 是使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建的,并且启用了pipelineLibraryGroupHandles 功能,则应用程序可以从该管线查询捕获重放组句柄。对于任何引用管线库的 pipeline,捕获重放句柄在按位上保持相同。组索引的分配方式与没有 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建管线时的方式相同。

有效使用
  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-04620
    pipeline 必须 是一个光线追踪管道

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051
    firstGroup 必须 小于 pipeline 中的着色器组的数量

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483
    firstGroupgroupCount 的总和 必须 小于或等于 pipeline 中的着色器组的数量

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484
    dataSize 必须至少为 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleCaptureReplaySize × groupCount

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingPipelineShaderGroupHandleCaptureReplay-03606
    必须启用 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplay 才能调用此函数

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-03607
    pipeline 必须是用包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHRflags 创建的

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-07829
    如果未启用 pipelineLibraryGroupHandles 功能,则 pipeline 必须 未使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建

有效用法(隐式)
  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pData-parameter
    pData 必须 是指向 dataSize 字节数组的有效指针

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-arraylength
    dataSize 必须 大于 0

  • VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parent
    pipeline 必须 是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

光线追踪管线可以包含比图形或计算管线更多的着色器,因此为了允许在管线内并行编译着色器,应用程序可以选择将编译推迟到稍后的时间点。

要编译管线中的延迟着色器,请调用

// Provided by VK_NV_ray_tracing
VkResult vkCompileDeferredNV(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    uint32_t                                    shader);
  • device 是包含光线追踪管道的逻辑设备。

  • pipeline 是包含着色器的光线追踪管道对象。

  • shader 是要编译的着色器的索引。

有效使用
  • VUID-vkCompileDeferredNV-pipeline-04621
    pipeline 必须 是一个光线追踪管道

  • VUID-vkCompileDeferredNV-pipeline-02237
    pipeline 必须是用 VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV 创建的

  • VUID-vkCompileDeferredNV-shader-02238
    shader 必须之前没有被作为延迟编译调用过

有效用法(隐式)
  • VUID-vkCompileDeferredNV-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCompileDeferredNV-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkCompileDeferredNV-pipeline-parent
    pipeline 必须 是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要查询光线追踪管线中着色器组中着色器的管线堆栈大小,请调用

// Provided by VK_KHR_ray_tracing_pipeline
VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    uint32_t                                    group,
    VkShaderGroupShaderKHR                      groupShader);
  • device 是包含光线追踪管道的逻辑设备。

  • pipeline 是包含着色器组的光线追踪管线对象。

  • group 是要查询的着色器组的索引。

  • groupShader 是要查询的组中的着色器类型。

返回值是指定着色器从指定着色器组调用时的光线追踪管线堆栈大小(以字节为单位)。

有效使用
  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-pipeline-04622
    pipeline 必须 是一个光线追踪管道

  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-group-03608
    group 的值必须小于 pipeline 中的着色器组的数量

  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-groupShader-03609
    group 中由 groupShader 标识的着色器必须不是 VK_SHADER_UNUSED_KHR

有效用法(隐式)
  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-groupShader-parameter
    groupShader 必须是有效的 VkShaderGroupShaderKHR

  • VUID-vkGetRayTracingShaderGroupStackSizeKHR-pipeline-parent
    pipeline 必须 是从 device 创建、分配或检索的

vkGetRayTracingShaderGroupStackSizeKHRgroupShader 的可能值为

// Provided by VK_KHR_ray_tracing_pipeline
typedef enum VkShaderGroupShaderKHR {
    VK_SHADER_GROUP_SHADER_GENERAL_KHR = 0,
    VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR = 1,
    VK_SHADER_GROUP_SHADER_ANY_HIT_KHR = 2,
    VK_SHADER_GROUP_SHADER_INTERSECTION_KHR = 3,
} VkShaderGroupShaderKHR;

动态设置光线追踪管线的堆栈大小,请调用

// Provided by VK_KHR_ray_tracing_pipeline
void vkCmdSetRayTracingPipelineStackSizeKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    pipelineStackSize);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pipelineStackSize 是用于后续光线追踪跟踪命令的堆栈大小。

当光线追踪管线在 VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置了 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR 时创建时,此命令设置后续光线追踪命令的堆栈大小。否则,堆栈大小将按照光线追踪管线堆栈中所述计算。

有效使用
  • VUID-vkCmdSetRayTracingPipelineStackSizeKHR-pipelineStackSize-03610
    pipelineStackSize 必须足够大,以满足后续跟踪调用使用的光线追踪管线中着色器的任何动态执行

有效用法(隐式)
  • VUID-vkCmdSetRayTracingPipelineStackSizeKHR-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdSetRayTracingPipelineStackSizeKHR-commandBuffer-recording
    commandBuffer 必须 处于 记录状态

  • VUID-vkCmdSetRayTracingPipelineStackSizeKHR-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool 必须支持计算操作

  • VUID-vkCmdSetRayTracingPipelineStackSizeKHR-renderpass
    此命令 必须 仅在渲染通道实例之外调用。

  • VUID-vkCmdSetRayTracingPipelineStackSizeKHR-videocoding
    此命令 必须 仅在视频编码范围之外调用。

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

状态

管线销毁

要销毁管线,请调用

// Provided by VK_VERSION_1_0
void vkDestroyPipeline(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁管线的逻辑设备。

  • pipeline 是要销毁的管线的句柄。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

有效使用
  • VUID-vkDestroyPipeline-pipeline-00765
    所有引用 pipeline 的已提交命令 必须 已完成执行

  • VUID-vkDestroyPipeline-pipeline-00766
    如果创建 pipeline 时提供了 VkAllocationCallbacks,则此处 必须 提供一组兼容的回调

  • VUID-vkDestroyPipeline-pipeline-00767
    如果创建 pipeline 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyPipeline-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroyPipeline-pipeline-parameter
    如果 pipeline 不是 VK_NULL_HANDLE,则 pipeline 必须 是一个有效的 VkPipeline 句柄

  • VUID-vkDestroyPipeline-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyPipeline-pipeline-parent
    如果 pipeline 是一个有效的句柄,则它 必须 是从 device 创建、分配或检索的

主机同步
  • pipeline 的主机访问 必须 进行外部同步

管线派生

管线派生是从父管线创建的子管线,其中子管线和父管线预计具有很多共同点。

派生管线的目的是使用父管线作为起点,从而更便宜地创建它们,并且在同一父管线的子管线之间切换/绑定更高效(在主机或设备上)。

通过在 Vk*PipelineCreateInfo 结构中设置 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志来创建派生管线。如果设置了此标志,则结构的 basePipelineHandlebasePipelineIndex 成员 必须 有且仅有一个具有有效的句柄/索引,并指定父管线。如果使用 basePipelineHandle,则 必须 已创建父管线。如果使用 basePipelineIndex,则父管线正在同一命令中创建。VK_NULL_HANDLE 用作 basePipelineHandle 的无效句柄,而 -1 是 basePipelineIndex 的无效索引。如果使用 basePipelineIndex,则基本管线 必须 出现在数组的较早位置。基本管线 必须 使用设置的 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 标志创建。

管线缓存

管线缓存对象允许在管线之间以及应用程序的运行之间重用管线构造的结果。通过在创建多个相关管线时传递相同的管线缓存对象来实现管线之间的重用。通过在应用程序的一次运行中检索管线缓存内容、保存内容并在后续运行中使用它们来预初始化管线缓存来实现应用程序运行之间的重用。管线缓存对象的内容由实现管理。应用程序 可以 管理管线缓存对象消耗的主机内存,并控制从管线缓存对象检索的数据量。

管线缓存对象由 VkPipelineCache 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache)

创建管线缓存

要创建管线缓存对象,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreatePipelineCache(
    VkDevice                                    device,
    const VkPipelineCacheCreateInfo*            pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkPipelineCache*                            pPipelineCache);
  • device 是创建管线缓存对象的逻辑设备。

  • pCreateInfo 是指向 VkPipelineCacheCreateInfo 结构的指针,该结构包含管线缓存对象的初始参数。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

  • pPipelineCache 是指向 VkPipelineCache 句柄的指针,其中返回生成的管线缓存对象。

应用程序 可以 使用 pAllocator 跟踪和管理管线缓存对象的总主机内存大小。应用程序 可以 限制在 vkGetPipelineCacheData 中从管线缓存对象检索的数据量。实现 应该 在内部不限制添加到管线缓存对象的总条目数或消耗的总主机内存。

创建后,可以将管线缓存传递给 vkCreateGraphicsPipelines vkCreateRayTracingPipelinesKHRvkCreateRayTracingPipelinesNVvkCreateComputePipelines 命令。如果传递到这些命令中的管线缓存不是 VK_NULL_HANDLE,则实现将查询它以查找可能的重用机会并使用新内容对其进行更新。在这些命令中对管线缓存对象的使用在内部同步,并且可以在多个线程中同时使用同一管线缓存对象。

如果 pCreateInfoflags 包括 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT,则修改返回的管线缓存对象的所有命令 必须 进行外部同步

实现 应该 尽一切努力将所有临界区限制为实际访问缓存,这预计比 vkCreate*Pipelines 命令的持续时间短得多。

有效用法(隐式)
  • VUID-vkCreatePipelineCache-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreatePipelineCache-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效 VkPipelineCacheCreateInfo 结构的有效指针

  • VUID-vkCreatePipelineCache-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreatePipelineCache-pPipelineCache-parameter
    pPipelineCache 必须 是指向 VkPipelineCache 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkPipelineCacheCreateInfo 结构的定义如下

// Provided by VK_VERSION_1_0
typedef struct VkPipelineCacheCreateInfo {
    VkStructureType               sType;
    const void*                   pNext;
    VkPipelineCacheCreateFlags    flags;
    size_t                        initialDataSize;
    const void*                   pInitialData;
} VkPipelineCacheCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkPipelineCacheCreateFlagBits 的位掩码,指定管线缓存的行为。

  • initialDataSizepInitialData 中的字节数。如果 initialDataSize 为零,则管线缓存最初将为空。

  • pInitialData 是指向先前检索的管线缓存数据的指针。如果管线缓存数据与设备不兼容(如下定义),则管线缓存最初将为空。如果 initialDataSize 为零,则忽略 pInitialData

有效使用
  • VUID-VkPipelineCacheCreateInfo-initialDataSize-00768
    如果 initialDataSize 不为 0,则它 必须 等于 pInitialData 的大小,如 vkGetPipelineCacheData 在最初检索 pInitialData 时返回的大小

  • VUID-VkPipelineCacheCreateInfo-initialDataSize-00769
    如果 initialDataSize 不为 0,则 pInitialData 必须是从先前调用 vkGetPipelineCacheData 获取的。

  • VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892
    如果 pipelineCreationCacheControl 功能未启用,则 flags 必须不包含 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT

  • VUID-VkPipelineCacheCreateInfo-maintenance8-10200
    如果 maintenance8 功能未启用,则 flags 必须不包含 VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR

  • VUID-VkPipelineCacheCreateInfo-flags-10201
    如果 flags 包含 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT,则它必须不包含 VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR

有效用法(隐式)
  • VUID-VkPipelineCacheCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO

  • VUID-VkPipelineCacheCreateInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineCacheCreateInfo-flags-parameter
    flags 必须VkPipelineCacheCreateFlagBits 值的有效组合。

  • VUID-VkPipelineCacheCreateInfo-pInitialData-parameter
    如果 initialDataSize 不为 0,则 pInitialData 必须是指向大小为 initialDataSize 字节的数组的有效指针。

// Provided by VK_VERSION_1_0
typedef VkFlags VkPipelineCacheCreateFlags;

VkPipelineCacheCreateFlags 是一种位掩码类型,用于设置零个或多个 VkPipelineCacheCreateFlagBits 的掩码。

可以在 VkPipelineCacheCreateInfo::flags 中设置的位,用于指定管线缓存的行为,包括:

// Provided by VK_EXT_pipeline_creation_cache_control
typedef enum VkPipelineCacheCreateFlagBits {
  // Provided by VK_VERSION_1_3
    VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT = 0x00000001,
  // Provided by VK_KHR_maintenance8
    VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR = 0x00000008,
  // Provided by VK_EXT_pipeline_creation_cache_control
    VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT,
} VkPipelineCacheCreateFlagBits;
  • VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 指定所有修改创建的 VkPipelineCache 的命令都将 外部同步。设置此标志后,实现可能会跳过支持在允许的情况下从多个线程同时修改所需的任何不必要的处理。

  • VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR 指定当创建的 VkPipelineCache 用作 vkMergePipelineCachesdstCache 参数时,它不需要 外部同步。此标志与 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 互斥。

合并管线缓存

可以使用以下命令合并管线缓存对象:

// Provided by VK_VERSION_1_0
VkResult vkMergePipelineCaches(
    VkDevice                                    device,
    VkPipelineCache                             dstCache,
    uint32_t                                    srcCacheCount,
    const VkPipelineCache*                      pSrcCaches);
  • device 是拥有管线缓存对象的逻辑设备。

  • dstCache 是要将结果合并到的管线缓存的句柄。

  • srcCacheCountpSrcCaches 数组的长度。

  • pSrcCaches 是指向管线缓存句柄数组的指针,这些句柄将合并到 dstCache 中。合并后会包含 dstCache 的先前内容。

合并操作的详细信息取决于实现,但实现应该合并指定管线的内容并删除重复条目。

有效使用
  • VUID-vkMergePipelineCaches-dstCache-00770
    dstCache 必须不出现在源缓存列表中。

  • VUID-vkMergePipelineCaches-dstCache-10202
    如果 dstCache 不是使用 VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR 创建的,则对 dstCache 的主机访问必须是外部同步的。

有效用法(隐式)
  • VUID-vkMergePipelineCaches-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkMergePipelineCaches-dstCache-parameter
    dstCache 必须是有效的 VkPipelineCache 句柄。

  • VUID-vkMergePipelineCaches-pSrcCaches-parameter
    pSrcCaches 必须是指向 srcCacheCount 个有效的 VkPipelineCache 句柄的数组的有效指针。

  • VUID-vkMergePipelineCaches-srcCacheCount-arraylength
    srcCacheCount 必须大于 0

  • VUID-vkMergePipelineCaches-dstCache-parent
    dstCache 必须已从 device 创建、分配或检索。

  • VUID-vkMergePipelineCaches-pSrcCaches-parent
    pSrcCaches 的每个元素必须已从 device 创建、分配或检索。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

检索管线缓存数据

可以使用以下命令从管线缓存对象检索数据:

// Provided by VK_VERSION_1_0
VkResult vkGetPipelineCacheData(
    VkDevice                                    device,
    VkPipelineCache                             pipelineCache,
    size_t*                                     pDataSize,
    void*                                       pData);
  • device 是拥有管线缓存的逻辑设备。

  • pipelineCache 是要从中检索数据的管线缓存。

  • pDataSize 是指向与管线缓存中数据量相关的 size_t 值的指针,如下所述。

  • pDataNULL 或指向缓冲区的指针。

如果 pDataNULL,则将以字节为单位返回可以从管线缓存中检索的最大数据大小,并在 pDataSize 中返回。否则,pDataSize 必须指向应用程序设置为缓冲区大小(以字节为单位)的变量,该缓冲区由 pData 指向,并且在返回时,变量将被实际写入 pData 的数据量覆盖。如果 pDataSize 小于管线缓存可以检索的最大大小,则最多会将 pDataSize 字节写入 pData,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以表明并非所有管线缓存都已返回。

写入 pData 的任何数据都是有效的,并且可以作为传递给 vkCreatePipelineCacheVkPipelineCacheCreateInfo 结构的 pInitialData 成员提供。

除非在两次调用之间调用了修改缓存内容的命令,否则使用相同参数对 vkGetPipelineCacheData 的两次调用必须检索相同的数据。

写入 pData 的初始字节必须管线缓存头 部分中描述的标头。

如果 pDataSize 小于存储此标头所需的大小,则不会将任何内容写入 pData,并将 0 写入 pDataSize

有效用法(隐式)
  • VUID-vkGetPipelineCacheData-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineCacheData-pipelineCache-parameter
    pipelineCache 必须是有效的 VkPipelineCache 句柄。

  • VUID-vkGetPipelineCacheData-pDataSize-parameter
    pDataSize 必须是指向 size_t 值的有效指针。

  • VUID-vkGetPipelineCacheData-pData-parameter
    如果 pDataSize 引用的值不为 0,并且 pData 不为 NULL,则 pData 必须是指向大小为 pDataSize 字节的数组的有效指针。

  • VUID-vkGetPipelineCacheData-pipelineCache-parent
    pipelineCache 必须已创建、分配或从 device 中检索。

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

管线缓存头

应用程序可以存储从管线缓存检索的数据,并在应用程序的未来运行中使用这些数据来填充新的管线缓存对象。然而,管线编译的结果可能取决于供应商 ID、设备 ID、驱动程序版本和设备的其它详细信息。为了使应用程序能够检测先前检索的数据何时与设备不兼容,管线缓存数据必须以有效的管线缓存头开始。

本节中描述的结构不是 Vulkan API 的一部分,仅用于描述管线缓存数据中数据元素的表示形式。因此,本节中定义的结构的有效用法条款不定义将管线缓存数据作为输入的 API 的有效使用条件,因为向任何 Vulkan API 命令提供无效的管线缓存数据都将导致提供的管线缓存数据被忽略。

管线缓存头的版本一定义如下

// Provided by VK_VERSION_1_0
typedef struct VkPipelineCacheHeaderVersionOne {
    uint32_t                        headerSize;
    VkPipelineCacheHeaderVersion    headerVersion;
    uint32_t                        vendorID;
    uint32_t                        deviceID;
    uint8_t                         pipelineCacheUUID[VK_UUID_SIZE];
} VkPipelineCacheHeaderVersionOne;
  • headerSize 是管线缓存头的长度(以字节为单位)。

  • headerVersion 是一个 VkPipelineCacheHeaderVersion 值,指定头的版本。管线缓存的消费者应该使用缓存版本来解释缓存头的其余部分。

  • vendorID 是实现的 VkPhysicalDeviceProperties::vendorID

  • deviceID 是实现的 VkPhysicalDeviceProperties::deviceID

  • pipelineCacheUUID 是实现的 VkPhysicalDeviceProperties::pipelineCacheUUID

与 Vulkan API 声明的大多数结构不同,此结构的所有字段都以最低有效字节优先的方式写入,而不管主机字节顺序如何。

C 语言规范没有定义结构成员的打包方式。此布局假设结构成员紧密打包,成员按照结构中列出的顺序排列,并且结构的预期大小为 32 字节。如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法在正确的偏移量处设置值。

有效使用
  • VUID-VkPipelineCacheHeaderVersionOne-headerSize-04967
    headerSize 必须为 32

  • VUID-VkPipelineCacheHeaderVersionOne-headerVersion-04968
    headerVersion 必须VK_PIPELINE_CACHE_HEADER_VERSION_ONE

  • VUID-VkPipelineCacheHeaderVersionOne-headerSize-08990
    headerSize 必须不超过管线缓存的大小

有效用法(隐式)

管线缓存头的 headerVersion 值的可能值如下

// Provided by VK_VERSION_1_0
typedef enum VkPipelineCacheHeaderVersion {
    VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1,
} VkPipelineCacheHeaderVersion;

销毁管线缓存

要销毁管线缓存,请调用

// Provided by VK_VERSION_1_0
void vkDestroyPipelineCache(
    VkDevice                                    device,
    VkPipelineCache                             pipelineCache,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁管线缓存对象的逻辑设备。

  • pipelineCache 是要销毁的管线缓存的句柄。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

有效使用
  • VUID-vkDestroyPipelineCache-pipelineCache-00771
    如果在创建 pipelineCache 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyPipelineCache-pipelineCache-00772
    如果在创建 pipelineCache 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyPipelineCache-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroyPipelineCache-pipelineCache-parameter
    如果 pipelineCache 不是 VK_NULL_HANDLE,则 pipelineCache 必须是有效的 VkPipelineCache 句柄

  • VUID-vkDestroyPipelineCache-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyPipelineCache-pipelineCache-parent
    如果 pipelineCache 是有效句柄,则它必须是从 device 创建、分配或检索的

主机同步
  • pipelineCache 的主机访问必须进行外部同步

管线二进制文件

管线二进制对象允许在管线之间以及应用程序的运行之间重用管线构造的结果。通过从 VkPipeline 对象中提取管线二进制文件,将其与相应的 VkPipelineBinaryKeyKHR 关联,然后在创建管线时将 VkPipelineBinaryInfoKHR 添加到任何 Vk*PipelineCreateInfopNext 链中来实现重用。通过从 VkPipelineBinaryKHR 对象中提取 VkPipelineBinaryDataKHR,保存内容,然后在后续运行时使用它们来创建 VkPipelineBinaryKHR 对象,可以在运行之间重用管线二进制文件。

当创建包含 pNext 链中的 VkPipelineBinaryInfoKHR 或设置了 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的管线时,不允许使用 VkPipelineCache 对象。

管线二进制对象由 VkPipelineBinaryKHR 句柄表示

// Provided by VK_KHR_pipeline_binary
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineBinaryKHR)

生成管线密钥

要为特定的管线创建信息生成密钥,请调用

// Provided by VK_KHR_pipeline_binary
VkResult vkGetPipelineKeyKHR(
    VkDevice                                    device,
    const VkPipelineCreateInfoKHR*              pPipelineCreateInfo,
    VkPipelineBinaryKeyKHR*                     pPipelineKey);

如果 pPipelineCreateInfoNULL,则实现必须返回适用于所有管线的全局密钥。如果以这种方式获得的密钥在保存和还原从不同的 VkDevice 中的 vkGetPipelineBinaryDataKHR 获得的数据之间发生变化,则应用程序必须假定还原的数据无效,并且不能传递给 vkCreatePipelineBinariesKHR。否则,应用程序可以假定数据仍然有效。

如果 pPipelineCreateInfo 不为 NULL,则获取的密钥用作比较两个管线创建信息结构的方法。实现可能不会比较管线创建信息的不会影响最终二进制输出的部分。如果使用着色器模块标识符而不是着色器模块,则生成的 pPipelineKey 必须等于从其中查询标识符的着色器模块生成密钥时生成的密钥。如果两个 pPipelineKey 的内容相等,则使用两个 pPipelineCreateInfo->pname:pNext 创建信息创建的管线必须生成相同的 VkPipelineBinaryKHR 内容。

管线键与管线二进制键不同。管线二进制键只能在编译后获得。管线键旨在可选地允许将管线创建信息与多个管线二进制键关联。

有效使用
  • VUID-vkGetPipelineKeyKHR-pNext-09605
    pPipelineCreateInfopNext必须不将 VkPipelineBinaryInfoKHR::binaryCount 设置为大于 0 的值

有效用法(隐式)
  • VUID-vkGetPipelineKeyKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineKeyKHR-pPipelineCreateInfo-parameter
    如果 pPipelineCreateInfo 不是 NULL,则 pPipelineCreateInfo 必须是指向有效 VkPipelineCreateInfoKHR 结构的有效指针

  • VUID-vkGetPipelineKeyKHR-pPipelineKey-parameter
    pPipelineKey 必须是指向 VkPipelineBinaryKeyKHR 结构的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkPipelineCreateInfoKHR 结构定义为

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineCreateInfoKHR {
    VkStructureType    sType;
    void*              pNext;
} VkPipelineCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNext 是指向扩展此结构的结构的指针。

有效使用
有效用法(隐式)
  • VUID-VkPipelineCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_CREATE_INFO_KHR

VkPipelineBinaryKeyKHR 结构定义为

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryKeyKHR {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           keySize;
    uint8_t            key[VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR];
} VkPipelineBinaryKeyKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • keySizekey 中返回的有效数据的大小(以字节为单位)。

  • key 是一个指定管线二进制键的不透明数据缓冲区。

超出前 keySize 字节的任何返回值都是未定义的。实现必须返回一个大于 0 且小于等于 VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHRkeySize

如果 keySize 相等且 key 的前 keySize 字节比较相等,则认为两个键相等。

对于不同的二进制文件,实现可能返回不同的 keySize

实现应该确保 keySize 足够大,以唯一标识一个管线二进制文件。

有效用法(隐式)
  • VUID-VkPipelineBinaryKeyKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_BINARY_KEY_KHR

  • VUID-VkPipelineBinaryKeyKHR-pNext-pNext
    pNext 必须NULL

VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR 是二进制键的长度(以字节为单位),如 VkPipelineBinaryKeyKHR::keySize 中返回。

#define VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR 32U

创建管线二进制文件

要创建管线二进制对象,请调用

// Provided by VK_KHR_pipeline_binary
VkResult vkCreatePipelineBinariesKHR(
    VkDevice                                    device,
    const VkPipelineBinaryCreateInfoKHR*        pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkPipelineBinaryHandlesInfoKHR*             pBinaries);
  • device 是创建管线二进制对象的逻辑设备。

  • pCreateInfo 是指向 VkPipelineBinaryCreateInfoKHR 结构的指针,该结构包含用于创建管线二进制文件的数据。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

  • pBinaries 是指向 VkPipelineBinaryHandlesInfoKHR 结构的指针,其中返回生成的管线二进制文件。

实现将尝试创建所有管线二进制文件。如果任何管线二进制文件的创建失败,则

有效用法(隐式)
  • VUID-vkCreatePipelineBinariesKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreatePipelineBinariesKHR-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkPipelineBinaryCreateInfoKHR 结构的有效指针

  • VUID-vkCreatePipelineBinariesKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreatePipelineBinariesKHR-pBinaries-parameter
    pBinaries 必须是指向 VkPipelineBinaryHandlesInfoKHR 结构的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

  • VK_PIPELINE_BINARY_MISSING_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

VkPipelineBinaryHandlesInfoKHR 结构定义为

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryHandlesInfoKHR {
    VkStructureType         sType;
    const void*             pNext;
    uint32_t                pipelineBinaryCount;
    VkPipelineBinaryKHR*    pPipelineBinaries;
} VkPipelineBinaryHandlesInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pipelineBinaryCount 是与此管线关联的二进制文件数,或 pPipelineBinaries 数组中的条目数。

  • pPipelineBinariesNULL 或指向 VkPipelineBinaryKHR 句柄数组的指针,其中返回生成的管线二进制文件。

如果 pPipelineBinariesNULL,则将在 pipelineBinaryCount 中返回将要创建的二进制文件数。否则,pipelineBinaryCount 必须pPipelineBinaries 数组中的条目数,并且从 vkCreatePipelineBinariesKHR 返回时,pipelineBinaryCount 将被实际写入 pPipelineBinaries 的句柄数覆盖。如果 pipelineBinaryCount 的值小于将要创建的二进制文件数,则最多将 pipelineBinaryCount 个句柄写入 pPipelineBinaries,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示 pPipelineBinaries 不足以创建所有二进制文件。

有效用法(隐式)
  • VUID-VkPipelineBinaryHandlesInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_BINARY_HANDLES_INFO_KHR

  • VUID-VkPipelineBinaryHandlesInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineBinaryHandlesInfoKHR-pPipelineBinaries-parameter
    如果 pipelineBinaryCount 不为 0,且 pPipelineBinaries 不为 NULL,则 pPipelineBinaries 必须是指向 pipelineBinaryCountVkPipelineBinaryKHR 句柄数组的有效指针

VkPipelineBinaryCreateInfoKHR 结构定义为

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryCreateInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    const VkPipelineBinaryKeysAndDataKHR*    pKeysAndDataInfo;
    VkPipeline                               pipeline;
    const VkPipelineCreateInfoKHR*           pPipelineCreateInfo;
} VkPipelineBinaryCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pKeysAndDataInfoNULL 或指向 VkPipelineBinaryKeysAndDataKHR 结构的指针,该结构包含用于创建管线二进制文件的键和数据。

  • pipelineVK_NULL_HANDLE 或包含用于创建管线二进制文件的数据的 VkPipeline

  • pPipelineCreateInfoNULL 或指向包含管线创建信息的 VkPipelineCreateInfoKHR 结构的指针。这用于探测实现的内部缓存中是否存在管线二进制文件。

pPipelineCreateInfo 不为 NULL 时,如果 pipelineBinaryInternalCacheVK_TRUE,则实现将尝试从应用程序外部的内部缓存检索管线二进制数据。应用程序可以使用此来确定是否可以在不编译的情况下创建管线。如果实现由于缺少内部缓存条目而无法创建管线二进制文件,则返回 VK_PIPELINE_BINARY_MISSING_KHR。如果创建成功,则可以使用生成的二进制文件创建管线。在这种情况下,即使之前使用相同参数成功创建了管线二进制文件,也可能出于任何原因返回 VK_PIPELINE_BINARY_MISSING_KHR

如果 pipelineBinaryPrecompiledInternalCacheVK_TRUE,则即使应用程序之前未使用 pPipelineCreateInfo 创建过管线二进制文件,实现可能也能够创建管线二进制文件。

在某些平台上,内部管线缓存可能会在应用程序运行之前预先填充。

有效使用
  • VUID-VkPipelineBinaryCreateInfoKHR-pipeline-09607
    如果 pipeline 不是 VK_NULL_HANDLE,则 pipeline 必须使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 创建。

  • VUID-VkPipelineBinaryCreateInfoKHR-pipeline-09608
    如果 pipeline 不是 VK_NULL_HANDLE,则在此命令之前,必须没有对 pipeline 调用过 vkReleaseCapturedPipelineDataKHR

  • VUID-VkPipelineBinaryCreateInfoKHR-pipelineBinaryInternalCache-09609
    如果 pipelineBinaryInternalCacheVK_FALSE,则 pPipelineCreateInfo 必须NULL

  • VUID-VkPipelineBinaryCreateInfoKHR-device-09610
    如果 device 是使用 VkDevicePipelineBinaryInternalCacheControlKHR::disableInternalCache 设置为 VK_TRUE 创建的,则 pPipelineCreateInfo 必须NULL

  • VUID-VkPipelineBinaryCreateInfoKHR-pKeysAndDataInfo-09619
    pKeysAndDataInfopipelinepPipelineCreateInfo必须只有一个是非 NULL 的。

  • VUID-VkPipelineBinaryCreateInfoKHR-pPipelineCreateInfo-09606
    如果 pPipelineCreateInfo 不是 NULL,则 pPipelineCreateInfopNext必须不将 VkPipelineBinaryInfoKHR::binaryCount 设置为大于 0 的值。

有效用法(隐式)
  • VUID-VkPipelineBinaryCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_BINARY_CREATE_INFO_KHR

  • VUID-VkPipelineBinaryCreateInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineBinaryCreateInfoKHR-pKeysAndDataInfo-parameter
    如果 pKeysAndDataInfo 不是 NULL,则 pKeysAndDataInfo 必须是指向有效 VkPipelineBinaryKeysAndDataKHR 结构的有效指针。

  • VUID-VkPipelineBinaryCreateInfoKHR-pipeline-parameter
    如果 pipeline 不是 VK_NULL_HANDLE,则 pipeline 必须 是一个有效的 VkPipeline 句柄

  • VUID-VkPipelineBinaryCreateInfoKHR-pPipelineCreateInfo-parameter
    如果 pPipelineCreateInfo 不是 NULL,则 pPipelineCreateInfo 必须是指向有效 VkPipelineCreateInfoKHR 结构的有效指针

VkPipelineBinaryKeysAndDataKHR 结构的定义如下:

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryKeysAndDataKHR {
    uint32_t                          binaryCount;
    const VkPipelineBinaryKeyKHR*     pPipelineBinaryKeys;
    const VkPipelineBinaryDataKHR*    pPipelineBinaryData;
} VkPipelineBinaryKeysAndDataKHR;
  • binaryCountpPipelineBinaryKeyspPipelineBinaryData 数组的大小。

  • pPipelineBinaryKeys 是指向包含管线二进制键的 VkPipelineBinaryKeyKHR 结构数组的指针。

  • pPipelineBinaryData 是指向包含管线二进制数据的 VkPipelineBinaryDataKHR 结构数组的指针。

有效用法(隐式)
  • VUID-VkPipelineBinaryKeysAndDataKHR-pPipelineBinaryKeys-parameter
    pPipelineBinaryKeys 必须是指向包含 binaryCount 个有效 VkPipelineBinaryKeyKHR 结构数组的有效指针。

  • VUID-VkPipelineBinaryKeysAndDataKHR-pPipelineBinaryData-parameter
    pPipelineBinaryData 必须是指向包含 binaryCount 个有效 VkPipelineBinaryDataKHR 结构数组的有效指针。

  • VUID-VkPipelineBinaryKeysAndDataKHR-binaryCount-arraylength
    binaryCount 必须大于 0

VkPipelineBinaryDataKHR 结构的定义如下:

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryDataKHR {
    size_t    dataSize;
    void*     pData;
} VkPipelineBinaryDataKHR;
  • dataSizepData 缓冲区的大小(以字节为单位)。

  • pData 是指向包含从 vkGetPipelineBinaryDataKHR 获取的管线二进制数据的 size 字节缓冲区的指针。

有效用法(隐式)
  • VUID-VkPipelineBinaryDataKHR-pData-parameter
    pData 必须 是指向 dataSize 字节数组的有效指针

  • VUID-VkPipelineBinaryDataKHR-dataSize-arraylength
    dataSize 必须 大于 0

检索管线二进制数据

可以使用以下命令从管线二进制对象检索数据:

// Provided by VK_KHR_pipeline_binary
VkResult vkGetPipelineBinaryDataKHR(
    VkDevice                                    device,
    const VkPipelineBinaryDataInfoKHR*          pInfo,
    VkPipelineBinaryKeyKHR*                     pPipelineBinaryKey,
    size_t*                                     pPipelineBinaryDataSize,
    void*                                       pPipelineBinaryData);
  • device 是创建管线二进制文件的逻辑设备。

  • pInfo 是指向 VkPipelineBinaryDataInfoKHR 结构的指针,该结构描述要从中获取数据的管线二进制文件。

  • pPipelineBinaryKey 是指向 VkPipelineBinaryKeyKHR 结构的指针,该结构的键将写入此二进制文件。

  • pPipelineBinaryDataSize 是指向与管线二进制数据量相关的 size_t 值的指针,如下所述。

  • pPipelineBinaryData 可以是 NULL 或指向缓冲区的指针。

如果 pPipelineBinaryDataNULL,则存储二进制文件所需的数据大小(以字节为单位)将返回到 pPipelineBinaryDataSize 中。否则,pPipelineBinaryDataSize 必须包含 pPipelineBinaryData 指向的缓冲区的大小(以字节为单位),并且在返回时,pPipelineBinaryDataSize 将被覆盖为存储二进制文件所需的数据大小(以字节为单位)。如果 pPipelineBinaryDataSize 小于存储二进制文件所需的大小,则不会写入任何内容到 pPipelineBinaryData,并且将返回 VK_ERROR_NOT_ENOUGH_SPACE_KHR,而不是 VK_SUCCESS

如果调用返回其中一个成功返回代码,则无论 pPipelineBinaryData 是否为 NULL,都会将管线二进制键写入 pPipelineBinaryKey

如果 pipelineBinaryCompressedDataVK_FALSE,则实现不向应用程序返回压缩的管线二进制数据。

有效用法(隐式)
  • VUID-vkGetPipelineBinaryDataKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineBinaryDataKHR-pInfo-parameter
    pInfo 必须是指向有效 VkPipelineBinaryDataInfoKHR 结构的有效指针。

  • VUID-vkGetPipelineBinaryDataKHR-pPipelineBinaryKey-parameter
    pPipelineBinaryKey 必须是指向 VkPipelineBinaryKeyKHR 结构的有效指针。

  • VUID-vkGetPipelineBinaryDataKHR-pPipelineBinaryDataSize-parameter
    pPipelineBinaryDataSize 必须是一个指向 size_t 值的有效指针

  • VUID-vkGetPipelineBinaryDataKHR-pPipelineBinaryData-parameter
    如果 pPipelineBinaryDataSize 引用的值不为 0,并且 pPipelineBinaryData 不为 NULL,则 pPipelineBinaryData 必须是一个指向 pPipelineBinaryDataSize 字节数组的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_NOT_ENOUGH_SPACE_KHR

VkPipelineBinaryDataInfoKHR 结构体的定义如下

// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryDataInfoKHR {
    VkStructureType        sType;
    void*                  pNext;
    VkPipelineBinaryKHR    pipelineBinary;
} VkPipelineBinaryDataInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pipelineBinary 是从中获取数据的管线二进制。

有效用法(隐式)
  • VUID-VkPipelineBinaryDataInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_BINARY_DATA_INFO_KHR

  • VUID-VkPipelineBinaryDataInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineBinaryDataInfoKHR-pipelineBinary-parameter
    pipelineBinary 必须是一个有效的 VkPipelineBinaryKHR 句柄

释放捕获的管线二进制数据

要释放使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 捕获的管线资源,请调用

// Provided by VK_KHR_pipeline_binary
VkResult vkReleaseCapturedPipelineDataKHR(
    VkDevice                                    device,
    const VkReleaseCapturedPipelineDataInfoKHR* pInfo,
    const VkAllocationCallbacks*                pAllocator);
  • device 是创建管线对象的逻辑设备。

  • pInfo 是一个指向 VkReleaseCapturedPipelineDataInfoKHR 结构的指针,该结构描述要从中释放数据的管线。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

实现可以释放因使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 创建管线而捕获的任何资源,并将管线置于仿佛在管线创建时未提供 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 的状态。

使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 创建管线而捕获的任何资源都由 vkDestroyPipeline 隐式释放。

有效使用
  • VUID-vkReleaseCapturedPipelineDataKHR-pipeline-09611
    如果在创建 pipeline 时提供了 VkAllocationCallbacks,则必须pAllocator 中提供一组兼容的回调

  • VUID-vkReleaseCapturedPipelineDataKHR-pipeline-09612
    如果在创建 pipeline 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkReleaseCapturedPipelineDataKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkReleaseCapturedPipelineDataKHR-pInfo-parameter
    pInfo 必须是一个指向有效 VkReleaseCapturedPipelineDataInfoKHR 结构的有效指针

  • VUID-vkReleaseCapturedPipelineDataKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

主机同步
  • pInfo->pipeline 的主机访问必须进行外部同步

返回代码
成功
  • VK_SUCCESS

失败

VkReleaseCapturedPipelineDataInfoKHR 结构体的定义如下

// Provided by VK_KHR_pipeline_binary
typedef struct VkReleaseCapturedPipelineDataInfoKHR {
    VkStructureType    sType;
    void*              pNext;
    VkPipeline         pipeline;
} VkReleaseCapturedPipelineDataInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pipeline 是要从中释放数据的管线对象的句柄。

有效使用
  • VUID-VkReleaseCapturedPipelineDataInfoKHR-pipeline-09613
    pipeline 必须是使用 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 创建的

  • VUID-VkReleaseCapturedPipelineDataInfoKHR-pipeline-09618
    pipeline 必须没有在之前对 vkReleaseCapturedPipelineDataKHR 的调用中使用过

有效用法(隐式)
  • VUID-VkReleaseCapturedPipelineDataInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RELEASE_CAPTURED_PIPELINE_DATA_INFO_KHR

  • VUID-VkReleaseCapturedPipelineDataInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkReleaseCapturedPipelineDataInfoKHR-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

销毁管线二进制

要销毁一个 VkPipelineBinaryKHR,请调用

// Provided by VK_KHR_pipeline_binary
void vkDestroyPipelineBinaryKHR(
    VkDevice                                    device,
    VkPipelineBinaryKHR                         pipelineBinary,
    const VkAllocationCallbacks*                pAllocator);
  • device 是创建管线二进制对象的逻辑设备。

  • pipelineBinary 是要销毁的管线二进制对象的句柄。

  • pAllocator 控制主机内存分配,如 内存分配 章节所述。

有效使用
  • VUID-vkDestroyPipelineBinaryKHR-pipelineBinary-09614
    如果在创建 pipelineBinary 时提供了 VkAllocationCallbacks,则这里必须提供一组兼容的回调

  • VUID-vkDestroyPipelineBinaryKHR-pipelineBinary-09615
    如果在创建 pipelineBinary 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyPipelineBinaryKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroyPipelineBinaryKHR-pipelineBinary-parameter
    如果 pipelineBinary 不是 VK_NULL_HANDLE,则 pipelineBinary 必须是一个有效的 VkPipelineBinaryKHR 句柄

  • VUID-vkDestroyPipelineBinaryKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyPipelineBinaryKHR-pipelineBinary-parent
    如果 pipelineBinary 是一个有效的句柄,则它必须是从 device 创建、分配或检索的

主机同步
  • pipelineBinary 的主机访问必须进行外部同步

特化常量

特化常量是一种机制,通过这种机制,SPIR-V 模块中的常量可以在创建 VkPipeline 时指定其常量值。这允许 SPIR-V 模块具有可以在执行使用 Vulkan API 的应用程序时修改的常量。

例如,特化常量可用于允许计算着色器在运行时由用户更改其本地工作组大小。

每个 VkPipelineShaderStageCreateInfo 结构都包含一个 pSpecializationInfo 成员,该成员可以NULL 以指示没有特化常量,或者指向一个 VkSpecializationInfo 结构。

VkSpecializationInfo 结构体的定义如下

// Provided by VK_VERSION_1_0
typedef struct VkSpecializationInfo {
    uint32_t                           mapEntryCount;
    const VkSpecializationMapEntry*    pMapEntries;
    size_t                             dataSize;
    const void*                        pData;
} VkSpecializationInfo;
  • mapEntryCountpMapEntries 数组中的条目数。

  • pMapEntries 是一个指向 VkSpecializationMapEntry 结构数组的指针,该数组将常量 ID 映射到 pData 中的偏移量。

  • dataSizepData 缓冲区的字节大小。

  • pData 包含要特化的实际常量值。

有效使用
  • VUID-VkSpecializationInfo-offset-00773
    pMapEntries 的每个元素的 offset 成员必须小于 dataSize

  • VUID-VkSpecializationInfo-pMapEntries-00774
    pMapEntries 的每个元素的 size 成员必须小于或等于 dataSize 减去 offset

  • VUID-VkSpecializationInfo-constantID-04911
    pMapEntries 的每个元素的 constantID 值在 pMapEntries必须是唯一的。

有效用法(隐式)
  • VUID-VkSpecializationInfo-pMapEntries-parameter
    如果 mapEntryCount 不为 0,则 pMapEntries 必须是指向 mapEntryCount 个有效 VkSpecializationMapEntry 结构体数组的有效指针。

  • VUID-VkSpecializationInfo-pData-parameter
    如果 dataSize 不为 0,则 pData 必须是指向 dataSize 个字节数组的有效指针。

VkSpecializationMapEntry 结构体的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkSpecializationMapEntry {
    uint32_t    constantID;
    uint32_t    offset;
    size_t      size;
} VkSpecializationMapEntry;
  • constantID 是 SPIR-V 中特化常量的 ID。

  • offset 是特化常量值在所提供的数据缓冲区内的字节偏移量。

  • size 是特化常量值在所提供的数据缓冲区内的字节大小。

如果 constantID 值不是着色器中使用的特化常量 ID,则该映射条目不会影响管线的行为。

有效使用
  • VUID-VkSpecializationMapEntry-constantID-00776
    对于在着色器中声明的 constantID 特化常量,size 必须constantID 的字节大小匹配。如果特化常量类型为 boolean,则 size 必须VkBool32 的字节大小。

在人类可读的 SPIR-V 中

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

从上面我们可以看到三个特化常量,分别对应 WorkgroupSize 向量的 x、y 和 z 元素。

现在,要通过特化常量机制来特化上述内容

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,
};

然后,当调用 vkCreateComputePipelines,并将我们定义的 VkSpecializationInfo 作为 VkPipelineShaderStageCreateInfopSpecializationInfo 参数传递时,我们将创建一个运行时指定本地工作组大小的计算管线。

另一个例子是,应用程序有一个 SPIR-V 模块,其中包含一些他们希望使用的平台相关的常量。

在人类可读的 SPIR-V 中

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

从上面我们可以看到两个特化常量,一个是 32 位有符号整数,第二个是 32 位浮点数值。

现在,要通过特化常量机制来特化上述内容

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,
};

允许将带有特化的 SPIR-V 模块编译到未提供特化信息的管线中。SPIR-V 特化常量包含默认值,因此如果未提供特化,则将使用默认值。在上面的示例中,应用程序仅特化 SPIR-V 模块中的某些特化常量,而让其他常量使用在 OpSpecConstant 声明中编码的默认值是有效的。

管线库

管线库是一种特殊的管线,使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建,不能绑定,而是定义一组可以链接到其他管线的管线状态。对于光线追踪管线,这包括着色器和着色器组。对于图形管线,这包括 VkGraphicsPipelineLibraryFlagBitsEXT 定义的不同库类型。应用程序必须基于与它链接的管线维护管线库的生命周期。

通过在适当的创建机制中使用以下结构来实现此链接

VkPipelineLibraryCreateInfoKHR 结构体的定义如下:

// Provided by VK_KHR_pipeline_library
typedef struct VkPipelineLibraryCreateInfoKHR {
    VkStructureType      sType;
    const void*          pNext;
    uint32_t             libraryCount;
    const VkPipeline*    pLibraries;
} VkPipelineLibraryCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • libraryCountpLibraries 中管线库的数量。

  • pLibraries 是指向 VkPipeline 结构体数组的指针,该数组指定创建管线时要使用的管线库。

有效使用
  • VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-03381
    pLibraries 的每个元素必须已使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建。

  • VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-06855
    如果 pLibraries 中的任何库是使用带有 VkPipelineShaderStageModuleIdentifierCreateInfoEXTidentifierSize 不等于 0 的着色器阶段创建的,则该管线必须使用 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT 标志设置创建。

  • VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-08096
    如果 pLibraries 的任何元素是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则所有元素必须都是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的。

  • VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07404
    如果正在使用 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT 创建 pipeline,则 pLibraries 的每个元素必须已使用 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT 创建。

  • VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07405
    如果正在创建的 pipeline 没有 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT,则 pLibraries 的每个元素必须都是在没有 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT 的情况下创建的。

  • VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07406
    如果正在使用 VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT 创建 pipeline,则 pLibraries 的每个元素必须已使用 VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT 创建。

  • VUID-VkPipelineLibraryCreateInfoKHR-pipeline-07407
    如果正在创建的 pipeline 没有 VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT,则 pLibraries 的每个元素必须都是在没有 VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT 的情况下创建的。

有效用法(隐式)
  • VUID-VkPipelineLibraryCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR

  • VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-parameter
    如果 libraryCount 不为 0,则 pLibraries 必须是指向 libraryCount 个有效 VkPipeline 句柄数组的有效指针。

使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR 创建的管线库可以依赖于 VkPipelineLibraryCreateInfoKHR 中的其他管线库。

只要其中一个链接的管线正在使用,管线库就被认为是正在使用。如果管线库包含其他管线库,则递归地应用此规则。

管线绑定

创建管线后,可以使用以下命令将其绑定到命令缓冲区:

// Provided by VK_VERSION_1_0
void vkCmdBindPipeline(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipeline                                  pipeline);
  • commandBuffer 是管线将绑定到的命令缓冲区。

  • pipelineBindPoint 是一个 VkPipelineBindPoint 值,指定将管线绑定到哪个绑定点。绑定一个绑定点不会干扰其他绑定点。

  • pipeline 是要绑定的管线。

一旦绑定,管线绑定会影响命令缓冲区中与给定管线类型交互的后续命令,直到将相同类型的不同管线绑定到绑定点,或者直到通过绑定着色器对象(如与管线的交互中所述)干扰管线绑定点为止。不与给定管线类型交互的命令必须不受管线状态的影响。

有效使用
  • VUID-vkCmdBindPipeline-pipelineBindPoint-00777
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_COMPUTE,则分配 commandBufferVkCommandPool 必须支持计算操作

  • VUID-vkCmdBindPipeline-pipelineBindPoint-00778
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_GRAPHICS,则分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdBindPipeline-pipelineBindPoint-00779
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_COMPUTE,则 pipeline 必须是计算管线

  • VUID-vkCmdBindPipeline-pipelineBindPoint-00780
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_GRAPHICS,则 pipeline 必须是图形管线

  • VUID-vkCmdBindPipeline-pipeline-00781
    如果不支持 variableMultisampleRate 功能, pipeline 是图形管线,当前子通道不使用附件,并且这不是在转换到当前子通道后首次使用图形管线调用此函数,则此管线指定的样本计数必须与先前管线中设置的样本计数匹配

  • VUID-vkCmdBindPipeline-variableSampleLocations-01525
    如果 VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocationsVK_FALSE,并且 pipeline 是使用 VkPipelineSampleLocationsStateCreateInfoEXT 结构创建的图形管线,该结构的 sampleLocationsEnable 成员设置为 VK_TRUE 但未启用 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT,则当前渲染通道实例必须已通过指定 VkRenderPassSampleLocationsBeginInfoEXT 结构开始,该结构的 pPostSubpassSampleLocations 成员包含一个元素,该元素的 subpassIndex 与当前子通道索引匹配,并且该元素的 sampleLocationsInfo 成员必须与创建管线时在 VkPipelineSampleLocationsStateCreateInfoEXT 中指定的 sampleLocationsInfo 匹配

  • VUID-vkCmdBindPipeline-None-02323
    当变换反馈处于活动状态时,必须不记录此命令

  • VUID-vkCmdBindPipeline-pipelineBindPoint-02391
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,则分配 commandBufferVkCommandPool 必须支持计算操作

  • VUID-vkCmdBindPipeline-pipelineBindPoint-02392
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,则 pipeline 必须是光线追踪管线

  • VUID-vkCmdBindPipeline-pipelineBindPoint-06721
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,则 commandBuffer 必须不是受保护的命令缓冲区

  • VUID-vkCmdBindPipeline-pipelineProtectedAccess-07408
    如果启用了 pipelineProtectedAccess 功能,并且 commandBuffer 是受保护的命令缓冲区,则 pipeline 必须已在未设置 VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT 的情况下创建

  • VUID-vkCmdBindPipeline-pipelineProtectedAccess-07409
    如果启用了 pipelineProtectedAccess 功能,并且 commandBuffer 不是受保护的命令缓冲区,则 pipeline 必须已在未设置 VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT 的情况下创建

  • VUID-vkCmdBindPipeline-pipeline-03382
    创建 pipeline必须未设置 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR

  • VUID-vkCmdBindPipeline-commandBuffer-04808
    如果 commandBuffer 是启用了 VkCommandBufferInheritanceViewportScissorInfoNV::viewportScissor2D 的二级命令缓冲区,并且 pipelineBindPointVK_PIPELINE_BIND_POINT_GRAPHICS,则 pipeline 必须已在启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT 以及 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNTVK_DYNAMIC_STATE_SCISSOR 的情况下创建

  • VUID-vkCmdBindPipeline-commandBuffer-04809
    如果 commandBuffer 是启用了 VkCommandBufferInheritanceViewportScissorInfoNV::viewportScissor2D 的二级命令缓冲区,并且 pipelineBindPointVK_PIPELINE_BIND_POINT_GRAPHICS,并且 pipeline 是使用 VkPipelineDiscardRectangleStateCreateInfoEXT 结构创建的,并且其 discardRectangleCount 成员不为 0,或者该管线是在启用了 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT 的情况下创建的,则该管线必须已在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT 的情况下创建

  • VUID-vkCmdBindPipeline-pipelineBindPoint-04881
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_GRAPHICS 并且 provokingVertexModePerPipeline 限制为 VK_FALSE,则管线的 VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::provokingVertexMode 必须与当前渲染通道实例中先前绑定到此绑定点的任何其他管线的 provokingVertexMode 相同,包括在开始渲染通道实例时已绑定的任何管线

  • VUID-vkCmdBindPipeline-pipelineBindPoint-04949
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI,则分配 commandBufferVkCommandPool 必须支持计算操作

  • VUID-vkCmdBindPipeline-pipelineBindPoint-04950
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI,则 pipeline 必须是子通道着色管线

有效用法(隐式)
  • VUID-vkCmdBindPipeline-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBindPipeline-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-vkCmdBindPipeline-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkCmdBindPipeline-commandBuffer-recording
    commandBuffer 必须 处于 记录状态

  • VUID-vkCmdBindPipeline-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool **必须** 支持图形或计算操作。

  • VUID-vkCmdBindPipeline-videocoding
    此命令 必须 仅在视频编码范围之外调用。

  • VUID-vkCmdBindPipeline-commonparent
    commandBufferpipeline必须 从同一个 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

两者

外部

图形
计算

状态

vkCmdBindPipeline::pipelineBindPoint 的可能值,指定管线对象的绑定点,有以下几种:

// Provided by VK_VERSION_1_0
typedef enum VkPipelineBindPoint {
    VK_PIPELINE_BIND_POINT_GRAPHICS = 0,
    VK_PIPELINE_BIND_POINT_COMPUTE = 1,
#ifdef VK_ENABLE_BETA_EXTENSIONS
  // Provided by VK_AMDX_shader_enqueue
    VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX = 1000134000,
#endif
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR = 1000165000,
  // Provided by VK_HUAWEI_subpass_shading
    VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI = 1000369003,
  // Provided by VK_NV_ray_tracing
    VK_PIPELINE_BIND_POINT_RAY_TRACING_NV = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,
} VkPipelineBindPoint;
  • VK_PIPELINE_BIND_POINT_COMPUTE 指定绑定为计算管线。

  • VK_PIPELINE_BIND_POINT_GRAPHICS 指定绑定为图形管线。

  • VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR 指定绑定为光线追踪管线。

  • VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI 指定绑定为子通道着色管线。

  • VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX 指定绑定为执行图管线

对于创建时支持多个着色器组的管线(参见图形管线着色器组),常规的 vkCmdBindPipeline 命令将绑定着色器组 0。要显式绑定着色器组,请使用

// Provided by VK_NV_device_generated_commands
void vkCmdBindPipelineShaderGroupNV(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipeline                                  pipeline,
    uint32_t                                    groupIndex);
  • commandBuffer 是管线将绑定到的命令缓冲区。

  • pipelineBindPoint 是一个 VkPipelineBindPoint 值,指定将要绑定管线的绑定点。

  • pipeline 是要绑定的管线。

  • groupIndex 是要绑定的着色器组。

有效使用
有效用法(隐式)
  • VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-vkCmdBindPipelineShaderGroupNV-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-recording
    commandBuffer 必须 处于 记录状态

  • VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool **必须** 支持图形或计算操作。

  • VUID-vkCmdBindPipelineShaderGroupNV-videocoding
    此命令 必须 仅在视频编码范围之外调用。

  • VUID-vkCmdBindPipelineShaderGroupNV-commonparent
    commandBufferpipeline必须 从同一个 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

两者

外部

图形
计算

状态

与着色器对象的交互

如果启用了shaderObject 功能,则应用程序**可以**同时使用管线和着色器对象。管线和着色器对象之间的交互在与管线的交互中进行了描述。

动态状态

当绑定管线对象时,任何未指定为动态的管线对象状态都将应用于命令缓冲区状态。指定为动态的管线对象状态此时不会应用于命令缓冲区状态。

相反,动态状态**可以**随时修改,并且在命令缓冲区的生命周期内持续存在,或者直到被另一个动态状态设置命令修改,或者通过绑定在该状态中静态指定的管线而失效。

如果启用了commandBufferInheritance 功能,则队列中先前执行的命令缓冲区中的所有有效状态都会继承到同一队列中执行的下一个命令缓冲区中。在绘制或分派命令之前,不需要再次设置此继承的状态。

当绑定管线对象时,以下内容适用于每个状态参数:

  • 如果新管线对象中未将状态指定为动态状态,则该命令缓冲区状态将被新管线对象中的状态覆盖。在此管线绑定之后,在使用此管线进行任何绘制或分派调用之前,**必须**没有调用过任何对应的动态状态设置命令。

  • 如果新管线对象中将状态指定为动态状态,则该命令缓冲区状态不会被干扰。在使用此管线进行任何绘制或分派调用之前,**必须**至少调用过每个对应的动态状态设置命令一次。状态设置命令**必须**在命令缓冲区记录开始之后,或在上次绑定该状态指定为静态的管线对象之后记录,以两者较晚者为准。

  • 如果新管线对象中未包含该状态(VkGraphicsPipelineCreateInfo 中的相应指针为 NULL 或被忽略),则该命令缓冲区状态不会被干扰。例如,网格着色管线不包含顶点输入状态,因此不会干扰任何此类命令缓冲区状态。

不影响操作结果的动态状态**可以**保持**未定义**。

例如,如果通过管线对象状态禁用混合,则即使在管线对象中将此状态指定为动态状态,也不需要在命令缓冲区中指定动态颜色混合常量。

VkPhysicalDeviceDriverProperties::conformanceVersion 小于 1.3.8.0 的 Vulkan 实现上运行的应用程序应注意,重新绑定绑定的管线对象可能不会重新应用静态状态。

管线属性和着色器信息

创建管线时,其状态和着色器会编译为零个或多个特定于设备的执行文件,这些执行文件在针对该管线执行命令时使用。要查询这些管线执行文件的属性,请调用

// Provided by VK_KHR_pipeline_executable_properties
VkResult vkGetPipelineExecutablePropertiesKHR(
    VkDevice                                    device,
    const VkPipelineInfoKHR*                    pPipelineInfo,
    uint32_t*                                   pExecutableCount,
    VkPipelineExecutablePropertiesKHR*          pProperties);
  • device 是创建管线的设备。

  • pPipelineInfo 描述要查询的管线。

  • pExecutableCount 是一个指向整数的指针,该整数与可用或查询的管线可执行文件的数量有关,如下所述。

  • pPropertiesNULL 或指向 VkPipelineExecutablePropertiesKHR 结构的数组的指针。

如果 pPropertiesNULL,则管线关联的可执行文件数量将返回到 pExecutableCount 中。否则,pExecutableCount 必须 指向一个由应用程序设置的变量,该变量表示 pProperties 数组中的元素数量,并且在返回时,该变量将被实际写入 pProperties 的结构数量覆盖。如果 pExecutableCount 小于与管线关联的可执行文件数量,则最多将写入 pExecutableCount 个结构,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的属性都已返回。

有效使用
  • VUID-vkGetPipelineExecutablePropertiesKHR-pipelineExecutableInfo-03270
    必须启用 pipelineExecutableInfo 功能

  • VUID-vkGetPipelineExecutablePropertiesKHR-pipeline-03271
    pPipelineInfopipeline 成员必须已使用 device 创建

有效用法(隐式)
  • VUID-vkGetPipelineExecutablePropertiesKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineExecutablePropertiesKHR-pPipelineInfo-parameter
    pPipelineInfo 必须是指向有效 VkPipelineInfoKHR 结构的有效指针

  • VUID-vkGetPipelineExecutablePropertiesKHR-pExecutableCount-parameter
    pExecutableCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetPipelineExecutablePropertiesKHR-pProperties-parameter
    如果 pExecutableCount 引用的值不为 0,且 pProperties 不为 NULL,则 pProperties 必须是指向 pExecutableCountVkPipelineExecutablePropertiesKHR 结构数组的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkPipelineExecutablePropertiesKHR 结构的定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef struct VkPipelineExecutablePropertiesKHR {
    VkStructureType       sType;
    void*                 pNext;
    VkShaderStageFlags    stages;
    char                  name[VK_MAX_DESCRIPTION_SIZE];
    char                  description[VK_MAX_DESCRIPTION_SIZE];
    uint32_t              subgroupSize;
} VkPipelineExecutablePropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stages 是零个或多个 VkShaderStageFlagBits 的位掩码,指示哪些着色器阶段(如果有)主要用作编译此管线可执行文件的输入。

  • name 是一个 VK_MAX_DESCRIPTION_SIZE char 的数组,包含一个以 null 结尾的 UTF-8 字符串,该字符串是此管线可执行文件的简短、人类可读的名称。

  • description 是一个 VK_MAX_DESCRIPTION_SIZE char 的数组,包含一个以 null 结尾的 UTF-8 字符串,该字符串是此管线可执行文件的人类可读描述。

  • subgroupSize 是此管线可执行文件被调度的子组大小。

并非所有实现都在着色器阶段和管线可执行文件之间具有 1:1 的映射,并且某些实现可能会将给定的着色器阶段减少为固定功能硬件编程,从而没有可用的管线可执行文件。不保证着色器阶段和管线可执行文件之间的映射,并且 stages 应该被视为尽力而为的提示。由于应用程序不能依赖 stages 字段来提供精确的描述,因此 namedescription 提供了人类可读的名称和描述,可以更准确地描述给定的管线可执行文件。

有效用法(隐式)
  • VUID-VkPipelineExecutablePropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR

  • VUID-VkPipelineExecutablePropertiesKHR-pNext-pNext
    pNext 必须NULL

要查询管线属性,请调用

// Provided by VK_EXT_pipeline_properties
VkResult vkGetPipelinePropertiesEXT(
    VkDevice                                    device,
    const VkPipelineInfoEXT*                    pPipelineInfo,
    VkBaseOutStructure*                         pPipelineProperties);
  • device 是创建管线的逻辑设备。

  • pPipelineInfo 是指向 VkPipelineInfoEXT 结构的指针,该结构描述了正在查询的管线。

  • pPipelineProperties 是指向 VkBaseOutStructure 结构的指针,管线属性将写入其中。

要查询管线的 pipelineIdentifier,请在 pPipelineProperties 中传递 VkPipelinePropertiesIdentifierEXT 结构。每个管线都与一个 pipelineIdentifier 相关联,并且该标识符是特定于实现的。

有效使用
  • VUID-vkGetPipelinePropertiesEXT-pipeline-06738
    pPipelineInfopipeline 成员必须已使用 device 创建

  • VUID-vkGetPipelinePropertiesEXT-pPipelineProperties-06739
    pPipelineProperties 必须是指向 VkPipelinePropertiesIdentifierEXT 结构的有效指针

  • VUID-vkGetPipelinePropertiesEXT-None-06766
    必须启用 pipelinePropertiesIdentifier 功能

有效用法(隐式)
  • VUID-vkGetPipelinePropertiesEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelinePropertiesEXT-pPipelineInfo-parameter
    pPipelineInfo 必须是指向有效 VkPipelineInfoEXT 结构的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkPipelinePropertiesIdentifierEXT 结构的定义如下:

// Provided by VK_EXT_pipeline_properties
typedef struct VkPipelinePropertiesIdentifierEXT {
    VkStructureType    sType;
    void*              pNext;
    uint8_t            pipelineIdentifier[VK_UUID_SIZE];
} VkPipelinePropertiesIdentifierEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pipelineIdentifier 是一个 VK_UUID_SIZEuint8_t 值的数组,管线标识符将写入其中。

有效用法(隐式)
  • VUID-VkPipelinePropertiesIdentifierEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT

  • VUID-VkPipelinePropertiesIdentifierEXT-pNext-pNext
    pNext 必须NULL

VkPipelineInfoKHR 结构的定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef struct VkPipelineInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkPipeline         pipeline;
} VkPipelineInfoKHR;

或等效的

// Provided by VK_EXT_pipeline_properties
typedef VkPipelineInfoKHR VkPipelineInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pipeline 是一个 VkPipeline 句柄。

有效用法(隐式)
  • VUID-VkPipelineInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR

  • VUID-VkPipelineInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineInfoKHR-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

每个管线可执行文件可能都有一组与其关联的统计信息,这些统计信息由管线编译过程生成。这些统计信息可能包括诸如指令计数、溢出量(如果有)、最大并发线程数或任何其他可能帮助开发人员评估着色器预期性能的信息。要查询与管线可执行文件关联的编译时统计信息,请调用

// Provided by VK_KHR_pipeline_executable_properties
VkResult vkGetPipelineExecutableStatisticsKHR(
    VkDevice                                    device,
    const VkPipelineExecutableInfoKHR*          pExecutableInfo,
    uint32_t*                                   pStatisticCount,
    VkPipelineExecutableStatisticKHR*           pStatistics);
  • device 是创建管线的设备。

  • pExecutableInfo 描述了正在查询的管线可执行文件。

  • pStatisticCount 是指向与可用或查询的统计信息数量相关的整数的指针,如下所述。

  • pStatisticsNULL 或指向 VkPipelineExecutableStatisticKHR 结构数组的指针。

如果 pStatisticsNULL,则与管线可执行文件关联的统计信息数量将返回到 pStatisticCount 中。否则,pStatisticCount 必须 指向一个由应用程序设置的变量,该变量表示 pStatistics 数组中的元素数量,并且在返回时,该变量将被实际写入 pStatistics 的结构数量覆盖。如果 pStatisticCount 小于与管线可执行文件关联的统计信息数量,则最多将写入 pStatisticCount 个结构,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的统计信息都已返回。

有效使用
  • VUID-vkGetPipelineExecutableStatisticsKHR-pipelineExecutableInfo-03272
    必须启用 pipelineExecutableInfo 功能

  • VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03273
    pExecutableInfopipeline 成员必须已使用 device 创建。

  • VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03274
    pExecutableInfopipeline 成员必须已使用 VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR 创建。

有效用法(隐式)
  • VUID-vkGetPipelineExecutableStatisticsKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineExecutableStatisticsKHR-pExecutableInfo-parameter
    pExecutableInfo 必须是指向有效 VkPipelineExecutableInfoKHR 结构的有效指针。

  • VUID-vkGetPipelineExecutableStatisticsKHR-pStatisticCount-parameter
    pStatisticCount 必须是指向 uint32_t 值的有效指针。

  • VUID-vkGetPipelineExecutableStatisticsKHR-pStatistics-parameter
    如果 pStatisticCount 引用的值不为 0,并且 pStatistics 不为 NULL,则 pStatistics 必须是指向 pStatisticCountVkPipelineExecutableStatisticKHR 结构数组的有效指针。

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkPipelineExecutableInfoKHR 结构的定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef struct VkPipelineExecutableInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkPipeline         pipeline;
    uint32_t           executableIndex;
} VkPipelineExecutableInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pipeline 是要查询的管线。

  • executableIndex 是要查询的管线可执行文件在 vkGetPipelineExecutablePropertiesKHR 返回的可执行属性数组中的索引。

有效使用
  • VUID-VkPipelineExecutableInfoKHR-executableIndex-03275
    executableIndex 必须小于与 pipeline 关联的管线可执行文件的数量,该数量在 vkGetPipelineExecutablePropertiesKHRpExecutableCount 参数中返回。

有效用法(隐式)
  • VUID-VkPipelineExecutableInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR

  • VUID-VkPipelineExecutableInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineExecutableInfoKHR-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

VkPipelineExecutableStatisticKHR 结构的定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef struct VkPipelineExecutableStatisticKHR {
    VkStructureType                           sType;
    void*                                     pNext;
    char                                      name[VK_MAX_DESCRIPTION_SIZE];
    char                                      description[VK_MAX_DESCRIPTION_SIZE];
    VkPipelineExecutableStatisticFormatKHR    format;
    VkPipelineExecutableStatisticValueKHR     value;
} VkPipelineExecutableStatisticKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • name 是一个 VK_MAX_DESCRIPTION_SIZEchar 的数组,其中包含一个以 null 结尾的 UTF-8 字符串,该字符串是此统计信息的简短的人类可读名称。

  • description 是一个 VK_MAX_DESCRIPTION_SIZEchar 的数组,其中包含一个以 null 结尾的 UTF-8 字符串,该字符串是此统计信息的人类可读描述。

  • format 是一个 VkPipelineExecutableStatisticFormatKHR 值,指定 value 中找到的数据的格式。

  • value 是此统计信息的值。

有效用法(隐式)
  • VUID-VkPipelineExecutableStatisticKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR

  • VUID-VkPipelineExecutableStatisticKHR-pNext-pNext
    pNext 必须NULL

VkPipelineExecutableStatisticFormatKHR 枚举的定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef enum VkPipelineExecutableStatisticFormatKHR {
    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR = 0,
    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR = 1,
    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR = 2,
    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR = 3,
} VkPipelineExecutableStatisticFormatKHR;
  • VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR 指定统计信息以 32 位布尔值返回,该值必须VK_TRUEVK_FALSE,并且应该VkPipelineExecutableStatisticValueKHRb32 字段中读取。

  • VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR 指定统计信息以有符号 64 位整数返回,并且应该VkPipelineExecutableStatisticValueKHRi64 字段中读取。

  • VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR 指定统计信息以无符号 64 位整数返回,并且应该VkPipelineExecutableStatisticValueKHRu64 字段中读取。

  • VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR 指定统计信息以 64 位浮点值返回,并且应该VkPipelineExecutableStatisticValueKHRf64 字段中读取。

VkPipelineExecutableStatisticValueKHR 联合体的定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef union VkPipelineExecutableStatisticValueKHR {
    VkBool32    b32;
    int64_t     i64;
    uint64_t    u64;
    double      f64;
} VkPipelineExecutableStatisticValueKHR;
  • 如果 VkPipelineExecutableStatisticFormatKHRVK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR,则 b32 是 32 位布尔值。

  • 如果 VkPipelineExecutableStatisticFormatKHRVK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR,则 i64 是有符号 64 位整数值。

  • 如果 VkPipelineExecutableStatisticFormatKHRVK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR,则 u64 是无符号 64 位整数值。

  • 如果 VkPipelineExecutableStatisticFormatKHRVK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR,则 f64 是 64 位浮点值。

每个管线可执行文件可能有一个或多个与其关联的文本或二进制内部表示形式,这些表示形式是在编译过程中生成的。这些可能包括最终的着色器汇编代码、编译后的着色器的二进制形式,或着色器编译器在任意数量的中间编译步骤中的内部表示形式。要查询与管线可执行文件关联的内部表示形式,请调用

// Provided by VK_KHR_pipeline_executable_properties
VkResult vkGetPipelineExecutableInternalRepresentationsKHR(
    VkDevice                                    device,
    const VkPipelineExecutableInfoKHR*          pExecutableInfo,
    uint32_t*                                   pInternalRepresentationCount,
    VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations);
  • device 是创建管线的设备。

  • pExecutableInfo 描述了正在查询的管线可执行文件。

  • pInternalRepresentationCount 是一个指向与可用或查询的内部表示形式数量相关的整数的指针,如下所述。

  • pInternalRepresentationsNULL 或指向 VkPipelineExecutableInternalRepresentationKHR 结构数组的指针。

如果 pInternalRepresentationsNULL,则与管线可执行文件关联的内部表示形式的数量将在 pInternalRepresentationCount 中返回。否则,pInternalRepresentationCount 必须指向一个由应用程序设置为 pInternalRepresentations 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pInternalRepresentations 的结构数量覆盖。如果 pInternalRepresentationCount 小于与管线可执行文件关联的内部表示形式的数量,则最多写入 pInternalRepresentationCount 个结构,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的表示形式都已返回。

虽然内部表示形式的细节仍然是与实现相关的,但实现应该按照它们在编译后的管线中出现的顺序对内部表示形式进行排序,最后是最终的着色器汇编代码(如果有)。

有效使用
  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipelineExecutableInfo-03276
    必须启用 pipelineExecutableInfo 功能

  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03277
    pExecutableInfopipeline 成员必须已使用 device 创建。

  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03278
    pExecutableInfopipeline 成员必须已使用 VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR 创建。

有效用法(隐式)
  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pExecutableInfo-parameter
    pExecutableInfo 必须是指向有效 VkPipelineExecutableInfoKHR 结构的有效指针。

  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentationCount-parameter
    pInternalRepresentationCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentations-parameter
    如果 pInternalRepresentationCount 所引用的值不是 0,并且 pInternalRepresentations 不是 NULL,则 pInternalRepresentations 必须是指向 pInternalRepresentationCountVkPipelineExecutableInternalRepresentationKHR 结构体数组的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkPipelineExecutableInternalRepresentationKHR 结构体定义如下:

// Provided by VK_KHR_pipeline_executable_properties
typedef struct VkPipelineExecutableInternalRepresentationKHR {
    VkStructureType    sType;
    void*              pNext;
    char               name[VK_MAX_DESCRIPTION_SIZE];
    char               description[VK_MAX_DESCRIPTION_SIZE];
    VkBool32           isText;
    size_t             dataSize;
    void*              pData;
} VkPipelineExecutableInternalRepresentationKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • name 是一个包含以 null 结尾的 UTF-8 字符串的 VK_MAX_DESCRIPTION_SIZEchar 的数组,该字符串是此内部表示的简短、人类可读的名称。

  • description 是一个包含以 null 结尾的 UTF-8 字符串的 VK_MAX_DESCRIPTION_SIZEchar 的数组,该字符串是此内部表示的人类可读描述。

  • isText 指定返回的数据是文本还是不透明数据。如果 isTextVK_TRUE,则 pData 中返回的数据是文本,并保证是以 null 结尾的 UTF-8 字符串。

  • dataSize 是一个与内部表示数据大小(以字节为单位)相关的整数,如下所述。

  • pData 可以是 NULL 或指向实现将写入内部表示数据的内存块的指针。

如果 pDataNULL,则内部表示数据的大小(以字节为单位)将返回到 dataSize 中。否则,dataSize 必须pData 指向的缓冲区的大小(以字节为单位),并且在返回时,dataSize 将被实际写入 pData 的数据字节数(包括任何尾随的 null 字符)覆盖。如果 dataSize 小于内部表示数据的大小(以字节为单位),则最多将 dataSize 个字节的数据写入 pData,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非返回了所有可用的表示。

如果 isTextVK_TRUE,且 pData 不为 NULL,且 dataSize 不为零,则写入 pData 的最后一个字节将是 null 字符。

有效用法(隐式)
  • VUID-VkPipelineExecutableInternalRepresentationKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR

  • VUID-VkPipelineExecutableInternalRepresentationKHR-pNext-pNext
    pNext 必须NULL

可以通过调用以下函数提取已编译为管线对象一部分的特定着色器的信息:

// Provided by VK_AMD_shader_info
VkResult vkGetShaderInfoAMD(
    VkDevice                                    device,
    VkPipeline                                  pipeline,
    VkShaderStageFlagBits                       shaderStage,
    VkShaderInfoTypeAMD                         infoType,
    size_t*                                     pInfoSize,
    void*                                       pInfo);
  • device 是创建 pipeline 的设备。

  • pipeline 是查询的目标。

  • shaderStage 是一个 VkShaderStageFlagBits,用于指定正在查询信息的管线内的特定着色器。

  • infoType 描述了正在查询的信息类型。

  • pInfoSize 是一个指向与查询返回的数据量相关的值的指针,如下所述。

  • pInfo 可以是 NULL 或指向缓冲区的指针。

如果 pInfoNULL,则关于着色器可以检索的最大信息大小(以字节为单位)将返回到 pInfoSize 中。否则,pInfoSize 必须指向应用程序设置为 pInfo 所指向的缓冲区大小(以字节为单位)的变量,并且在返回时,该变量将被实际写入 pInfo 的数据量覆盖。如果 pInfoSize 小于管线缓存可以检索的最大大小,则最多将 pInfoSize 个字节写入 pInfo,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示未返回管线缓存的所有必需信息。

并非所有信息都适用于每个着色器,并且实现可能不支持任何着色器的所有类型的信息。当某种类型的信息不可用时,该函数将返回 VK_ERROR_FEATURE_NOT_PRESENT

如果信息成功且完全查询,则该函数将返回 VK_SUCCESS

对于 infoTypeVK_SHADER_INFO_TYPE_STATISTICS_AMD,将把 VkShaderStatisticsInfoAMD 结构体写入 pInfo 所指向的缓冲区。此结构体将填充有关该着色器使用的物理设备资源的统计信息以及其他杂项信息,并在下文中进行更详细的描述。

对于 infoTypeVK_SHADER_INFO_TYPE_DISASSEMBLY_AMDpInfo 是指向包含人类可读反汇编的以 null 结尾的 UTF-8 字符串的指针。反汇编字符串的确切格式和内容是供应商特定的。

所有其他类型的信息(包括 infoTypeVK_SHADER_INFO_TYPE_BINARY_AMD)的格式和内容都留给供应商,本扩展名不再进行指定。

有效用法(隐式)
  • VUID-vkGetShaderInfoAMD-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetShaderInfoAMD-pipeline-parameter
    pipeline 必须 是有效的 VkPipeline 句柄。

  • VUID-vkGetShaderInfoAMD-shaderStage-parameter
    shaderStage 必须是有效的 VkShaderStageFlagBits

  • VUID-vkGetShaderInfoAMD-infoType-parameter
    infoType 必须是有效的 VkShaderInfoTypeAMD

  • VUID-vkGetShaderInfoAMD-pInfoSize-parameter
    pInfoSize 必须是指向 size_t 值的有效指针

  • VUID-vkGetShaderInfoAMD-pInfo-parameter
    如果 pInfoSize 引用的值不是 0,并且 pInfo 不是 NULL,则 pInfo 必须是指向 pInfoSize 个字节的数组的有效指针

  • VUID-vkGetShaderInfoAMD-pipeline-parent
    pipeline 必须 是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_FEATURE_NOT_PRESENT

  • VK_ERROR_OUT_OF_HOST_MEMORY

vkGetShaderInfoAMD::infoType 的可能值(指定从着色器查询的信息)为:

// Provided by VK_AMD_shader_info
typedef enum VkShaderInfoTypeAMD {
    VK_SHADER_INFO_TYPE_STATISTICS_AMD = 0,
    VK_SHADER_INFO_TYPE_BINARY_AMD = 1,
    VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD = 2,
} VkShaderInfoTypeAMD;
  • VK_SHADER_INFO_TYPE_STATISTICS_AMD 指定将查询着色器使用的设备资源。

  • VK_SHADER_INFO_TYPE_BINARY_AMD 指定将查询特定于实现的信息。

  • VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD 指定着色器的人类可读反汇编。

VkShaderStatisticsInfoAMD 结构体定义如下:

// Provided by VK_AMD_shader_info
typedef struct VkShaderStatisticsInfoAMD {
    VkShaderStageFlags          shaderStageMask;
    VkShaderResourceUsageAMD    resourceUsage;
    uint32_t                    numPhysicalVgprs;
    uint32_t                    numPhysicalSgprs;
    uint32_t                    numAvailableVgprs;
    uint32_t                    numAvailableSgprs;
    uint32_t                    computeWorkGroupSize[3];
} VkShaderStatisticsInfoAMD;
  • shaderStageMask 是此着色器中包含的逻辑着色器阶段的组合。

  • resourceUsage 是描述此着色器使用的内部物理设备资源的 VkShaderResourceUsageAMD 结构体。

  • numPhysicalVgprs 是物理设备可用的向量指令通用寄存器 (VGPR) 的最大数量。

  • numPhysicalSgprs 是物理设备可用的标量指令通用寄存器 (SGPR) 的最大数量。

  • numAvailableVgprs 是提供给着色器编译器的 VGPR 最大限制。

  • numAvailableSgprs 是提供给着色器编译器的 SGPR 最大限制。

  • computeWorkGroupSize 是此着色器在 { X, Y, Z } 维度上的本地工作组大小。

某些实现可能会将多个逻辑着色器阶段合并到一个着色器中。在这种情况下,shaderStageMask 将包含该着色器中处于活动状态的所有阶段的位掩码。因此,如果将这些阶段指定为 vkGetShaderInfoAMD 的输入,则对于所有此类着色器阶段查询,可能会返回相同的输出信息。

可用 VGPR 和 SGPR 的数量(分别为 numAvailableVgprsnumAvailableSgprs)是物理寄存器的着色器可寻址子集,作为寄存器分配的限制提供给编译器。由于寄存器压力是一个瓶颈,这些值可能会因性能优化而受到实现的进一步限制。

VkShaderResourceUsageAMD 结构定义为

// Provided by VK_AMD_shader_info
typedef struct VkShaderResourceUsageAMD {
    uint32_t    numUsedVgprs;
    uint32_t    numUsedSgprs;
    uint32_t    ldsSizePerLocalWorkGroup;
    size_t      ldsUsageSizeInBytes;
    size_t      scratchMemUsageInBytes;
} VkShaderResourceUsageAMD;
  • numUsedVgprs 是此着色器使用的向量指令通用寄存器的数量。

  • numUsedSgprs 是此着色器使用的标量指令通用寄存器的数量。

  • ldsSizePerLocalWorkGroup 是每个工作组的最大本地数据存储大小,以字节为单位。

  • ldsUsageSizeInBytes 是此着色器每个工作组的 LDS 使用大小,以字节为单位。

  • scratchMemUsageInBytes 是此着色器使用的暂存内存大小,以字节为单位。

管线编译器控制

可以通过将 VkPipelineCompilerControlCreateInfoAMD 结构添加到 VkGraphicsPipelineCreateInfoVkComputePipelineCreateInfopNext 链中来调整管线的编译。

// Provided by VK_AMD_pipeline_compiler_control
typedef struct VkPipelineCompilerControlCreateInfoAMD {
    VkStructureType                      sType;
    const void*                          pNext;
    VkPipelineCompilerControlFlagsAMD    compilerControlFlags;
} VkPipelineCompilerControlCreateInfoAMD;
有效用法(隐式)
  • VUID-VkPipelineCompilerControlCreateInfoAMD-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD

  • VUID-VkPipelineCompilerControlCreateInfoAMD-compilerControlFlags-zerobitmask
    compilerControlFlags 必须0

此扩展当前没有可用的标志;标志将通过此扩展的未来版本添加。

// Provided by VK_AMD_pipeline_compiler_control
typedef enum VkPipelineCompilerControlFlagBitsAMD {
} VkPipelineCompilerControlFlagBitsAMD;
// Provided by VK_AMD_pipeline_compiler_control
typedef VkFlags VkPipelineCompilerControlFlagsAMD;

VkPipelineCompilerControlFlagsAMD 是一种位掩码类型,用于设置零个或多个 VkPipelineCompilerControlFlagBitsAMD 的掩码。

管线创建反馈

可以通过将 VkPipelineCreationFeedbackCreateInfo 结构添加到 VkGraphicsPipelineCreateInfoVkRayTracingPipelineCreateInfoKHRVkRayTracingPipelineCreateInfoNVVkComputePipelineCreateInfopNext 链中来获得有关特定管线对象创建的反馈。 VkPipelineCreationFeedbackCreateInfo 结构定义为

// Provided by VK_VERSION_1_3
typedef struct VkPipelineCreationFeedbackCreateInfo {
    VkStructureType                sType;
    const void*                    pNext;
    VkPipelineCreationFeedback*    pPipelineCreationFeedback;
    uint32_t                       pipelineStageCreationFeedbackCount;
    VkPipelineCreationFeedback*    pPipelineStageCreationFeedbacks;
} VkPipelineCreationFeedbackCreateInfo;

或等效的

// Provided by VK_EXT_pipeline_creation_feedback
typedef VkPipelineCreationFeedbackCreateInfo VkPipelineCreationFeedbackCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pPipelineCreationFeedback 是指向 VkPipelineCreationFeedback 结构的指针。

  • pipelineStageCreationFeedbackCountpPipelineStageCreationFeedbacks 中的元素数量。

  • pPipelineStageCreationFeedbacks 是指向 pipelineStageCreationFeedbackCountVkPipelineCreationFeedback 结构数组的指针。

实现将管线创建反馈写入 pPipelineCreationFeedback,并可能将管线阶段创建反馈写入 pPipelineStageCreationFeedbacks。实现必须VkPipelineCreationFeedback::flags 中为 pPipelineCreationFeedbackpPipelineStageCreationFeedbacks 的每个元素设置或清除 VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT

实现跳过每个阶段反馈的一种常见情况是在 pPipelineCreationFeedback 中设置 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 时。

当链接到 VkRayTracingPipelineCreateInfoKHRVkRayTracingPipelineCreateInfoNVVkGraphicsPipelineCreateInfo 时,pPipelineStageCreationFeedbacks 的第 i 个元素对应于 VkRayTracingPipelineCreateInfoKHR::pStagesVkRayTracingPipelineCreateInfoNV::pStagesVkGraphicsPipelineCreateInfo::pStages 的第 i 个元素。 当链接到 VkComputePipelineCreateInfo 时,pPipelineStageCreationFeedbacks 的第一个元素对应于 VkComputePipelineCreateInfo::stage

有效用法(隐式)
  • VUID-VkPipelineCreationFeedbackCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO

  • VUID-VkPipelineCreationFeedbackCreateInfo-pPipelineCreationFeedback-parameter
    pPipelineCreationFeedback 必须是指向 VkPipelineCreationFeedback 结构的有效指针

  • VUID-VkPipelineCreationFeedbackCreateInfo-pPipelineStageCreationFeedbacks-parameter
    如果 pipelineStageCreationFeedbackCount 不为 0,则 pPipelineStageCreationFeedbacks 必须是指向 pipelineStageCreationFeedbackCountVkPipelineCreationFeedback 结构数组的有效指针

VkPipelineCreationFeedback 结构定义为

// Provided by VK_VERSION_1_3
typedef struct VkPipelineCreationFeedback {
    VkPipelineCreationFeedbackFlags    flags;
    uint64_t                           duration;
} VkPipelineCreationFeedback;

或等效的

// Provided by VK_EXT_pipeline_creation_feedback
typedef VkPipelineCreationFeedback VkPipelineCreationFeedbackEXT;
  • flags 是一个 VkPipelineCreationFeedbackFlagBits 的位掩码,提供有关管线或管线阶段创建的反馈。

  • duration 是创建管线或管线阶段所花费的时间,以纳秒为单位。

如果未在 flags 中设置 VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,则实现必须不在 flags 中设置任何其他位,并且所有其他 VkPipelineCreationFeedback 数据成员的值都是未定义的

VkPipelineCreationFeedbackflags 成员的可能值为

// Provided by VK_VERSION_1_3
typedef enum VkPipelineCreationFeedbackFlagBits {
    VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT = 0x00000001,
    VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT = 0x00000002,
    VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT = 0x00000004,
  // Provided by VK_EXT_pipeline_creation_feedback
    VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,
  // Provided by VK_EXT_pipeline_creation_feedback
    VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT,
  // Provided by VK_EXT_pipeline_creation_feedback
    VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT,
} VkPipelineCreationFeedbackFlagBits;

或等效的

// Provided by VK_EXT_pipeline_creation_feedback
typedef VkPipelineCreationFeedbackFlagBits VkPipelineCreationFeedbackFlagBitsEXT;
  • VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT 指定反馈信息有效。

  • VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 指定在管线创建命令中应用程序指定的 pipelineCache 中找到了一个可以直接使用的管线或管线阶段。

    如果实现能够通过使用 vkCreateGraphicsPipelinesvkCreateRayTracingPipelinesKHRvkCreateRayTracingPipelinesNVvkCreateComputePipelinespipelineCache 参数来避免管线或管线阶段创建的大部分工作,则实现设置 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT 位。当实现为整个管线设置此位时,它可以可能不对任何阶段取消设置此位。

    鼓励实现为使用此位的应用程序提供有意义的信号。目的是向应用程序传达管线或管线阶段是使用应用程序提供的管线缓存“以最快速度”创建的。如果实现使用内部缓存,则不鼓励设置此位,因为反馈将无法操作。

  • VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT 指定使用 Vk*PipelineCreateInfo 结构的 basePipelineHandlebasePipelineIndex 成员指定的基础管线来加速管线的创建。

    如果实现能够通过使用基础管线来避免大量工作,则实现设置 VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT 位。

    虽然“大量工作”是主观的,但鼓励实现为使用此位的应用程序提供有意义的信号。 例如,持续时间减少 1% 可能不需要设置此位,而减少 50% 则需要。

// Provided by VK_VERSION_1_3
typedef VkFlags VkPipelineCreationFeedbackFlags;

或等效的

// Provided by VK_EXT_pipeline_creation_feedback
typedef VkPipelineCreationFeedbackFlags VkPipelineCreationFeedbackFlagsEXT;

VkPipelineCreationFeedbackFlags 是一个位掩码类型,用于提供零个或多个 VkPipelineCreationFeedbackFlagBits