着色器接口

当创建管线时,在相应的 VkPipelineCreateInfo 结构中指定的一组着色器会在多个不同的接口中隐式链接。

本章描述了一组 SPIR-V 修饰符的有效用法。任何其他使用这些修饰符的行为都是无效的,但当使用 SPIR-V 1.4 及更早版本时除外:BlockBufferBlockOffsetArrayStrideMatrixStride 也可以修饰 PrivateFunction 存储类中的变量使用的类型和类型成员。

在本章中,将引用 SPIR-V 术语,例如 MeshNV 执行模型。即使在不支持任何扩展的规范版本中也会出现这些术语。这是故意的,因为这些术语在统一的 SPIR-V 规范中出现,而没有此类限定符。

着色器输入和输出接口

当管线中存在多个阶段时,一个阶段的输出会与下一个阶段的输入形成接口。当此类接口涉及着色器时,着色器输出会与下一阶段的输入进行匹配,并且着色器输入会与前一阶段的输出进行匹配。

所有形成着色器输入和输出接口的变量都列为 OpEntryPoint 指令的操作数,并在 SPIR-V 模块中使用 InputOutput 存储类分别声明。无论连续着色器阶段之间存在任何非着色器阶段,这些通常会形成连续着色器阶段之间的接口。

有两种变量可以在着色器阶段之间匹配:内置变量和用户定义变量。每个类都有不同的匹配标准集。

在着色器写入 Output 变量或在声明变量时使用 Initializer 操作数之前,着色器阶段的 Output 变量具有未定义的值。

内置接口块

满足以下要求的着色器内置变量定义了内置接口块。它们必须

  • 被显式声明(没有隐式内置),

  • BuiltIn 修饰符标识,

  • 按照内置变量部分中的描述形成对象类型,并且

  • 在顶层成员为内置的块中声明。

每个着色器在每个接口中必须只有一个内置接口块,除了网格输出接口,其中必须最多一个用 PerPrimitiveEXT 修饰符修饰的内置接口块和最多一个没有此修饰符的内置接口块。

内置变量必须没有任何 LocationComponent 修饰符。

用户定义变量接口

OpEntryPoint 列出的具有 InputOutput 存储类的非内置变量形成了用户定义变量接口。这些必须具有数值类型,或递归地,此类类型的复合类型。如果实现支持storageInputOutput16,则组件的宽度可以为 16 位。这些变量必须Location 修饰符标识,并且可以也用 Component 修饰符标识。

接口匹配

如果以下条件均满足,则给定着色器阶段中的输出变量、块或结构成员会与后续着色器阶段中的输入变量、块或结构成员具有接口匹配

  • 它们具有等效的修饰符,除了

    • XfbBufferXfbStrideOffsetStream

    • 一个没有用 Component 修饰,而另一个用 Component0 声明

    • 插值修饰符

    • 如果一个是输入变量,而另一个是输出变量,则 RelaxedPrecision

  • 它们的类型匹配如下

    • 如果输入在细分控制或几何着色器中声明为 OpTypeArray,其 Element Type 等效于输出的 OpType* 声明,并且两者都不是结构成员;或

    • 如果启用了 maintenance4 功能,则将它们声明为 OpTypeVector 变量,并且输出的 Component Count 值高于输入的,但具有相同的 Component Type;或

    • 如果输出在网格着色器中声明为 OpTypeArray,且其 Element Type 等效于输入的 OpType* 声明,并且两者都不是结构成员;或者

    • 如果输入使用 PerVertexKHR 修饰,并且在片段着色器中声明为 OpTypeArray,且其 Element Type 等效于输出的 OpType* 声明,并且输入和输出都不是结构成员;或者

    • 如果在任何其他情况下,它们使用等效的 OpType* 声明进行声明。

  • 如果两者都是结构,并且每个成员都有一个接口匹配。

上面的“结构”一词指的是具有 OpTypeStruct 类型的变量和接口块(也声明为 OpTypeStruct)。

如果管道编译为单独的图形管道库,并且不支持 graphicsPipelineLibraryIndependentInterpolationDecoration 限制,则如果最后一个光栅化前着色器阶段和片段着色器阶段之间的插值修饰不同,则不会找到匹配项。

所有输入变量和块**必须**在前一个着色器阶段中具有接口匹配,片段着色器中的内置变量除外。着色器**可以**声明并写入后续阶段未声明或读取的输出变量。

直通几何着色器的匹配规则略有不同,在直通接口匹配部分中描述。

如果前一个阶段没有写入匹配的输出变量(如上所述),则输入变量的值是**未定义的**。

位置分配

本节描述了用户定义变量的 Location 分配,以及给定的用户变量类型消耗多少 Location 插槽。 如上所述,与其他的着色器输入和输出相比,某些输入和输出具有额外的数组级别。在考虑类型消耗多少 Location 插槽之前,将从类型中删除此外部数组级别。

Location 值指定一个接口插槽,该插槽由在阶段之间传递的 32 位四分量向量组成。 Component 指定这些向量 Location 插槽内的字组件。着色器接口中仅支持宽度为 16、32 或 64 的类型。

以下类型的输入和输出消耗单个接口 Location

  • 16 位标量和向量类型,以及

  • 32 位标量和向量类型,以及

  • 64 位标量和 2 分量向量类型。

64 位三和四分量向量消耗两个连续的 Location 插槽。

如果声明的输入或输出是大小为 *n* 的数组,并且每个元素占用 *m* 个 Location 插槽,则将从指定的 Location 开始分配 *m* × *n* 个连续的 Location 插槽。

如果声明的输入或输出是 *n* × *m* 16 位、32 位或 64 位矩阵,则将从指定的 Location 开始为其分配多个 Location 插槽。为每个矩阵分配的 Location 插槽数与 *n* 个元素的 *m* 分量向量数组相同。

具有非块结构的 OpVariable **必须**使用 Location 修饰。

当使用结构类型(块或非块)的 OpVariable 使用 Location 修饰时,结构类型中的成员**必须**不使用 Location 修饰。 OpVariable 的成员按照声明顺序分配连续的 Location 插槽,从第一个成员开始,该成员分配来自 OpVariableLocation 修饰。

当声明没有 Location 修饰的块类型 OpVariable 时,其结构类型中的每个成员**必须**使用 Location 修饰。嵌套比顶级成员更深的类型**必须**不具有 Location 修饰。

块和结构成员消耗的 Location 插槽是通过以深度优先遍历实例化成员的方式应用以上规则来确定的,就好像结构或块成员被声明为相同类型的输入或输出变量一样。

在同一个 OpEntryPoint 上列为操作数的任何两个输入**必须**不分配相同的 Location 插槽和 Component 字,无论是显式还是隐式。在同一个 OpEntryPoint 上列为操作数的任何两个输出**必须**不分配相同的 Location 插槽和 Component 字,无论是显式还是隐式。

着色器输入或输出接口可用的输入和输出 Location 插槽数量是有限的,并且取决于 着色器输入和输出位置 中描述的着色器阶段。 内置接口块用户定义变量接口中的所有变量都计入这些限制。每个有效的 Location **必须**具有小于给定接口可用 Location 插槽数量的值,如 着色器输入和输出位置 的“可用位置”列中所指定。

表 1. 着色器输入和输出位置
着色器接口 可用位置

顶点输入

maxVertexInputAttributes

顶点输出

maxVertexOutputComponents / 4

细分控制输入

maxTessellationControlPerVertexInputComponents / 4

细分控制输出

maxTessellationControlPerVertexOutputComponents / 4

细分评估输入

maxTessellationEvaluationInputComponents / 4

细分评估输出

maxTessellationEvaluationOutputComponents / 4

几何输入

maxGeometryInputComponents / 4

几何输出

maxGeometryOutputComponents / 4

片段输入

maxFragmentInputComponents / 4

片段输出

maxFragmentOutputAttachments

网格输出

maxMeshOutputComponents / 4

集群剔除输出

maxOutputClusterCount

组件分配

Component 修饰允许为标量和向量更精细地指定 Location,直到消耗的 Location 插槽内的单个 Component 字。 Location 内的 Component 字为 0、1、2 和 3。从 Component N 开始的变量或块成员将消耗 Component 字 N、N+1、N+2、...直到其大小。对于 16 位和 32 位类型,如果此 Component 字序列大于 3,则无效。标量 64 位类型将按顺序消耗这两个 Component 字,而双分量 64 位向量类型将消耗 Location 内的所有四个可用 Component 字。三分量或四分量 64 位向量类型**必须**不指定非零 Component 修饰。三分量 64 位向量类型将消耗第一个 Location 的所有四个 Component 字和第二个 LocationComponent 0 和 1。这为其他组件限定的声明留下了可用的 Component 2 和 3。

标量或双分量 64 位数据类型**必须**不指定 Component 修饰为 1 或 3。对于任何不是标量或向量的类型,**必须**不指定 Component 修饰。

四分量 64 位数据类型将消耗第一个 Location 的所有四个 Component 字和第二个 Location 的所有四个 Component 字。

顶点输入接口

当顶点阶段存在于管线中时,顶点着色器输入变量与顶点输入属性形成接口。顶点着色器输入变量通过 LocationComponent 修饰符与 VkGraphicsPipelineCreateInfo 结构的 pVertexInputState 成员中指定的顶点输入属性进行匹配。

由带有 Input 存储类别的 OpEntryPoint 列出的顶点着色器输入变量构成顶点输入接口。这些变量必须使用 Location 修饰符进行标识,并且可以使用 Component 修饰符进行标识。

为了进行接口匹配:没有 Component 修饰符声明的变量被认为具有值为零的 Component 修饰符。可用的顶点输入 Location 插槽数量由 VkPhysicalDeviceLimits 结构的 maxVertexInputAttributes 成员给出。

有关详细信息,请参阅属性位置和组件分配

所有如上声明的顶点着色器输入必须在管线中具有相应的属性和绑定。

片段输出接口

当片段阶段存在于管线中时,片段着色器输出与 渲染过程实例定义的输出附件形成接口。片段着色器输出变量通过 LocationComponent 修饰符与指定的颜色附件进行匹配。

由带有 Output 存储类别的 OpEntryPoint 列出的片段着色器输出变量构成片段输出接口。这些变量必须使用 Location 修饰符进行标识。它们可以使用 Component 修饰符和/或 Index 修饰符进行标识。为了进行接口匹配:没有 Component 修饰符声明的变量被认为具有值为零的 Component 修饰符,而没有 Index 修饰符声明的变量被认为具有值为零的 Index 修饰符。

使用 iLocation 修饰符标识的片段着色器输出变量与 VkRenderingInfo::pColorAttachments[i] 指示的颜色附件相关联。当使用渲染过程对象时,它与 VkSubpassDescription::pColorAttachments[i] 指示的颜色附件相关联。如果启用了混合,则如混合中所述,在通过混合单元后,值被写入这些附件。位置的消耗如位置分配中所述。可用的片段输出 Location 插槽数量由 VkPhysicalDeviceLimits 结构的 maxFragmentOutputAttachments 成员给出。

如果支持 dynamicRenderingLocalRead 功能,则在使用动态渲染时可以重新映射片段输出位置。

要在渲染期间设置片段输出位置映射,请调用

// Provided by VK_VERSION_1_4
void vkCmdSetRenderingAttachmentLocations(
    VkCommandBuffer                             commandBuffer,
    const VkRenderingAttachmentLocationInfo*    pLocationInfo);

或等效命令

// Provided by VK_KHR_dynamic_rendering_local_read
void vkCmdSetRenderingAttachmentLocationsKHR(
    VkCommandBuffer                             commandBuffer,
    const VkRenderingAttachmentLocationInfo*    pLocationInfo);

此命令为后续绘图命令设置附件位置映射,并且必须与绑定管线提供的映射匹配(如果已绑定管线),该映射可以通过将 VkRenderingAttachmentLocationInfo 链接到 VkGraphicsPipelineCreateInfo 来设置。

在调用此命令之前,命令缓冲区状态中的映射被视为 vkCmdBeginRendering 中指定的每个颜色附件在 VkRenderingInfo::pColorAttachments 中具有与其索引相等的位置。每当调用 vkCmdBeginRendering 时,此状态都会重置。

有效用法
  • VUID-vkCmdSetRenderingAttachmentLocations-dynamicRenderingLocalRead-09509
    dynamicRenderingLocalRead 必须启用

  • VUID-vkCmdSetRenderingAttachmentLocations-pLocationInfo-09510
    pLocationInfo->colorAttachmentCount 必须等于用于开始当前渲染过程实例的 VkRenderingInfo::colorAttachmentCount 的值

  • VUID-vkCmdSetRenderingAttachmentLocations-commandBuffer-09511
    当前渲染过程实例必须已在此 commandBuffer 中通过 vkCmdBeginRendering 启动或恢复

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

  • VUID-vkCmdSetRenderingAttachmentLocations-pLocationInfo-parameter
    pLocationInfo 必须是指向有效的 VkRenderingAttachmentLocationInfo 结构的有效指针

  • VUID-vkCmdSetRenderingAttachmentLocations-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdSetRenderingAttachmentLocations-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdSetRenderingAttachmentLocations-renderpass
    此命令必须仅在渲染过程实例内部调用

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

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

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

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

主要
辅助

内部

外部

图形

状态

VkRenderingAttachmentLocationInfo 结构定义为

// Provided by VK_VERSION_1_4
typedef struct VkRenderingAttachmentLocationInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           colorAttachmentCount;
    const uint32_t*    pColorAttachmentLocations;
} VkRenderingAttachmentLocationInfo;

或等效结构

// Provided by VK_KHR_dynamic_rendering_local_read
typedef VkRenderingAttachmentLocationInfo VkRenderingAttachmentLocationInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • colorAttachmentCountpColorAttachmentLocations 中的元素数量。

  • pColorAttachmentLocations 是指向 colorAttachmentCountuint32_t 值的数组的指针,这些值定义了颜色附件的重新映射位置。

此结构允许应用程序将颜色附件的位置重新映射到不同的片段着色器输出位置。

pColorAttachmentLocations 的每个设置为 VK_ATTACHMENT_UNUSED 的元素对于此管线将作为颜色附件不可访问;没有位置会映射到它。pColorAttachmentLocations 的每个设置为任何其他值的元素都会将指定的位置值映射到渲染过程中指定的颜色附件,其索引与 pColorAttachmentLocations 数组中的索引相对应。任何写入未映射到附件的片段输出位置的操作必须被丢弃。

如果 pColorAttachmentLocationsNULL,则相当于将每个元素设置为其在数组中的索引。

此结构可以包含在 VkGraphicsPipelineCreateInfo 结构的 pNext 链中,以设置管线的此状态。如果此结构未包含在 VkGraphicsPipelineCreateInfopNext 链中,则相当于指定具有以下属性的此结构

此结构可以包含在 VkCommandBufferInheritanceInfo 结构的 pNext 链中,以指定从主命令缓冲区继承的状态。如果 VkCommandBufferInheritanceInfo::renderPass 不是 VK_NULL_HANDLE,或者 VkCommandBufferBeginInfo::flags 中未指定 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,则忽略此结构的成员。如果此结构未包含在 VkCommandBufferInheritanceInfopNext 链中,则相当于指定具有以下属性的此结构

有效用法
  • VUID-VkRenderingAttachmentLocationInfo-dynamicRenderingLocalRead-09512
    如果 dynamicRenderingLocalRead 功能未启用,且 pColorAttachmentLocations 不为 NULL,则每个元素必须是其在数组中的索引值

  • VUID-VkRenderingAttachmentLocationInfo-pColorAttachmentLocations-09513
    pColorAttachmentLocations 中不为 VK_ATTACHMENT_UNUSED 的元素必须都是唯一的

  • VUID-VkRenderingAttachmentLocationInfo-colorAttachmentCount-09514
    colorAttachmentCount 必须小于或等于 maxColorAttachments

  • VUID-VkRenderingAttachmentLocationInfo-pColorAttachmentLocations-09515
    pColorAttachmentLocations 的每个元素必须小于 maxColorAttachments

有效用法(隐式)
  • VUID-VkRenderingAttachmentLocationInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO

当活动的片段着色器调用完成时,所有片段着色器输出的值会被复制出来,并用作混合输入或颜色附件写入。如果调用没有为它们设置值,则这些混合或颜色附件写入的输入值是未定义的

输出变量的组件按照组件分配中所述进行分配。标识为 0、1、2 和 3 的输出 Component 字将分别定向到混合单元的 R、G、B 和 A 输入,或者如果禁用混合,则定向到输出附件。如果两个变量放置在同一个 Location 中,它们必须具有相同的底层类型(浮点型或整型)。不对应于任何片段着色器输出的 Component 字也会导致混合或颜色附件写入的未定义值。

标识为零的 Index 的片段输出被定向到与相应 Location 关联的混合单元的第一个输入。标识为一的 Index 的输出被定向到相应混合单元的第二个输入。

必须没有输出变量具有与任何其他变量(显式声明或隐含)相同的 LocationComponentIndex

片段着色器写入的输出值必须声明为 OpTypeFloatOpTypeInt,且 Width 为 32。如果支持 storageInputOutput16,片段着色器写入的输出值可以声明为 OpTypeFloatOpTypeInt,且 Width 为 16。也允许这些类型的复合类型。如果颜色附件具有有符号或无符号的标准化定点格式,则假定颜色值为浮点数,并按照从浮点数到标准化定点数的转换中所述转换为定点数;如果颜色附件具有整数格式,则假定颜色值为整数,并转换为目标的位深度。任何无法以附件格式表示的值都是未定义的。对于任何其他附件格式,不执行任何转换。如果片段着色器写入的值的类型与相应颜色附件的格式不匹配,则这些组件的最终值是未定义的

旧式抖动

应用程序可以通过使用 VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT 标志来启用对子通路的颜色输出应用抖动。对于动态渲染通道中的使用,必须使用 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 标志。在这种情况下,使用的管线必须使用 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT 创建。

当启用抖动时,实现可能通过一个 ULP 修改输出颜色值 c。此修改必须仅取决于样本的帧缓冲区坐标 (xf,yf),以及 c 的值。

抖动算法的具体细节未指定,包括算法本身,应用抖动的格式以及应用抖动的阶段。

此扩展仅供 OpenGL 模拟层使用,因此应用于子通路的抖动算法应该等效于供应商的 OpenGL 实现(如果有)。

片段图块图像接口

当管线中存在片元着色器阶段时,使用 Location 修饰的片元着色器瓦片图像变量会与渲染通道实例定义的颜色附件形成接口。片元着色器瓦片图像变量通过 Location 修饰与 VkRenderingInfoKHR 结构的 pColorAttachments 数组中指定的颜色附件进行匹配,该结构描述了执行片元着色器的渲染通道实例。

通过 OpEntryPoint 列出的具有 TileImageEXT 存储类和 Location 修饰的片元着色器变量构成了片元瓦片图像接口。这些变量必须声明为 OpTypeImage 类型,且 Dim 操作数为 TileImageDataEXT。这些变量不支持 Component 修饰。

读取 Location 修饰值为 i 的瓦片图像变量会从 VkRenderingInfoKHR::pColorAttachments 的元素标识的颜色附件中读取数据,该元素的 location 等于 i。如果瓦片图像变量声明为大小为 N 的数组,它将消耗 N 个连续的瓦片图像位置,从指定的索引开始。必须不能有多个具有相同 Location 的瓦片图像变量,无论是显式声明还是由数组声明隐含的。可用瓦片图像位置的数量与 VkPhysicalDeviceLimits 结构的 maxFragmentOutputAttachments 成员给出的可用片元输出位置的数量相同。

瓦片图像变量的基本数据类型(浮点型、整型、无符号整型)必须与相应颜色附件的基本格式匹配,否则从瓦片图像变量读取的值是未定义的

片元输入附件接口

当管线中存在片元着色器阶段时,片元着色器子通道输入与当前子通道的输入附件形成接口。片元着色器子通道输入变量通过 InputAttachmentIndex 修饰与 VkSubpassDescription 结构的 pInputAttachments 数组中指定的输入附件进行匹配,该结构描述了执行片元着色器的子通道。

具有 UniformConstant 存储类和 InputAttachmentIndex 修饰的片元着色器子通道输入变量(这些变量被 OpEntryPoint 静态使用)构成了片元输入附件接口。这些变量必须声明为 OpTypeImage 类型,Dim 操作数为 SubpassDataArrayed 操作数为 0,Sampled 操作数为 2。如果对应的 VkAttachmentDescriptionsamples 字段为 VK_SAMPLE_COUNT_1_BIT,且未启用多采样渲染到单采样,则 OpTypeImageMS 操作数必须为 0,否则为 1。

使用 InputAttachmentIndex 修饰值 i 标识的子通道输入变量从 VkSubpassDescriptionpInputAttachments[i] 成员指示的输入附件中读取数据。如果子通道输入变量声明为大小为 N 的数组,它将消耗 N 个连续的输入附件,从指定的索引开始。必须不能有多个具有相同 InputAttachmentIndex 的输入变量,无论是显式声明还是由数组声明隐含的,每个图像方面都是如此。多方面图像(例如,深度/模板格式)可以使用相同的输入变量。可用输入附件索引的数量由 VkPhysicalDeviceLimits 结构的 maxPerStageDescriptorInputAttachments 成员给出。

当启用 dynamicRenderingLocalRead 功能使用动态渲染时,具有 InputAttachmentIndex 修饰值为 i 的子通道输入变量可以映射到颜色、深度或模板附件。

要在动态渲染期间设置输入附件索引映射,请调用

// Provided by VK_VERSION_1_4
void vkCmdSetRenderingInputAttachmentIndices(
    VkCommandBuffer                             commandBuffer,
    const VkRenderingInputAttachmentIndexInfo*  pInputAttachmentIndexInfo);

或等效命令

// Provided by VK_KHR_dynamic_rendering_local_read
void vkCmdSetRenderingInputAttachmentIndicesKHR(
    VkCommandBuffer                             commandBuffer,
    const VkRenderingInputAttachmentIndexInfo*  pInputAttachmentIndexInfo);

此命令设置后续绘制命令的输入附件索引映射,并且必须与绑定管线提供的映射匹配(如果已绑定管线),可以通过将 VkRenderingInputAttachmentIndexInfo 链接到 VkGraphicsPipelineCreateInfo 来设置映射。

在此命令调用之前,命令缓冲区状态中的映射被视为 vkCmdBeginRendering 中指定的每个颜色附件映射到子通道输入,该子通道输入的 InputAttachmentIndex 等于其在 VkRenderingInfo::pColorAttachments 中的索引,并且深度/模板附件映射到没有这些修饰的输入附件。每当调用 vkCmdBeginRendering 时,此状态都会重置。

有效用法
  • VUID-vkCmdSetRenderingInputAttachmentIndices-dynamicRenderingLocalRead-09516
    dynamicRenderingLocalRead 必须启用

  • VUID-vkCmdSetRenderingInputAttachmentIndices-pInputAttachmentIndexInfo-09517
    pInputAttachmentIndexInfo->colorAttachmentCount 必须等于用于开始当前渲染通道实例的 VkRenderingInfo::colorAttachmentCount 的值

  • VUID-vkCmdSetRenderingInputAttachmentIndices-commandBuffer-09518
    当前渲染过程实例必须已在此 commandBuffer 中通过 vkCmdBeginRendering 启动或恢复

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

  • VUID-vkCmdSetRenderingInputAttachmentIndices-pInputAttachmentIndexInfo-parameter
    pInputAttachmentIndexInfo 必须是指向有效 VkRenderingInputAttachmentIndexInfo 结构的有效指针

  • VUID-vkCmdSetRenderingInputAttachmentIndices-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdSetRenderingInputAttachmentIndices-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdSetRenderingInputAttachmentIndices-renderpass
    此命令必须仅在渲染过程实例内部调用

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

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

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

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

主要
辅助

内部

外部

图形

状态

VkRenderingInputAttachmentIndexInfo 结构的定义如下

// Provided by VK_VERSION_1_4
typedef struct VkRenderingInputAttachmentIndexInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           colorAttachmentCount;
    const uint32_t*    pColorAttachmentInputIndices;
    const uint32_t*    pDepthInputAttachmentIndex;
    const uint32_t*    pStencilInputAttachmentIndex;
} VkRenderingInputAttachmentIndexInfo;

或等效结构

// Provided by VK_KHR_dynamic_rendering_local_read
typedef VkRenderingInputAttachmentIndexInfo VkRenderingInputAttachmentIndexInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • colorAttachmentCountpColorAttachmentInputIndices 中的元素数量。

  • pColorAttachmentInputIndices 是指向一个包含 colorAttachmentCountuint32_t 值的数组的指针,这些值定义了用作输入附件的颜色附件的索引。

  • pDepthInputAttachmentIndexNULL 或指向一个 uint32_t 值的指针,该值定义了用作输入附件的深度附件的索引。

  • pStencilInputAttachmentIndexNULL 或指向一个 uint32_t 值的指针,该值定义了用作输入附件的模板附件的索引。

此结构允许应用程序将附件重新映射到不同的输入附件索引。

pColorAttachmentInputIndices 的每个设置为 VK_ATTACHMENT_UNUSED 的元素都表示对应的附件将不会在此管线中用作输入附件。这些元素中的任何其他值都将对应的附件映射到着色器代码中定义的 InputAttachmentIndex 值。

如果 pColorAttachmentInputIndicesNULL,则等效于将每个元素设置为其在数组中的索引。

如果 pDepthInputAttachmentIndexpStencilInputAttachmentIndex 被设置为 NULL,它们会映射到没有 InputAttachmentIndex 修饰符的输入附件。如果它们指向 VK_ATTACHMENT_UNUSED 值,则表示对应的附件将不会在此管线中用作输入附件。如果它们指向任何其他值,则会将对应的附件映射到着色器代码中定义的 InputAttachmentIndex 值。

此结构可以包含在 VkGraphicsPipelineCreateInfo 结构的 pNext 链中,以设置管线的此状态。如果此结构未包含在 VkGraphicsPipelineCreateInfopNext 链中,则相当于指定具有以下属性的此结构

  • colorAttachmentCount 设置为 VkPipelineRenderingCreateInfo::colorAttachmentCount

  • pColorAttachmentInputIndices 设置为 NULL

  • pDepthInputAttachmentIndex 设置为 NULL

  • pStencilInputAttachmentIndex 设置为 NULL

此结构 **可以** 包含在 VkCommandBufferInheritanceInfo 结构的 pNext 链中,以指定从主命令缓冲区继承的状态。如果此结构未包含在 VkCommandBufferInheritanceInfopNext 链中,则相当于指定具有以下属性的此结构

  • colorAttachmentCount 设置为 VkCommandBufferInheritanceRenderingInfo::colorAttachmentCount

  • pColorAttachmentInputIndices 设置为 NULL

  • pDepthInputAttachmentIndex 设置为 NULL

  • pStencilInputAttachmentIndex 设置为 NULL

有效用法
  • VUID-VkRenderingInputAttachmentIndexInfo-dynamicRenderingLocalRead-09519
    如果 dynamicRenderingLocalRead 功能未启用,且 pColorAttachmentInputIndices 不为 NULL,则每个元素 **必须** 为 VK_ATTACHMENT_UNUSED

  • VUID-VkRenderingInputAttachmentIndexInfo-dynamicRenderingLocalRead-09520
    如果 dynamicRenderingLocalRead 功能未启用,则 pDepthInputAttachmentIndex **必须** 是指向 VK_ATTACHMENT_UNUSED 值的有效指针

  • VUID-VkRenderingInputAttachmentIndexInfo-dynamicRenderingLocalRead-09521
    如果 dynamicRenderingLocalRead 功能未启用,则 pStencilInputAttachmentIndex **必须** 是指向 VK_ATTACHMENT_UNUSED 值的有效指针

  • VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-09522
    pColorAttachmentInputIndices 中不为 VK_ATTACHMENT_UNUSED 的元素 **必须** 各不相同

  • VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-09523
    pColorAttachmentInputIndices 中不为 VK_ATTACHMENT_UNUSED 的元素 **必须** 与 pDepthInputAttachmentIndex 的内容值不同

  • VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-09524
    pColorAttachmentInputIndices 中不为 VK_ATTACHMENT_UNUSED 的元素 **必须** 与 pStencilInputAttachmentIndex 的内容值不同

  • VUID-VkRenderingInputAttachmentIndexInfo-colorAttachmentCount-09525
    colorAttachmentCount 必须小于或等于 maxColorAttachments

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

  • VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-parameter
    如果 colorAttachmentCount 不为 0,且 pColorAttachmentInputIndices 不为 NULL,则 pColorAttachmentInputIndices **必须** 是指向包含 colorAttachmentCountuint32_t 值的数组的有效指针

  • VUID-VkRenderingInputAttachmentIndexInfo-pDepthInputAttachmentIndex-parameter
    如果 pDepthInputAttachmentIndex 不为 NULL,则 pDepthInputAttachmentIndex **必须** 是指向有效的 uint32_t 值的有效指针

  • VUID-VkRenderingInputAttachmentIndexInfo-pStencilInputAttachmentIndex-parameter
    如果 pStencilInputAttachmentIndex 不为 NULL,则 pStencilInputAttachmentIndex **必须** 是指向有效的 uint32_t 值的有效指针

InputAttachmentIndex 标识的变量 **必须** 仅由片元阶段使用。子通道输入的 数值格式 **必须** 与相应输入附件的格式匹配,否则从这些变量进行的子通道加载的值是 **未定义的**。如果帧缓冲附件同时包含深度和模板方面,则子通道输入的数值格式将确定着色器访问的是深度还是模板方面。

有关更多详细信息,请参阅 输入附件

片元输入附件兼容性

由片元着色器静态访问的输入附件 **必须** 由一个描述符支持,该描述符等效于 VkFramebuffer 中的 VkImageView,但 subresourceRange.aspectMask 除外。 aspectMask **必须** 等于着色器访问的方面。

光线追踪管线接口

光线追踪管线 **可能** 比其他管线具有更多的阶段,每个阶段有多个实例,并且阶段之间有更多动态交互,但仍然具有接口结构,这些结构遵守与其他管线中着色器阶段之间的接口相同的通用规则。光线追踪管线的三种阶段间接口变量是

  • 光线有效载荷,包含为光线整个生命周期跟踪的数据。

  • 命中属性,包含有关特定命中在处理期间的数据。

  • 可调用数据,用于将数据传入和传出可调用着色器。

光线有效载荷和可调用数据在显式着色器调用指令中使用,因此它们具有传入的变体,以区分传递给调用的参数与后续着色器调用指令正在使用的任何其他有效载荷或数据。

阶段之间使用的接口结构 **必须** 在使用它的阶段之间匹配。具体而言

  • 在任何命中或最近命中着色器中读取的命中属性结构 **必须** 与同一命中组中相应交点着色器中写入的命中属性结构相同。

  • 可调用着色器的传入可调用数据 **必须** 与调用着色器中执行可调用指令引用的可调用数据相同。

  • 由光线追踪命令调用的着色器的光线有效载荷 **必须** 对于使用该光线有效载荷的所有着色器阶段都相同。

任何具有传入光线有效载荷、传入可调用数据或命中属性的着色器 **必须** 仅声明一个该类型的变量。

表 2. 光线管线着色器接口
着色器阶段 光线有效载荷 传入光线有效载荷 命中属性 可调用数据 传入的可调用数据

射线生成

读/写

读/写

相交

读/写

任意命中

读/写

最近命中

读/写

读/写

读/写

未命中

读/写

读/写

读/写

可调用

读/写

读/写

着色器资源接口

当着色器阶段访问缓冲区或图像资源时,如资源描述符部分所述,着色器资源变量必须与在管道创建时提供的管道布局相匹配。

构成某个阶段着色器资源接口的着色器变量集合是指该阶段的OpEntryPoint静态使用的,且存储类为UniformUniformConstantStorageBufferPushConstant的变量。对于片段着色器,这包括片段输入附件接口

着色器资源接口由两个子接口组成:推送常量接口和描述符集接口。

推送常量接口

使用PushConstant存储类定义的,且由管道的着色器入口点静态使用的着色器变量,定义了推送常量接口。它们必须

  • 类型为OpTypeStruct

  • 使用Block修饰符标识,并且

  • 使用OffsetArrayStrideMatrixStride修饰符显式布局,如偏移和步幅分配中所述。

每个着色器入口点静态使用的推送常量块不得超过一个。

推送常量块的每个静态使用成员的Offset必须将其完全包含在每个使用它的OpEntryPointVkPushConstantRange中,并且该范围的stageFlags必须为该阶段指定适当的VkShaderStageFlagBits。推送常量块的任何成员的Offset修饰符不得导致该成员所需的空间超出范围[0, maxPushConstantsSize)

声明为数组的推送常量块的任何成员必须仅使用动态均匀索引访问。

描述符集接口

描述符集接口由存储类为StorageBufferUniformUniformConstant的着色器变量(包括片段输入附件接口中的变量)组成,这些变量由管道的着色器入口点静态使用。

这些变量必须指定DescriptorSetBinding修饰符,这些修饰符按照描述符集和绑定分配中所述,在管道布局中与VkDescriptorSetLayout对象进行分配和匹配。

对于用于OpImageReadOpImageSparseReadOpImageWrite操作的变量,OpTypeImage声明的Image Format不得Unknown,除非在以下条件下:

  • 对于OpImageWrite,如果图像格式列在无格式存储列表中,并且启用了shaderStorageImageWriteWithoutFormat功能,并且着色器模块声明了StorageImageWriteWithoutFormat功能。

  • 对于OpImageWrite,如果图像格式支持VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT并且着色器模块声明了StorageImageWriteWithoutFormat功能。

  • 对于OpImageReadOpImageSparseRead,如果图像格式列在无格式存储列表中,并且启用了shaderStorageImageReadWithoutFormat功能,并且着色器模块声明了StorageImageReadWithoutFormat功能。

  • 对于OpImageReadOpImageSparseRead,如果图像格式支持VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT并且着色器模块声明了StorageImageReadWithoutFormat功能。

  • 对于OpImageRead,如果DimSubpassData(表示从输入附件读取)。

对于用于OpAtomic*操作的变量,OpTypeImage声明的Image Format不得Unknown

使用Uniform存储类标识的变量用于访问透明的缓冲区支持资源。此类变量必须

  • 类型为OpTypeStruct,或此类型的数组,

  • 使用BlockBufferBlock修饰符标识,并且

  • 使用OffsetArrayStrideMatrixStride修饰符显式布局,如偏移和步幅分配中所述。

使用StorageBuffer存储类标识的变量用于访问透明的缓冲区支持资源。此类变量必须

  • 类型为OpTypeStruct,或此类型的数组,

  • 使用Block修饰符标识,并且

  • 使用OffsetArrayStrideMatrixStride修饰符显式布局,如偏移和步幅分配中所述。

Uniform存储类中任何Block修饰的变量的成员的Offset修饰符不得导致该变量所需的空间超出范围[0, maxUniformBufferRange)StorageBuffer存储类中任何Block修饰的变量的成员的Offset修饰符不得导致该变量所需的空间超出范围[0, maxStorageBufferRange)

当变量分配给具有descriptorTypeVK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK的描述符集布局绑定时,使用Uniform存储类标识的变量可以也用于访问透明的描述符集支持资源。在这种情况下,变量必须是类型为OpTypeStruct,并且不能聚合到该类型的数组中。此外,此类变量的任何成员的Offset修饰符不得导致该变量所需的空间超出范围[0,maxInlineUniformBlockSize)

使用UniformConstant存储类和InputAttachmentIndex修饰符标识的变量必须按照片段输入附件接口中所述进行声明。

用描述符集和绑定修饰的SPIR-V变量,该描述符集和绑定标识组合图像采样器描述符可以具有OpTypeImageOpTypeSampler (Sampled=1) 或 OpTypeSampledImage的类型。

当通过此类变量访问资源时,除非启用允许动态统一或非统一表达式的功能(如下所述),否则必须通过编译时常量表达式选择资源。

  • 存储图像(存储纹理缓冲区和输入附件除外)

    • 动态统一:shaderStorageImageArrayDynamicIndexingStorageImageArrayDynamicIndexing

    • 非统一:shaderStorageImageArrayNonUniformIndexingStorageImageArrayNonUniformIndexing

  • 存储纹理缓冲区

    • 动态统一:shaderStorageTexelBufferArrayDynamicIndexingStorageTexelBufferArrayDynamicIndexing

    • 非统一:shaderStorageTexelBufferArrayNonUniformIndexingStorageTexelBufferArrayNonUniformIndexing

  • 输入附件

    • 动态统一:shaderInputAttachmentArrayDynamicIndexingInputAttachmentArrayDynamicIndexing

    • 非统一:shaderInputAttachmentArrayNonUniformIndexingInputAttachmentArrayNonUniformIndexing

  • 采样图像(统一纹理缓冲区除外),采样器和组合图像采样器

    • 动态统一:shaderSampledImageArrayDynamicIndexingSampledImageArrayDynamicIndexing

    • 非统一:shaderSampledImageArrayNonUniformIndexingSampledImageArrayNonUniformIndexing

  • 统一纹理缓冲区

    • 动态统一:shaderUniformTexelBufferArrayDynamicIndexingUniformTexelBufferArrayDynamicIndexing

    • 非统一:shaderUniformTexelBufferArrayNonUniformIndexingUniformTexelBufferArrayNonUniformIndexing

  • 统一缓冲区

    • 动态统一:shaderUniformBufferArrayDynamicIndexingUniformBufferArrayDynamicIndexing

    • 非统一:shaderUniformBufferArrayNonUniformIndexingUniformBufferArrayNonUniformIndexing

  • 存储缓冲区

    • 动态统一:shaderStorageBufferArrayDynamicIndexingStorageBufferArrayDynamicIndexing

    • 非统一:shaderStorageBufferArrayNonUniformIndexingStorageBufferArrayNonUniformIndexing

  • 加速结构

    • 动态统一:始终支持。

    • 非统一:始终支持。

  • 权重图像:

    • 动态统一:始终支持。

    • 非统一:从不支持。

  • 块匹配图像:

    • 动态统一:始终支持。

    • 非统一:从不支持。

示例 1。注意

如果子组不一定是其硬件的调用组的子集(例如,如果多个绘制调用打包在一起),则在实现此功能时,实现必须小心。如果此类实现需要在子组内对任何资源访问保持统一性,则如果它们声明了相应的功能,则实现负责确保在调用组中仅动态统一的索引仍然按预期工作。

启用采样器 Y′CBCR 转换或采样子采样图像的数组中的组合图像采样器,必须仅通过常量整数表达式进行索引。

表 3. 着色器资源和描述符类型对应关系
资源类型 描述符类型

采样器

VK_DESCRIPTOR_TYPE_SAMPLERVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER

采样图像

VK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER

存储图像

VK_DESCRIPTOR_TYPE_STORAGE_IMAGE

组合图像采样器

VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER

统一纹理缓冲区

VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER

存储纹理缓冲区

VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER

统一缓冲区

VK_DESCRIPTOR_TYPE_UNIFORM_BUFFERVK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC

存储缓冲区

VK_DESCRIPTOR_TYPE_STORAGE_BUFFERVK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC

输入附件

VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT

内联统一块

VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

加速结构

VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHRVK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV

权重图像

VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM

块匹配图像

VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM

表 4. 着色器资源和存储类对应关系
资源类型 存储类 类型1 修饰符2

采样器

UniformConstant

OpTypeSampler

采样图像

UniformConstant

OpTypeImage (Sampled=1)

存储图像

UniformConstant

OpTypeImage (Sampled=2)

组合图像采样器

UniformConstant

OpTypeSampledImage
OpTypeImage (Sampled=1)
OpTypeSampler

统一纹理缓冲区

UniformConstant

OpTypeImage (Dim=Buffer, Sampled=1)

存储纹理缓冲区

UniformConstant

OpTypeImage (Dim=Buffer, Sampled=2)

统一缓冲区

Uniform

OpTypeStruct

BlockOffset,(ArrayStride),(MatrixStride

存储缓冲区

Uniform

OpTypeStruct

BufferBlockOffset,(ArrayStride),(MatrixStride

StorageBuffer

BlockOffset,(ArrayStride),(MatrixStride

输入附件

UniformConstant

OpTypeImage (Dim=SubpassData, Sampled=2)

InputAttachmentIndex

内联统一块

Uniform

OpTypeStruct

BlockOffset,(ArrayStride),(MatrixStride

加速结构

UniformConstant

OpTypeAccelerationStructureKHR

采样权重图像

UniformConstant

OpTypeImage (Depth=0, Dim=2D,
Arrayed=1, MS=0, Sampled=1)

WeightTextureQCOM

块匹配图像

UniformConstant

OpTypeImage (Depth=0, Dim=2D,
Arrayed=0, MS=0, Sampled=1)

BlockMatchTextureQCOM

1

在引用 OpTypeImage 的地方,只有在明确引用的地方才接受 DimBufferSubpassdata。它们不对应于指定了通用 OpTypeImage 的资源类型。

2

除了 DescriptorSetBinding

描述符集和绑定分配

使用 sDescriptorSet 修饰符和 bBinding 修饰符修饰的变量表示该变量与 VkDescriptorSetLayoutBinding 相关联,该 VkDescriptorSetLayoutBindingVkPipelineLayoutCreateInfo 中指定的 pSetLayouts[s] 中具有等于 bbinding

DescriptorSet 修饰符值必须在零和 maxBoundDescriptorSets 减一之间,包括零和 maxBoundDescriptorSets 减一。如 描述符集布局中所述,Binding 修饰符值可以是任何 32 位无符号整数值。每个描述符集都有其自己的绑定名称空间。

如果 Binding 修饰符与数组一起使用,则整个数组都分配有该绑定值。数组必须是一维数组,并且数组的大小必须不大于绑定中描述符的数量。如果数组的大小在运行时确定,则不得使用大于或等于绑定描述符集中该绑定的元素。如果数组的大小在运行时确定,则必须启用runtimeDescriptorArray功能,并且必须声明 RuntimeDescriptorArray 功能。数组的每个元素的索引称为arrayElement。为了进行接口匹配和描述符集操作,如果资源变量不是数组,则将其视为具有零的 arrayElement。

着色器资源限制所示,管线阶段可以访问的每种类型的资源数量都有限制。“每个阶段的资源”列给出了在管线中任何给定阶段的入口点可以静态使用的每种资源类型的数量限制。“资源类型”列列出了计入限制的资源类型。某些资源类型会针对多个限制进行计数。VK_DESCRIPTOR_TYPE_MUTABLE_EXT描述符类型会被计为单个资源,并且对于关联绑定中的VkMutableDescriptorTypeListEXT中存在的每个描述符集类型的唯一资源限制,也会计为一个资源。如果VkMutableDescriptorTypeListEXT中的多个描述符类型映射到同一个资源限制,则在计算资源限制时仅消耗一个描述符。

管线布局可能包含描述符集和绑定,这些描述符集和绑定没有被绑定stageFlags中着色器阶段入口点静态使用的任何变量引用。

但是,如果分配给给定DescriptorSetBinding的变量被着色器阶段的入口点静态使用,则管线布局必须包含该描述符集布局中以及该绑定编号的描述符集布局绑定,并且该绑定的stageFlags必须包含该阶段的适当的VkShaderStageFlagBits。变量必须是其SPIR-V类型和存储类确定的有效资源类型,如着色器资源和存储类对应关系中所定义。描述符集布局绑定必须是相应的描述符类型,如着色器资源和描述符类型对应关系中所定义。

着色器中可以具有重叠的set和binding值的着色器变量的数量没有限制;但是哪些资源被静态使用会产生影响。如果任何标识资源的着色器变量在着色器中被静态使用,则在着色器执行时,在声明的set和binding处绑定的底层描述符必须支持着色器中声明的类型

如果声明了多个具有相同set和binding值以及相同底层描述符类型的着色器变量,则它们都可以在同一着色器中静态使用。但是,访问不会自动同步,并且应使用Aliased修饰符来避免数据危险(请参阅SPIR-V规范中的 2.18.2 别名部分)。

如果在一个着色器中声明了多个具有相同set和binding值但声明类型不同的着色器变量,而这些变量中的任何一个都不受相关绑定描述符支持,则只有在未使用静态使用不支持类型的变量时,才能执行该着色器。

使用共享相同描述符集和绑定值的多个静态使用着色器变量的一个值得注意的示例是VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER类型的描述符,它在UniformConstant存储类中具有多个对应的着色器变量,其中一些可以是OpTypeImageSampled=1),一些可以是OpTypeSampler,还有一些可以是OpTypeSampledImage

表 5. 着色器资源限制
每个阶段的资源 资源类型

maxPerStageDescriptorSamplersmaxPerStageDescriptorUpdateAfterBindSamplers

采样器

组合图像采样器

maxPerStageDescriptorSampledImagesmaxPerStageDescriptorUpdateAfterBindSampledImages

采样图像

组合图像采样器

统一纹理缓冲区

采样权重图像

块匹配图像

maxPerStageDescriptorStorageImagesmaxPerStageDescriptorUpdateAfterBindStorageImages

存储图像

存储纹理缓冲区

maxPerStageDescriptorUniformBuffersmaxPerStageDescriptorUpdateAfterBindUniformBuffers

统一缓冲区

uniform buffer 动态

maxPerStageDescriptorStorageBuffersmaxPerStageDescriptorUpdateAfterBindStorageBuffers

存储缓冲区

storage buffer 动态

maxPerStageDescriptorInputAttachmentsmaxPerStageDescriptorUpdateAfterBindInputAttachments

输入附件1

maxPerStageDescriptorInlineUniformBlocksmaxPerStageDescriptorUpdateAfterBindInlineUniformBlocks

内联统一块

VkPhysicalDeviceRayTracingPropertiesNV::maxDescriptorSetAccelerationStructuresmaxPerStageDescriptorAccelerationStructuresmaxPerStageDescriptorUpdateAfterBindAccelerationStructures

加速结构

1

输入附件只能在片段着色器阶段使用

偏移量和步幅分配

某些对象必须使用OffsetArrayStrideMatrixStride显式布局,如SPIR-V 显式布局验证规则中所述。所有此类布局也必须符合以下要求。

Offset修饰符的数字顺序不需要遵循成员声明顺序。

对齐要求

对齐要求因特定资源和启用的功能而异。

矩阵类型根据数组定义如下

  • 具有C列和R行的列主矩阵等效于具有R个分量的C元素向量数组。

  • 具有C列和R行的行主矩阵等效于具有C个分量的R元素向量数组。

OpTypeStruct成员类型的标量对齐定义递归如下

  • 大小为N的标量具有N的标量对齐。

  • 向量类型的标量对齐等于其组件类型的标量对齐。

  • 数组类型的标量对齐等于其元素类型的标量对齐。

  • 结构的标量对齐等于其任何成员的最大标量对齐。

  • 矩阵类型从等效的数组声明继承标量对齐

OpTypeStruct成员类型的基本对齐定义递归如下

  • 标量的基本对齐等于其标量对齐。

  • 双分量向量的基本对齐等于其标量对齐的两倍。

  • 三分量或四分量向量的基本对齐等于其标量对齐的四倍。

  • 数组的基本对齐等于其元素类型的基本对齐。

  • 结构的基本对齐等于其任何成员的最大基本对齐。空结构的基本对齐等于 SPIR-V 模块中声明的功能允许的最小标量类型的大小。(例如,对于StorageBuffer存储类中 1 字节对齐的空结构,必须在 SPIR-V 模块中声明StorageBuffer8BitAccessUniformAndStorageBuffer8BitAccess。)

  • 矩阵类型从等效的数组声明继承基本对齐

OpTypeStruct成员类型的扩展对齐也定义如下

  • 标量或向量类型的扩展对齐等于其基本对齐。

  • 数组或结构类型的扩展对齐等于其任何成员的最大扩展对齐,向上舍入到 16 的倍数。

  • 矩阵类型从等效的数组声明继承扩展对齐方式。

如果满足以下任一条件,则认为成员不正确地跨越

  • 它是一个总大小小于等于 16 字节的向量,并且其 Offset 修饰符将其第一个字节放置在 F,最后一个字节放置在 L,其中 floor(F / 16) != floor(L / 16)

  • 它是一个总大小大于 16 字节的向量,并且其 Offset 修饰符将其第一个字节放置在不是 16 的整数倍的位置。

标准缓冲区布局

OpTypeStruct 的每个需要显式布局的成员必须按照以下第一个匹配的规则对齐。如果该结构包含在多个存储类的指针类型中,则它必须满足用于引用它的每个存储类的要求。

  1. 如果启用了 scalarBlockLayout 功能,并且存储类是 UniformStorageBufferPhysicalStorageBufferShaderRecordBufferKHRPushConstant,则每个成员必须按照其标量对齐方式对齐。

  2. 如果启用了 workgroupMemoryExplicitLayoutScalarBlockLayout 功能,并且存储类是 Workgroup,则每个成员必须按照其标量对齐方式对齐。

  3. 所有向量必须按照其标量对齐方式对齐。

  4. 如果未启用 uniformBufferStandardLayout 功能,则存储类为 Uniform 且具有 Block 修饰的 OpTypeStruct 的任何成员必须按照其扩展对齐方式对齐。

  5. 其他每个成员必须按照其基本对齐方式对齐。

即使支持标量对齐,通常使用基本对齐性能更高。

内存布局必须遵守以下规则:

  • 任何成员的 Offset 修饰符必须是其对齐方式的倍数。

  • 任何 ArrayStrideMatrixStride 修饰符必须是如上定义的数组或矩阵的对齐方式的倍数。

如果满足以下条件之一:

  • 存储类是 UniformStorageBufferPhysicalStorageBufferShaderRecordBufferKHRPushConstant,并且未启用 scalarBlockLayout 功能。

  • 存储类是 Workgroup,并且结构成员不是 Block 的一部分,或者未启用 workgroupMemoryExplicitLayoutScalarBlockLayout 功能。

  • 存储类是任何其他存储类。

则内存布局必须还遵守以下规则:

  • 向量必须不发生如上定义的不正确跨越。

  • 成员的 Offset 修饰符必须不将其放置在结构、数组或矩阵的末尾与该结构、数组或矩阵的下一个对齐方式的倍数之间。

GLSL 中的 std430 布局满足使用基本对齐方式的类型的这些规则。 std140 布局满足使用扩展对齐方式的类型的规则。

内置变量

通过声明使用 BuiltIn SPIR-V 修饰符修饰的变量,可以在着色器中访问内置变量。每个 BuiltIn 修饰符的含义如下。在本节的其余部分中,内置名称与等效于使用该特定内置修饰的变量的术语互换使用。表示整数值的内置变量可以声明为有符号或无符号的 32 位整数。

如上所述,相对于其他着色器输入和输出,某些输入和输出具有额外的数组级别。此数组级别未包含在下面的类型描述中,但声明内置变量时必须包含它。

列为同一 OpEntryPoint 的操作数的任何两个 Input 存储类 OpVariable 声明必须不具有相同的 BuiltIn 修饰符。列为同一 OpEntryPoint 的操作数的任何两个 Output 存储类 OpVariable 声明必须不具有相同的 BuiltIn 修饰符。

BaryCoordKHR

BaryCoordKHR 修饰符可以用于修饰片段着色器输入变量。此变量将包含一个三组件浮点向量,其中包含重心权重,指示片段相对于其图元顶点的屏幕空间位置(使用透视插值获得)。

有效用法
  • VUID-BaryCoordKHR-BaryCoordKHR-04154
    BaryCoordKHR 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-BaryCoordKHR-BaryCoordKHR-04155
    使用 BaryCoordKHR 修饰的变量必须使用 Input Storage Class 声明

  • VUID-BaryCoordKHR-BaryCoordKHR-04156
    使用 BaryCoordKHR 修饰的变量必须声明为 32 位浮点值的三组件向量

BaryCoordNoPerspAMD

BaryCoordNoPerspAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含与片段的中心通过线性插值计算的重心坐标对应的 (I,J) 对。考虑到恒等式 I + J + K = 1.0,可以导出重心坐标的 K 坐标。

有效用法
  • VUID-BaryCoordNoPerspAMD-BaryCoordNoPerspAMD-04157
    BaryCoordNoPerspAMD 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-BaryCoordNoPerspAMD-BaryCoordNoPerspAMD-04158
    使用 BaryCoordNoPerspAMD 修饰的变量必须使用 Input Storage Class 声明

  • VUID-BaryCoordNoPerspAMD-BaryCoordNoPerspAMD-04159
    使用 BaryCoordNoPerspAMD 修饰的变量必须声明为 32 位浮点值的双组件向量

BaryCoordNoPerspKHR

BaryCoordNoPerspKHR 修饰符可以用于修饰片段着色器输入变量。此变量将包含一个三组件浮点向量,其中包含重心权重,指示片段相对于其图元顶点的屏幕空间位置(使用线性插值获得)。

有效用法
  • VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04160
    BaryCoordNoPerspKHR 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04161
    使用 BaryCoordNoPerspKHR 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162
    使用 BaryCoordNoPerspKHR 修饰的变量必须声明为包含三个 32 位浮点数值的分量向量

BaryCoordNoPerspCentroidAMD

BaryCoordNoPerspCentroidAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含使用质心处的线性插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。

有效用法
  • VUID-BaryCoordNoPerspCentroidAMD-BaryCoordNoPerspCentroidAMD-04163
    BaryCoordNoPerspCentroidAMD 修饰符必须仅在 Fragment Execution Model 内使用

  • VUID-BaryCoordNoPerspCentroidAMD-BaryCoordNoPerspCentroidAMD-04164
    使用 BaryCoordNoPerspCentroidAMD 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-BaryCoordNoPerspCentroidAMD-BaryCoordNoPerspCentroidAMD-04165
    使用 BaryCoordNoPerspCentroidAMD 修饰的变量必须声明为包含三个 32 位浮点数值的分量向量

BaryCoordNoPerspSampleAMD

BaryCoordNoPerspSampleAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含使用每个覆盖样本处的线性插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。

有效用法
  • VUID-BaryCoordNoPerspSampleAMD-BaryCoordNoPerspSampleAMD-04166
    BaryCoordNoPerspSampleAMD 修饰符必须仅在 Fragment Execution Model 内使用

  • VUID-BaryCoordNoPerspSampleAMD-BaryCoordNoPerspSampleAMD-04167
    使用 BaryCoordNoPerspSampleAMD 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-BaryCoordNoPerspSampleAMD-BaryCoordNoPerspSampleAMD-04168
    使用 BaryCoordNoPerspSampleAMD 修饰的变量必须声明为包含两个 32 位浮点数值的分量向量

BaryCoordPullModelAMD

BaryCoordPullModelAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含在片段中心计算的 (1/W, 1/I, 1/J),可以用于计算梯度,然后在任何所需的样本位置插值 I、J 和 W。

有效用法
  • VUID-BaryCoordPullModelAMD-BaryCoordPullModelAMD-04169
    BaryCoordPullModelAMD 修饰符必须仅在 Fragment Execution Model 内使用

  • VUID-BaryCoordPullModelAMD-BaryCoordPullModelAMD-04170
    使用 BaryCoordPullModelAMD 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-BaryCoordPullModelAMD-BaryCoordPullModelAMD-04171
    使用 BaryCoordPullModelAMD 修饰的变量必须声明为包含三个 32 位浮点数值的分量向量

BaryCoordSmoothAMD

BaryCoordSmoothAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含使用片段中心处的透视插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。

有效用法
  • VUID-BaryCoordSmoothAMD-BaryCoordSmoothAMD-04172
    BaryCoordSmoothAMD 修饰符必须仅在 Fragment Execution Model 内使用

  • VUID-BaryCoordSmoothAMD-BaryCoordSmoothAMD-04173
    使用 BaryCoordSmoothAMD 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-BaryCoordSmoothAMD-BaryCoordSmoothAMD-04174
    使用 BaryCoordSmoothAMD 修饰的变量必须声明为包含两个 32 位浮点数值的分量向量

BaryCoordSmoothCentroidAMD

BaryCoordSmoothCentroidAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含使用质心处的透视插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。

有效用法
  • VUID-BaryCoordSmoothCentroidAMD-BaryCoordSmoothCentroidAMD-04175
    BaryCoordSmoothCentroidAMD 修饰符必须仅在 Fragment Execution Model 内使用

  • VUID-BaryCoordSmoothCentroidAMD-BaryCoordSmoothCentroidAMD-04176
    使用 BaryCoordSmoothCentroidAMD 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-BaryCoordSmoothCentroidAMD-BaryCoordSmoothCentroidAMD-04177
    使用 BaryCoordSmoothCentroidAMD 修饰的变量必须声明为包含两个 32 位浮点数值的分量向量

BaryCoordSmoothSampleAMD

BaryCoordSmoothSampleAMD 修饰符可以用于修饰片段着色器输入变量。此变量将包含使用每个覆盖样本处的透视插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。

有效用法
  • VUID-BaryCoordSmoothSampleAMD-BaryCoordSmoothSampleAMD-04178
    BaryCoordSmoothSampleAMD 修饰符必须仅在 Fragment Execution Model 内使用。

  • VUID-BaryCoordSmoothSampleAMD-BaryCoordSmoothSampleAMD-04179
    使用 BaryCoordSmoothSampleAMD 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-BaryCoordSmoothSampleAMD-BaryCoordSmoothSampleAMD-04180
    使用 BaryCoordSmoothSampleAMD 修饰的变量必须声明为包含两个分量的 32 位浮点数值的向量。

BaseInstance

使用 BaseInstance 内置变量修饰一个变量,将使该变量包含与传递给调用当前顶点着色器调用的命令的第一个实例对应的整数值。BaseInstance直接绘制命令firstInstance 参数,或是间接绘制命令所使用的结构体的 firstInstance 成员。

有效用法
  • VUID-BaseInstance-BaseInstance-04181
    BaseInstance 修饰符必须仅在 Vertex Execution Model 内使用。

  • VUID-BaseInstance-BaseInstance-04182
    使用 BaseInstance 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-BaseInstance-BaseInstance-04183
    使用 BaseInstance 修饰的变量必须声明为标量 32 位整数值。

BaseVertex

使用 BaseVertex 内置变量修饰一个变量,将使该变量包含与传递给调用当前顶点着色器调用的命令的第一个顶点或顶点偏移量对应的整数值。对于非索引绘制命令,此变量是直接绘制命令firstVertex 参数,或是间接绘制命令所使用的结构体的 firstVertex 成员。对于索引绘制命令,此变量是直接绘制命令vertexOffset 参数,或是间接绘制命令所使用的结构体的 vertexOffset 成员。

有效用法
  • VUID-BaseVertex-BaseVertex-04184
    BaseVertex 修饰符必须仅在 Vertex Execution Model 内使用。

  • VUID-BaseVertex-BaseVertex-04185
    使用 BaseVertex 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-BaseVertex-BaseVertex-04186
    使用 BaseVertex 修饰的变量必须声明为标量 32 位整数值。

ClipDistance

使用 ClipDistance 内置修饰符修饰一个变量,将使该变量包含用于控制用户裁剪的机制。ClipDistance 是一个数组,数组的第 i 个元素指定平面 i 的裁剪距离。裁剪距离为 0 表示顶点在平面上,正距离表示顶点在裁剪半空间内,负距离表示顶点在裁剪半空间外。

使用 ClipDistance 修饰的数组变量由着色器显式指定大小。

在最后一个光栅化前着色器阶段,这些值将在图元上线性插值,且插值距离小于 0 的图元部分将被视为在裁剪体之外。如果片段着色器随后使用 ClipDistance,则 ClipDistance 包含这些线性插值的值。

有效用法
  • VUID-ClipDistance-ClipDistance-04187
    ClipDistance 修饰符必须仅在 MeshEXTMeshNVVertexFragmentTessellationControlTessellationEvaluationGeometry Execution Model 内使用。

  • VUID-ClipDistance-ClipDistance-04188
    MeshEXTMeshNVVertex Execution Model 内使用 ClipDistance 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-ClipDistance-ClipDistance-04189
    Fragment Execution Model 内使用 ClipDistance 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-ClipDistance-ClipDistance-04190
    TessellationControlTessellationEvaluationGeometry Execution Model 内使用 ClipDistance 修饰的变量,必须在除 InputOutput 之外的 Storage Class 中声明。

  • VUID-ClipDistance-ClipDistance-04191
    使用 ClipDistance 修饰的变量必须声明为包含 32 位浮点数值的数组。

ClipDistancePerViewNV

使用 ClipDistancePerViewNV 内置修饰符修饰一个变量,将使该变量包含每个视口的裁剪距离。每个视口的裁剪距离具有与 ClipDistance 相同的语义。

有效用法
  • VUID-ClipDistancePerViewNV-ClipDistancePerViewNV-04192
    ClipDistancePerViewNV 修饰符必须仅在 MeshNV Execution Model 内使用。

  • VUID-ClipDistancePerViewNV-ClipDistancePerViewNV-04193
    使用 ClipDistancePerViewNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-ClipDistancePerViewNV-ClipDistancePerViewNV-04194
    使用 ClipDistancePerViewNV 修饰的变量必须同时使用 PerViewNV 修饰符修饰。

  • VUID-ClipDistancePerViewNV-ClipDistancePerViewNV-04195
    使用 ClipDistancePerViewNV 修饰的变量必须声明为包含 32 位浮点数值的二维数组。

ClusterIDHUAWEI

ClusterIDHUAWEI 修饰符可用于修饰集群剔除着色器输出变量,此变量将包含一个整数值,该值指定此绘制命令正在渲染的集群的 ID。当启用集群剔除着色器时,ClusterIDHUAWEI 将替换传递给顶点着色器的 gl_DrawID 以获取与集群相关的信息。

有效用法
  • VUID-ClusterIDHUAWEI-ClusterIDHUAWEI-07797
    ClusterIDHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 内使用。

  • VUID-ClusterIDHUAWEI-ClusterIDHUAWEI-07798
    使用 ClusterIDHUAWEI 修饰的变量必须声明为标量 32 位整数值。

ClusterShadingRateHUAWEI

ClusterShadingRateHUAWEI 修饰符可用于修饰集群剔除着色器输出变量。此变量将包含一个整数值,该值指定渲染集群的着色率。

有效用法
  • VUID-ClusterShadingRateHUAWEI-ClusterShadingRateHUAWEI-09448
    ClusterShadingRateHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用。

  • VUID-ClusterShadingRateHUAWEI-ClusterShadingRateHUAWEI-09449
    ClusterShadingRateHUAWEI 修饰的变量必须声明为标量 32 位整数值。

CullDistance

CullDistance 内建修饰符修饰变量将使该变量包含控制用户裁剪的机制。如果此数组的任何成员对于属于图元的所有顶点都赋值为负值,则会在光栅化之前丢弃该图元。

在片段着色器中,CullDistance 数组的值在每个图元上进行线性插值。

如果 CullDistance 修饰了一个输入变量,则该变量将包含来自先前着色器阶段的 CullDistance 修饰的输出变量的对应值。

有效用法
  • VUID-CullDistance-CullDistance-04196
    CullDistance 修饰符必须仅在 MeshEXTMeshNVVertexFragmentTessellationControlTessellationEvaluationGeometry Execution Model 中使用。

  • VUID-CullDistance-CullDistance-04197
    MeshEXTMeshNVVertex Execution Model 中用 CullDistance 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-CullDistance-CullDistance-04198
    Fragment Execution Model 中用 CullDistance 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CullDistance-CullDistance-04199
    TessellationControlTessellationEvaluationGeometry Execution Model 中用 CullDistance 修饰的变量必须不使用 InputOutput 之外的 Storage Class 声明。

  • VUID-CullDistance-CullDistance-04200
    CullDistance 修饰的变量必须声明为 32 位浮点值的数组。

CullDistancePerViewNV

CullDistancePerViewNV 内建修饰符修饰变量将使该变量包含每个视口的裁剪距离。每个视口的裁剪距离具有与 CullDistance 相同的语义。

有效用法
  • VUID-CullDistancePerViewNV-CullDistancePerViewNV-04201
    CullDistancePerViewNV 修饰符必须仅在 MeshNV Execution Model 中使用。

  • VUID-CullDistancePerViewNV-CullDistancePerViewNV-04202
    CullDistancePerViewNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-CullDistancePerViewNV-CullDistancePerViewNV-04203
    CullDistancePerViewNV 修饰的变量必须也用 PerViewNV 修饰符修饰。

  • VUID-CullDistancePerViewNV-CullDistancePerViewNV-04204
    CullDistancePerViewNV 修饰的变量必须声明为 32 位浮点值的二维数组。

CullPrimitiveEXT

CullPrimitiveEXT 内建修饰符修饰变量将使该变量包含输出图元的裁剪状态。如果每个图元的布尔值为 true,则会裁剪该图元;如果为 false,则不会裁剪该图元。

有效用法
  • VUID-CullPrimitiveEXT-CullPrimitiveEXT-07034
    CullPrimitiveEXT 修饰符必须仅在 MeshEXT Execution Model 中使用。

  • VUID-CullPrimitiveEXT-CullPrimitiveEXT-07035
    CullPrimitiveEXT 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-CullPrimitiveEXT-CullPrimitiveEXT-07036
    CullPrimitiveEXT 修饰的变量必须声明为布尔值的数组。

  • VUID-CullPrimitiveEXT-CullPrimitiveEXT-07037
    CullPrimitiveEXT 修饰的数组的大小必须OutputPrimitivesEXT 指定的值匹配。

  • VUID-CullPrimitiveEXT-CullPrimitiveEXT-07038
    MeshEXT Execution Model 中用 CullPrimitiveEXT 修饰的变量必须也用 PerPrimitiveEXT 修饰符修饰。

CullMaskKHR

CullMaskKHR 修饰符修饰的变量将指定正在处理的光线的裁剪掩码。该值由传递给 OpTrace* 指令之一的 Cull Mask 参数给出。

有效用法
  • VUID-CullMaskKHR-CullMaskKHR-06735
    CullMaskKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-CullMaskKHR-CullMaskKHR-06736
    CullMaskKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CullMaskKHR-CullMaskKHR-06737
    CullMaskKHR 修饰的变量必须声明为标量 32 位整数值。

CurrentRayTimeNV

CurrentRayTimeNV 修饰符修饰的变量包含传递给调用此着色器的 OpTraceRayMotionNV 的时间值。

有效用法
  • VUID-CurrentRayTimeNV-CurrentRayTimeNV-04942
    CurrentRayTimeNV 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-CurrentRayTimeNV-CurrentRayTimeNV-04943
    CurrentRayTimeNV 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CurrentRayTimeNV-CurrentRayTimeNV-04944
    CurrentRayTimeNV 修饰的变量必须声明为标量 32 位浮点值。

DeviceIndex

The DeviceIndex decoration can be applied to a shader input which will be filled with the device index of the physical device that is executing the current shader invocation. This value will be in the range , where physicalDeviceCount is the physicalDeviceCount member of VkDeviceGroupDeviceCreateInfo.

有效用法
  • VUID-DeviceIndex-DeviceIndex-04205
    DeviceIndex 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-DeviceIndex-DeviceIndex-04206
    DeviceIndex 修饰的变量必须声明为标量 32 位整数值。

DrawIndex

使用 DrawIndex 内置修饰符修饰变量,将使该变量包含一个整数值,该值对应于调用当前任务、网格或顶点着色器调用的绘制的从零开始的索引。对于间接绘制命令DrawIndex 从零开始,并为执行的每个绘制递增一。绘制次数由 drawCount 参数给出。对于直接绘制命令,如果使用 vkCmdDrawMultiEXTvkCmdDrawMultiIndexedEXT,则此变量包含与绘制的从零开始的索引对应的整数值。否则,DrawIndex 始终为零。DrawIndex 是动态一致的。

当使用任务或网格着色器时,只有第一个活动的阶段才能正确访问该变量。其他阶段读取的值是未定义的

有效用法
  • VUID-DrawIndex-DrawIndex-04207
    DrawIndex 修饰符必须仅在 VertexMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用

  • VUID-DrawIndex-DrawIndex-04208
    DrawIndex 修饰的变量必须使用 Input Storage Class 声明

  • VUID-DrawIndex-DrawIndex-04209
    DrawIndex 修饰的变量必须声明为标量 32 位整数值

FirstIndexHUAWEI

FirstIndexHUAWEI 修饰符可用于修饰集群剔除着色器输出变量,此索引模式特定变量将包含一个整数值,该值指定与集群对应的索引缓冲区内的基本索引。

有效用法
  • VUID-FirstIndexHUAWEI-FirstIndexHUAWEI-07799
    FirstIndexHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用

  • VUID-FirstIndexHUAWEI-FirstIndexHUAWEI-07800
    FirstIndexHUAWEI 修饰的变量必须声明为标量 32 位整数值

FragCoord

使用 FragCoord 内置修饰符修饰变量,将使该变量包含正在处理的片段的坐标 (x,y,z,1/w)

(x,y) 值是片段的帧缓冲区坐标 (xf,yf)

当启用 样本着色 时,FragCoordxy 分量反映与着色器调用对应的其中一个样本的位置。

否则,FragCoordxy 分量反映片段中心的位置。

FragCoordz 分量是图元的插值深度值。

w 分量是插值的

Centroid 插值修饰符在 FragCoord 上被忽略,但是允许使用。

有效用法
  • VUID-FragCoord-FragCoord-04210
    FragCoord 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-FragCoord-FragCoord-04211
    FragCoord 修饰的变量必须使用 Input Storage Class 声明

  • VUID-FragCoord-FragCoord-04212
    FragCoord 修饰的变量必须声明为 32 位浮点值的四分量向量

FragDepth

要使着色器提供片段深度值,着色器必须声明 DepthReplacing 执行模式。此类着色器的片段深度值将来自用 FragDepth 内置修饰符修饰的变量。

此值将用于实现执行的任何后续深度测试或写入深度附件。有关详细信息,请参见片段着色器深度替换

有效用法
  • VUID-FragDepth-FragDepth-04213
    FragDepth 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-FragDepth-FragDepth-04214
    FragDepth 修饰的变量必须使用 Output Storage Class 声明

  • VUID-FragDepth-FragDepth-04215
    FragDepth 修饰的变量必须声明为标量 32 位浮点值

  • VUID-FragDepth-FragDepth-04216
    如果着色器动态写入用 FragDepth 修饰的变量,则必须声明 DepthReplacing Execution Mode

FirstInstanceHUAWEI

FirstInstanceHUAWEI 修饰符可用于修饰集群剔除着色器输出变量,此变量将包含一个整数值,该值指定要绘制的第一个实例的实例 ID。

有效用法
  • VUID-FirstInstanceHUAWEI-FirstInstanceHUAWEI-07801
    FirstInstanceHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用

  • VUID-FirstInstanceHUAWEI-FirstInstanceHUAWEI-07802
    FirstInstanceHUAWEI 修饰的变量必须声明为标量 32 位整数值

FirstVertexHUAWEI

FirstVertexHUAWEI 修饰符可以用来修饰集群剔除着色器输出变量。这个非索引模式的特定变量将包含一个整数值,该值指定要绘制的集群中第一个顶点的索引。

有效用法
  • VUID-FirstVertexHUAWEI-FirstVertexHUAWEI-07803
    FirstVertexHUAWEI 修饰符必须仅在 FirstVertexHUAWEI Execution Model 中使用。

  • VUID-FirstVertexHUAWEI-FirstVertexHUAWEI-07804
    FirstVertexHUAWEI 修饰的变量必须声明为标量 32 位整数值。

FragInvocationCountEXT

FragInvocationCountEXT 内置修饰符修饰变量将使该变量包含片段着色器的最大调用次数,由 minSampleShading 确定。

如果 样本着色 未启用,则 FragInvocationCountEXT 将填充值为 1。

有效用法
  • VUID-FragInvocationCountEXT-FragInvocationCountEXT-04217
    FragInvocationCountEXT 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-FragInvocationCountEXT-FragInvocationCountEXT-04218
    FragInvocationCountEXT 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-FragInvocationCountEXT-FragInvocationCountEXT-04219
    FragInvocationCountEXT 修饰的变量必须声明为标量 32 位整数值。

FragSizeEXT

FragSizeEXT 内置修饰符修饰变量将使该变量包含该次调用片段所覆盖的区域的像素尺寸。

如果未启用片段密度图,则 FragSizeEXT 将填充值为 (1,1)

有效用法
  • VUID-FragSizeEXT-FragSizeEXT-04220
    FragSizeEXT 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-FragSizeEXT-FragSizeEXT-04221
    FragSizeEXT 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-FragSizeEXT-FragSizeEXT-04222
    FragSizeEXT 修饰的变量必须声明为包含两个分量的 32 位整数值的向量。

FragStencilRefEXT

FragStencilRefEXT 内置修饰符修饰变量将使该变量包含片段覆盖的所有样本的新模板引用值。此值将用作模板测试中使用的模板引用值。

要写入 FragStencilRefEXT,着色器必须声明 StencilRefReplacingEXT 执行模式。如果着色器声明了 StencilRefReplacingEXT 执行模式,并且着色器中存在未设置 FragStencilRefEXT 的执行路径,则对于采用该路径的着色器执行,片段的模板引用值是未定义的

仅考虑用 FragStencilRefEXT 修饰的变量的整数值的最低有效位 s 位用于模板测试,其中 s 是模板帧缓冲区附件中的位数,并且丢弃高位。

有关更多详细信息,请参见片段着色器模板引用替换

有效用法
  • VUID-FragStencilRefEXT-FragStencilRefEXT-04223
    FragStencilRefEXT 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-FragStencilRefEXT-FragStencilRefEXT-04224
    FragStencilRefEXT 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-FragStencilRefEXT-FragStencilRefEXT-04225
    FragStencilRefEXT 修饰的变量必须声明为标量整数值。

FragmentSizeNV

FragmentSizeNV 内置修饰符修饰变量将使该变量包含片段的宽度和高度。

有效用法
  • VUID-FragmentSizeNV-FragmentSizeNV-04226
    FragmentSizeNV 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-FragmentSizeNV-FragmentSizeNV-04227
    FragmentSizeNV 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-FragmentSizeNV-FragmentSizeNV-04228
    FragmentSizeNV 修饰的变量必须声明为包含两个分量的 32 位整数值的向量。

FrontFacing

FrontFacing 内置修饰符修饰变量将使该变量包含片段是正面还是背面。如果当前片段被认为是正面多边形图元的一部分,或者是非多边形图元的一部分,则此变量为非零值;如果该片段被认为是背面多边形图元的一部分,则为零值。

有效用法
  • VUID-FrontFacing-FrontFacing-04229
    FrontFacing 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-FrontFacing-FrontFacing-04230
    FrontFacing 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-FrontFacing-FrontFacing-04231
    FrontFacing 修饰的变量必须声明为布尔值。

FullyCoveredEXT

使用 FullyCoveredEXT 内建修饰符装饰变量将使该变量指示片元区域是否被生成图元完全覆盖。如果启用了保守光栅化并且当前片元区域被生成图元完全覆盖,则此变量为非零值;如果片元未被覆盖或部分覆盖,或者保守光栅化被禁用,则此变量为零值。

有效用法
  • VUID-FullyCoveredEXT-FullyCoveredEXT-04232
    FullyCoveredEXT 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-FullyCoveredEXT-FullyCoveredEXT-04233
    使用 FullyCoveredEXT 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-FullyCoveredEXT-FullyCoveredEXT-04234
    使用 FullyCoveredEXT 修饰的变量必须声明为布尔值。

  • VUID-FullyCoveredEXT-conservativeRasterizationPostDepthCoverage-04235
    如果不支持 VkPhysicalDeviceConservativeRasterizationPropertiesEXT::conservativeRasterizationPostDepthCoverage,则在声明带有 FullyCoveredEXT 修饰符的变量时,必须不声明 PostDepthCoverage Execution Mode

GlobalInvocationId

使用 GlobalInvocationId 内建修饰符装饰变量将使该变量包含当前调用在全局工作组中的位置。每个组件等于本地工作组的索引乘以本地工作组的大小加上 LocalInvocationId

有效用法
  • VUID-GlobalInvocationId-GlobalInvocationId-04236
    GlobalInvocationId 修饰符必须仅在 GLCompute, MeshEXT, TaskEXT, MeshNVTaskNV Execution Model 中使用。

  • VUID-GlobalInvocationId-GlobalInvocationId-04237
    使用 GlobalInvocationId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-GlobalInvocationId-GlobalInvocationId-04238
    使用 GlobalInvocationId 修饰的变量必须声明为三个 32 位整数值组成的分量向量。

HelperInvocation

使用 HelperInvocation 内建修饰符装饰变量将使该变量包含当前调用是否为辅助调用。如果当前着色的片元是辅助调用,则此变量为非零值,否则为零值。辅助调用是为了满足内部要求(如生成导数)而产生的着色器调用。

辅助调用很可能具有 SampleMask 片元着色器输入值为零的值。

有效用法
  • VUID-HelperInvocation-HelperInvocation-04239
    HelperInvocation 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-HelperInvocation-HelperInvocation-04240
    使用 HelperInvocation 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-HelperInvocation-HelperInvocation-04241
    使用 HelperInvocation 修饰的变量必须声明为布尔值。

HitKindKHR

使用 HitKindKHR 修饰符装饰的变量将描述触发当前着色器执行的交点。这些值由交点着色器确定。对于用户定义的交点着色器,这是传递给 OpReportIntersectionKHR 的“命中类型”操作数的值。对于三角形交点候选,这将是 HitKindFrontFacingTriangleKHRHitKindBackFacingTriangleKHR 之一。

有效用法
  • VUID-HitKindKHR-HitKindKHR-04242
    HitKindKHR 修饰符必须仅在 AnyHitKHRClosestHitKHR Execution Model 中使用。

  • VUID-HitKindKHR-HitKindKHR-04243
    使用 HitKindKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-HitKindKHR-HitKindKHR-04244
    使用 HitKindKHR 修饰的变量必须声明为标量 32 位整数值。

HitTNV

使用 HitTNV 修饰符装饰的变量等同于使用 RayTmaxKHR 修饰符装饰的变量。

有效用法
  • VUID-HitTNV-HitTNV-04245
    HitTNV 修饰符必须仅在 AnyHitNVClosestHitNV Execution Model 中使用。

  • VUID-HitTNV-HitTNV-04246
    使用 HitTNV 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-HitTNV-HitTNV-04247
    使用 HitTNV 修饰的变量必须声明为标量 32 位浮点值。

HitTriangleVertexPositionsKHR

使用 HitTriangleVertexPositionsKHR 修饰符装饰的变量将以应用程序提供的顺序指定当前交点处三角形的对象空间顶点。返回的位置由几何变换转换,该变换以标准的浮点精度执行,但没有明确定义的浮点运算顺序来执行矩阵乘法。

有效用法
  • VUID-HitTriangleVertexPositionsKHR-HitTriangleVertexPositionsKHR-08747
    HitTriangleVertexPositionsKHR 修饰符必须仅在 AnyHitKHRClosestHitKHR Execution Model 中使用。

  • VUID-HitTriangleVertexPositionsKHR-HitTriangleVertexPositionsKHR-08748
    使用 HitTriangleVertexPositionsKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-HitTriangleVertexPositionsKHR-HitTriangleVertexPositionsKHR-08749
    使用 HitTriangleVertexPositionsKHR 修饰的变量必须声明为由三个 32 位浮点值组成的三分量向量数组。

  • VUID-HitTriangleVertexPositionsKHR-HitTriangleVertexPositionsKHR-08750
    仅当 HitKindKHR 的值为 HitKindFrontFacingTriangleKHRHitKindBackFacingTriangleKHR 时,才可以使用使用 HitTriangleVertexPositionsKHR 修饰的变量。

  • VUID-HitTriangleVertexPositionsKHR-None-08751
    与当前交点对应的加速结构必须使用 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR 构建。

IncomingRayFlagsKHR

带有 IncomingRayFlagsKHR 修饰符的变量将包含传递到调用此特定着色器的跟踪调用中的射线标志。在射线追踪管线上设置管线标志必须不会导致任何相应的标志在带有此修饰符的变量中设置。

有效用法
  • VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248
    IncomingRayFlagsKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249
    使用 IncomingRayFlagsKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250
    使用 IncomingRayFlagsKHR 修饰的变量必须声明为标量 32 位整数值。

IndexCountHUAWEI

IndexCountHUAWEI 修饰符可用于修饰集群剔除着色器输出变量。这个索引模式特定的变量将包含一个整数值,指定要绘制的集群中索引顶点的数量。

有效用法
  • VUID-IndexCountHUAWEI-IndexCountHUAWEI-07805
    IndexCountHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用。

  • VUID-IndexCountHUAWEI-IndexCountHUAWEI-07806
    使用 IndexCountHUAWEI 修饰的变量必须声明为标量 32 位整数值。

InstanceCountHUAWEI

InstanceCountHUAWEI 修饰符可用于修饰集群剔除着色器输出变量。这个变量将包含一个整数值,指定一个集群中要绘制的实例的数量。

有效用法
  • VUID-InstanceCountHUAWEI-InstanceCountHUAWEI-07807
    InstanceCountHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用。

  • VUID-InstanceCountHUAWEI-InstanceCountHUAWEI-07808
    使用 InstanceCountHUAWEI 修饰的变量必须声明为标量 32 位整数值。

InstanceCustomIndexKHR

使用 InstanceCustomIndexKHR 修饰符修饰的变量将包含与当前光线相交的实例的应用程序定义值。该变量在低 24 位包含 VkAccelerationStructureInstanceKHR::instanceCustomIndex 中为当前加速结构实例指定的值,高 8 位将为零。

有效用法
  • VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04251
    InstanceCustomIndexKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用。

  • VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04252
    使用 InstanceCustomIndexKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04253
    使用 InstanceCustomIndexKHR 修饰的变量必须声明为标量 32 位整数值。

InstanceId

在相交、任何命中或最近命中着色器中使用 InstanceId 修饰符修饰变量,将使该变量包含与当前光线相交的实例的索引。

有效用法
  • VUID-InstanceId-InstanceId-04254
    InstanceId 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用。

  • VUID-InstanceId-InstanceId-04255
    使用 InstanceId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-InstanceId-InstanceId-04256
    使用 InstanceId 修饰的变量必须声明为标量 32 位整数值。

InvocationId

使用 InvocationId 内置修饰符修饰变量将使该变量包含几何着色器中当前着色器调用的索引,或者细分控制着色器中输出面片顶点的索引。

在几何着色器中,当前着色器调用的索引范围从零到着色器中声明的实例数减一。如果几何着色器的实例计数为一或未指定,则 InvocationId 将为零。

有效用法
  • VUID-InvocationId-InvocationId-04257
    InvocationId 修饰符必须仅在 TessellationControlGeometry Execution Model 中使用。

  • VUID-InvocationId-InvocationId-04258
    使用 InvocationId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-InvocationId-InvocationId-04259
    使用 InvocationId 修饰的变量必须声明为标量 32 位整数值。

InvocationsPerPixelNV

使用 InvocationsPerPixelNV 内置修饰符修饰变量将使该变量包含每个像素的最大片段着色器调用次数,该调用次数来源于片段的有效着色率。如果一个图元没有完全覆盖一个像素,则该像素的片段着色器调用次数可能小于 InvocationsPerPixelNV 的值。如果着色率指示一个片段覆盖多个像素,则 InvocationsPerPixelNV 将为一。

有效用法
  • VUID-InvocationsPerPixelNV-InvocationsPerPixelNV-04260
    InvocationsPerPixelNV 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-InvocationsPerPixelNV-InvocationsPerPixelNV-04261
    使用 InvocationsPerPixelNV 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-InvocationsPerPixelNV-InvocationsPerPixelNV-04262
    使用 InvocationsPerPixelNV 修饰的变量必须声明为标量 32 位整数值。

InstanceIndex

在顶点着色器中,使用 InstanceIndex 内建修饰符装饰一个变量,将使该变量包含当前顶点着色器调用正在处理的实例的索引。InstanceIndex 的起始值是 vkCmdDrawvkCmdDrawIndexedfirstInstance 参数,或者是由 vkCmdDrawIndirectvkCmdDrawIndexedIndirect 消费的结构的 firstInstance 成员。

有效用法
  • VUID-InstanceIndex-InstanceIndex-04263
    InstanceIndex 修饰符 必须 仅在 Vertex Execution Model 中使用。

  • VUID-InstanceIndex-InstanceIndex-04264
    InstanceIndex 修饰的变量 必须 使用 Input Storage Class 声明。

  • VUID-InstanceIndex-InstanceIndex-04265
    InstanceIndex 修饰的变量 必须 声明为标量 32 位整数值。

LaunchIdKHR

LaunchIdKHR 修饰符装饰的变量将指定正在处理的工作项的索引。对于由 vkCmdTraceRaysKHRvkCmdTraceRaysNV 命令调度的每个 width × height × depth 项,都会生成一个工作项。所有着色器调用都继承用 LaunchIdKHR 修饰的变量的相同值。

有效用法
  • VUID-LaunchIdKHR-LaunchIdKHR-04266
    LaunchIdKHR 修饰符 必须 仅在 RayGenerationKHRIntersectionKHRAnyHitKHRClosestHitKHRMissKHRCallableKHR Execution Model 中使用。

  • VUID-LaunchIdKHR-LaunchIdKHR-04267
    LaunchIdKHR 修饰的变量 必须 使用 Input Storage Class 声明。

  • VUID-LaunchIdKHR-LaunchIdKHR-04268
    LaunchIdKHR 修饰的变量 必须 声明为三个组件的 32 位整数值向量。

LaunchSizeKHR

LaunchSizeKHR 修饰符装饰的变量将包含传递给 vkCmdTraceRaysKHRvkCmdTraceRaysNV 命令的 widthheightdepth 维度,该命令启动了此着色器执行。 width 在第一个组件中,height 在第二个组件中,depth 在第三个组件中。

有效用法
  • VUID-LaunchSizeKHR-LaunchSizeKHR-04269
    LaunchSizeKHR 修饰符 必须 仅在 RayGenerationKHRIntersectionKHRAnyHitKHRClosestHitKHRMissKHRCallableKHR Execution Model 中使用。

  • VUID-LaunchSizeKHR-LaunchSizeKHR-04270
    LaunchSizeKHR 修饰的变量 必须 使用 Input Storage Class 声明。

  • VUID-LaunchSizeKHR-LaunchSizeKHR-04271
    LaunchSizeKHR 修饰的变量 必须 声明为三个组件的 32 位整数值向量。

Layer

使用 Layer 内建修饰符装饰变量,将使该变量包含多层帧缓冲附件的选定层。

在网格、顶点、细分评估或几何着色器中,任何使用 Layer 装饰的变量都可以写入帧缓冲层索引,该着色器产生的图元将指向该索引。

最后一个活动的 光栅化前着色器阶段(按管线顺序)控制使用的 Layer。即使最后一个阶段未能写入 Layer,也不使用先前着色器阶段的输出。

如果最后一个活动的 光栅化前着色器阶段着色器入口点的接口不包含用 Layer 修饰的变量,则使用第一层。如果一个 光栅化前着色器阶段着色器入口点的接口包含用 Layer 修饰的变量,它 必须 为给定图元的所有输出顶点写入相同的 Layer 值。如果 Layer 值小于 0 或大于或等于帧缓冲中的层数,则图元 可能 仍然被光栅化,片段着色器 可能 被执行,并且所有层的帧缓冲值都是 未定义的。在网格着色器中,当 Layer 值大于或等于 maxMeshOutputLayers 限制时,也适用此情况。

如果使用 Layer 修饰的变量也使用 ViewportRelativeNV 修饰,则会将 ViewportIndex 添加到用于渲染并在片段着色器中可用的层。

如果着色器写入使用 ViewportMaskNV 修饰的变量,则选择的层对于图元渲染到的每个视口都有不同的值。

在片段着色器中,使用 Layer 修饰的变量包含片段调用所属的图元的层索引。

有效用法
  • VUID-Layer-Layer-04272
    Layer 修饰符 必须 仅在 MeshEXTMeshNVVertexTessellationEvaluationGeometryFragment Execution Model 中使用。

  • VUID-Layer-Layer-04273
    如果未启用 shaderOutputLayer 功能,则 Layer 修饰符 必须 仅在 GeometryFragment Execution Model 中使用。

  • VUID-Layer-Layer-04274
    MeshEXTMeshNVVertexTessellationEvaluationGeometry Execution Model 中使用 Layer 修饰的变量 必须 使用 Output Storage Class 声明。

  • VUID-Layer-Layer-04275
    Fragment Execution Model 中使用 Layer 修饰的变量 必须 使用 Input Storage Class 声明。

  • VUID-Layer-Layer-04276
    使用 Layer 修饰的变量 必须 声明为标量 32 位整数值。

  • VUID-Layer-Layer-07039
    MeshEXT Execution Model 中使用 Layer 修饰的变量 必须 也使用 PerPrimitiveEXT 修饰符进行修饰。

LayerPerViewNV

使用 LayerPerViewNV 内建修饰符装饰的变量将包含每个视口的每视口层信息。每视口层的语义与每个视口的 Layer 相同。

有效用法
  • VUID-LayerPerViewNV-LayerPerViewNV-04277
    LayerPerViewNV 修饰符必须仅在 MeshNV Execution Model 中使用。

  • VUID-LayerPerViewNV-LayerPerViewNV-04278
    使用 LayerPerViewNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-LayerPerViewNV-LayerPerViewNV-04279
    使用 LayerPerViewNV 修饰的变量必须同时使用 PerViewNV 修饰符修饰。

  • VUID-LayerPerViewNV-LayerPerViewNV-04280
    使用 LayerPerViewNV 修饰的变量必须声明为标量 32 位整数值的数组。

LocalInvocationId

使用 LocalInvocationId 内建修饰符修饰变量将使该变量包含当前集群剔除、任务、网格或计算着色器在本地工作组内的调用位置。每个分量的范围从零到该维度的工作组大小减一。

如果特定维度的工作组大小为一,则该维度的 LocalInvocationId 将为零。如果工作组实际上是二维的,则 LocalInvocationId.z 将为零。如果工作组实际上是一维的,则 LocalInvocationId.yLocalInvocationId.z 都将为零。

有效用法
  • VUID-LocalInvocationId-LocalInvocationId-04281
    LocalInvocationId 修饰符必须仅在 GLComputeMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用。

  • VUID-LocalInvocationId-LocalInvocationId-04282
    使用 LocalInvocationId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-LocalInvocationId-LocalInvocationId-04283
    使用 LocalInvocationId 修饰的变量必须声明为包含 3 个分量的 32 位整数值向量。

LocalInvocationIndex

使用 LocalInvocationIndex 内建修饰符修饰变量将使该变量包含 LocalInvocationId 的一维表示。计算方式如下:

LocalInvocationIndex =
    LocalInvocationId.z * WorkgroupSize.x * WorkgroupSize.y +
    LocalInvocationId.y * WorkgroupSize.x +
    LocalInvocationId.x;
有效用法
  • VUID-LocalInvocationIndex-LocalInvocationIndex-04284
    LocalInvocationIndex 修饰符必须仅在 GLComputeMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用。

  • VUID-LocalInvocationIndex-LocalInvocationIndex-04285
    使用 LocalInvocationIndex 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-LocalInvocationIndex-LocalInvocationIndex-04286
    使用 LocalInvocationIndex 修饰的变量必须声明为标量 32 位整数值。

MeshViewCountNV

使用 MeshViewCountNV 内建修饰符修饰变量将使该变量包含当前网格或任务着色器调用所处理的视图数量。

有效用法
  • VUID-MeshViewCountNV-MeshViewCountNV-04287
    MeshViewCountNV 修饰符必须仅在 MeshNVTaskNV Execution Model 中使用。

  • VUID-MeshViewCountNV-MeshViewCountNV-04288
    使用 MeshViewCountNV 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-MeshViewCountNV-MeshViewCountNV-04289
    使用 MeshViewCountNV 修饰的变量必须声明为标量 32 位整数值。

MeshViewIndicesNV

使用 MeshViewIndicesNV 内建修饰符修饰变量将使该变量包含网格视图索引。网格视图索引是一个数组,其中每个元素都保存当前网格或任务着色器调用所处理的视图之一的视图编号。索引大于或等于 MeshViewCountNV 的数组元素的值是未定义的。如果 MeshViewIndicesNV[i] 的值为 j,则当处理视图索引为 j 的图元时,使用 PerViewNV 修饰的任何输出都将取数组元素 i 的值。

有效用法
  • VUID-MeshViewIndicesNV-MeshViewIndicesNV-04290
    MeshViewIndicesNV 修饰符必须仅在 MeshNVTaskNV Execution Model 中使用。

  • VUID-MeshViewIndicesNV-MeshViewIndicesNV-04291
    使用 MeshViewIndicesNV 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-MeshViewIndicesNV-MeshViewIndicesNV-04292
    使用 MeshViewIndicesNV 修饰的变量必须声明为标量 32 位整数值的数组。

NumSubgroups

使用 NumSubgroups 内建修饰符修饰变量将使该变量包含本地工作组中的子组数量。

有效用法
  • VUID-NumSubgroups-NumSubgroups-04293
    NumSubgroups 修饰符必须仅在 GLComputeMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用。

  • VUID-NumSubgroups-NumSubgroups-04294
    使用 NumSubgroups 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-NumSubgroups-NumSubgroups-04295
    使用 NumSubgroups 修饰的变量必须声明为标量 32 位整数值。

NumWorkgroups

使用 NumWorkgroups 内建修饰符修饰变量将使该变量包含属于调度的本地工作组的数量,调用属于该调度的一部分。每个分量等于传递到调度命令中的工作组计数参数的值。

有效用法
  • VUID-NumWorkgroups-NumWorkgroups-04296
    NumWorkgroups 修饰符必须仅在 GLComputeMeshEXTTaskEXT Execution Model 中使用。

  • VUID-NumWorkgroups-NumWorkgroups-04297
    使用 NumWorkgroups 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-NumWorkgroups-NumWorkgroups-04298
    使用 NumWorkgroups 修饰的变量必须声明为由三个 32 位整数值组成的分量向量

ObjectRayDirectionKHR

使用 ObjectRayDirectionKHR 修饰的变量将指定正在处理的光线在对象空间中的方向。

有效用法
  • VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04299
    ObjectRayDirectionKHR 修饰必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用

  • VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04300
    使用 ObjectRayDirectionKHR 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04301
    使用 ObjectRayDirectionKHR 修饰的变量必须声明为由三个 32 位浮点数值组成的分量向量

ObjectRayOriginKHR

使用 ObjectRayOriginKHR 修饰的变量将指定正在处理的光线在对象空间中的原点。

有效用法
  • VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04302
    ObjectRayOriginKHR 修饰必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用

  • VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04303
    使用 ObjectRayOriginKHR 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04304
    使用 ObjectRayOriginKHR 修饰的变量必须声明为由三个 32 位浮点数值组成的分量向量

ObjectToWorldKHR

使用 ObjectToWorldKHR 修饰的变量将包含当前对象到世界变换矩阵,该矩阵由当前相交的实例确定。

有效用法
  • VUID-ObjectToWorldKHR-ObjectToWorldKHR-04305
    ObjectToWorldKHR 修饰必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用

  • VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306
    使用 ObjectToWorldKHR 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307
    使用 ObjectToWorldKHR 修饰的变量必须声明为具有四个列的矩阵,每一列都是由三个 32 位浮点数值组成的分量向量

PatchVertices

使用 PatchVertices 内建修饰符修饰变量,将使该变量包含着色器正在处理的输入面片中的顶点数。在细分控制着色器中,这与 VkPipelineTessellationStateCreateInfo 的 name:patchControlPoints 成员相同。在细分评估着色器中,PatchVertices 等于细分控制输出面片大小。当同一个着色器在面片大小配置不同的不同管线中使用时,PatchVertices 变量的值也会有所不同。

有效用法
  • VUID-PatchVertices-PatchVertices-04308
    PatchVertices 修饰必须仅在 TessellationControlTessellationEvaluation Execution Model 中使用

  • VUID-PatchVertices-PatchVertices-04309
    使用 PatchVertices 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-PatchVertices-PatchVertices-04310
    使用 PatchVertices 修饰的变量必须声明为标量 32 位整数值

PointCoord

使用 PointCoord 内建修饰符修饰变量,将使该变量包含当前片元在光栅化点内的坐标,该坐标已归一化为点的尺寸,原点位于点的左上角,如 基本点光栅化中所述。如果片元着色器调用所属的图元不是点,则使用 PointCoord 修饰的变量包含未定义的值。

根据点的光栅化方式,PointCoord 可能永远无法达到 (0,0)(1,1)

有效用法
  • VUID-PointCoord-PointCoord-04311
    PointCoord 修饰必须仅在 Fragment Execution Model 中使用

  • VUID-PointCoord-PointCoord-04312
    使用 PointCoord 修饰的变量必须使用 Input Storage Class 进行声明

  • VUID-PointCoord-PointCoord-04313
    使用 PointCoord 修饰的变量必须声明为由两个 32 位浮点数值组成的分量向量

PointSize

使用 PointSize 内建修饰符修饰变量,将使该变量包含点图元的大小,或者如果 多边形模式VK_POLYGON_MODE_POINTVkPhysicalDeviceMaintenance5Properties::polygonModePointSize 设置为 VK_TRUE,则该变量将包含多边形的最终光栅化大小。管线中最后一个预光栅化着色器阶段写入到使用 PointSize 修饰的变量的值用作光栅化产生的点的帧缓冲空间大小。如果启用了 maintenance5 功能,并且没有值写入到使用 PointSize 修饰的变量,则使用 1.0 作为点的大小。

PointSize 修饰 Input Storage Class 中的变量时,它包含从上一个着色器阶段写入到使用 PointSize 修饰的输出变量的数据。

有效用法
  • VUID-PointSize-PointSize-04314
    PointSize 修饰必须仅在 MeshEXTMeshNVVertexTessellationControlTessellationEvaluationGeometry Execution Model 中使用

  • VUID-PointSize-PointSize-04315
    MeshEXTMeshNVVertex Execution Model 中,使用 PointSize 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PointSize-PointSize-04316
    TessellationControlTessellationEvaluationGeometry Execution Model 中,使用 PointSize 修饰的变量不得使用 InputOutput 之外的 Storage Class 声明。

  • VUID-PointSize-PointSize-04317
    使用 PointSize 修饰的变量必须声明为标量 32 位浮点数值。

Position

使用 Position 内建修饰符修饰变量,将使该变量包含当前顶点的位置。在最后一个光栅化前着色器阶段中,使用 Position 修饰的变量的值将用于后续的图元组装、裁剪和光栅化操作。

Position 修饰 Input Storage Class 中的变量时,它包含从前一个着色器阶段写入到使用 Position 修饰的输出变量中的数据。

有效用法
  • VUID-Position-Position-04318
    Position 修饰符必须仅在 MeshEXTMeshNVVertexTessellationControlTessellationEvaluationGeometry Execution Model 中使用。

  • VUID-Position-Position-04319
    MeshEXTMeshNVVertex Execution Model 中,使用 Position 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-Position-Position-04320
    TessellationControlTessellationEvaluationGeometry Execution Model 中,使用 Position 修饰的变量不得使用 InputOutput 之外的 Storage Class 声明。

  • VUID-Position-Position-04321
    使用 Position 修饰的变量必须声明为由四个 32 位浮点数值组成的向量。

PositionPerViewNV

使用 PositionPerViewNV 内建修饰符修饰变量,将使该变量包含当前顶点针对每个视图的位置。

数组的元素对应于多视图子通道中的视图,并且与着色器编译时所针对的子通道的视图掩码中的视图相对应的元素将用作这些视图的位置值。对于管线中的最后一个光栅化前着色器阶段,写入到使用 PositionPerViewNV 修饰的输出变量的值将用于后续的图元组装、裁剪和光栅化操作,就像使用 Position 一样。在较早的光栅化前着色器阶段中,PositionPerViewNV 的输出可在随后的光栅化前着色器阶段中作为输入使用。

如果着色器是针对设置了 VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX 位的子通道编译的,则每个视图的位置值必须仅在 X 分量中不同。如果值确实不同,则将以实现相关的方式选择一个值。

有效用法
  • VUID-PositionPerViewNV-PositionPerViewNV-04322
    PositionPerViewNV 修饰符必须仅在 MeshNVVertexTessellationControlTessellationEvaluationGeometry Execution Model 中使用。

  • VUID-PositionPerViewNV-PositionPerViewNV-04323
    VertexMeshNV Execution Model 中,使用 PositionPerViewNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PositionPerViewNV-PositionPerViewNV-04324
    TessellationControlTessellationEvaluationGeometry Execution Model 中,使用 PositionPerViewNV 修饰的变量不得使用 InputOutput 之外的 Storage Class 声明。

  • VUID-PositionPerViewNV-PositionPerViewNV-04325
    使用 PositionPerViewNV 修饰的变量必须声明为由四个 32 位浮点数值组成的向量的数组,其元素的数量至少应为子通道的视图掩码中的最大视图加一。

  • VUID-PositionPerViewNV-PositionPerViewNV-04326
    使用 PositionPerViewNV 修饰的数组变量必须仅通过常量或特化常量进行索引。

PrimitiveCountNV

使用 PrimitiveCountNV 修饰变量,将使该变量包含图元计数。图元计数指定网格着色器产生的输出网格中将由后续管线阶段处理的图元数量。

有效用法
  • VUID-PrimitiveCountNV-PrimitiveCountNV-04327
    PrimitiveCountNV 修饰符必须仅在 MeshNV Execution Model 中使用。

  • VUID-PrimitiveCountNV-PrimitiveCountNV-04328
    使用 PrimitiveCountNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitiveCountNV-PrimitiveCountNV-04329
    使用 PrimitiveCountNV 修饰的变量必须声明为标量 32 位整数值。

PrimitiveId

使用 PrimitiveId 内建修饰符修饰变量,将使该变量包含当前图元的索引。

绘图命令生成的第一个图元的索引为零,并且在处理完每个单独的点、线或三角形图元后,该索引会递增。

对于绘制为点或线段的三角形(请参见多边形模式),即使最终绘制多个点或线,图元索引也仅递增一次。

使用 PrimitiveId 修饰的变量在每次绘制的实例之间都会重置为零。

使用图元重启重启图元拓扑结构对使用 PrimitiveId 修饰的变量的值没有影响。

在细分控制和细分评估着色器中,它将包含当前渲染图元集中与着色器调用对应的面片索引。

在几何着色器中,它将包含自当前渲染图元集开始以来,呈现给着色器作为输入的图元数量。

在片段着色器中,如果存在网格着色器,则它将包含网格着色器写入的图元索引;如果存在几何着色器,则它将包含几何着色器写入的图元索引;或者如果存在几何着色器,则它将包含本应呈现给几何着色器作为输入的值。

在交集、任何命中或最近命中着色器中,它将包含正在处理的三角形或边界框在几何体中的索引。

PrimitiveId 修饰符应用于网格着色器或几何着色器中的输出变量时,结果值通过片段着色器中 PrimitiveId 修饰的输入变量可见。

使用 PrimitiveId 的片段着色器将需要声明 MeshShadingNVMeshShadingEXTGeometryTessellation 功能,以满足 SPIR-V 使用 PrimitiveId 的要求。

有效用法
  • VUID-PrimitiveId-PrimitiveId-04330
    PrimitiveId 修饰符必须仅在 MeshEXTMeshNVIntersectionKHRAnyHitKHRClosestHitKHRTessellationControlTessellationEvaluationGeometryFragment Execution Model 中使用。

  • VUID-PrimitiveId-Fragment-04331
    如果管线同时包含 FragmentGeometry Execution Model,并且一个用 PrimitiveId 修饰的变量从 Fragment 着色器中读取,则 Geometry 着色器必须在所有执行路径中写入用 PrimitiveId 修饰的输出变量。

  • VUID-PrimitiveId-Fragment-04332
    如果管线同时包含 FragmentMeshEXTMeshNV Execution Model,并且一个用 PrimitiveId 修饰的变量从 Fragment 着色器中读取,则 MeshEXTMeshNV 着色器必须在所有执行路径中写入用 PrimitiveId 修饰的输出变量。

  • VUID-PrimitiveId-Fragment-04333
    如果 Fragment Execution Model 包含一个用 PrimitiveId 修饰的变量,则还必须声明 MeshShadingEXTMeshShadingNVGeometryTessellation 功能。

  • VUID-PrimitiveId-PrimitiveId-04334
    TessellationControlTessellationEvaluationFragmentIntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中用 PrimitiveId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-PrimitiveId-PrimitiveId-04335
    Geometry Execution Model 中用 PrimitiveId 修饰的变量必须使用 InputOutput Storage Class 声明。

  • VUID-PrimitiveId-PrimitiveId-04336
    MeshEXTMeshNV Execution Model 中用 PrimitiveId 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitiveId-PrimitiveId-04337
    PrimitiveId 修饰的变量必须声明为标量 32 位整数值。

  • VUID-PrimitiveId-PrimitiveId-07040
    MeshEXT Execution Model 中用 PrimitiveId 修饰的变量还必须PerPrimitiveEXT 修饰符修饰。

PrimitiveIndicesNV

PrimitiveIndicesNV 修饰符修饰一个变量将使该变量包含顶点索引值的输出数组。根据使用执行模式声明的输出图元类型,索引被分为一组(OutputPoints)、两组(OutputLinesNV)或三组(OutputTrianglesNV)索引,每组生成一个图元。

有效用法
  • VUID-PrimitiveIndicesNV-PrimitiveIndicesNV-04338
    PrimitiveIndicesNV 修饰符必须仅在 MeshNV Execution Model 中使用。

  • VUID-PrimitiveIndicesNV-PrimitiveIndicesNV-04339
    PrimitiveIndicesNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitiveIndicesNV-PrimitiveIndicesNV-04340
    PrimitiveIndicesNV 修饰的变量必须声明为标量 32 位整数值的数组。

  • VUID-PrimitiveIndicesNV-PrimitiveIndicesNV-04341
    PrimitiveIndicesNV 修饰的数组的所有索引值必须在范围 [0, N-1] 内,其中 N 是由 OutputVertices Execution Mode 指定的值。

  • VUID-PrimitiveIndicesNV-OutputPoints-04342
    如果 Execution ModeOutputPoints,则用 PrimitiveIndicesNV 修饰的数组的尺寸必须OutputPrimitivesNV 指定的值。

  • VUID-PrimitiveIndicesNV-OutputLinesNV-04343
    如果 Execution ModeOutputLinesNV,则用 PrimitiveIndicesNV 修饰的数组的尺寸必须OutputPrimitivesNV 指定的值的两倍。

  • VUID-PrimitiveIndicesNV-OutputTrianglesNV-04344
    如果 Execution ModeOutputTrianglesNV,则用 PrimitiveIndicesNV 修饰的数组的尺寸必须OutputPrimitivesNV 指定的值的三倍。

PrimitivePointIndicesEXT

PrimitivePointIndicesEXT 修饰符修饰一个变量将使该变量包含点图元的顶点索引值的输出数组。

有效用法
  • VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07041
    PrimitivePointIndicesEXT 修饰符必须仅在 MeshEXT Execution Model 中使用。

  • VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07042
    PrimitivePointIndicesEXT 修饰符必须OutputPoints Execution Mode 一起使用。

  • VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07043
    PrimitivePointIndicesEXT 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07044
    PrimitivePointIndicesEXT 修饰的变量必须声明为标量 32 位整数值的数组。

  • VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07045
    PrimitivePointIndicesEXT 修饰的数组的所有索引值必须在范围 [0, N-1] 内,其中 N 是由 OutputVertices Execution Mode 指定的值。

  • VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07046
    PrimitivePointIndicesEXT 修饰的数组的大小必须OutputPrimitivesEXT 指定的值匹配。

PrimitiveLineIndicesEXT

PrimitiveLineIndicesEXT 修饰符修饰一个变量将使该变量包含线图元的顶点索引值的输出数组。

有效用法
  • VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07047
    PrimitiveLineIndicesEXT 修饰符必须仅在 MeshEXT Execution Model 中使用。

  • VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07048
    PrimitiveLineIndicesEXT 修饰符必须OutputLinesEXT Execution Mode 一起使用。

  • VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07049
    使用 PrimitiveLineIndicesEXT 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07050
    使用 PrimitiveLineIndicesEXT 修饰的变量必须声明为由两个分量组成的 32 位整数值向量的数组。

  • VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07051
    使用 PrimitiveLineIndicesEXT 修饰的数组的所有索引值必须在范围 [0, N-1] 内,其中 NOutputVertices Execution Mode 指定的值。

  • VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07052
    使用 PrimitiveLineIndicesEXT 修饰的数组的大小必须OutputPrimitivesEXT 指定的值匹配。

PrimitiveTriangleIndicesEXT

使用 PrimitiveTriangleIndicesEXT 修饰符修饰变量将使该变量包含三角形图元的顶点索引值的输出数组。

有效用法
  • VUID-PrimitiveTriangleIndicesEXT-PrimitiveTriangleIndicesEXT-07053
    PrimitiveTriangleIndicesEXT 修饰符必须仅在 MeshEXT Execution Model 中使用。

  • VUID-PrimitiveTriangleIndicesEXT-PrimitiveTriangleIndicesEXT-07054
    PrimitiveTriangleIndicesEXT 修饰符必须OutputTrianglesEXT Execution Mode 一起使用。

  • VUID-PrimitiveTriangleIndicesEXT-PrimitiveTriangleIndicesEXT-07055
    使用 PrimitiveTriangleIndicesEXT 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitiveTriangleIndicesEXT-PrimitiveTriangleIndicesEXT-07056
    使用 PrimitiveTriangleIndicesEXT 修饰的变量必须声明为由三个分量组成的 32 位整数值向量的数组。

  • VUID-PrimitiveTriangleIndicesEXT-PrimitiveTriangleIndicesEXT-07057
    使用 PrimitiveTriangleIndicesEXT 修饰的数组的所有索引值必须在范围 [0, N-1] 内,其中 NOutputVertices Execution Mode 指定的值。

  • VUID-PrimitiveTriangleIndicesEXT-PrimitiveTriangleIndicesEXT-07058
    使用 PrimitiveTriangleIndicesEXT 修饰的数组的大小必须OutputPrimitivesEXT 指定的值匹配。

PrimitiveShadingRateKHR

使用 PrimitiveShadingRateKHR 内建修饰符修饰变量将使该变量包含图元片段着色率

管线中最后一个预光栅化着色器阶段写入使用 PrimitiveShadingRateKHR 修饰的变量的值,将被用作图元片段着色率。之前的着色器阶段中的输出将被忽略。

如果最后一个激活的预光栅化着色器阶段着色器入口点的接口不包含使用 PrimitiveShadingRateKHR 修饰的变量,则如同着色器指定了片段着色率值为 0 一样,表示水平和垂直速率为 1 像素。

如果着色器的输出接口中包含 PrimitiveShadingRateKHR,并且存在不写入该变量的着色器执行路径,则对于采取该路径的着色器执行,其值是未定义的

有效用法
  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04484
    PrimitiveShadingRateKHR 修饰符必须仅在 MeshEXTMeshNVVertexGeometry Execution Model 中使用。

  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04485
    使用 PrimitiveShadingRateKHR 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04486
    使用 PrimitiveShadingRateKHR 修饰的变量必须声明为标量 32 位整数值。

  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04487
    写入 PrimitiveShadingRateKHR 的值必须最多包含 Vertical2PixelsVertical4Pixels 中的一个。

  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04488
    写入 PrimitiveShadingRateKHR 的值必须最多包含 Horizontal2PixelsHorizontal4Pixels 中的一个。

  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04489
    写入 PrimitiveShadingRateKHR 的值必须没有除 SPIR-V 规范中 **Fragment Shading Rate Flags** 枚举器定义的位之外的任何位被设置。

  • VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-07059
    MeshEXT Execution Model 中使用 PrimitiveShadingRateKHR 修饰的变量必须同时使用 PerPrimitiveEXT 修饰符修饰。

RayGeometryIndexKHR

使用 RayGeometryIndexKHR 修饰的变量将包含当前着色的加速结构几何体的几何体索引

有效用法
  • VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04345
    RayGeometryIndexKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用。

  • VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04346
    使用 RayGeometryIndexKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04347
    使用 RayGeometryIndexKHR 修饰的变量必须声明为标量 32 位整数值。

RayTmaxKHR

使用 RayTmaxKHR 修饰的变量将包含正在处理的光线的参数 tmax 值。该值独立于光线原点和方向存在的空间。该值初始化为传递给管线追踪光线指令的参数。

tmax 值在产生相交的光线的生命周期中会发生变化。在最近命中着色器中,该值反映了到相交图元的最近距离。在任意命中着色器中,它反映了到当前相交图元的距离。在相交着色器中,它反映了到目前为止相交的最近图元的距离或初始值。如果在调用 OpReportIntersectionKHR 后相应的任意命中着色器不忽略相交,则该值可以在相交着色器中发生更改。在未命中着色器中,该值与传递给管线追踪光线指令的参数相同。

有效用法
  • VUID-RayTmaxKHR-RayTmaxKHR-04348
    RayTmaxKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-RayTmaxKHR-RayTmaxKHR-04349
    使用 RayTmaxKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-RayTmaxKHR-RayTmaxKHR-04350
    使用 RayTmaxKHR 修饰的变量必须声明为标量 32 位浮点值。

RayTminKHR

使用 RayTminKHR 修饰的变量将包含正在处理的光线的参数 tmin 值。该值独立于光线原点和方向存在的空间。该值是传递给管线追踪光线指令的参数。

tmin 值在光线查询的持续时间内保持不变。

有效用法
  • VUID-RayTminKHR-RayTminKHR-04351
    RayTminKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-RayTminKHR-RayTminKHR-04352
    使用 RayTminKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-RayTminKHR-RayTminKHR-04353
    使用 RayTminKHR 修饰的变量必须声明为标量 32 位浮点值。

SampleId

使用 SampleId 内置修饰符修饰变量将使该变量包含当前片段着色器调用的覆盖索引SampleId 的范围从零到帧缓冲区中的样本数减一。如果片段着色器入口点的接口包含使用 SampleId 修饰的输入变量,则样本着色被视为已启用,且 minSampleShading 值为 1.0。

有效用法
  • VUID-SampleId-SampleId-04354
    SampleId 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-SampleId-SampleId-04355
    使用 SampleId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-SampleId-SampleId-04356
    使用 SampleId 修饰的变量必须声明为标量 32 位整数值。

SampleMask

使用 SampleMask 内置修饰符修饰变量将使任何变量包含当前片段着色器调用的样本掩码

使用 SampleMask 修饰的 Input 存储类中的变量将包含在光栅化期间生成片段的图元覆盖的样本集合的位掩码。当且仅当样本被认为对此片段着色器调用已覆盖时,才设置样本位。SampleMask[] 是一个整数数组。位以一种方式映射到样本,其中掩码 M (SampleMask[M]) 的位 B 对应于样本 32 × M + B

使用 SampleMask 修饰的 Output 存储类中的变量是一个整数数组,形成一个位数组,类似于使用 SampleMask 修饰的输入变量,但其中每个位都表示着色器计算的覆盖率。此计算出的 SampleMask多重采样覆盖操作中生成的覆盖掩码相结合。

使用 SampleMask 修饰的变量必须是无大小的数组,或显式大小设置为不大于实现相关的最大样本掩码(作为 32 位元素的数组),该最大样本掩码由最大样本数确定。

如果片段着色器入口点的接口包含使用 SampleMask 修饰的输出变量,则对于未能分配值的任何片段着色器调用的任何数组元素,样本掩码将是未定义的。如果片段着色器入口点的接口不包含使用 SampleMask 修饰的输出变量,则样本掩码对片段的处理没有影响。

有效用法
  • VUID-SampleMask-SampleMask-04357
    SampleMask 修饰符必须仅在 Fragment Execution Model 中使用。

  • VUID-SampleMask-SampleMask-04358
    使用 SampleMask 修饰的变量必须使用 InputOutput Storage Class 声明。

  • VUID-SampleMask-SampleMask-04359
    使用 SampleMask 修饰的变量必须声明为 32 位整数值的数组。

SamplePosition

使用 SamplePosition 内置修饰符修饰变量将使该变量包含正在着色的样本的子像素位置。像素的左上角被认为在坐标 (0,0),像素的右下角被认为在坐标 (1,1)

如果渲染通道具有片段密度图附件,则该变量将改为包含正在着色的样本的子片段位置。任何片段区域的左上角都被视为坐标 (0,0),而右下角被视为坐标 (1,1)

如果片段着色器入口点的接口包含一个使用 SamplePosition 修饰的输入变量,则认为启用了样本着色,并且 minSampleShading 的值为 1.0。

如果当前管线使用自定义样本位置,则使用 SamplePosition 内建修饰符修饰的任何变量的值都是未定义的

有效用法
  • VUID-SamplePosition-SamplePosition-04360
    SamplePosition 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-SamplePosition-SamplePosition-04361
    使用 SamplePosition 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SamplePosition-SamplePosition-04362
    使用 SamplePosition 修饰的变量必须声明为由两个 32 位浮点值组成的分量向量

ShadingRateKHR

使用 ShadingRateKHR 内建修饰符修饰变量将使该变量包含当前片段调用的片段着色率

有效用法
  • VUID-ShadingRateKHR-ShadingRateKHR-04490
    ShadingRateKHR 修饰符必须仅在 Fragment Execution Model 中使用

  • VUID-ShadingRateKHR-ShadingRateKHR-04491
    使用 ShadingRateKHR 修饰的变量必须使用 Input Storage Class 声明

  • VUID-ShadingRateKHR-ShadingRateKHR-04492
    使用 ShadingRateKHR 修饰的变量必须声明为标量 32 位整数值

SMCountNV

使用 SMCountNV 内建修饰符修饰变量将使该变量包含设备上的 SM 数量。

有效用法
  • VUID-SMCountNV-SMCountNV-04363
    使用 SMCountNV 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SMCountNV-SMCountNV-04364
    使用 SMCountNV 修饰的变量必须声明为标量 32 位整数值

SMIDNV

使用 SMIDNV 内建修饰符修饰变量将使该变量包含当前着色器调用正在运行的 SM 的 ID。此变量的范围是 [0, SMCountNV-1]

有效用法
  • VUID-SMIDNV-SMIDNV-04365
    使用 SMIDNV 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SMIDNV-SMIDNV-04366
    使用 SMIDNV 修饰的变量必须声明为标量 32 位整数值

SubgroupId

使用 SubgroupId 内建修饰符修饰变量将使该变量包含本地工作组中子组的索引。此变量的范围是 [0, NumSubgroups-1]。

有效用法
  • VUID-SubgroupId-SubgroupId-04367
    SubgroupId 修饰符必须仅在 GLComputeMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用

  • VUID-SubgroupId-SubgroupId-04368
    使用 SubgroupId 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SubgroupId-SubgroupId-04369
    使用 SubgroupId 修饰的变量必须声明为标量 32 位整数值

SubgroupEqMask

使用 SubgroupEqMask 内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与 SubgroupLocalInvocationId 对应的位在用 SubgroupEqMask 修饰的变量中设置。所有其他位都设置为零。

SubgroupEqMaskKHRSubgroupEqMask 的别名。

有效用法
  • VUID-SubgroupEqMask-SubgroupEqMask-04370
    使用 SubgroupEqMask 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SubgroupEqMask-SubgroupEqMask-04371
    使用 SubgroupEqMask 修饰的变量必须声明为由四个 32 位整数值组成的分量向量

SubgroupGeMask

使用 SubgroupGeMask 内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与大于或等于 SubgroupLocalInvocationIdSubgroupSize-1 的调用对应的位在用 SubgroupGeMask 修饰的变量中设置。所有其他位都设置为零。

SubgroupGeMaskKHRSubgroupGeMask 的别名。

有效用法
  • VUID-SubgroupGeMask-SubgroupGeMask-04372
    使用 SubgroupGeMask 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SubgroupGeMask-SubgroupGeMask-04373
    使用 SubgroupGeMask 修饰的变量必须声明为由四个 32 位整数值组成的分量向量

SubgroupGtMask

使用 SubgroupGtMask 内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与大于 SubgroupLocalInvocationIdSubgroupSize-1 的调用对应的位在用 SubgroupGtMask 修饰的变量中设置。所有其他位都设置为零。

SubgroupGtMaskKHRSubgroupGtMask 的别名。

有效用法
  • VUID-SubgroupGtMask-SubgroupGtMask-04374
    使用 SubgroupGtMask 修饰的变量必须使用 Input Storage Class 声明

  • VUID-SubgroupGtMask-SubgroupGtMask-04375
    使用 SubgroupGtMask 修饰的变量必须声明为由四个 32 位整数值组成的分量向量

SubgroupLeMask

使用 SubgroupLeMask 内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与小于或等于 SubgroupLocalInvocationId 的调用对应的位在用 SubgroupLeMask 修饰的变量中设置。所有其他位都设置为零。

SubgroupLeMaskKHRSubgroupLeMask 的别名。

有效用法
  • VUID-SubgroupLeMask-SubgroupLeMask-04376
    使用 SubgroupLeMask 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-SubgroupLeMask-SubgroupLeMask-04377
    使用 SubgroupLeMask 修饰的变量必须声明为包含四个分量的 32 位整数值向量。

SubgroupLtMask

使用 SubgroupLtMask 内置修饰符修饰一个变量,将使该变量包含当前子组调用的子组掩码。在 SubgroupLtMask 修饰的变量中,小于 SubgroupLocalInvocationId 的调用的对应位会被设置。所有其他位都设置为零。

SubgroupLtMaskKHRSubgroupLtMask 的别名。

有效用法
  • VUID-SubgroupLtMask-SubgroupLtMask-04378
    使用 SubgroupLtMask 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-SubgroupLtMask-SubgroupLtMask-04379
    使用 SubgroupLtMask 修饰的变量必须声明为包含四个分量的 32 位整数值向量。

SubgroupLocalInvocationId

使用 SubgroupLocalInvocationId 内置修饰符修饰一个变量,将使该变量包含调用在子组内的索引。该变量的取值范围为 [0,SubgroupSize-1]。

如果指定了 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT,或者如果 module 声明了 SPIR-V 1.6 或更高版本,并且 stage 的 X 维度中的本地工作组大小是 SubgroupSize 的倍数,则为该管线阶段启用完整子组。当启用完整子组时,子组必须在所有调用都处于活动状态的情况下启动,即对于范围 [0,SubgroupSize-1] 中的每个值,都有一个具有 SubgroupLocalInvocationId 的活动调用。

SubgroupLocalInvocationIdLocalInvocationIdLocalInvocationIndex 之间没有直接关系。如果管线或着色器对象是使用完整子组创建的,则应用程序可以计算自己的本地调用索引以达到相同的目的。

索引 = SubgroupLocalInvocationId + SubgroupId × SubgroupSize

如果未启用完整子组,则某些子组可能会在非活动调用时分派,这些调用不对应于本地工作组调用,从而使 index 的值不可靠。

当编译 SPIR-V 1.6 着色器时,VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BITVK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT 实际上已被弃用,因为此行为是 Vulkan 与 SPIR-V 1.6 的默认行为。这更符合开发人员的期望,并避免了应用程序在未来意外中断。

有效用法
  • VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-04380
    使用 SubgroupLocalInvocationId 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-04381
    使用 SubgroupLocalInvocationId 修饰的变量必须声明为标量 32 位整数值。

SubgroupSize

使用 SubgroupSize 内置修饰符修饰一个变量,将使该变量包含实现相关的子组中的调用数。此值必须是 2 的幂的整数。

如果管线是使用设置的 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 标志创建的,或者着色器对象是使用设置的 VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT 标志创建的,或者 SPIR-V module 至少为 1.6 版本,则 SubgroupSize 修饰的变量将包含每个被分派的子组的子组大小。此值必须介于 minSubgroupSizemaxSubgroupSize 之间,并且必须子组范围保持一致。该值可能在单个绘制调用中发生变化,并且对于片元着色器,可能在单个图元中发生变化。在计算分派中,SubgroupSize 必须命令范围保持一致。

如果管线是使用链式 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构创建的,或者着色器对象是使用链式 VkShaderRequiredSubgroupSizeCreateInfoEXT 结构创建的,则 SubgroupSize 修饰的变量将与requiredSubgroupSize 匹配。

如果 SPIR-V module 低于 1.6 版本,并且管线不是使用设置的 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT 标志创建的,并且没有链接 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,并且着色器不是使用设置的 VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT 标志创建的,并且没有链接 VkShaderRequiredSubgroupSizeCreateInfoEXT 结构,则使用 SubgroupSize 修饰的变量将与 subgroupSize 匹配。

实现可以支持的每个子组的最大调用数为 128。

SubgroupSize 的旧行为被认为是已弃用的,因为如果没有 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BITVK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT 的保证,某些计算算法就无法轻松实现。

有效用法
  • VUID-SubgroupSize-SubgroupSize-04382
    使用 SubgroupSize 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-SubgroupSize-SubgroupSize-04383
    使用 SubgroupSize 修饰的变量必须声明为标量 32 位整数值。

TaskCountNV

使用 TaskCountNV 修饰一个变量将使该变量包含任务计数。任务计数指定在任务着色器完成时生成的后续网格着色器工作组的数量。

有效用法
  • VUID-TaskCountNV-TaskCountNV-04384
    TaskCountNV 修饰符必须仅在 TaskNV Execution Model 中使用。

  • VUID-TaskCountNV-TaskCountNV-04385
    使用 TaskCountNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-TaskCountNV-TaskCountNV-04386
    使用 TaskCountNV 修饰的变量必须声明为标量 32 位整数值。

TessCoord

使用 TessCoord 内置修饰符修饰一个变量将使该变量包含细分顶点在面片内的三维重心坐标 (u,v,w)uvw 的取值范围为 [0,1],并在被细分的图元上线性变化。对于 QuadsIsoLines 的细分模式,第三个分量始终为零。

有效用法
  • VUID-TessCoord-TessCoord-04387
    TessCoord 修饰符必须仅在 TessellationEvaluation Execution Model 中使用。

  • VUID-TessCoord-TessCoord-04388
    使用 TessCoord 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-TessCoord-TessCoord-04389
    使用 TessCoord 修饰的变量必须声明为包含三个分量的 32 位浮点数值向量。

TessLevelOuter

使用 TessLevelOuter 内建修饰符修饰的变量将包含当前面片的外部细分级别。

在细分控制着色器中,可以使用 TessLevelOuter 修饰的变量进行写入,从而控制生成面片的细分因子。这些值由细分器用于控制图元细分,并且可以被细分评估着色器读取。

在细分评估着色器中,可以使用 TessLevelOuter 修饰的变量读取由细分控制着色器写入的值。

有效用法
  • VUID-TessLevelOuter-TessLevelOuter-04390
    TessLevelOuter 修饰符必须仅在 TessellationControlTessellationEvaluation Execution Model 中使用。

  • VUID-TessLevelOuter-TessLevelOuter-04391
    TessellationControl Execution Model 中使用 TessLevelOuter 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-TessLevelOuter-TessLevelOuter-04392
    TessellationEvaluation Execution Model 中使用 TessLevelOuter 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-TessLevelOuter-TessLevelOuter-04393
    使用 TessLevelOuter 修饰的变量必须声明为大小为 4 的数组,包含 32 位浮点数值。

TessLevelInner

使用 TessLevelInner 内建修饰符修饰的变量将包含当前面片的内部细分级别。

在细分控制着色器中,可以使用 TessLevelInner 修饰的变量进行写入,从而控制生成面片的细分因子。这些值由细分器用于控制图元细分,并且可以被细分评估着色器读取。

在细分评估着色器中,可以使用 TessLevelInner 修饰的变量读取由细分控制着色器写入的值。

有效用法
  • VUID-TessLevelInner-TessLevelInner-04394
    TessLevelInner 修饰符必须仅在 TessellationControlTessellationEvaluation Execution Model 中使用。

  • VUID-TessLevelInner-TessLevelInner-04395
    TessellationControl Execution Model 中使用 TessLevelInner 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-TessLevelInner-TessLevelInner-04396
    TessellationEvaluation Execution Model 中使用 TessLevelInner 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-TessLevelInner-TessLevelInner-04397
    使用 TessLevelInner 修饰的变量必须声明为大小为 2 的数组,包含 32 位浮点数值。

VertexCountHUAWEI

VertexCountHUAWEI 修饰符可以用于修饰簇剔除着色器的输出变量,这个非索引模式特定的变量将包含一个整数值,指定要绘制的簇中的顶点数量。

有效用法
  • VUID-VertexCountHUAWEI-VertexCountHUAWEI-07809
    VertexCountHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用。

  • VUID-VertexCountHUAWEI-VertexCountHUAWEI-07810
    使用 VertexCountHUAWEI 修饰的变量必须声明为标量 32 位整数值。

VertexIndex

使用 VertexIndex 内建修饰符修饰的变量将包含当前顶点着色器调用正在处理的顶点的索引。对于非索引绘制,该变量从 vkCmdDrawfirstVertex 参数或 vkCmdDrawIndirect 使用的结构体的 firstVertex 成员开始,并且在每次绘制中为每个顶点递增 1。对于索引绘制,其值是顶点索引缓冲区的内容加上 vkCmdDrawIndexedvertexOffset 参数或 vkCmdDrawIndexedIndirect 使用的结构体的 vertexOffset 成员。

对于每个实例,VertexIndex 都从相同的起始值开始。

有效用法
  • VUID-VertexIndex-VertexIndex-04398
    VertexIndex 修饰符必须仅在 Vertex Execution Model 中使用。

  • VUID-VertexIndex-VertexIndex-04399
    使用 VertexIndex 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-VertexIndex-VertexIndex-04400
    使用 VertexIndex 修饰的变量必须声明为标量 32 位整数值。

VertexOffsetHUAWEI

VertexOffsetHUAWEI 修饰符可以用于修饰簇剔除着色器的输出变量,这个索引模式特定的变量将包含一个整数值,指定一个偏移值,该偏移值在索引到顶点缓冲区之前添加到簇的顶点索引中。

有效用法
  • VUID-VertexOffsetHUAWEI-VertexOffsetHUAWEI-07811
    VertexOffsetHUAWEI 修饰符必须仅在 ClusterCullingHUAWEI Execution Model 中使用。

  • VUID-VertexOffsetHUAWEI-VertexOffsetHUAWEI-07812
    使用 VertexOffsetHUAWEI 修饰的变量必须声明为标量 32 位整数值。

ViewIndex

ViewIndex 修饰符可以应用于着色器输入,该输入将被填充为当前着色器调用正在处理的视图的索引。

如果渲染过程中启用了多视图,则此值将是管道编译所针对的子通道的视图掩码中设置的其中一个位的索引。 如果渲染过程中未启用多视图,则此值将为零。

有效用法
  • VUID-ViewIndex-ViewIndex-04401
    ViewIndex 修饰符必须仅在 MeshEXTVertexGeometryTessellationControlTessellationEvaluationFragment Execution Model 中使用。

  • VUID-ViewIndex-ViewIndex-04402
    使用 ViewIndex 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-ViewIndex-ViewIndex-04403
    使用 ViewIndex 修饰的变量必须声明为标量 32 位整数值。

ViewportIndex

使用 ViewportIndex 内建修饰符修饰变量将使该变量包含视口的索引。

在网格、顶点、细分计算或几何着色器中,可以使用视口索引写入用 ViewportIndex 修饰的变量,该视口索引是该着色器生成的图元将被定向到的视口索引。

所选的视口索引用于选择视口变换、裁剪矩形和互斥裁剪矩形。

最后一个活动的预光栅化着色器阶段(按管线顺序)控制所使用的 ViewportIndex。 即使最后一个阶段未能写入 ViewportIndex,也不会使用先前着色器阶段的输出。

如果最后一个活动的预光栅化着色器阶段着色器入口点的接口不包含用 ViewportIndex 修饰的变量,并且如果未启用 multiviewPerViewViewports 功能,则使用第一个视口。如果一个 预光栅化着色器阶段着色器入口点的接口包含用 ViewportIndex 修饰的变量,则它必须为给定图元的所有输出顶点写入相同的 ViewportIndex 值。

在片段着色器中,用 ViewportIndex 修饰的变量包含该片段调用所属的图元的视口索引。

如果启用了 multiviewPerViewViewports 功能,并且最后一个活动的预光栅化着色器阶段着色器入口点的接口不包含用 ViewportIndex 修饰的变量,则 ViewIndex 的值将用作选择视口变换和裁剪矩形的索引,并且片段着色器中的 ViewportIndex 值是未定义的

有效用法
  • VUID-ViewportIndex-ViewportIndex-04404
    ViewportIndex 修饰符必须仅在 MeshEXTMeshNVVertexTessellationEvaluationGeometryFragment Execution Model 中使用。

  • VUID-ViewportIndex-ViewportIndex-04405
    如果未启用 shaderOutputViewportIndex 功能,则 ViewportIndex 修饰符必须仅在 GeometryFragment Execution Model 中使用。

  • VUID-ViewportIndex-ViewportIndex-04406
    MeshEXTMeshNVVertexTessellationEvaluationGeometry Execution Model 中使用 ViewportIndex 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-ViewportIndex-ViewportIndex-04407
    Fragment Execution Model 中使用 ViewportIndex 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-ViewportIndex-ViewportIndex-04408
    使用 ViewportIndex 修饰的变量必须声明为标量 32 位整数值。

  • VUID-ViewportIndex-ViewportIndex-07060
    MeshEXT Execution Model 中使用 ViewportIndex 修饰的变量还必须使用 PerPrimitiveEXT 修饰符进行修饰。

ViewportMaskNV

使用 ViewportMaskNV 内建修饰符修饰变量将使该变量包含视口掩码。

在网格、顶点、细分计算或几何着色器中,可以使用掩码写入用 ViewportMaskNV 修饰的变量,该掩码表示该着色器生成的图元将被定向到的哪些视口。

ViewportMaskNV 变量必须是一个具有 ⌈(VkPhysicalDeviceLimits::maxViewports / 32)⌉ 个元素的数组。当着色器写入此变量时,元素 M 的位 B 控制是否将图元发送到视口 32 × M + B。掩码指示的视口用于选择图元将进行变换的视口变换、裁剪矩形和互斥裁剪矩形。

最后一个活动的预光栅化着色器阶段(按管线顺序)控制所使用的 ViewportMaskNV。即使最后一个阶段未能写入 ViewportMaskNV,也不会使用先前着色器阶段的输出。当 ViewportMaskNV 由最后一个预光栅化着色器阶段写入时,片段着色器中任何使用 ViewportIndex 修饰的变量将具有在生成该片段时使用的视口的索引。

如果一个 预光栅化着色器阶段着色器入口点的接口包含用 ViewportMaskNV 修饰的变量,则它必须为给定图元的所有输出顶点写入相同的 ViewportMaskNV 值。

有效用法
  • VUID-ViewportMaskNV-ViewportMaskNV-04409
    ViewportMaskNV 修饰符必须仅在 VertexMeshNVTessellationEvaluationGeometry Execution Model 中使用。

  • VUID-ViewportMaskNV-ViewportMaskNV-04410
    使用 ViewportMaskNV 修饰的变量必须使用 Output Storage Class 声明。

  • VUID-ViewportMaskNV-ViewportMaskNV-04411
    使用 ViewportMaskNV 修饰的变量必须声明为 32 位整数值的数组。

ViewportMaskPerViewNV

使用 ViewportMaskPerViewNV 内建修饰符修饰一个变量,将使该变量包含每个视口的图元广播掩码。

在最后一个光栅化前着色器阶段中写入 ViewportMaskPerViewNV 元素的值是一个位掩码,指示图元将被定向到哪些视口。图元将被广播到与位掩码中每个非零位对应的视口,并且该视口索引用于为每个视图选择视口变换、剪裁矩形和排他性剪裁矩形。必须将相同的值写入给定图元中的所有顶点,否则用于该图元的视口集合是未定义的

数组的元素对应于多视图子通道中的视图,并且与着色器编译时所针对的子通道的视图掩码中的视图相对应的那些元素将用作这些视图的视口掩码值。较早的光栅化前着色器阶段中的 ViewportMaskPerViewNV 输出在随后的光栅化前着色器阶段中不可用作输入。

尽管 ViewportMaskNV 是一个数组,但 ViewportMaskPerViewNV 不是一个二维数组。相反,ViewportMaskPerViewNV 限制为 32 个视口。

有效用法
  • VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04412
    ViewportMaskPerViewNV 修饰符必须仅在 VertexMeshNVTessellationControlTessellationEvaluationGeometry Execution Model 中使用

  • VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04413
    使用 ViewportMaskPerViewNV 修饰的变量必须使用 Output Storage Class 声明

  • VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04414
    使用 ViewportMaskPerViewNV 修饰的变量必须声明为 32 位整数值的数组

  • VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04415
    使用 ViewportMaskPerViewNV 修饰的数组大小必须小于或等于 32

  • VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04416
    使用 ViewportMaskPerViewNV 修饰的数组大小必须大于子通道视图掩码中的最大视图

  • VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04417
    使用 ViewportMaskPerViewNV 修饰的数组变量必须只能通过常量或特化常量进行索引

WarpsPerSMNV

使用 WarpsPerSMNV 内建修饰符修饰一个变量,将使该变量包含在 SM 上执行的最大 Warp 数量。

有效用法
  • VUID-WarpsPerSMNV-WarpsPerSMNV-04418
    使用 WarpsPerSMNV 修饰的变量必须使用 Input Storage Class 声明

  • VUID-WarpsPerSMNV-WarpsPerSMNV-04419
    使用 WarpsPerSMNV 修饰的变量必须声明为标量 32 位整数值

WarpIDNV

使用 WarpIDNV 内建修饰符修饰一个变量,将使该变量包含当前着色器调用正在运行的 SM 上的 Warp ID。此变量的范围为 [0, WarpsPerSMNV-1]

有效用法
  • VUID-WarpIDNV-WarpIDNV-04420
    使用 WarpIDNV 修饰的变量必须使用 Input Storage Class 声明

  • VUID-WarpIDNV-WarpIDNV-04421
    使用 WarpIDNV 修饰的变量必须声明为标量 32 位整数值

WorkgroupId

使用 WorkgroupId 内建修饰符修饰一个变量,将使该变量包含当前调用所属的全局工作组。每个组件的范围从一个基值到一个 基值 + 计数 值,基于传递给调度命令的参数。

有效用法
  • VUID-WorkgroupId-WorkgroupId-04422
    WorkgroupId 修饰符必须仅在 GLComputeMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用

  • VUID-WorkgroupId-WorkgroupId-04423
    使用 WorkgroupId 修饰的变量必须使用 Input Storage Class 声明

  • VUID-WorkgroupId-WorkgroupId-04424
    使用 WorkgroupId 修饰的变量必须声明为 32 位整数值的三分量向量

WorkgroupSize

SPIR-V 1.6 已弃用 WorkgroupSize,而改用 LocalSizeId Execution Mode。对 LocalSizeId 的支持已添加到 VK_KHR_maintenance4 中,并在 1.3 版本中提升为核心。

使用 WorkgroupSize 内建修饰符修饰一个对象,将使该对象包含本地工作组的维度。如果一个对象使用 WorkgroupSize 修饰符进行修饰,则它将优先于任何 LocalSizeLocalSizeId 执行模式。

有效用法
  • VUID-WorkgroupSize-WorkgroupSize-04425
    WorkgroupSize 修饰符必须仅在 GLComputeMeshEXTTaskEXTMeshNVTaskNV Execution Model 中使用

  • VUID-WorkgroupSize-WorkgroupSize-04426
    使用 WorkgroupSize 修饰的变量必须是特化常量或常量

  • VUID-WorkgroupSize-WorkgroupSize-04427
    使用 WorkgroupSize 修饰的变量必须声明为 32 位整数值的三分量向量

WorldRayDirectionKHR

使用 WorldRayDirectionKHR 修饰的变量将指定正在处理的光线在世界空间中的方向。该值是传递给 管线追踪光线 指令的参数。

有效用法
  • VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04428
    WorldRayDirectionKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04429
    使用 WorldRayDirectionKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04430
    使用 WorldRayDirectionKHR 修饰的变量必须声明为 32 位浮点值的三分量向量。

WorldRayOriginKHR

使用 WorldRayOriginKHR 修饰的变量将指定正在处理的光线在世界空间中的原点。该值是传递给 管线追踪光线 指令的参数。

有效用法
  • VUID-WorldRayOriginKHR-WorldRayOriginKHR-04431
    WorldRayOriginKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHRMissKHR Execution Model 中使用。

  • VUID-WorldRayOriginKHR-WorldRayOriginKHR-04432
    使用 WorldRayOriginKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-WorldRayOriginKHR-WorldRayOriginKHR-04433
    使用 WorldRayOriginKHR 修饰的变量必须声明为 32 位浮点值的三分量向量。

WorldToObjectKHR

使用 WorldToObjectKHR 修饰的变量将包含当前的世界到对象变换矩阵,该矩阵由当前交点的实例确定。

有效用法
  • VUID-WorldToObjectKHR-WorldToObjectKHR-04434
    WorldToObjectKHR 修饰符必须仅在 IntersectionKHRAnyHitKHRClosestHitKHR Execution Model 中使用。

  • VUID-WorldToObjectKHR-WorldToObjectKHR-04435
    使用 WorldToObjectKHR 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-WorldToObjectKHR-WorldToObjectKHR-04436
    使用 WorldToObjectKHR 修饰的变量必须声明为具有四列 32 位浮点值的三分量向量的矩阵。

CoreCountARM

使用 CoreCountARM 内置修饰符修饰变量将使该变量包含设备上的内核数量。

有效用法
  • VUID-CoreCountARM-CoreCountARM-07595
    使用 CoreCountARM 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CoreCountARM-CoreCountARM-07596
    使用 CoreCountARM 修饰的变量必须声明为标量 32 位整数值。

CoreMaxIDARM

使用 CoreMaxIDARM 内置修饰符修饰变量将使该变量包含当前着色器调用正在运行的设备上任何着色器内核的最大 ID。

有效用法
  • VUID-CoreMaxIDARM-CoreMaxIDARM-07597
    使用 CoreMaxIDARM 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CoreMaxIDARM-CoreMaxIDARM-07598
    使用 CoreMaxIDARM 修饰的变量必须声明为标量 32 位整数值。

CoreIDARM

使用 CoreIDARM 内置修饰符修饰变量将使该变量包含当前着色器调用正在运行的内核的 ID。此变量的范围为 [0, CoreMaxIDARM]

有效用法
  • VUID-CoreIDARM-CoreIDARM-07599
    使用 CoreIDARM 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CoreIDARM-CoreIDARM-07600
    使用 CoreIDARM 修饰的变量必须声明为标量 32 位整数值。

WarpMaxIDARM

使用 WarpMaxIDARM 内置修饰符修饰变量将使该变量包含当前调用正在运行的内核的最大 warp ID。

有效用法
  • VUID-WarpMaxIDARM-WarpMaxIDARM-07601
    使用 WarpMaxIDARM 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-WarpMaxIDARM-WarpMaxIDARM-07602
    使用 WarpMaxIDARM 修饰的变量必须声明为标量 32 位整数值。

WarpIDARM

使用 WarpIDARM 内置修饰符修饰变量将使该变量包含当前着色器调用正在运行的内核上的 warp 的 ID。此变量的范围为 [0, WarpMaxIDARM]

有效用法
  • VUID-WarpIDARM-WarpIDARM-07603
    使用 WarpIDARM 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-WarpIDARM-WarpIDARM-07604
    使用 WarpIDARM 修饰的变量必须声明为标量 32 位整数值。

CoalescedInputCountAMDX

使用 CoalescedInputCountAMDX 内置修饰符修饰变量将使该变量包含实现合并到当前着色器的输入的节点分派数量。此变量的值将在 [1, arraySize) 范围内,其中 arraySize 是着色器的输入有效负载数组的最大大小。

有效用法
  • VUID-CoalescedInputCountAMDX-CoalescedInputCountAMDX-09172
    使用 CoalescedInputCountAMDX 修饰的变量必须使用 Input Storage Class 声明。

  • VUID-CoalescedInputCountAMDX-CoalescedInputCountAMDX-09173
    如果一个变量使用 CoalescedInputCountAMDX 修饰,则必须声明 CoalescingAMDX 执行模式。

  • VUID-CoalescedInputCountAMDX-CoalescedInputCountAMDX-09174
    使用 CoalescedInputCountAMDX 修饰的变量必须声明为标量 32 位整数值。

ShaderIndexAMDX

使用 ShaderIndexAMDX 内置修饰符修饰一个变量,将使该变量包含编译时指定的着色器索引,可以通过 VkPipelineShaderStageNodeCreateInfoAMDX::index 或者通过 ShaderIndexAMDX 执行模式来指定。

有效用法
  • VUID-ShaderIndexAMDX-ShaderIndexAMDX-09175
    使用 ShaderIndexAMDX 修饰的变量必须使用 Input Storage Class 进行声明。

  • VUID-ShaderIndexAMDX-ShaderIndexAMDX-09176
    使用 ShaderIndexAMDX 修饰的变量必须声明为标量 32 位整数值。