管线
以下图显示了 Vulkan 管线的框图。一些 Vulkan 命令指定要绘制的几何对象或要执行的计算工作,而另一些命令指定状态,控制各个管线阶段如何处理对象,或控制组织为图像和缓冲区的内存之间的数据传输。命令有效地通过处理管线发送,要么是图形管线、光线追踪管线或计算管线。
图形管线可以在两种模式下运行,分别是图元着色或网格着色管线。
图元着色
图形管线的第一个阶段(输入汇编器)根据请求的图元拓扑,将顶点组装成几何图元,如点、线和三角形。在下一个阶段(顶点着色器)中,顶点可以被变换,计算每个顶点的位置和属性。如果支持细分曲面和/或几何着色器,它们可以从单个输入图元生成多个图元,并可能在此过程中更改图元拓扑或生成额外的属性数据。
集群剔除着色
当使用集群剔除着色器时,类似计算着色器的着色器将执行基于集群的剔除,一组新的内置输出变量用于表示可见的集群,此外,还使用新的内置函数将这些变量从集群剔除着色器发送到输入汇编器 (IA) 阶段,然后 IA 可以使用这些变量来获取可见集群的顶点并驱动顶点着色器工作。
网格着色
如果可选的 (任务着色器) 处于活动状态,则每个任务都会触发一个任务着色器工作组的执行,该工作组在完成时将生成一组新任务。如果不存在任务着色器,则每个生成的任务或每个原始分派的任务都会触发网格着色器工作组的执行,该工作组会生成一个输出网格,该网格具有从存储在输出网格中的顶点组装而成的可变大小的图元数量。
通用
最终生成的图元在为下一个阶段(光栅化)做准备时被裁剪到裁剪体。光栅化器从点、线段或三角形的二维描述中生成与帧缓冲区区域关联的一系列片段。这些片段由片段操作处理,以确定生成的值是否将写入帧缓冲区。片段着色确定要写入帧缓冲区附件的值。然后,帧缓冲区操作读取和写入渲染通道实例的给定子通道的颜色和深度/模板附件。附件可以在同一渲染通道的后续子通道中用作片段着色器中的输入附件。
计算管线是一个与图形管线分开的管线,它在可以从缓冲区和图像内存读取和写入的一维、二维或三维工作组上运行。
此排序仅用作描述 Vulkan 的工具,而不是 Vulkan 如何实现的严格规则,我们仅将其作为组织管线的各种操作的手段。管线阶段之间的实际排序保证在同步章节中详细解释。
每个管线都由一个整体对象控制,该对象由所有着色器阶段的描述和任何相关的固定功能阶段创建。链接整个管线允许基于着色器的输入/输出优化着色器,并消除昂贵的绘制时状态验证。
管线对象使用 vkCmdBindPipeline 绑定到当前状态。任何指定为动态的管线对象状态都不会在绑定管线对象时应用于当前状态,而是由动态状态设置命令设置。
如果 commandBufferInheritance
特性未启用,则不会在命令缓冲区之间继承任何状态,包括动态状态。
如果 commandBufferInheritance
特性已启用,则在一个队列中执行的命令缓冲区末尾有效的全部图形和计算状态,将被继承并在同一队列中接下来执行的命令缓冲区的开头有效。这适用于主命令缓冲区和二级命令缓冲区。提交到队列的主命令缓冲区将从先前提交到该队列的命令缓冲区继承状态,二级命令缓冲区将从执行它们的主命令缓冲区或二级命令缓冲区继承状态,并且在执行二级命令缓冲区后,它的状态将被执行它的主命令缓冲区或二级命令缓冲区继承。在一个队列中执行的命令缓冲区不会从任何其他队列中执行的命令缓冲区继承状态。
计算、光线追踪和图形管线分别由 VkPipeline
句柄表示。
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline)
多管线创建
可以通过诸如 vkCreateExecutionGraphPipelinesAMDX、vkCreateRayTracingPipelinesKHR、vkCreateRayTracingPipelinesNV、vkCreateComputePipelines 和 vkCreateGraphicsPipelines 等命令在单个调用中创建多个管线。
创建命令传递一个 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
,并使用 module
和 pName
从着色器模块中选择一个入口点来创建,其中该入口点在 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
是创建计算管线的逻辑设备。 -
pipelineCache
是 VK_NULL_HANDLE,表示禁用管线缓存;或者是有效的 管线缓存 对象的句柄,在这种情况下,在该命令的执行期间启用该缓存的使用。 -
createInfoCount
是pCreateInfos
和pPipelines
数组的长度。 -
pCreateInfos
是指向 VkComputePipelineCreateInfo 结构数组的指针。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。 -
pPipelines
是指向 VkPipeline 句柄数组的指针,其中返回生成的计算管线对象。
管线的创建和返回方式如 多管线创建 所述。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。 -
stage
是一个 VkPipelineShaderStageCreateInfo 结构,描述计算着色器。 -
layout
是描述管线和与管线一起使用的描述符集的绑定位置。 -
basePipelineHandle
是一个要从中派生的管线。 -
basePipelineIndex
是一个索引,指向pCreateInfos
参数中要用作派生管线的管线。
参数 basePipelineHandle
和 basePipelineIndex
在管线派生中进行了更详细的描述。
如果 pNext
链包含 VkPipelineCreateFlags2CreateInfo 结构,则使用该结构的 VkPipelineCreateFlags2CreateInfo::flags
,而不是此结构中的 flags
。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkPipelineShaderStageCreateFlagBits 的位掩码,指定如何生成管道着色器阶段。 -
stage
是一个 VkShaderStageFlagBits 值,指定单个管道阶段。 -
module
是可选的 VkShaderModule 对象,其中包含此阶段的着色器代码。 -
pName
是一个指向以 null 结尾的 UTF-8 字符串的指针,该字符串指定此阶段着色器的入口点名称。 -
pSpecializationInfo
是指向 VkSpecializationInfo 结构的指针,如 特化常量 中所述,或NULL
。
如果 module
不是 VK_NULL_HANDLE,则管道使用的着色器代码由 module
定义。如果 module
是 VK_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
导致管道编译失败,因为在链接步骤之前,可能无法确定是否可以从标识符创建管道。
// Provided by VK_VERSION_1_0
typedef VkFlags VkPipelineShaderStageCreateFlags;
VkPipelineShaderStageCreateFlags
是一个位掩码类型,用于设置零个或多个 VkPipelineShaderStageCreateFlagBits 的掩码。
指定如何创建管线着色器阶段的 VkPipelineShaderStageCreateInfo 的 flags
成员的可能值是:
// 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
指定子组大小在任务、网格或计算阶段启动时,必须 所有调用都是活跃的。
如果指定了 |
可以通过命令和结构设置的,指定一个或多个着色器阶段的位是:
// 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
指定可调用阶段。
|
// 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。
如果 VkPipelineShaderStageCreateInfo 的 pNext
链中包含 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo
结构,则指定正在编译的管线着色器阶段具有所需的子组大小。
如果 VkShaderCreateInfoEXT 的 pNext
链中包含 VkShaderRequiredSubgroupSizeCreateInfoEXT
结构,则指定正在编译的着色器具有所需的子组大小。
子通道着色管线是一个计算管线,它必须仅在渲染通道的子通道中调用,其工作维度由渲染区域大小指定。子通道着色管线着色器是一个计算着色器,允许访问调用子通道中指定的输入附件。要创建子通道着色管线,请在 VkComputePipelineCreateInfo 的 pNext
链中使用 VkSubpassShadingPipelineCreateInfoHUAWEI 调用 vkCreateComputePipelines。
VkSubpassShadingPipelineCreateInfoHUAWEI
结构定义为
// Provided by VK_HUAWEI_subpass_shading
typedef struct VkSubpassShadingPipelineCreateInfoHUAWEI {
VkStructureType sType;
void* pNext;
VkRenderPass renderPass;
uint32_t subpass;
} VkSubpassShadingPipelineCreateInfoHUAWEI;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
renderPass
是一个渲染通道对象的句柄,描述了将在其中使用该管线的环境。该管线必须仅与提供的渲染通道实例兼容的渲染通道一起使用。有关更多信息,请参阅 渲染通道兼容性。 -
subpass
是将在其中使用此管线的渲染通道中子通道的索引。
子通道着色管线的工作组大小是一个 2D 向量,宽度和高度均为 2 的幂。宽度和高度的最大值取决于具体实现,并且可能因渲染通道中附件的不同格式和采样计数而异。
要查询最大工作组大小,请调用
// Provided by VK_HUAWEI_subpass_shading
VkResult vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
VkDevice device,
VkRenderPass renderpass,
VkExtent2D* pMaxWorkgroupSize);
-
device
是一个本地设备对象的句柄,该对象用于创建给定的渲染通道。 -
renderPass
是一个渲染通道对象的句柄,描述了将在其中使用该管线的环境。该管线必须仅与提供的渲染通道实例兼容的渲染通道一起使用。有关更多信息,请参阅 渲染通道兼容性。 -
pMaxWorkgroupSize
是指向 VkExtent2D 结构的指针。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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
链中。
-
VkGraphicsPipelineCreateInfo
,VkRayTracingPipelineCreateInfoKHR
,VkComputePipelineCreateInfo
VkPipelineRobustnessCreateInfo
描述的鲁棒性行为适用于通过此管线的所有访问 -
VkPipelineShaderStageCreateInfo
:VkPipelineRobustnessCreateInfo
描述的鲁棒性行为适用于源自此着色器阶段的着色器代码的所有访问
如果为管线和管线阶段都指定了 VkPipelineRobustnessCreateInfo
,则为管线阶段指定的 VkPipelineRobustnessCreateInfo
将优先。
当为管线指定 VkPipelineRobustnessCreateInfo
时,它仅影响创建信息指定的管线子集,而不是从管线库链接的子集。 对于 VkGraphicsPipelineCreateInfo,该子集由 VkGraphicsPipelineLibraryCreateInfoEXT::flags
指定。 对于 VkRayTracingPipelineCreateInfoKHR,该子集由 VkRayTracingPipelineCreateInfoKHR::pStages
中的特定阶段指定。
VkPipelineRobustnessCreateInfo
的 storageBuffers
、uniformBuffers
和 vertexInputs
成员的可能值是:
// 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
功能一样。
VkPipelineRobustnessCreateInfo 的 images
成员的可能值是:
// 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
identifierSize
是pIdentifier
指向的缓冲区的大小,以字节为单位。 -
pIdentifier
是指向包含不透明数据的缓冲区的指针,该数据指定标识符。
可以使用任何标识符。如果使用标识符创建的管线需要编译才能完成管线创建调用,则管线编译必须失败,如 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT
定义。
pIdentifier
和 identifierSize
可以从先前查询的 VkShaderModuleIdentifierEXT 获取。
如果要在 设备生成的命令中使用计算管线,方法是用 VkBindPipelineIndirectCommandNV 指定其管线令牌,那么该管线的关联元数据必须保存在指定的缓冲区设备地址,以便稍后用于间接命令生成。缓冲区设备地址必须在创建计算管线时使用 VkComputePipelineIndirectBufferInfoNV 结构在 VkComputePipelineCreateInfo 的 pNext
链中指定。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
deviceAddress
是存储管线元数据的地址。 -
size
是使用 vkGetPipelineIndirectMemoryRequirementsNV 查询的管线元数据的大小。 -
pipelineDeviceAddressCaptureReplay
是管线元数据最初保存的设备地址,现在可以用于重新填充deviceAddress
以进行重放。
如果 pipelineDeviceAddressCaptureReplay
为零,则不请求特定地址。如果 pipelineDeviceAddressCaptureReplay
不为零,则它必须是从同一实现中相同创建的管线检索到的地址。管线元数据必须也放置在相同创建的缓冲区上,并使用 vkCmdUpdatePipelineIndirectBufferNV 命令放在相同偏移量处。
要在设备地址保存计算管线的元数据,请调用
// 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_BIT
和 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
阶段以及分别使用 VK_ACCESS_MEMORY_WRITE_BIT
和 VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV
访问掩码进行同步。
图形管线
图形管线由多个着色器阶段、多个固定功能管线阶段和一个管线布局组成。
要创建图形管线,请调用
// Provided by VK_VERSION_1_0
VkResult vkCreateGraphicsPipelines(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
const VkGraphicsPipelineCreateInfo* pCreateInfos,
const VkAllocationCallbacks* pAllocator,
VkPipeline* pPipelines);
-
device
是创建图形管线的逻辑设备。 -
pipelineCache
是 VK_NULL_HANDLE,表示禁用管线缓存;或者是有效的 管线缓存 对象的句柄,在这种情况下,在该命令的执行期间启用该缓存的使用。 -
createInfoCount
是pCreateInfos
和pPipelines
数组的长度。 -
pCreateInfos
是指向 VkGraphicsPipelineCreateInfo 结构数组的指针。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。 -
pPipelines
是指向 VkPipeline 句柄数组的指针,其中返回生成的图形管线对象。
VkGraphicsPipelineCreateInfo 结构包括一个 VkPipelineShaderStageCreateInfo 结构数组,用于每个所需的活动着色器阶段,以及所有相关固定功能阶段的创建信息和一个管线布局。
管线的创建和返回方式如 多管线创建 所述。
实现或层可能提供隐式缓存。因此,在将 VK_NULL_HANDLE 传递给 |
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。 -
stageCount
是pStages
数组中的条目数。 -
pStages
是一个指向stageCount
个 VkPipelineShaderStageCreateInfo 结构的数组的指针,描述了图形管线中包含的着色器阶段集合。 -
pVertexInputState
是一个指向 VkPipelineVertexInputStateCreateInfo 结构的指针。如果管线包含网格着色器阶段,则会被忽略。如果管线是通过设置VK_DYNAMIC_STATE_VERTEX_INPUT_EXT
动态状态创建的,则它可以为NULL
。 -
pInputAssemblyState
是一个指向 VkPipelineInputAssemblyStateCreateInfo 结构的指针,该结构决定了顶点着色的输入汇编行为,如 绘制命令 中所述。 如果启用了VK_EXT_extended_dynamic_state3
扩展,并且在创建管线时同时设置了VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE
和VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY
动态状态,并且dynamicPrimitiveTopologyUnrestricted
为VK_TRUE
,则它可以为NULL
。如果管线包含网格着色器阶段,则会被忽略。 -
pTessellationState
是一个指向 VkPipelineTessellationStateCreateInfo 结构的指针,该结构定义了细分着色器使用的细分状态。如果管线是通过设置VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT
动态状态创建的,则它可以为NULL
。 -
pViewportState
是一个指向 VkPipelineViewportStateCreateInfo 结构的指针,该结构定义了在启用光栅化时使用的视口状态。 如果启用了VK_EXT_extended_dynamic_state3
扩展,并且在创建管线时同时设置了VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT
和VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT
动态状态,则它可以为NULL
。 -
pRasterizationState
是一个指向 VkPipelineRasterizationStateCreateInfo 结构的指针,该结构定义了光栅化状态。 如果启用了VK_EXT_extended_dynamic_state3
扩展,并且在创建管线时同时设置了VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT
、VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE
、VK_DYNAMIC_STATE_POLYGON_MODE_EXT
、VK_DYNAMIC_STATE_CULL_MODE
、VK_DYNAMIC_STATE_FRONT_FACE
、VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE
、VK_DYNAMIC_STATE_DEPTH_BIAS
和VK_DYNAMIC_STATE_LINE_WIDTH
动态状态,则它可以为NULL
。 -
pMultisampleState
是一个指向 VkPipelineMultisampleStateCreateInfo 结构的指针,该结构定义了在启用光栅化时使用的多重采样状态。 如果启用了VK_EXT_extended_dynamic_state3
扩展,并且在创建管线时同时设置了VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT
、VK_DYNAMIC_STATE_SAMPLE_MASK_EXT
和VK_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_ENABLE
、VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE
、VK_DYNAMIC_STATE_DEPTH_COMPARE_OP
、VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE
、VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE
、VK_DYNAMIC_STATE_STENCIL_OP
和VK_DYNAMIC_STATE_DEPTH_BOUNDS
动态状态,则它可以为NULL
。 -
pColorBlendState
是一个指向 VkPipelineColorBlendStateCreateInfo 结构的指针,该结构定义了在渲染期间访问任何颜色附件时启用光栅化时使用的颜色混合状态。 如果启用了VK_EXT_extended_dynamic_state3
扩展,并且在创建管线时同时设置了VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT
、VK_DYNAMIC_STATE_LOGIC_OP_EXT
、VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT
、VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT
、VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT
和VK_DYNAMIC_STATE_BLEND_CONSTANTS
动态状态,则它可以为NULL
。 -
pDynamicState
是一个指向 VkPipelineDynamicStateCreateInfo 结构的指针,该结构定义了管线状态对象的哪些属性是动态的,并且可以独立于管线状态进行更改。 这可以为NULL
,这意味着管线中没有状态被认为是动态的。 -
layout
是描述管线和与管线一起使用的描述符集的绑定位置。 -
renderPass
是一个渲染通道对象的句柄,描述了将在其中使用该管线的环境。该管线必须仅与提供的渲染通道实例兼容的渲染通道一起使用。有关更多信息,请参阅 渲染通道兼容性。 -
subpass
是将在其中使用此管线的渲染通道中子通道的索引。 -
basePipelineHandle
是一个要从中派生的管线。 -
basePipelineIndex
是一个索引,指向pCreateInfos
参数中要用作派生管线的管线。
参数 basePipelineHandle
和 basePipelineIndex
在管线派生中进行了更详细的描述。
如果任何着色器阶段编译失败,编译日志将报告回应用程序,并生成 VK_ERROR_INVALID_SHADER_NV
。
使用 |
顶点输入状态由以下内容定义:
如果管线在 VkGraphicsPipelineLibraryCreateInfoEXT::flags
中显式或作为默认值包含 VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT
,并且满足创建完整的图形管线所需要的此状态的条件,或者此管线未以任何方式指定光栅化前状态,则该管线必须直接指定此状态。
光栅化前着色器状态由以下内容定义:
-
VkPipelineShaderStageCreateInfo 条目用于:
-
顶点着色器
-
细分控制着色器
-
细分评估着色器
-
几何着色器
-
任务着色器
-
网格着色器
-
-
在 VkPipelineLayout 中,如果指定了
VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT
,则所有具有光栅化前着色器绑定的描述符集。-
如果未指定
VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT
,则必须指定完整的管线布局。
-
-
VkRenderPass 和
subpass
参数 -
VkPipelineRenderingCreateInfo 的
viewMask
参数(忽略格式)
必须指定此状态才能创建完整的图形管线。
如果 pNext
链包含一个 VkGraphicsPipelineLibraryCreateInfoEXT 结构,其中 flags
中包含了 VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT
,或者未指定并默认为包含该值,则必须在管线中指定此状态。
片段着色器状态由以下内容定义:
-
片段着色器的 VkPipelineShaderStageCreateInfo 条目
-
在 VkPipelineLayout 中,如果指定了
VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT
,则包含所有具有片段着色器绑定的描述符集。-
如果未指定
VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT
,则必须指定完整的管线布局。
-
-
如果启用了样本着色或者
renderpass
不是 VK_NULL_HANDLE,则为 VkPipelineMultisampleStateCreateInfo -
VkRenderPass 和
subpass
参数 -
VkPipelineRenderingCreateInfo 的
viewMask
参数(忽略格式) -
包含/省略
VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
标志 -
包含/省略
VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
标志
如果管线直接或通过将其作为管线库包含来指定预光栅化状态,并且 rasterizerDiscardEnable
为 VK_FALSE
或使用了 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE
,则必须指定此状态才能创建完整的图形管线。
如果管线在 VkGraphicsPipelineLibraryCreateInfoEXT::flags
中显式或默认包含 VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT
,并且满足了 完整的图形管线 需要此状态的条件,或者此管线未以任何方式指定预光栅化状态,则该管线必须直接指定此状态。
片段输出状态由以下内容定义:
-
VkRenderPass 和
subpass
参数 -
包含/省略
VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT
和VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT
标志 -
包含/省略
VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT
标志
如果管线直接或通过将其作为管线库包含来指定预光栅化状态,并且 rasterizerDiscardEnable
为 VK_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
。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
viewMask
是用于渲染的视图掩码。 -
colorAttachmentCount
是pColorAttachmentFormats
中的条目数 -
pColorAttachmentFormats
是指向 VkFormat 值数组的指针,该数组定义此管线中使用的颜色附件的格式。 -
depthAttachmentFormat
是定义此管线中使用的深度附件格式的 VkFormat 值。 -
stencilAttachmentFormat
是定义此管线中使用的模板附件格式的 VkFormat 值。
当创建一个没有 VkRenderPass 的管线时,如果 VkGraphicsPipelineCreateInfo 的 pNext
链中包含此结构,则它指定用于渲染的附件的视图掩码和格式。如果未指定此结构,并且管线不包含 VkRenderPass,则 viewMask
和 colorAttachmentCount
为 0
,depthAttachmentFormat
和 stencilAttachmentFormat
为 VK_FORMAT_UNDEFINED
。如果使用有效的 VkRenderPass 创建图形管线,则忽略此结构的参数。
如果 depthAttachmentFormat
、stencilAttachmentFormat
或 pColorAttachmentFormats
的任何元素为 VK_FORMAT_UNDEFINED
,则表示相应的附件在渲染过程中未使用。有效的格式表示 可以 使用附件 - 但在开始渲染时将附件设置为 NULL
仍然是有效的。
如果渲染过程将与外部格式解析附件一起使用,则 VkExternalFormatANDROID 结构 必须 也包含在 VkGraphicsPipelineCreateInfo 的 pNext
链中,定义将使用的解析附件的外部格式。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkPipelineCreateFlagBits2 的位掩码,指定如何生成管线。
如果此结构包含在管线创建结构的 pNext
链中,则使用 flags
代替在该创建结构中传递的相应 flags
值,从而允许指定其他创建标志。
在 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_SUCCESS
,VK_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
所述。如果pipelineBinaryPrefersInternalCache
为VK_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_BIT
和 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT
是有效的。这允许一个管线既是父级,也可能是管线层次结构中的子级。有关更多信息,请参见 管线派生。
当实现查找 管线缓存 中的管线时,如果该管线是使用链接库创建的,则实现应该始终返回使用 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 的掩码。
可以设置的位在
-
VkGraphicsPipelineCreateInfo::
flags
-
VkComputePipelineCreateInfo::
flags
指定如何创建管线,并且是
// 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_BIT
和 VK_PIPELINE_CREATE_DERIVATIVE_BIT
是有效的。这允许管道在管道层次结构中既是父级,也可能是子级。有关详细信息,请参阅 管道派生。
当实现查找管道缓存中的管道时,如果该管道是使用链接库创建的,则实现应该始终返回一个等效的、使用 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
binaryCount
是pPipelineBinaries
数组中元素的数量。 -
pPipelineBinaries
是指向 VkPipelineBinaryKHR 句柄数组的指针。
如果在创建管道时,任何 Vk*PipelineCreateInfo
结构的 pNext
链中包含 binaryCount
大于 0 的 VkPipelineBinaryInfoKHR
结构,则实现必须使用 pPipelineBinaries
中的数据,而不是重新计算它。VkPipelineShaderStageCreateInfo 实例中声明的任何着色器模块标识符或着色器模块都将被忽略。
如果此结构未包含在 pNext
链中,则相当于指定此结构的 binaryCount
为 0
。
VkGraphicsPipelineLibraryCreateInfoEXT
结构定义为
// Provided by VK_EXT_graphics_pipeline_library
typedef struct VkGraphicsPipelineLibraryCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkGraphicsPipelineLibraryFlagsEXT flags;
} VkGraphicsPipelineLibraryCreateInfoEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkGraphicsPipelineLibraryFlagBitsEXT 的位掩码,用于指定正在编译的图形管道的子集。
如果在 VkGraphicsPipelineCreateInfo 的 pNext
链中包含 VkGraphicsPipelineLibraryCreateInfoEXT
结构,则它指定了正在创建的图形管道的子集,不包括来自链接管道库的任何子集。如果使用管道库创建管道,则来自这些库的状态将与所述子集合并。
如果省略此结构,并且 VkGraphicsPipelineCreateInfo::flags
包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
或者 VkGraphicsPipelineCreateInfo::pNext
链包含 libraryCount
大于 0
的 VkPipelineLibraryCreateInfoKHR 结构,则相当于 flags
为 0
。否则,如果省略此结构,则相当于 flags
包含图形管道的所有可能子集(即完整的图形管道)。
// Provided by VK_EXT_graphics_pipeline_library
typedef VkFlags VkGraphicsPipelineLibraryFlagsEXT;
VkGraphicsPipelineLibraryFlagsEXT
是一个位掩码类型,用于设置零个或多个 VkGraphicsPipelineLibraryFlagBitsEXT 的掩码。
VkGraphicsPipelineLibraryCreateInfoEXT 的 flags
成员的可能值,用于指定要编译的图形管线的子集为:
// 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;
-
VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT
指定管线将包含顶点输入接口状态。 -
VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT
指定管线将包含光栅化前着色器状态。 -
VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT
指定管线将包含片元着色器状态。 -
VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT
指定管线将包含片元输出接口状态。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
dynamicStateCount
是pDynamicStates
数组中的元素数量。 -
pDynamicStates
是指向 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;
-
VK_DYNAMIC_STATE_VIEWPORT
指定将忽略 VkPipelineViewportStateCreateInfo 中的pViewports
状态,并且必须在任何绘制命令之前使用 vkCmdSetViewport 动态设置。管线使用的视口数量仍然由 VkPipelineViewportStateCreateInfo 的viewportCount
成员指定。 -
VK_DYNAMIC_STATE_SCISSOR
指定将忽略 VkPipelineViewportStateCreateInfo 中的pScissors
状态,并且必须在任何绘制命令之前使用 vkCmdSetScissor 动态设置。管线使用的剪裁矩形数量仍然由 VkPipelineViewportStateCreateInfo 的scissorCount
成员指定。 -
VK_DYNAMIC_STATE_LINE_WIDTH
指定将忽略 VkPipelineRasterizationStateCreateInfo 中的lineWidth
状态,并且必须在任何为光栅器生成线图元的绘制命令之前使用 vkCmdSetLineWidth 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_BIAS
指定将忽略 VkPipelineRasterizationStateCreateInfo 的pNext
链中包含的任何 VkDepthBiasRepresentationInfoEXT 实例,以及 VkPipelineRasterizationStateCreateInfo 中的depthBiasConstantFactor
、depthBiasClamp
和depthBiasSlopeFactor
状态,并且必须在使用 启用深度偏移 进行任何绘制之前使用 vkCmdSetDepthBias 或 vkCmdSetDepthBias2EXT 动态设置。 -
VK_DYNAMIC_STATE_BLEND_CONSTANTS
指定将忽略 VkPipelineColorBlendStateCreateInfo 中的blendConstants
状态,并且必须在使用VkPipelineColorBlendAttachmentState
成员blendEnable
设置为VK_TRUE
且任何混合函数使用常量混合颜色的管线状态进行任何绘制之前使用 vkCmdSetBlendConstants 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_BOUNDS
指定将忽略 VkPipelineDepthStencilStateCreateInfo 的minDepthBounds
和maxDepthBounds
状态,并且必须在使用 VkPipelineDepthStencilStateCreateInfo 成员depthBoundsTestEnable
设置为VK_TRUE
的管线状态进行任何绘制之前使用 vkCmdSetDepthBounds 动态设置。 -
VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK
指定将忽略 VkPipelineDepthStencilStateCreateInfo 中front
和back
的compareMask
状态,并且必须在使用 VkPipelineDepthStencilStateCreateInfo 成员stencilTestEnable
设置为VK_TRUE
的管线状态进行任何绘制之前使用 vkCmdSetStencilCompareMask 动态设置。 -
VK_DYNAMIC_STATE_STENCIL_WRITE_MASK
指定将忽略 VkPipelineDepthStencilStateCreateInfo 中front
和back
的writeMask
状态,并且必须在使用 VkPipelineDepthStencilStateCreateInfo 成员stencilTestEnable
设置为VK_TRUE
的管线状态进行任何绘制之前使用 vkCmdSetStencilWriteMask 动态设置。 -
VK_DYNAMIC_STATE_STENCIL_REFERENCE
指定 VkPipelineDepthStencilStateCreateInfo 中front
和back
的reference
状态将被忽略,并且必须在任何使用stencilTestEnable
成员设置为VK_TRUE
的管线状态进行绘制之前,使用 vkCmdSetStencilReference 动态设置。 -
VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV
指定 VkPipelineViewportWScalingStateCreateInfoNV 中的pViewportWScalings
状态将被忽略,并且必须在任何使用viewportScalingEnable
成员设置为VK_TRUE
的管线状态进行绘制之前,使用 vkCmdSetViewportWScalingNV 动态设置。 -
VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT
指定 VkPipelineDiscardRectangleStateCreateInfoEXT 中的pDiscardRectangles
状态将被忽略,并且必须在任何绘制或清除命令之前,使用 vkCmdSetDiscardRectangleEXT 动态设置。 -
VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT
指定 VkGraphicsPipelineCreateInfo 链中带有大于零的discardRectangleCount
的 VkPipelineDiscardRectangleStateCreateInfoEXT 结构的存在不会隐式启用丢弃矩形,并且必须在任何绘制命令之前,使用 vkCmdSetDiscardRectangleEnableEXT 动态启用。此功能在至少支持VK_EXT_discard_rectangles
扩展的specVersion
2
的实现上可用。 -
VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT
指定 VkPipelineDiscardRectangleStateCreateInfoEXT 中的discardRectangleMode
状态将被忽略,并且必须在任何绘制命令之前,使用 vkCmdSetDiscardRectangleModeEXT 动态设置。此功能在至少支持VK_EXT_discard_rectangles
扩展的specVersion
2
的实现上可用。 -
VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT
指定 VkPipelineSampleLocationsStateCreateInfoEXT 中的sampleLocationsInfo
状态将被忽略,并且必须在任何绘制或清除命令之前,使用 vkCmdSetSampleLocationsEXT 动态设置。启用自定义采样位置仍然由 VkPipelineSampleLocationsStateCreateInfoEXT 的sampleLocationsEnable
成员指示。 -
VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV
指定 VkPipelineViewportExclusiveScissorStateCreateInfoNV 中的pExclusiveScissors
状态将被忽略,并且必须在任何绘图命令之前,使用 vkCmdSetExclusiveScissorNV 动态设置。 -
VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV
指定必须使用 vkCmdSetExclusiveScissorEnableNV 显式启用独占剪裁,并且 VkPipelineViewportExclusiveScissorStateCreateInfoNV 中的exclusiveScissorCount
值不会隐式启用它们。此功能在至少支持VK_NV_scissor_exclusive
扩展的specVersion
2
的实现上可用。 -
VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV
指定 VkPipelineViewportShadingRateImageStateCreateInfoNV 中的pShadingRatePalettes
状态将被忽略,并且必须在任何绘图命令之前,使用 vkCmdSetViewportShadingRatePaletteNV 动态设置。 -
VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV
指定 VkPipelineViewportCoarseSampleOrderStateCreateInfoNV 中的粗采样顺序状态将被忽略,并且必须在任何绘图命令之前,使用 vkCmdSetCoarseSampleOrderNV 动态设置。 -
VK_DYNAMIC_STATE_LINE_STIPPLE
指定 VkPipelineRasterizationLineStateCreateInfo 中的lineStippleFactor
和lineStipplePattern
状态将被忽略,并且必须在任何使用stippledLineEnable
成员设置为VK_TRUE
的管线状态进行绘制之前,使用 vkCmdSetLineStipple 动态设置。 -
VK_DYNAMIC_STATE_CULL_MODE
指定 VkPipelineRasterizationStateCreateInfo 中的cullMode
状态将被忽略,并且必须在任何绘图命令之前,使用 vkCmdSetCullMode 动态设置。 -
VK_DYNAMIC_STATE_FRONT_FACE
指定 VkPipelineRasterizationStateCreateInfo 中的frontFace
状态将被忽略,并且必须在任何绘图命令之前,使用 vkCmdSetFrontFace 动态设置。 -
VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY
指定 VkPipelineInputAssemblyStateCreateInfo 中的topology
状态仅指定 拓扑类,并且特定的拓扑顺序和邻接关系必须在任何绘图命令之前,使用 vkCmdSetPrimitiveTopology 动态设置。 -
VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT
指定 VkPipelineViewportStateCreateInfo 中的viewportCount
和pViewports
状态将被忽略,并且必须在任何绘制调用之前,使用 vkCmdSetViewportWithCount 动态设置。 -
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT
指定 VkPipelineViewportStateCreateInfo 中的scissorCount
和pScissors
状态将被忽略,并且必须在任何绘制调用之前,使用 vkCmdSetScissorWithCount 动态设置。 -
VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE
指定 VkVertexInputBindingDescription 中的stride
状态将被忽略,并且必须在任何绘制调用之前,使用 vkCmdBindVertexBuffers2 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE
指定 VkPipelineDepthStencilStateCreateInfo 中的depthTestEnable
状态将被忽略,并且必须在任何绘制调用之前,使用 vkCmdSetDepthTestEnable 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE
指定 VkPipelineDepthStencilStateCreateInfo 中的depthWriteEnable
状态将被忽略,并且必须在任何绘制调用之前,使用 vkCmdSetDepthWriteEnable 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_COMPARE_OP
指定 VkPipelineDepthStencilStateCreateInfo 中的depthCompareOp
状态将被忽略,并且必须在任何绘制调用之前,使用 vkCmdSetDepthCompareOp 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE
指定 VkPipelineDepthStencilStateCreateInfo 中的depthBoundsTestEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetDepthBoundsTestEnable 动态设置。 -
VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE
指定 VkPipelineDepthStencilStateCreateInfo 中的stencilTestEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetStencilTestEnable 动态设置。 -
VK_DYNAMIC_STATE_STENCIL_OP
指定VkPipelineDepthStencilStateCreateInfo
中front
和back
的failOp
、passOp
、depthFailOp
和compareOp
状态将被忽略,并且必须在任何使用管道状态进行绘制之前,使用 vkCmdSetStencilOp 动态设置,其中VkPipelineDepthStencilStateCreateInfo
成员stencilTestEnable
设置为VK_TRUE
。 -
VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT
指定 VkPipelineTessellationStateCreateInfo 中的patchControlPoints
状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetPatchControlPointsEXT 动态设置。 -
VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE
指定 VkPipelineRasterizationStateCreateInfo 中的rasterizerDiscardEnable
状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetRasterizerDiscardEnable 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE
指定 VkPipelineRasterizationStateCreateInfo 中的depthBiasEnable
状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetDepthBiasEnable 动态设置。 -
VK_DYNAMIC_STATE_LOGIC_OP_EXT
指定 VkPipelineColorBlendStateCreateInfo 中的logicOp
状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetLogicOpEXT 动态设置。 -
VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE
指定 VkPipelineInputAssemblyStateCreateInfo 中的primitiveRestartEnable
状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetPrimitiveRestartEnable 动态设置。 -
VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR
指定 VkPipelineFragmentShadingRateStateCreateInfoKHR 和 VkPipelineFragmentShadingRateEnumStateCreateInfoNV 中的状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetFragmentShadingRateKHR 或 vkCmdSetFragmentShadingRateEnumNV 动态设置。 -
VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR
指定管道的默认堆栈大小计算将被忽略,并且必须在执行任何光线追踪调用之前使用 vkCmdSetRayTracingPipelineStackSizeKHR 动态设置。 -
VK_DYNAMIC_STATE_VERTEX_INPUT_EXT
指定pVertexInputState
状态将被忽略,并且必须在使用任何绘制命令之前使用 vkCmdSetVertexInputEXT 动态设置。 -
VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT
指定 VkPipelineColorWriteCreateInfoEXT 中的pColorWriteEnables
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetColorWriteEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT
指定 VkPipelineTessellationDomainOriginStateCreateInfo 中的domainOrigin
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetTessellationDomainOriginEXT 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT
指定 VkPipelineRasterizationStateCreateInfo 中的depthClampEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetDepthClampEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_POLYGON_MODE_EXT
指定 VkPipelineRasterizationStateCreateInfo 中的polygonMode
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetPolygonModeEXT 动态设置。 -
VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT
指定 VkPipelineMultisampleStateCreateInfo 中的rasterizationSamples
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetRasterizationSamplesEXT 动态设置。 -
VK_DYNAMIC_STATE_SAMPLE_MASK_EXT
指定 VkPipelineMultisampleStateCreateInfo 中的pSampleMask
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetSampleMaskEXT 动态设置。 -
VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT
指定 VkPipelineMultisampleStateCreateInfo 中的alphaToCoverageEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetAlphaToCoverageEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT
指定 VkPipelineMultisampleStateCreateInfo 中的alphaToOneEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetAlphaToOneEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT
指定 VkPipelineColorBlendStateCreateInfo 中的logicOpEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetLogicOpEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT
指定 VkPipelineColorBlendAttachmentState 中的blendEnable
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetColorBlendEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT
指定 VkPipelineColorBlendAttachmentState 中的srcColorBlendFactor
、dstColorBlendFactor
、colorBlendOp
、srcAlphaBlendFactor
、dstAlphaBlendFactor
和alphaBlendOp
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetColorBlendEquationEXT 动态设置。 -
VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT
指定 VkPipelineColorBlendAttachmentState 中的colorWriteMask
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetColorWriteMaskEXT 动态设置。 -
VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT
指定 VkPipelineRasterizationStateStreamCreateInfoEXT 中的rasterizationStream
状态将被忽略,并且必须在使用任何绘制调用之前使用 vkCmdSetRasterizationStreamEXT 动态设置。 -
VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT
指定 VkPipelineRasterizationConservativeStateCreateInfoEXT 中的conservativeRasterizationMode
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetConservativeRasterizationModeEXT 动态设置。 -
VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT
指定 VkPipelineRasterizationConservativeStateCreateInfoEXT 中的extraPrimitiveOverestimationSize
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetExtraPrimitiveOverestimationSizeEXT 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT
指定 VkPipelineRasterizationDepthClipStateCreateInfoEXT 中的depthClipEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetDepthClipEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT
指定 VkPipelineSampleLocationsStateCreateInfoEXT 中的sampleLocationsEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetSampleLocationsEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT
指定 VkPipelineColorBlendAttachmentState 中的colorBlendOp
状态,以及 VkPipelineColorBlendAdvancedStateCreateInfoEXT 中的srcPremultiplied
、dstPremultiplied
和blendOverlap
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetColorBlendAdvancedEXT 动态设置。 -
VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT
指定 VkPipelineRasterizationProvokingVertexStateCreateInfoEXT 中的provokingVertexMode
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetProvokingVertexModeEXT 动态设置。 -
VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT
指定 VkPipelineRasterizationLineStateCreateInfo 中的lineRasterizationMode
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetLineRasterizationModeEXT 动态设置。 -
VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT
指定 VkPipelineRasterizationLineStateCreateInfo 中的stippledLineEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetLineStippleEnableEXT 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT
指定 VkPipelineViewportDepthClipControlCreateInfoEXT 中的negativeOneToOne
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetDepthClipNegativeOneToOneEXT 动态设置。 -
VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT
指定 VkPipelineViewportDepthClampControlCreateInfoEXT 中的depthClampMode
和pDepthClampRange
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetDepthClampRangeEXT 动态设置。 -
VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV
指定 VkPipelineViewportWScalingStateCreateInfoNV 中的viewportWScalingEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetViewportWScalingEnableNV 动态设置。 -
VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV
指定 VkPipelineViewportSwizzleStateCreateInfoNV 中的viewportCount
和pViewportSwizzles
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetViewportSwizzleNV 动态设置。 -
VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV
指定 VkPipelineCoverageToColorStateCreateInfoNV 中的coverageToColorEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetCoverageToColorEnableNV 动态设置。 -
VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV
指定 VkPipelineCoverageToColorStateCreateInfoNV 中的coverageToColorLocation
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetCoverageToColorLocationNV 动态设置。 -
VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV
指定 VkPipelineCoverageModulationStateCreateInfoNV 中的coverageModulationMode
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetCoverageModulationModeNV 动态设置。 -
VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV
指定 VkPipelineCoverageModulationStateCreateInfoNV 中的coverageModulationTableEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetCoverageModulationTableEnableNV 动态设置。 -
VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV
指定 VkPipelineCoverageModulationStateCreateInfoNV 中的coverageModulationTableCount
和pCoverageModulationTable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetCoverageModulationTableNV 动态设置。 -
VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV
指定 VkPipelineViewportShadingRateImageStateCreateInfoNV 中的shadingRateImageEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetShadingRateImageEnableNV 动态设置。 -
VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV
指定 VkPipelineRepresentativeFragmentTestStateCreateInfoNV 中的representativeFragmentTestEnable
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetRepresentativeFragmentTestEnableNV 动态设置。 -
VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV
指定 VkPipelineCoverageReductionStateCreateInfoNV 中的coverageReductionMode
状态将被忽略,并且必须在使用任何绘制调用之前,通过 vkCmdSetCoverageReductionModeNV 动态设置。 -
VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT
指定VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT
和VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT
标志将被忽略,并且**必须**在使用任何绘制调用之前,通过 vkCmdSetAttachmentFeedbackLoopEnableEXT 动态设置。
图形管线阶段的有效组合
图元处理可以由顶点、细分和几何着色器阶段在每个图元的基础上处理,也可以使用任务和网格着色器阶段在每个网格的基础上处理。如果管线包含网格着色器阶段,则使用网格管线,否则使用图元管线。
如果省略任务着色器,则会跳过任务着色阶段。
如果省略细分着色器阶段,则会跳过管线的细分着色和固定功能阶段。
如果省略几何着色器,则会跳过几何着色阶段。
如果省略片元着色器,则片元颜色输出具有**未定义**的值,并且片元深度值由 片元操作 状态确定。这**可以**用于仅深度渲染。
管线中存在着色器阶段通过包含一个有效的 VkPipelineShaderStageCreateInfo 来指示,其中 module
和 pName
选择着色器模块中的入口点,并且该入口点对于 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
groupCount
是pGroups
数组中的元素数量。 -
pGroups
是指向 VkGraphicsShaderGroupCreateInfoNV 结构的数组的指针,该结构指定每个着色器组覆盖原始 VkGraphicsPipelineCreateInfo 的哪个状态。 -
pipelineCount
是pPipelines
数组中的元素数量。 -
pPipelines
是指向图形VkPipeline
结构数组的指针,这些结构在创建的管线中被引用,包括它们的所有着色器组。
当通过索引引用着色器组时,在引用的管线中定义的组被视为好像它们被定义为 pGroups
中的附加条目。它们按照在 pPipelines
数组中出现的顺序以及在定义这些管线时在 pGroups
数组中出现的顺序附加。
应用程序**必须**基于使用它们的所有管线来维护所有此类被引用管线的生命周期。
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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stageCount
是pStages
数组中的条目数。 -
pStages
是指向 VkPipelineShaderStageCreateInfo 结构数组的指针,该结构指定此着色器组中包含的着色器阶段集。 -
pVertexInputState
是指向 VkPipelineVertexInputStateCreateInfo 结构的指针。 -
pTessellationState
是指向 VkPipelineTessellationStateCreateInfo 结构的指针,如果着色器组不包含细分控制着色器阶段和细分评估着色器阶段,则会被忽略。
光线追踪管线
光线追踪管线由多个着色器阶段、固定功能遍历阶段以及管线布局组成。
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,表示禁用管线缓存,要么是有效的管线缓存对象的句柄,在这种情况下,在该命令执行期间启用该缓存的使用。 -
createInfoCount
是pCreateInfos
和pPipelines
数组的长度。 -
pCreateInfos
是指向 VkRayTracingPipelineCreateInfoNV 结构体数组的指针。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。 -
pPipelines
是指向将返回结果光线追踪管线对象的数组的指针。
管线的创建和返回方式如 多管线创建 所述。
要创建光线追踪管线,请调用
// 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,表示禁用管线缓存,要么是有效的管线缓存对象的句柄,在这种情况下,在该命令执行期间启用该缓存的使用。 -
createInfoCount
是pCreateInfos
和pPipelines
数组的长度。 -
pCreateInfos
是指向 VkRayTracingPipelineCreateInfoKHR 结构体数组的指针。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。 -
pPipelines
是指向将返回结果光线追踪管线对象的数组的指针。
如果当 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplay
启用时,实现无法重用 VkRayTracingShaderGroupCreateInfoKHR::pShaderGroupCaptureReplayHandle
中提供的着色器组句柄,则会返回 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。 -
stageCount
是pStages
数组中的条目数。 -
pStages
是指向 VkPipelineShaderStageCreateInfo 结构体数组的指针,该数组指定光线追踪管线中要包含的着色器阶段集。 -
groupCount
是pGroups
数组中的条目数。 -
pGroups
是指向 VkRayTracingShaderGroupCreateInfoNV 结构体数组的指针,该数组描述光线追踪管线中每个着色器组中要包含的着色器阶段集。 -
maxRecursionDepth
是此管线执行的着色器的最大递归深度。 -
layout
是描述管线和与管线一起使用的描述符集的绑定位置。 -
basePipelineHandle
是一个要从中派生的管线。 -
basePipelineIndex
是一个索引,指向pCreateInfos
参数中要用作派生管线的管线。
参数 basePipelineHandle
和 basePipelineIndex
在管线派生中进行了更详细的描述。
如果 pNext
链包含 VkPipelineCreateFlags2CreateInfo 结构,则使用该结构的 VkPipelineCreateFlags2CreateInfo::flags
,而不是此结构中的 flags
。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkPipelineCreateFlagBits 的位掩码,用于指定如何生成管线。 -
stageCount
是pStages
数组中的条目数。 -
pStages
是指向stageCount
个 VkPipelineShaderStageCreateInfo 结构的数组的指针,这些结构描述了将包含在光线追踪管线中的着色器阶段的集合。 -
groupCount
是pGroups
数组中的条目数。 -
pGroups
是指向groupCount
个 VkRayTracingShaderGroupCreateInfoKHR 结构的数组的指针,这些结构描述了将包含在光线追踪管线中每个着色器组中的着色器阶段的集合。 -
maxPipelineRayRecursionDepth
是此管线执行的着色器的 最大递归深度。 -
pLibraryInfo
是指向 VkPipelineLibraryCreateInfoKHR 结构的指针,该结构定义要包含的管线库。 -
pLibraryInterface
是指向 VkRayTracingPipelineInterfaceCreateInfoKHR 结构的指针,该结构定义使用管线库时的其他信息。 -
pDynamicState
是指向 VkPipelineDynamicStateCreateInfo 结构的指针,用于指示管线状态对象的哪些属性是动态的,并且可以独立于管线状态进行更改。 这可以为NULL
,这意味着管线中没有状态被视为动态的。 -
layout
是描述管线和与管线一起使用的描述符集的绑定位置。 -
basePipelineHandle
是一个要从中派生的管线。 -
basePipelineIndex
是一个索引,指向pCreateInfos
参数中要用作派生管线的管线。
参数 basePipelineHandle
和 basePipelineIndex
在管线派生中进行了更详细的描述。
当指定 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
。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
type
是此结构中指定的命中组类型。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV
,则generalShader
是组中来自 VkRayTracingPipelineCreateInfoNV::pStages
的射线生成、未命中或可调用着色器的索引,否则为VK_SHADER_UNUSED_NV
。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV
或VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV
,则closestHitShader
是组中来自 VkRayTracingPipelineCreateInfoNV::pStages
的最近命中着色器的可选索引,否则为VK_SHADER_UNUSED_NV
。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV
或VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV
,则anyHitShader
是组中来自 VkRayTracingPipelineCreateInfoNV::pStages
的任意命中着色器的可选索引,否则为VK_SHADER_UNUSED_NV
。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV
,则intersectionShader
是组中来自 VkRayTracingPipelineCreateInfoNV::pStages
的相交着色器的索引,否则为VK_SHADER_UNUSED_NV
。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
type
是此结构中指定的命中组类型。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR
,则generalShader
是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages
的光线生成、未命中或可调用着色器的索引;否则为VK_SHADER_UNUSED_KHR
。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR
或VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR
,则closestHitShader
是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages
的最近命中着色器的可选索引;否则为VK_SHADER_UNUSED_KHR
。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR
或VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR
,则anyHitShader
是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages
的任意命中着色器的可选索引;否则为VK_SHADER_UNUSED_KHR
。 -
如果着色器组的
type
为VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR
,则intersectionShader
是该组中来自 VkRayTracingPipelineCreateInfoKHR::pStages
的相交着色器的索引;否则为VK_SHADER_UNUSED_KHR
。 -
pShaderGroupCaptureReplayHandle
为NULL
,或者是指向此着色器组的重放信息的指针,该信息从 vkGetRayTracingCaptureReplayShaderGroupHandlesKHR 查询获得,如 光线追踪捕获重放 中所述。 如果 VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplay
为VK_FALSE
,则忽略此项。
如果管道创建时使用了 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
并且启用了 pipelineLibraryGroupHandles 特性,则 pShaderGroupCaptureReplayHandle
会被所有链接到此管道的管道继承,并且对于任何引用此管道库的管道,保持按位相同。
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_KHR
、VK_SHADER_STAGE_MISS_BIT_KHR
或VK_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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxPipelineRayPayloadSize
是管道中任何着色器使用的最大负载大小(以字节为单位)。 -
maxPipelineRayHitAttributeSize
是管道中任何着色器使用的最大属性结构大小(以字节为单位)。
maxPipelineRayPayloadSize
的计算方式是 RayPayloadKHR
或 IncomingRayPayloadKHR
存储类中声明的块的最大大小(以字节为单位)。maxPipelineRayHitAttributeSize
的计算方式是 HitAttributeKHR
存储类中声明的任何块的最大大小(以字节为单位)。由于这些存储类中的变量没有显式的偏移量,因此大小的计算方式应假定每个变量都具有一个 标量对齐,该对齐等于该块的任何成员的最大标量对齐。
|
要查询光线追踪管道中着色器的不透明句柄,请调用
// 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::pGroups
或 VkRayTracingPipelineCreateInfoNV::pGroups
数组中检索句柄的第一个组的索引。 -
groupCount
是要检索的着色器句柄的数量。 -
dataSize
是pData
指向的缓冲区的大小(以字节为单位)。 -
pData
是指向应用程序分配的缓冲区的指针,结果将写入该缓冲区。
成功后,一个包含 groupCount
个着色器句柄的数组将被写入 pData
,每个元素的大小为 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleSize
。
如果 pipeline
是使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
创建的,并且启用了 pipelineLibraryGroupHandles 功能,则应用程序可以从该管道中查询组句柄,即使该管道是一个库并且从未绑定到命令缓冲区。 对于任何引用管道库的 pipeline
,这些组句柄的位值保持相同。组索引的分配方式与没有 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
创建管道的方式相同。
要查询光线追踪管道中着色器组的不透明捕获数据,请调用
// 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
是要检索的着色器句柄的数量。 -
dataSize
是pData
指向的缓冲区的大小(以字节为单位)。 -
pData
是指向应用程序分配的缓冲区的指针,结果将写入该缓冲区。
成功后,一个包含 groupCount
个着色器句柄的数组将被写入 pData
,每个元素的大小为 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleCaptureReplaySize
。
查询后,此不透明数据可以在管道创建时(在后续执行中)使用 VkRayTracingShaderGroupCreateInfoKHR::pShaderGroupCaptureReplayHandle
提供,如 光线追踪捕获/重放 中所述。
如果 pipeline
是使用 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
创建的,并且启用了pipelineLibraryGroupHandles 功能,则应用程序可以从该管线查询捕获重放组句柄。对于任何引用管线库的 pipeline
,捕获重放句柄在按位上保持相同。组索引的分配方式与没有 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
创建管线时的方式相同。
光线追踪管线可以包含比图形或计算管线更多的着色器,因此为了允许在管线内并行编译着色器,应用程序可以选择将编译推迟到稍后的时间点。
要编译管线中的延迟着色器,请调用
// Provided by VK_NV_ray_tracing
VkResult vkCompileDeferredNV(
VkDevice device,
VkPipeline pipeline,
uint32_t shader);
-
device
是包含光线追踪管道的逻辑设备。 -
pipeline
是包含着色器的光线追踪管道对象。 -
shader
是要编译的着色器的索引。
要查询光线追踪管线中着色器组中着色器的管线堆栈大小,请调用
// Provided by VK_KHR_ray_tracing_pipeline
VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR(
VkDevice device,
VkPipeline pipeline,
uint32_t group,
VkShaderGroupShaderKHR groupShader);
-
device
是包含光线追踪管道的逻辑设备。 -
pipeline
是包含着色器组的光线追踪管线对象。 -
group
是要查询的着色器组的索引。 -
groupShader
是要查询的组中的着色器类型。
返回值是指定着色器从指定着色器组调用时的光线追踪管线堆栈大小(以字节为单位)。
vkGetRayTracingShaderGroupStackSizeKHR 中 groupShader
的可能值为
// 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;
-
VK_SHADER_GROUP_SHADER_GENERAL_KHR
使用在组中用 VkRayTracingShaderGroupCreateInfoKHR::generalShader
指定的着色器 -
VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR
使用在组中用 VkRayTracingShaderGroupCreateInfoKHR::closestHitShader
指定的着色器 -
VK_SHADER_GROUP_SHADER_ANY_HIT_KHR
使用在组中用 VkRayTracingShaderGroupCreateInfoKHR::anyHitShader
指定的着色器 -
VK_SHADER_GROUP_SHADER_INTERSECTION_KHR
使用在组中用 VkRayTracingShaderGroupCreateInfoKHR::intersectionShader
指定的着色器
要动态设置光线追踪管线的堆栈大小,请调用
// 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
时创建时,此命令设置后续光线追踪命令的堆栈大小。否则,堆栈大小将按照光线追踪管线堆栈中所述计算。
管线销毁
要销毁管线,请调用
// Provided by VK_VERSION_1_0
void vkDestroyPipeline(
VkDevice device,
VkPipeline pipeline,
const VkAllocationCallbacks* pAllocator);
-
device
是销毁管线的逻辑设备。 -
pipeline
是要销毁的管线的句柄。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。
管线派生
管线派生是从父管线创建的子管线,其中子管线和父管线预计具有很多共同点。
派生管线的目的是使用父管线作为起点,从而更便宜地创建它们,并且在同一父管线的子管线之间切换/绑定更高效(在主机或设备上)。
通过在 Vk*PipelineCreateInfo
结构中设置 VK_PIPELINE_CREATE_DERIVATIVE_BIT
标志来创建派生管线。如果设置了此标志,则结构的 basePipelineHandle
或 basePipelineIndex
成员 必须 有且仅有一个具有有效的句柄/索引,并指定父管线。如果使用 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 句柄的指针,其中返回生成的管线缓存对象。
应用程序 可以 使用 |
创建后,可以将管线缓存传递给 vkCreateGraphicsPipelines vkCreateRayTracingPipelinesKHR、vkCreateRayTracingPipelinesNV 和 vkCreateComputePipelines 命令。如果传递到这些命令中的管线缓存不是 VK_NULL_HANDLE,则实现将查询它以查找可能的重用机会并使用新内容对其进行更新。在这些命令中对管线缓存对象的使用在内部同步,并且可以在多个线程中同时使用同一管线缓存对象。
如果 pCreateInfo
的 flags
包括 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT
,则修改返回的管线缓存对象的所有命令 必须 进行外部同步。
实现 应该 尽一切努力将所有临界区限制为实际访问缓存,这预计比 |
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkPipelineCacheCreateFlagBits 的位掩码,指定管线缓存的行为。 -
initialDataSize
是pInitialData
中的字节数。如果initialDataSize
为零,则管线缓存最初将为空。 -
pInitialData
是指向先前检索的管线缓存数据的指针。如果管线缓存数据与设备不兼容(如下定义),则管线缓存最初将为空。如果initialDataSize
为零,则忽略pInitialData
。
// 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 用作 vkMergePipelineCaches 的dstCache
参数时,它不需要 外部同步。此标志与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
是要将结果合并到的管线缓存的句柄。 -
srcCacheCount
是pSrcCaches
数组的长度。 -
pSrcCaches
是指向管线缓存句柄数组的指针,这些句柄将合并到dstCache
中。合并后会包含dstCache
的先前内容。
合并操作的详细信息取决于实现,但实现应该合并指定管线的内容并删除重复条目。 |
检索管线缓存数据
可以使用以下命令从管线缓存对象检索数据:
// Provided by VK_VERSION_1_0
VkResult vkGetPipelineCacheData(
VkDevice device,
VkPipelineCache pipelineCache,
size_t* pDataSize,
void* pData);
-
device
是拥有管线缓存的逻辑设备。 -
pipelineCache
是要从中检索数据的管线缓存。 -
pDataSize
是指向与管线缓存中数据量相关的size_t
值的指针,如下所述。 -
pData
为NULL
或指向缓冲区的指针。
如果 pData
为 NULL
,则将以字节为单位返回可以从管线缓存中检索的最大数据大小,并在 pDataSize
中返回。否则,pDataSize
必须指向应用程序设置为缓冲区大小(以字节为单位)的变量,该缓冲区由 pData
指向,并且在返回时,变量将被实际写入 pData
的数据量覆盖。如果 pDataSize
小于管线缓存可以检索的最大大小,则最多会将 pDataSize
字节写入 pData
,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以表明并非所有管线缓存都已返回。
写入 pData
的任何数据都是有效的,并且可以作为传递给 vkCreatePipelineCache
的 VkPipelineCacheCreateInfo 结构的 pInitialData
成员提供。
除非在两次调用之间调用了修改缓存内容的命令,否则使用相同参数对 vkGetPipelineCacheData
的两次调用必须检索相同的数据。
写入 pData
的初始字节必须是 管线缓存头 部分中描述的标头。
如果 pDataSize
小于存储此标头所需的大小,则不会将任何内容写入 pData
,并将 0 写入 pDataSize
。
管线缓存头
应用程序可以存储从管线缓存检索的数据,并在应用程序的未来运行中使用这些数据来填充新的管线缓存对象。然而,管线编译的结果可能取决于供应商 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 字节。如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法在正确的偏移量处设置值。
管线缓存头的 headerVersion
值的可能值如下
// Provided by VK_VERSION_1_0
typedef enum VkPipelineCacheHeaderVersion {
VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1,
} VkPipelineCacheHeaderVersion;
-
VK_PIPELINE_CACHE_HEADER_VERSION_ONE
指定管线缓存的版本一,由 VkPipelineCacheHeaderVersionOne 描述。
销毁管线缓存
要销毁管线缓存,请调用
// Provided by VK_VERSION_1_0
void vkDestroyPipelineCache(
VkDevice device,
VkPipelineCache pipelineCache,
const VkAllocationCallbacks* pAllocator);
-
device
是销毁管线缓存对象的逻辑设备。 -
pipelineCache
是要销毁的管线缓存的句柄。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。
管线二进制文件
管线二进制对象允许在管线之间以及应用程序的运行之间重用管线构造的结果。通过从 VkPipeline 对象中提取管线二进制文件,将其与相应的 VkPipelineBinaryKeyKHR 关联,然后在创建管线时将 VkPipelineBinaryInfoKHR 添加到任何 Vk*PipelineCreateInfo
的 pNext
链中来实现重用。通过从 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);
-
device
是创建管线对象的逻辑设备。 -
pPipelineCreateInfo
是NULL
或指向 VkPipelineCreateInfoKHR 结构的指针。 -
pPipelineKey
是指向 VkPipelineBinaryKeyKHR 结构的指针,其中返回结果密钥。
如果 pPipelineCreateInfo
为 NULL
,则实现必须返回适用于所有管线的全局密钥。如果以这种方式获得的密钥在保存和还原从不同的 VkDevice 中的 vkGetPipelineBinaryDataKHR 获得的数据之间发生变化,则应用程序必须假定还原的数据无效,并且不能传递给 vkCreatePipelineBinariesKHR。否则,应用程序可以假定数据仍然有效。
如果 pPipelineCreateInfo
不为 NULL
,则获取的密钥用作比较两个管线创建信息结构的方法。实现可能不会比较管线创建信息的不会影响最终二进制输出的部分。如果使用着色器模块标识符而不是着色器模块,则生成的 pPipelineKey
必须等于从其中查询标识符的着色器模块生成密钥时生成的密钥。如果两个 pPipelineKey
的内容相等,则使用两个 pPipelineCreateInfo->pname
:pNext 创建信息创建的管线必须生成相同的 VkPipelineBinaryKHR 内容。
管线键与管线二进制键不同。管线二进制键只能在编译后获得。管线键旨在可选地允许将管线创建信息与多个管线二进制键关联。
VkPipelineCreateInfoKHR
结构定义为
// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineCreateInfoKHR {
VkStructureType sType;
void* pNext;
} VkPipelineCreateInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是指向扩展此结构的结构的指针。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
keySize
是key
中返回的有效数据的大小(以字节为单位)。 -
key
是一个指定管线二进制键的不透明数据缓冲区。
超出前 keySize
字节的任何返回值都是未定义的。实现必须返回一个大于 0 且小于等于 VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR
的 keySize
。
如果 keySize
相等且 key
的前 keySize
字节比较相等,则认为两个键相等。
对于不同的二进制文件,实现可能返回不同的 keySize
。
实现应该确保 keySize
足够大,以唯一标识一个管线二进制文件。
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 结构的指针,其中返回生成的管线二进制文件。
实现将尝试创建所有管线二进制文件。如果任何管线二进制文件的创建失败,则
-
pPipelineBinaries
输出数组中的相应条目将填充 VK_NULL_HANDLE。 -
vkCreatePipelineBinariesKHR 返回的
VkResult
将包含pBinaries
输出数组中第一个包含 VK_NULL_HANDLE 的条目的错误值。
VkPipelineBinaryHandlesInfoKHR
结构定义为
// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryHandlesInfoKHR {
VkStructureType sType;
const void* pNext;
uint32_t pipelineBinaryCount;
VkPipelineBinaryKHR* pPipelineBinaries;
} VkPipelineBinaryHandlesInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pipelineBinaryCount
是与此管线关联的二进制文件数,或pPipelineBinaries
数组中的条目数。 -
pPipelineBinaries
是NULL
或指向 VkPipelineBinaryKHR 句柄数组的指针,其中返回生成的管线二进制文件。
如果 pPipelineBinaries
为 NULL
,则将在 pipelineBinaryCount
中返回将要创建的二进制文件数。否则,pipelineBinaryCount
必须是 pPipelineBinaries
数组中的条目数,并且从 vkCreatePipelineBinariesKHR 返回时,pipelineBinaryCount
将被实际写入 pPipelineBinaries
的句柄数覆盖。如果 pipelineBinaryCount
的值小于将要创建的二进制文件数,则最多将 pipelineBinaryCount
个句柄写入 pPipelineBinaries
,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示 pPipelineBinaries
不足以创建所有二进制文件。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pKeysAndDataInfo
是NULL
或指向 VkPipelineBinaryKeysAndDataKHR 结构的指针,该结构包含用于创建管线二进制文件的键和数据。 -
pipeline
是 VK_NULL_HANDLE 或包含用于创建管线二进制文件的数据的VkPipeline
。 -
pPipelineCreateInfo
是NULL
或指向包含管线创建信息的 VkPipelineCreateInfoKHR 结构的指针。这用于探测实现的内部缓存中是否存在管线二进制文件。
当 pPipelineCreateInfo
不为 NULL
时,如果 pipelineBinaryInternalCache
为 VK_TRUE
,则实现将尝试从应用程序外部的内部缓存检索管线二进制数据。应用程序可以使用此来确定是否可以在不编译的情况下创建管线。如果实现由于缺少内部缓存条目而无法创建管线二进制文件,则返回 VK_PIPELINE_BINARY_MISSING_KHR
。如果创建成功,则可以使用生成的二进制文件创建管线。在这种情况下,即使之前使用相同参数成功创建了管线二进制文件,也可能出于任何原因返回 VK_PIPELINE_BINARY_MISSING_KHR
。
如果 pipelineBinaryPrecompiledInternalCache
为 VK_TRUE
,则即使应用程序之前未使用 pPipelineCreateInfo
创建过管线二进制文件,实现可能也能够创建管线二进制文件。
在某些平台上,内部管线缓存可能会在应用程序运行之前预先填充。 |
VkPipelineBinaryKeysAndDataKHR
结构的定义如下:
// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryKeysAndDataKHR {
uint32_t binaryCount;
const VkPipelineBinaryKeyKHR* pPipelineBinaryKeys;
const VkPipelineBinaryDataKHR* pPipelineBinaryData;
} VkPipelineBinaryKeysAndDataKHR;
-
binaryCount
是pPipelineBinaryKeys
和pPipelineBinaryData
数组的大小。 -
pPipelineBinaryKeys
是指向包含管线二进制键的 VkPipelineBinaryKeyKHR 结构数组的指针。 -
pPipelineBinaryData
是指向包含管线二进制数据的 VkPipelineBinaryDataKHR 结构数组的指针。
VkPipelineBinaryDataKHR
结构的定义如下:
// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryDataKHR {
size_t dataSize;
void* pData;
} VkPipelineBinaryDataKHR;
-
dataSize
是pData
缓冲区的大小(以字节为单位)。 -
pData
是指向包含从vkGetPipelineBinaryDataKHR
获取的管线二进制数据的size
字节缓冲区的指针。
检索管线二进制数据
可以使用以下命令从管线二进制对象检索数据:
// 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
或指向缓冲区的指针。
如果 pPipelineBinaryData
为 NULL
,则存储二进制文件所需的数据大小(以字节为单位)将返回到 pPipelineBinaryDataSize
中。否则,pPipelineBinaryDataSize
必须包含 pPipelineBinaryData
指向的缓冲区的大小(以字节为单位),并且在返回时,pPipelineBinaryDataSize
将被覆盖为存储二进制文件所需的数据大小(以字节为单位)。如果 pPipelineBinaryDataSize
小于存储二进制文件所需的大小,则不会写入任何内容到 pPipelineBinaryData
,并且将返回 VK_ERROR_NOT_ENOUGH_SPACE_KHR
,而不是 VK_SUCCESS
。
如果调用返回其中一个成功返回代码,则无论 pPipelineBinaryData
是否为 NULL
,都会将管线二进制键写入 pPipelineBinaryKey
。
如果 pipelineBinaryCompressedData 为 VK_FALSE
,则实现应不向应用程序返回压缩的管线二进制数据。
VkPipelineBinaryDataInfoKHR
结构体的定义如下
// Provided by VK_KHR_pipeline_binary
typedef struct VkPipelineBinaryDataInfoKHR {
VkStructureType sType;
void* pNext;
VkPipelineBinaryKHR pipelineBinary;
} VkPipelineBinaryDataInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pipelineBinary
是从中获取数据的管线二进制。
释放捕获的管线二进制数据
要释放使用 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
的状态。
使用 |
VkReleaseCapturedPipelineDataInfoKHR
结构体的定义如下
// Provided by VK_KHR_pipeline_binary
typedef struct VkReleaseCapturedPipelineDataInfoKHR {
VkStructureType sType;
void* pNext;
VkPipeline pipeline;
} VkReleaseCapturedPipelineDataInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pipeline
是要从中释放数据的管线对象的句柄。
销毁管线二进制
要销毁一个 VkPipelineBinaryKHR,请调用
// Provided by VK_KHR_pipeline_binary
void vkDestroyPipelineBinaryKHR(
VkDevice device,
VkPipelineBinaryKHR pipelineBinary,
const VkAllocationCallbacks* pAllocator);
-
device
是创建管线二进制对象的逻辑设备。 -
pipelineBinary
是要销毁的管线二进制对象的句柄。 -
pAllocator
控制主机内存分配,如 内存分配 章节所述。
特化常量
特化常量是一种机制,通过这种机制,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;
-
mapEntryCount
是pMapEntries
数组中的条目数。 -
pMapEntries
是一个指向VkSpecializationMapEntry
结构数组的指针,该数组将常量 ID 映射到pData
中的偏移量。 -
dataSize
是pData
缓冲区的字节大小。 -
pData
包含要特化的实际常量值。
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,则该映射条目不会影响管线的行为。
在人类可读的 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
作为 VkPipelineShaderStageCreateInfo 的 pSpecializationInfo
参数传递时,我们将创建一个运行时指定本地工作组大小的计算管线。
另一个例子是,应用程序有一个 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
libraryCount
是pLibraries
中管线库的数量。 -
pLibraries
是指向 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
是要绑定的管线。
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
是要绑定的着色器组。
与着色器对象的交互
如果启用了shaderObject
功能,则应用程序**可以**同时使用管线和着色器对象。管线和着色器对象之间的交互在与管线的交互中进行了描述。
动态状态
当绑定管线对象时,任何未指定为动态的管线对象状态都将应用于命令缓冲区状态。指定为动态的管线对象状态此时不会应用于命令缓冲区状态。
相反,动态状态**可以**随时修改,并且在命令缓冲区的生命周期内持续存在,或者直到被另一个动态状态设置命令修改,或者通过绑定在该状态中静态指定的管线而失效。
如果启用了commandBufferInheritance
功能,则队列中先前执行的命令缓冲区中的所有有效状态都会继承到同一队列中执行的下一个命令缓冲区中。在绘制或分派命令之前,不需要再次设置此继承的状态。
当绑定管线对象时,以下内容适用于每个状态参数:
-
如果新管线对象中未将状态指定为动态状态,则该命令缓冲区状态将被新管线对象中的状态覆盖。在此管线绑定之后,在使用此管线进行任何绘制或分派调用之前,**必须**没有调用过任何对应的动态状态设置命令。
-
如果新管线对象中将状态指定为动态状态,则该命令缓冲区状态不会被干扰。在使用此管线进行任何绘制或分派调用之前,**必须**至少调用过每个对应的动态状态设置命令一次。状态设置命令**必须**在命令缓冲区记录开始之后,或在上次绑定该状态指定为静态的管线对象之后记录,以两者较晚者为准。
-
如果新管线对象中未包含该状态(VkGraphicsPipelineCreateInfo 中的相应指针为
NULL
或被忽略),则该命令缓冲区状态不会被干扰。例如,网格着色管线不包含顶点输入状态,因此不会干扰任何此类命令缓冲区状态。
不影响操作结果的动态状态**可以**保持**未定义**。
例如,如果通过管线对象状态禁用混合,则即使在管线对象中将此状态指定为动态状态,也不需要在命令缓冲区中指定动态颜色混合常量。 |
在 VkPhysicalDeviceDriverProperties:: |
管线属性和着色器信息
创建管线时,其状态和着色器会编译为零个或多个特定于设备的执行文件,这些执行文件在针对该管线执行命令时使用。要查询这些管线执行文件的属性,请调用
// Provided by VK_KHR_pipeline_executable_properties
VkResult vkGetPipelineExecutablePropertiesKHR(
VkDevice device,
const VkPipelineInfoKHR* pPipelineInfo,
uint32_t* pExecutableCount,
VkPipelineExecutablePropertiesKHR* pProperties);
-
device
是创建管线的设备。 -
pPipelineInfo
描述要查询的管线。 -
pExecutableCount
是一个指向整数的指针,该整数与可用或查询的管线可执行文件的数量有关,如下所述。 -
pProperties
是NULL
或指向 VkPipelineExecutablePropertiesKHR 结构的数组的指针。
如果 pProperties
为 NULL
,则管线关联的可执行文件数量将返回到 pExecutableCount
中。否则,pExecutableCount
必须 指向一个由应用程序设置的变量,该变量表示 pProperties
数组中的元素数量,并且在返回时,该变量将被实际写入 pProperties
的结构数量覆盖。如果 pExecutableCount
小于与管线关联的可执行文件数量,则最多将写入 pExecutableCount
个结构,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有可用的属性都已返回。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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
字段来提供精确的描述,因此 name
和 description
提供了人类可读的名称和描述,可以更准确地描述给定的管线可执行文件。
要查询管线属性,请调用
// Provided by VK_EXT_pipeline_properties
VkResult vkGetPipelinePropertiesEXT(
VkDevice device,
const VkPipelineInfoEXT* pPipelineInfo,
VkBaseOutStructure* pPipelineProperties);
-
device
是创建管线的逻辑设备。 -
pPipelineInfo
是指向 VkPipelineInfoEXT 结构的指针,该结构描述了正在查询的管线。 -
pPipelineProperties
是指向 VkBaseOutStructure 结构的指针,管线属性将写入其中。
要查询管线的 pipelineIdentifier
,请在 pPipelineProperties
中传递 VkPipelinePropertiesIdentifierEXT 结构。每个管线都与一个 pipelineIdentifier
相关联,并且该标识符是特定于实现的。
VkPipelinePropertiesIdentifierEXT
结构的定义如下:
// Provided by VK_EXT_pipeline_properties
typedef struct VkPipelinePropertiesIdentifierEXT {
VkStructureType sType;
void* pNext;
uint8_t pipelineIdentifier[VK_UUID_SIZE];
} VkPipelinePropertiesIdentifierEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pipelineIdentifier
是一个VK_UUID_SIZE
个uint8_t
值的数组,管线标识符将写入其中。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pipeline
是一个VkPipeline
句柄。
每个管线可执行文件可能都有一组与其关联的统计信息,这些统计信息由管线编译过程生成。这些统计信息可能包括诸如指令计数、溢出量(如果有)、最大并发线程数或任何其他可能帮助开发人员评估着色器预期性能的信息。要查询与管线可执行文件关联的编译时统计信息,请调用
// Provided by VK_KHR_pipeline_executable_properties
VkResult vkGetPipelineExecutableStatisticsKHR(
VkDevice device,
const VkPipelineExecutableInfoKHR* pExecutableInfo,
uint32_t* pStatisticCount,
VkPipelineExecutableStatisticKHR* pStatistics);
-
device
是创建管线的设备。 -
pExecutableInfo
描述了正在查询的管线可执行文件。 -
pStatisticCount
是指向与可用或查询的统计信息数量相关的整数的指针,如下所述。 -
pStatistics
是NULL
或指向 VkPipelineExecutableStatisticKHR 结构数组的指针。
如果 pStatistics
为 NULL
,则与管线可执行文件关联的统计信息数量将返回到 pStatisticCount
中。否则,pStatisticCount
必须 指向一个由应用程序设置的变量,该变量表示 pStatistics
数组中的元素数量,并且在返回时,该变量将被实际写入 pStatistics
的结构数量覆盖。如果 pStatisticCount
小于与管线可执行文件关联的统计信息数量,则最多将写入 pStatisticCount
个结构,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有可用的统计信息都已返回。
VkPipelineExecutableInfoKHR
结构的定义如下:
// Provided by VK_KHR_pipeline_executable_properties
typedef struct VkPipelineExecutableInfoKHR {
VkStructureType sType;
const void* pNext;
VkPipeline pipeline;
uint32_t executableIndex;
} VkPipelineExecutableInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pipeline
是要查询的管线。 -
executableIndex
是要查询的管线可执行文件在 vkGetPipelineExecutablePropertiesKHR 返回的可执行属性数组中的索引。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
name
是一个VK_MAX_DESCRIPTION_SIZE
个char
的数组,其中包含一个以 null 结尾的 UTF-8 字符串,该字符串是此统计信息的简短的人类可读名称。 -
description
是一个VK_MAX_DESCRIPTION_SIZE
个char
的数组,其中包含一个以 null 结尾的 UTF-8 字符串,该字符串是此统计信息的人类可读描述。 -
format
是一个 VkPipelineExecutableStatisticFormatKHR 值,指定value
中找到的数据的格式。 -
value
是此统计信息的值。
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_TRUE
或VK_FALSE
,并且应该从VkPipelineExecutableStatisticValueKHR
的b32
字段中读取。 -
VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR
指定统计信息以有符号 64 位整数返回,并且应该从VkPipelineExecutableStatisticValueKHR
的i64
字段中读取。 -
VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR
指定统计信息以无符号 64 位整数返回,并且应该从VkPipelineExecutableStatisticValueKHR
的u64
字段中读取。 -
VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR
指定统计信息以 64 位浮点值返回,并且应该从VkPipelineExecutableStatisticValueKHR
的f64
字段中读取。
VkPipelineExecutableStatisticValueKHR
联合体的定义如下:
// Provided by VK_KHR_pipeline_executable_properties
typedef union VkPipelineExecutableStatisticValueKHR {
VkBool32 b32;
int64_t i64;
uint64_t u64;
double f64;
} VkPipelineExecutableStatisticValueKHR;
-
如果
VkPipelineExecutableStatisticFormatKHR
为VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR
,则b32
是 32 位布尔值。 -
如果
VkPipelineExecutableStatisticFormatKHR
为VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR
,则i64
是有符号 64 位整数值。 -
如果
VkPipelineExecutableStatisticFormatKHR
为VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR
,则u64
是无符号 64 位整数值。 -
如果
VkPipelineExecutableStatisticFormatKHR
为VK_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
是一个指向与可用或查询的内部表示形式数量相关的整数的指针,如下所述。 -
pInternalRepresentations
是NULL
或指向 VkPipelineExecutableInternalRepresentationKHR 结构数组的指针。
如果 pInternalRepresentations
为 NULL
,则与管线可执行文件关联的内部表示形式的数量将在 pInternalRepresentationCount
中返回。否则,pInternalRepresentationCount
必须指向一个由应用程序设置为 pInternalRepresentations
数组中元素数量的变量,并且在返回时,该变量将被实际写入 pInternalRepresentations
的结构数量覆盖。如果 pInternalRepresentationCount
小于与管线可执行文件关联的内部表示形式的数量,则最多写入 pInternalRepresentationCount
个结构,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有可用的表示形式都已返回。
虽然内部表示形式的细节仍然是与实现相关的,但实现应该按照它们在编译后的管线中出现的顺序对内部表示形式进行排序,最后是最终的着色器汇编代码(如果有)。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
name
是一个包含以 null 结尾的 UTF-8 字符串的VK_MAX_DESCRIPTION_SIZE
个char
的数组,该字符串是此内部表示的简短、人类可读的名称。 -
description
是一个包含以 null 结尾的 UTF-8 字符串的VK_MAX_DESCRIPTION_SIZE
个char
的数组,该字符串是此内部表示的人类可读描述。 -
isText
指定返回的数据是文本还是不透明数据。如果isText
是VK_TRUE
,则pData
中返回的数据是文本,并保证是以 null 结尾的 UTF-8 字符串。 -
dataSize
是一个与内部表示数据大小(以字节为单位)相关的整数,如下所述。 -
pData
可以是NULL
或指向实现将写入内部表示数据的内存块的指针。
如果 pData
为 NULL
,则内部表示数据的大小(以字节为单位)将返回到 dataSize
中。否则,dataSize
必须是 pData
指向的缓冲区的大小(以字节为单位),并且在返回时,dataSize
将被实际写入 pData
的数据字节数(包括任何尾随的 null 字符)覆盖。如果 dataSize
小于内部表示数据的大小(以字节为单位),则最多将 dataSize
个字节的数据写入 pData
,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非返回了所有可用的表示。
如果 isText
为 VK_TRUE
,且 pData
不为 NULL
,且 dataSize
不为零,则写入 pData
的最后一个字节将是 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
或指向缓冲区的指针。
如果 pInfo
为 NULL
,则关于着色器可以检索的最大信息大小(以字节为单位)将返回到 pInfoSize
中。否则,pInfoSize
必须指向应用程序设置为 pInfo
所指向的缓冲区大小(以字节为单位)的变量,并且在返回时,该变量将被实际写入 pInfo
的数据量覆盖。如果 pInfoSize
小于管线缓存可以检索的最大大小,则最多将 pInfoSize
个字节写入 pInfo
,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示未返回管线缓存的所有必需信息。
并非所有信息都适用于每个着色器,并且实现可能不支持任何着色器的所有类型的信息。当某种类型的信息不可用时,该函数将返回 VK_ERROR_FEATURE_NOT_PRESENT
。
如果信息成功且完全查询,则该函数将返回 VK_SUCCESS
。
对于 infoType
为 VK_SHADER_INFO_TYPE_STATISTICS_AMD
,将把 VkShaderStatisticsInfoAMD
结构体写入 pInfo
所指向的缓冲区。此结构体将填充有关该着色器使用的物理设备资源的统计信息以及其他杂项信息,并在下文中进行更详细的描述。
对于 infoType
为 VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD
,pInfo
是指向包含人类可读反汇编的以 null 结尾的 UTF-8 字符串的指针。反汇编字符串的确切格式和内容是供应商特定的。
所有其他类型的信息(包括 infoType
为 VK_SHADER_INFO_TYPE_BINARY_AMD
)的格式和内容都留给供应商,本扩展名不再进行指定。
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 的数量(分别为 numAvailableVgprs
和 numAvailableSgprs
)是物理寄存器的着色器可寻址子集,作为寄存器分配的限制提供给编译器。由于寄存器压力是一个瓶颈,这些值可能会因性能优化而受到实现的进一步限制。
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
结构添加到 VkGraphicsPipelineCreateInfo 或 VkComputePipelineCreateInfo 的 pNext
链中来调整管线的编译。
// Provided by VK_AMD_pipeline_compiler_control
typedef struct VkPipelineCompilerControlCreateInfoAMD {
VkStructureType sType;
const void* pNext;
VkPipelineCompilerControlFlagsAMD compilerControlFlags;
} VkPipelineCompilerControlCreateInfoAMD;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
compilerControlFlags
是一个 VkPipelineCompilerControlFlagBitsAMD 的位掩码,它会影响管线的编译方式。
此扩展当前没有可用的标志;标志将通过此扩展的未来版本添加。
// Provided by VK_AMD_pipeline_compiler_control
typedef enum VkPipelineCompilerControlFlagBitsAMD {
} VkPipelineCompilerControlFlagBitsAMD;
// Provided by VK_AMD_pipeline_compiler_control
typedef VkFlags VkPipelineCompilerControlFlagsAMD;
VkPipelineCompilerControlFlagsAMD
是一种位掩码类型,用于设置零个或多个 VkPipelineCompilerControlFlagBitsAMD 的掩码。
管线创建反馈
可以通过将 VkPipelineCreationFeedbackCreateInfo
结构添加到 VkGraphicsPipelineCreateInfo、 VkRayTracingPipelineCreateInfoKHR、 VkRayTracingPipelineCreateInfoNV 或 VkComputePipelineCreateInfo 的 pNext
链中来获得有关特定管线对象创建的反馈。 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pPipelineCreationFeedback
是指向 VkPipelineCreationFeedback 结构的指针。 -
pipelineStageCreationFeedbackCount
是pPipelineStageCreationFeedbacks
中的元素数量。 -
pPipelineStageCreationFeedbacks
是指向pipelineStageCreationFeedbackCount
个 VkPipelineCreationFeedback 结构数组的指针。
实现应将管线创建反馈写入 pPipelineCreationFeedback
,并可能将管线阶段创建反馈写入 pPipelineStageCreationFeedbacks
。实现必须在 VkPipelineCreationFeedback::flags
中为 pPipelineCreationFeedback
和 pPipelineStageCreationFeedbacks
的每个元素设置或清除 VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT
。
实现跳过每个阶段反馈的一种常见情况是在 |
当链接到 VkRayTracingPipelineCreateInfoKHR、 VkRayTracingPipelineCreateInfoNV 或 VkGraphicsPipelineCreateInfo 时,pPipelineStageCreationFeedbacks
的第 i
个元素对应于 VkRayTracingPipelineCreateInfoKHR::pStages
、 VkRayTracingPipelineCreateInfoNV::pStages
或 VkGraphicsPipelineCreateInfo::pStages
的第 i
个元素。 当链接到 VkComputePipelineCreateInfo 时,pPipelineStageCreationFeedbacks
的第一个元素对应于 VkComputePipelineCreateInfo::stage
。
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
数据成员的值都是未定义的。
VkPipelineCreationFeedback 的 flags
成员的可能值为
// 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
中找到了一个可以直接使用的管线或管线阶段。如果实现能够通过使用 vkCreateGraphicsPipelines、 vkCreateRayTracingPipelinesKHR、 vkCreateRayTracingPipelinesNV 或 vkCreateComputePipelines 的
pipelineCache
参数来避免管线或管线阶段创建的大部分工作,则实现应设置VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT
位。当实现为整个管线设置此位时,它可以可能不对任何阶段取消设置此位。鼓励实现为使用此位的应用程序提供有意义的信号。目的是向应用程序传达管线或管线阶段是使用应用程序提供的管线缓存“以最快速度”创建的。如果实现使用内部缓存,则不鼓励设置此位,因为反馈将无法操作。
-
VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT
指定使用Vk*PipelineCreateInfo
结构的basePipelineHandle
或basePipelineIndex
成员指定的基础管线来加速管线的创建。如果实现能够通过使用基础管线来避免大量工作,则实现应设置
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。