渲染通道

绘制命令必须渲染通道实例中记录。每个渲染通道实例定义一组在渲染期间使用的图像资源,称为附件

要开始渲染通道实例,请调用

// Provided by VK_VERSION_1_3
void vkCmdBeginRendering(
    VkCommandBuffer                             commandBuffer,
    const VkRenderingInfo*                      pRenderingInfo);

或等效命令

// Provided by VK_KHR_dynamic_rendering
void vkCmdBeginRenderingKHR(
    VkCommandBuffer                             commandBuffer,
    const VkRenderingInfo*                      pRenderingInfo);
  • commandBuffer 是在其中记录命令的命令缓冲区。

  • pRenderingInfo 是指向 VkRenderingInfo 结构的指针,该结构指定要开始的渲染通道实例的详细信息。

开始渲染通道实例后,命令缓冲区即可记录绘制命令

如果 pRenderingInfo->flags 包含 VK_RENDERING_RESUMING_BIT,则此渲染通道是从先前在提交顺序中挂起的渲染通道实例恢复的。

有效用法
  • VUID-vkCmdBeginRendering-dynamicRendering-06446
    必须启用dynamicRendering功能

  • VUID-vkCmdBeginRendering-commandBuffer-06068
    如果 commandBuffer 是辅助命令缓冲区,并且未启用nestedCommandBuffer 功能,则 pRenderingInfo->flags不得包含 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT

  • VUID-vkCmdBeginRendering-pRenderingInfo-09588
    如果 pRenderingInfo->pDepthAttachment 不为 NULLpRenderingInfo->pDepthAttachment→imageView 不为 VK_NULL_HANDLE,则 pRenderingInfo->pDepthAttachment→imageView 必须采用 pRenderingInfo->pDepthAttachment→imageLayout 指定的布局

  • VUID-vkCmdBeginRendering-pRenderingInfo-09589
    如果 pRenderingInfo->pDepthAttachment 不为 NULLpRenderingInfo->pDepthAttachment→imageView 不为 VK_NULL_HANDLEpRenderingInfo->pDepthAttachment→imageResolveMode 不为 VK_RESOLVE_MODE_NONE,并且 pRenderingInfo->pDepthAttachment→resolveImageView 不为 VK_NULL_HANDLE,则 pRenderingInfo->pDepthAttachment→resolveImageView 必须采用 pRenderingInfo->pDepthAttachment→resolveImageLayout 指定的布局

  • VUID-vkCmdBeginRendering-pRenderingInfo-09590
    如果 pRenderingInfo->pStencilAttachment 不为 NULLpRenderingInfo->pStencilAttachment→imageView 不为 VK_NULL_HANDLE,则 pRenderingInfo->pStencilAttachment→imageView 必须采用 pRenderingInfo->pStencilAttachment→imageLayout 指定的布局

  • VUID-vkCmdBeginRendering-pRenderingInfo-09591
    如果 pRenderingInfo->pStencilAttachment 不为 NULLpRenderingInfo->pStencilAttachment→imageView 不为 VK_NULL_HANDLEpRenderingInfo->pStencilAttachment→imageResolveMode 不为 VK_RESOLVE_MODE_NONE,并且 pRenderingInfo->pStencilAttachment→resolveImageView 不为 VK_NULL_HANDLE,则 pRenderingInfo->pStencilAttachment→resolveImageView 必须采用 pRenderingInfo->pStencilAttachment→resolveImageLayout 指定的布局

  • VUID-vkCmdBeginRendering-pRenderingInfo-09592
    对于 pRenderingInfo->pColorAttachments 的任何元素,如果 imageView 不为 VK_NULL_HANDLE,则该图像视图必须采用 imageLayout 指定的布局

  • VUID-vkCmdBeginRendering-pRenderingInfo-09593
    对于 pRenderingInfo->pColorAttachments 的任何元素,如果 imageResolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,或者 imageView 不是 VK_NULL_HANDLEresolveMode 不是 VK_RESOLVE_MODE_NONE,并且 resolveImageView 不是 VK_NULL_HANDLE,则 resolveImageView 必须 处于 resolveImageLayout 指定的布局中。

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

  • VUID-vkCmdBeginRendering-pRenderingInfo-parameter
    pRenderingInfo 必须 是指向有效 VkRenderingInfo 结构的有效指针。

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

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

  • VUID-vkCmdBeginRendering-renderpass
    此命令必须仅在渲染过程实例之外调用。

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

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

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

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

主要
次要

外部

外部

图形

操作
状态

VkRenderingInfo 结构定义如下

// Provided by VK_VERSION_1_3
typedef struct VkRenderingInfo {
    VkStructureType                     sType;
    const void*                         pNext;
    VkRenderingFlags                    flags;
    VkRect2D                            renderArea;
    uint32_t                            layerCount;
    uint32_t                            viewMask;
    uint32_t                            colorAttachmentCount;
    const VkRenderingAttachmentInfo*    pColorAttachments;
    const VkRenderingAttachmentInfo*    pDepthAttachment;
    const VkRenderingAttachmentInfo*    pStencilAttachment;
} VkRenderingInfo;

或等效的

// Provided by VK_KHR_dynamic_rendering, VK_QCOM_tile_properties with VK_KHR_dynamic_rendering or VK_VERSION_1_3
typedef VkRenderingInfo VkRenderingInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flagsVkRenderingFlagBits 的位掩码。

  • renderArea 是受渲染过程实例影响的渲染区域。

  • layerCount 是当 viewMask0 时,每个附件中渲染的层数。

  • viewMask 是视图掩码,指示当它不为 0 时将渲染的附件层的索引。

  • colorAttachmentCountpColorAttachments 中的元素数量。

  • pColorAttachments 是指向 colorAttachmentCountVkRenderingAttachmentInfo 结构的数组的指针,这些结构描述了使用的任何颜色附件。

  • pDepthAttachment 是指向描述深度附件的 VkRenderingAttachmentInfo 结构的指针。

  • pStencilAttachment 是指向描述模板附件的 VkRenderingAttachmentInfo 结构的指针。

如果 viewMask 不为 0,则启用多视图。

如果 pNext 链中包含 VkDeviceGroupRenderPassBeginInfo 的实例,并且其 deviceRenderAreaCount 成员不为 0,则将忽略 renderArea,并且渲染区域由该结构按设备定义。

如果启用了多视图,并且启用了 multiviewPerViewRenderAreas 功能,并且 pNext 链中包含 VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM 的实例,且 perViewRenderAreaCount 不等于 0,则 VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM::pPerViewRenderAreas 的元素将覆盖 renderArea 并为每个视图定义一个渲染区域。 在这种情况下,renderArea 必须 是至少与所有按视图渲染区域的联合一样大的区域。

pColorAttachments 数组的每个元素都对应于着色器中的一个输出位置,即如果着色器声明了一个使用 Location 值为 X 修饰的输出变量,则它将使用 pColorAttachments[X] 中提供的附件。 如果 pColorAttachments 的任何元素的 imageView 成员是 VK_NULL_HANDLE,并且 resolveMode 不是 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则会丢弃片段对相应位置的写入。

有效用法
  • VUID-VkRenderingInfo-viewMask-06069
    如果 viewMask0,则 layerCount 必须 不为 0

  • VUID-VkRenderingInfo-multisampledRenderToSingleSampled-06857
    如果未启用以下任何一项,则 pDepthAttachmentpStencilAttachmentpColorAttachments 元素中非 VK_NULL_HANDLEimageView 成员必须具有相同的 sampleCount

  • VUID-VkRenderingInfo-imageView-09429
    如果未启用 multisampledRenderToSingleSampled 功能,则 pColorAttachments 元素中非 VK_NULL_HANDLEimageView 成员必须具有相同的 sampleCount

  • VUID-VkRenderingInfo-None-08994
    如果 VkDeviceGroupRenderPassBeginInfo::deviceRenderAreaCount 为 0,则 renderArea.extent.width 必须 大于 0。

  • VUID-VkRenderingInfo-None-08995
    如果 VkDeviceGroupRenderPassBeginInfo::deviceRenderAreaCount 为 0,则 renderArea.extent.height 必须 大于 0。

  • VUID-VkRenderingInfo-imageView-06858
    如果启用了多采样渲染到单采样,则由pDepthAttachmentpStencilAttachmentimageView成员以及pColorAttachments元素(非VK_NULL_HANDLE)引用的所有附件的采样计数必须VK_SAMPLE_COUNT_1_BIT,或者等于VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples

  • VUID-VkRenderingInfo-imageView-06859
    如果启用了多采样渲染到单采样,则由pDepthAttachmentpStencilAttachmentimageView成员以及pColorAttachments元素(非VK_NULL_HANDLE且采样计数为VK_SAMPLE_COUNT_1_BIT)引用的所有附件,在其VkImageCreateInfo::flags必须使用VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT创建。

  • VUID-VkRenderingInfo-pNext-06077
    如果pNext链不包含VkDeviceGroupRenderPassBeginInfo,或者其deviceRenderAreaCount成员等于0,则renderArea.offset.x必须大于或等于0。

  • VUID-VkRenderingInfo-pNext-06078
    如果pNext链不包含VkDeviceGroupRenderPassBeginInfo,或者其deviceRenderAreaCount成员等于0,则renderArea.offset.y必须大于或等于0。

  • VUID-VkRenderingInfo-pNext-07815
    如果pNext链不包含VkDeviceGroupRenderPassBeginInfo,或者其deviceRenderAreaCount成员等于0,则renderArea.extent.widthrenderArea.offset.x之和必须小于或等于maxFramebufferWidth

  • VUID-VkRenderingInfo-pNext-07816
    如果pNext链不包含VkDeviceGroupRenderPassBeginInfo,或者其deviceRenderAreaCount成员等于0,则renderArea.extent.heightrenderArea.offset.y之和必须小于或等于maxFramebufferHeight

  • VUID-VkRenderingInfo-pNext-06079
    如果pNext链不包含VkDeviceGroupRenderPassBeginInfo,或者其deviceRenderAreaCount成员等于0,则pColorAttachmentspDepthAttachmentpStencilAttachment的任何元素(非VK_NULL_HANDLE)的imageView成员的宽度必须大于或等于 renderArea.offset.x + renderArea.extent.width

  • VUID-VkRenderingInfo-pNext-06080
    如果pNext链不包含VkDeviceGroupRenderPassBeginInfo,或者其deviceRenderAreaCount成员等于0,则pColorAttachmentspDepthAttachmentpStencilAttachment的任何元素(非VK_NULL_HANDLE)的imageView成员的高度必须大于或等于 renderArea.offset.y + renderArea.extent.height

  • VUID-VkRenderingInfo-pNext-06083
    如果pNext链包含VkDeviceGroupRenderPassBeginInfo,则pColorAttachmentspDepthAttachmentpStencilAttachment的任何元素(非VK_NULL_HANDLE)的imageView成员的宽度必须大于或等于pDeviceRenderAreas的每个元素的offset.xextent.width成员之和。

  • VUID-VkRenderingInfo-pNext-06084
    如果pNext链包含VkDeviceGroupRenderPassBeginInfo,则pColorAttachmentspDepthAttachmentpStencilAttachment的任何元素(非VK_NULL_HANDLE)的imageView成员的高度必须大于或等于pDeviceRenderAreas的每个元素的offset.yextent.height成员之和。

  • VUID-VkRenderingInfo-pDepthAttachment-06085
    如果pDepthAttachmentpStencilAttachment都不为NULL,并且其中任何一个结构的imageView成员不为VK_NULL_HANDLE,则每个结构的imageView成员必须相同。

  • VUID-VkRenderingInfo-pDepthAttachment-06086
    如果pDepthAttachmentpStencilAttachment都不为NULL,并且每个结构的resolveMode成员不为VK_RESOLVE_MODE_NONE,则每个结构的resolveImageView成员必须相同。

  • VUID-VkRenderingInfo-colorAttachmentCount-06087
    如果colorAttachmentCount不为0,并且pColorAttachments的元素的imageView成员不为VK_NULL_HANDLE,则该imageView必须已使用VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT创建。

  • VUID-VkRenderingInfo-colorAttachmentCount-09476
    如果colorAttachmentCount不为0,并且pColorAttachments的某个元素的resolveMode成员设置为VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,或者其imageView成员不为VK_NULL_HANDLE,并且其resolveMode成员未设置为VK_RESOLVE_MODE_NONE,则pColorAttachments的该元素的resolveImageView成员必须已使用VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT创建。

  • VUID-VkRenderingInfo-pDepthAttachment-06547
    如果pDepthAttachment不为NULL,并且pDepthAttachment->imageView不为VK_NULL_HANDLE,则pDepthAttachment->imageView必须已使用包含深度分量的格式创建。

  • VUID-VkRenderingInfo-pDepthAttachment-06088
    如果pDepthAttachment不为NULL,并且pDepthAttachment->imageView不为VK_NULL_HANDLE,则pDepthAttachment->imageView必须已使用VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT创建。

  • VUID-VkRenderingInfo-pDepthAttachment-09477
    如果pDepthAttachment不为NULL,并且pDepthAttachment->resolveMode不为VK_RESOLVE_MODE_NONE,则pDepthAttachment->resolveImageView必须已使用VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT创建。

  • VUID-VkRenderingInfo-pStencilAttachment-06548
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,则 pStencilAttachment->imageView 必须 使用包含模板面的格式创建。

  • VUID-VkRenderingInfo-pStencilAttachment-06089
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,则 pStencilAttachment->imageView 必须 使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 的模板用途创建。

  • VUID-VkRenderingInfo-pStencilAttachment-09478
    如果 pStencilAttachment 不为 NULLpStencilAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pStencilAttachment->resolveImageView 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkRenderingInfo-colorAttachmentCount-06090
    如果 colorAttachmentCount 不为 0pColorAttachments 中某个元素的 imageView 成员不为 VK_NULL_HANDLE,则该元素的 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-colorAttachmentCount-06091
    如果 colorAttachmentCount 不为 0pColorAttachments 中某个元素的 imageView 成员不为 VK_NULL_HANDLE,如果该元素的 resolveMode 成员不为 VK_RESOLVE_MODE_NONE,则其 resolveImageLayout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pDepthAttachment-06092
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,则 pDepthAttachment->layout 必须不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkRenderingInfo-pDepthAttachment-06093
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,且 pDepthAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pDepthAttachment->resolveImageLayout 必须不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkRenderingInfo-pStencilAttachment-06094
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,则 pStencilAttachment->layout 必须不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkRenderingInfo-pStencilAttachment-06095
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,且 pStencilAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pStencilAttachment->resolveImageLayout 必须不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkRenderingInfo-colorAttachmentCount-06096
    如果 colorAttachmentCount 不为 0pColorAttachments 中某个元素的 imageView 成员不为 VK_NULL_HANDLE,则该元素的 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-colorAttachmentCount-06097
    如果 colorAttachmentCount 不为 0pColorAttachments 中某个元素的 imageView 成员不为 VK_NULL_HANDLE,如果该元素的 resolveMode 成员不为 VK_RESOLVE_MODE_NONE,则其 resolveImageLayout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pDepthAttachment-06098
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,且 pDepthAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pDepthAttachment->resolveImageLayout 必须不为 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkRenderingInfo-pStencilAttachment-06099
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,且 pStencilAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pStencilAttachment->resolveImageLayout 必须不为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-colorAttachmentCount-06100
    如果 colorAttachmentCount 不为 0pColorAttachments 中某个元素的 imageView 成员不为 VK_NULL_HANDLE,则该元素的 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-colorAttachmentCount-06101
    如果 colorAttachmentCount 不为 0pColorAttachments 中某个元素的 imageView 成员不为 VK_NULL_HANDLE,如果该元素的 resolveMode 成员不为 VK_RESOLVE_MODE_NONE,则其 resolveImageLayout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pDepthAttachment-07732
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,则 pDepthAttachment->layout 必须不为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pDepthAttachment-07733
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,且 pDepthAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pDepthAttachment->resolveImageLayout 必须不为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pStencilAttachment-07734
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,则 pStencilAttachment->layout 必须不为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pStencilAttachment-07735
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,且 pStencilAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pStencilAttachment->resolveImageLayout 必须不为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkRenderingInfo-pDepthAttachment-06102
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,则 pDepthAttachment->resolveMode 必须VkPhysicalDeviceDepthStencilResolveProperties::supportedDepthResolveModes 中设置的位之一

  • VUID-VkRenderingInfo-pStencilAttachment-06103
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,则 pStencilAttachment->resolveMode 必须VkPhysicalDeviceDepthStencilResolveProperties::supportedStencilResolveModes 中设置的位之一

  • VUID-VkRenderingInfo-pDepthAttachment-06104
    如果 pDepthAttachmentpStencilAttachment 都不为 NULL,并且 pDepthAttachment->imageViewpStencilAttachment->imageView 都不为 VK_NULL_HANDLE,并且 VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNoneVK_FALSE,则这两个结构的 resolveMode 必须是相同的值

  • VUID-VkRenderingInfo-pDepthAttachment-06105
    如果 pDepthAttachmentpStencilAttachment 都不为 NULL,并且 pDepthAttachment->imageViewpStencilAttachment->imageView 都不为 VK_NULL_HANDLE,并且 VkPhysicalDeviceDepthStencilResolveProperties::independentResolveVK_FALSE,并且这两个结构的 resolveMode 都不是 VK_RESOLVE_MODE_NONE,则这两个结构的 resolveMode 必须是相同的值

  • VUID-VkRenderingInfo-colorAttachmentCount-06106
    colorAttachmentCount 必须小于或等于 VkPhysicalDeviceLimits::maxColorAttachments

  • VUID-VkRenderingInfo-imageView-06107
    如果 pNext 链中包含的 VkRenderingFragmentDensityMapAttachmentInfoEXT 结构的 imageView 成员不为 VK_NULL_HANDLE,并且 fragmentDensityMapNonSubsampledImages 功能未启用,则 pDepthAttachmentpStencilAttachmentpColorAttachments 的每个元素的有效 imageViewresolveImageView 成员 必须是使用 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT 创建的 VkImageView

  • VUID-VkRenderingInfo-imageView-06108
    如果 pNext 链中包含的 VkRenderingFragmentDensityMapAttachmentInfoEXT 结构的 imageView 成员不为 VK_NULL_HANDLE,并且 viewMask 不为 0,则 imageView 必须具有大于或等于 viewMask 中最高有效位索引的 layerCount

  • VUID-VkRenderingInfo-imageView-06109
    如果 pNext 链中包含的 VkRenderingFragmentDensityMapAttachmentInfoEXT 结构的 imageView 成员不为 VK_NULL_HANDLE,并且 viewMask0,则 imageView 必须具有等于 1layerCount

  • VUID-VkRenderingInfo-pNext-06112
    If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0 and the imageView member of a VkRenderingFragmentDensityMapAttachmentInfoEXT structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a width greater than or equal to

  • VUID-VkRenderingInfo-pNext-06114
    If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0 and the imageView member of a VkRenderingFragmentDensityMapAttachmentInfoEXT structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a height greater than or equal to

  • VUID-VkRenderingInfo-pNext-06113
    If the pNext chain contains a VkDeviceGroupRenderPassBeginInfo structure, its deviceRenderAreaCount member is not 0, and the imageView member of a VkRenderingFragmentDensityMapAttachmentInfoEXT structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a width greater than or equal to for each element of pDeviceRenderAreas

  • VUID-VkRenderingInfo-pNext-06115
    If the pNext chain contains a VkDeviceGroupRenderPassBeginInfo structure, its deviceRenderAreaCount member is not 0, and the imageView member of a VkRenderingFragmentDensityMapAttachmentInfoEXT structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a height greater than or equal to for each element of pDeviceRenderAreas

  • VUID-VkRenderingInfo-imageView-06116
    如果 pNext 链中包含的 VkRenderingFragmentDensityMapAttachmentInfoEXT 结构的 imageView 成员不为 VK_NULL_HANDLE,则它 必须不等于 pDepthAttachmentpStencilAttachmentpColorAttachments 的任何元素的 imageViewresolveImageView 成员

  • VUID-VkRenderingInfo-pNext-06119
    If the maintenance7 feature is not enabled or the robustFragmentShadingRateAttachmentAccess limit is VK_FALSE or the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure was created with VkImageSubresourceRange::baseMipLevel greater than 0, the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, and the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a width greater than or equal to

  • VUID-VkRenderingInfo-pNext-06121
    If the maintenance7 feature is not enabled or the robustFragmentShadingRateAttachmentAccess limit is VK_FALSE or the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure was created with VkImageSubresourceRange::baseMipLevel greater than 0, the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0 and the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a height greater than or equal to

  • VUID-VkRenderingInfo-pNext-06120
    If the maintenance7 feature is not enabled or the robustFragmentShadingRateAttachmentAccess limit is VK_FALSE or the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure was created with VkImageSubresourceRange::baseMipLevel greater than 0, the pNext chain contains a VkDeviceGroupRenderPassBeginInfo structure, its deviceRenderAreaCount member is not 0, and the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a width greater than or equal to for each element of pDeviceRenderAreas

  • VUID-VkRenderingInfo-pNext-06122
    If the maintenance7 feature is not enabled or the robustFragmentShadingRateAttachmentAccess limit is VK_FALSE or the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure was created with VkImageSubresourceRange::baseMipLevel greater than 0, the pNext chain contains a VkDeviceGroupRenderPassBeginInfo structure, its deviceRenderAreaCount member is not 0, and the imageView member of a VkRenderingFragmentShadingRateAttachmentInfoKHR structure included in the pNext chain is not VK_NULL_HANDLE, imageView must have a height greater than or equal to for each element of pDeviceRenderAreas

  • VUID-VkRenderingInfo-layerCount-07817
    layerCount 必须小于或等于 maxFramebufferLayers

  • VUID-VkRenderingInfo-imageView-06123
    如果 pNext 链中包含的 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员不为 VK_NULL_HANDLE,并且 viewMask0,则 imageView 必须具有等于 1 或大于或等于 layerCountlayerCount

  • VUID-VkRenderingInfo-imageView-06124
    如果 pNext 链中包含的 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员不为 VK_NULL_HANDLE,并且 viewMask 不为 0,则 imageView 必须具有等于 1 或大于或等于 viewMask 中最高有效位索引的 layerCount

  • VUID-VkRenderingInfo-imageView-06125
    如果 pNext 链中包含的 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员不为 VK_NULL_HANDLE,则它 必须不等于 pDepthAttachmentpStencilAttachmentpColorAttachments 的任何元素的 imageViewresolveImageView 成员

  • VUID-VkRenderingInfo-imageView-06126
    如果 pNext 链中包含的 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员不为 VK_NULL_HANDLE,则它 必须不等于 pNext 链中包含的 VkRenderingFragmentDensityMapAttachmentInfoEXT 结构的 imageView 成员

  • VUID-VkRenderingInfo-multiview-06127
    如果 multiview 功能未启用,则 viewMask 必须0

  • VUID-VkRenderingInfo-viewMask-06128
    viewMask 中最高有效位的索引 必须小于 maxMultiviewViewCount

  • VUID-VkRenderingInfo-perViewRenderAreaCount-07857
    如果 pNext 链中包含的 VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM 结构的 perViewRenderAreaCount 成员不为 0,则必须启用 multiviewPerViewRenderAreas 特性。

  • VUID-VkRenderingInfo-perViewRenderAreaCount-07858
    如果 pNext 链中包含的 VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM 结构的 perViewRenderAreaCount 成员不为 0,则 renderArea 必须指定一个包含所有逐视图渲染区域的并集的渲染区域。

  • VUID-VkRenderingInfo-None-09044
    此结构指定的有效附件必须不绑定到绑定到此结构指定的任何其他有效附件的内存位置。

  • VUID-VkRenderingInfo-flags-10012
    如果 flags 包含 VK_RENDERING_CONTENTS_INLINE_BIT_KHR,则必须启用以下至少一个特性:

  • VUID-VkRenderingInfo-pDepthAttachment-09318
    pDepthAttachment->resolveMode 必须不能为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID

  • VUID-VkRenderingInfo-pStencilAttachment-09319
    pStencilAttachment->resolveMode 必须不能为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID

  • VUID-VkRenderingInfo-colorAttachmentCount-09320
    如果 colorAttachmentCount 不为 1,则 pColorAttachments 的任何元素的 resolveMode 成员必须不能为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID

  • VUID-VkRenderingInfo-resolveMode-09321
    如果 pColorAttachments 的任何元素的 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则 VkRenderingFragmentDensityMapAttachmentInfoEXT::imageView 必须VK_NULL_HANDLE

  • VUID-VkRenderingInfo-resolveMode-09322
    如果 pColorAttachments 的任何元素的 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则 VkRenderingFragmentShadingRateAttachmentInfoKHR::imageView 必须VK_NULL_HANDLE

  • VUID-VkRenderingInfo-pNext-09535
    如果 pNext 链包含 VkRenderPassStripeBeginInfoARM 结构,则 VkRenderPassStripeInfoARM::pStripeInfos 的元素定义的条带区域的并集必须覆盖 renderArea

  • VUID-VkRenderingInfo-colorAttachmentCount-09479
    如果 colorAttachmentCount 不为 0pColorAttachments 的元素的 imageView 成员不为 VK_NULL_HANDLE,则该 imageView 必须已使用identity swizzle创建。

  • VUID-VkRenderingInfo-colorAttachmentCount-09480
    如果 colorAttachmentCount 不为 0,并且 pColorAttachments 的某个元素的 resolveMode 成员设置为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,或者其 imageView 成员未设置为 VK_NULL_HANDLE 且其 resolveMode 成员未设置为 VK_RESOLVE_MODE_NONE,则 pColorAttachments 的该元素的 resolveImageView 成员必须已使用 identity swizzle 创建。

  • VUID-VkRenderingInfo-pDepthAttachment-09481
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,则 pDepthAttachment->imageView 必须已使用 identity swizzle 创建。

  • VUID-VkRenderingInfo-pDepthAttachment-09482
    如果 pDepthAttachment 不为 NULLpDepthAttachment->imageView 不为 VK_NULL_HANDLE,且 pDepthAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pDepthAttachment->resolveImageView 必须已使用 identity swizzle 创建。

  • VUID-VkRenderingInfo-pStencilAttachment-09483
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,则 pStencilAttachment->imageView 必须已使用 identity swizzle 创建。

  • VUID-VkRenderingInfo-pStencilAttachment-09484
    如果 pStencilAttachment 不为 NULLpStencilAttachment->imageView 不为 VK_NULL_HANDLE,且 pStencilAttachment->resolveMode 不为 VK_RESOLVE_MODE_NONE,则 pStencilAttachment->resolveImageView 必须已使用 identity swizzle 创建。

  • VUID-VkRenderingInfo-imageView-09485
    如果 pNext 链中包含的 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员不为 VK_NULL_HANDLE,则它必须已使用 identity swizzle 创建。

  • VUID-VkRenderingInfo-imageView-09486
    如果 pNext 链中包含的 VkRenderingFragmentDensityMapAttachmentInfoEXT 结构的 imageView 成员不为 VK_NULL_HANDLE,则它必须已使用 identity swizzle 创建。

有效使用 (隐式)

VkRenderingInfo::flags 中可以设置的,描述渲染通道附加属性的位是:

// Provided by VK_VERSION_1_3
typedef enum VkRenderingFlagBits {
    VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT = 0x00000001,
    VK_RENDERING_SUSPENDING_BIT = 0x00000002,
    VK_RENDERING_RESUMING_BIT = 0x00000004,
  // Provided by VK_EXT_legacy_dithering with (VK_KHR_dynamic_rendering or VK_VERSION_1_3) and (VK_KHR_maintenance5 or VK_VERSION_1_4)
    VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000008,
  // Provided by VK_KHR_maintenance7
    VK_RENDERING_CONTENTS_INLINE_BIT_KHR = 0x00000010,
  // Provided by VK_KHR_dynamic_rendering
    VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT,
  // Provided by VK_KHR_dynamic_rendering
    VK_RENDERING_SUSPENDING_BIT_KHR = VK_RENDERING_SUSPENDING_BIT,
  // Provided by VK_KHR_dynamic_rendering
    VK_RENDERING_RESUMING_BIT_KHR = VK_RENDERING_RESUMING_BIT,
  // Provided by VK_EXT_nested_command_buffer
    VK_RENDERING_CONTENTS_INLINE_BIT_EXT = VK_RENDERING_CONTENTS_INLINE_BIT_KHR,
} VkRenderingFlagBits;

或等效的

// Provided by VK_KHR_dynamic_rendering
typedef VkRenderingFlagBits VkRenderingFlagBitsKHR;
  • VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT 指定渲染通道实例的绘制调用将记录在辅助命令缓冲区中。如果启用了 nestedCommandBuffer 特性,则绘制调用可以来自内联和 vkCmdExecuteCommands

  • VK_RENDERING_RESUMING_BIT 指定渲染通道实例正在恢复之前暂停的渲染通道实例。

  • VK_RENDERING_SUSPENDING_BIT 指定渲染通道实例将被暂停。

  • VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 指定渲染通道实例启用了旧式抖动

  • VK_RENDERING_CONTENTS_INLINE_BIT_KHR 指定渲染通道实例的绘制调用可以在当前命令缓冲区内内联记录。 这可以VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT 位组合使用,以允许绘制调用同时在内联和辅助命令缓冲区中记录。

在暂停的渲染通道实例和恢复它们的渲染通道实例之间,pRenderingInfo 的内容必须匹配,除了 VK_RENDERING_RESUMING_BITVK_RENDERING_SUSPENDING_BITVK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT 标志的存在或缺失。在暂停和恢复渲染通道实例之间,不允许执行任何操作或同步命令,也不允许执行其他渲染通道实例。

// Provided by VK_VERSION_1_3
typedef VkFlags VkRenderingFlags;

或等效的

// Provided by VK_KHR_dynamic_rendering
typedef VkRenderingFlags VkRenderingFlagsKHR;

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

VkRenderingAttachmentInfo 结构体定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkRenderingAttachmentInfo {
    VkStructureType          sType;
    const void*              pNext;
    VkImageView              imageView;
    VkImageLayout            imageLayout;
    VkResolveModeFlagBits    resolveMode;
    VkImageView              resolveImageView;
    VkImageLayout            resolveImageLayout;
    VkAttachmentLoadOp       loadOp;
    VkAttachmentStoreOp      storeOp;
    VkClearValue             clearValue;
} VkRenderingAttachmentInfo;

或等效的

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

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

  • imageView 是将用于渲染的图像视图。

  • imageLayout 是渲染期间 imageView 将处于的布局。

  • resolveMode 是一个 VkResolveModeFlagBits 值,定义写入 imageView 的数据将如何解析到 resolveImageView 中。

  • resolveImageView 是一个图像视图,用于在渲染结束时写入解析后的数据。

  • resolveImageLayout 是渲染期间 resolveImageView 将处于的布局。

  • loadOp 是一个 VkAttachmentLoadOp 值,定义附件的加载操作

  • storeOp 是一个 VkAttachmentStoreOp 值,定义附件的存储操作

  • clearValue 是一个 VkClearValue 结构体,定义当 loadOpVK_ATTACHMENT_LOAD_OP_CLEAR 时用于清除 imageView 的值。

imageView 中的值会根据 loadOpstoreOp 的值,在 VkRenderingInfo 中指定的每个设备的渲染区域内加载和存储。 如果 imageViewVK_NULL_HANDLE,并且 resolveMode 不是 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则此结构体的其他成员将被忽略;对该附件的写入将被丢弃,并且不会执行加载存储多重采样解析操作。

如果 resolveModeVK_RESOLVE_MODE_NONE,则 resolveImageView 将被忽略。如果 resolveMode 不是 VK_RESOLVE_MODE_NONE,且 resolveImageView 不为 VK_NULL_HANDLE,则为附件子资源定义渲染通道多重采样解析操作。如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,并且 nullColorAttachmentWithExternalFormatResolve 限制为 VK_TRUE,则只有在 加载操作完成后,值才为未定义

解析模式和存储操作是独立的;写入解析值和未解析值都是有效的,并且在写入解析值时丢弃未解析值也是同样有效的。

存储和解析操作仅在不指定 VK_RENDERING_SUSPENDING_BIT_KHR 标志的渲染通道实例结束时执行。

加载操作仅在不指定 VK_RENDERING_RESUMING_BIT_KHR 标志的渲染通道实例开始时执行。

暂停的渲染通道实例末尾的图像内容保持定义,以便恢复的渲染通道实例访问。

如果 nullColorAttachmentWithExternalFormatResolve 限制为 VK_TRUE,并且 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则在渲染开始时将从解析附件加载颜色附件中的值,并且在解析发生后或写入解析附件后,可能也会重新加载;如果发生这种情况,它必须在任何对颜色附件的写入之前发生,而这些写入发生在触发此操作的解析之后。如果外部格式中的任何颜色分量被二次采样,则当加载它们时,将从图像中最接近的采样中读取值。

有效用法
  • VUID-VkRenderingAttachmentInfo-imageView-06129
    如果 imageView 不为 VK_NULL_HANDLE 并且具有非整数颜色格式,则 resolveMode 必须VK_RESOLVE_MODE_NONEVK_RESOLVE_MODE_AVERAGE_BIT

  • VUID-VkRenderingAttachmentInfo-imageView-06130
    如果 imageView 不为 VK_NULL_HANDLE 并且具有整数颜色格式,则 resolveMode 必须VK_RESOLVE_MODE_NONEVK_RESOLVE_MODE_SAMPLE_ZERO_BIT

  • VUID-VkRenderingAttachmentInfo-imageView-06861
    如果以下所有条件都成立,则 imageView 的采样计数必须不是 VK_SAMPLE_COUNT_1_BIT

  • VUID-VkRenderingAttachmentInfo-imageView-06862
    如果以下所有条件都成立,则 resolveImageView 必须 不是 VK_NULL_HANDLE

  • VUID-VkRenderingAttachmentInfo-imageView-06863
    如果 imageView 不是 VK_NULL_HANDLEresolveMode 不是 VK_RESOLVE_MODE_NONEVkRenderingInfopNext 链包含一个 multisampledRenderToSingleSampledEnable 字段等于 VK_TRUEVkMultisampledRenderToSingleSampledInfoEXT 结构体,并且 imageView 的采样计数为 VK_SAMPLE_COUNT_1_BIT,则 resolveImageView 必须VK_NULL_HANDLE

  • VUID-VkRenderingAttachmentInfo-imageView-06864
    如果 imageView 不是 VK_NULL_HANDLEresolveImageView 不是 VK_NULL_HANDLE,并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageView 必须 具有 VK_SAMPLE_COUNT_1_BIT 的采样计数。

  • VUID-VkRenderingAttachmentInfo-imageView-06865
    如果 imageView 不是 VK_NULL_HANDLEresolveImageView 不是 VK_NULL_HANDLE,并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 imageViewresolveImageView 必须 具有相同的 VkFormat

  • VUID-VkRenderingAttachmentInfo-imageView-06135
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须 不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkRenderingAttachmentInfo-imageView-06136
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkRenderingAttachmentInfo-imageView-06137
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderingAttachmentInfo-imageView-06138
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须 不是 VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV

  • VUID-VkRenderingAttachmentInfo-imageView-06139
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV

  • VUID-VkRenderingAttachmentInfo-imageView-06140
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须 不是 VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT

  • VUID-VkRenderingAttachmentInfo-imageView-06141
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT

  • VUID-VkRenderingAttachmentInfo-imageView-06142
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkRenderingAttachmentInfo-imageView-06143
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须 不是 VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR

  • VUID-VkRenderingAttachmentInfo-imageView-06144
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR

  • VUID-VkRenderingAttachmentInfo-imageView-06145
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须 不是 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

  • VUID-VkRenderingAttachmentInfo-imageView-06146
    如果 imageView 不是 VK_NULL_HANDLE 并且 resolveMode 不是 VK_RESOLVE_MODE_NONE,则 resolveImageLayout 必须 不是 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

  • VUID-VkRenderingAttachmentInfo-externalFormatResolve-09323
    如果 externalFormatResolve 特性未启用,则 resolveMode 必须 不是 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID

  • VUID-VkRenderingAttachmentInfo-resolveMode-09324
    如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则 resolveImageView 必须 是一个有效的图像视图。

  • VUID-VkRenderingAttachmentInfo-nullColorAttachmentWithExternalFormatResolve-09325
    如果 nullColorAttachmentWithExternalFormatResolve 属性为 VK_TRUE 并且 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则 resolveImageView 必须 使用 samples 值为 VK_SAMPLE_COUNT_1_BIT 的图像创建。

  • VUID-VkRenderingAttachmentInfo-resolveMode-09326
    如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则 resolveImageView 必须使用 VkExternalFormatANDROID 指定的外部格式创建。

  • VUID-VkRenderingAttachmentInfo-resolveMode-09327
    如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,则 resolveImageView 必须使用 subresourceRange.layerCount1 创建。

  • VUID-VkRenderingAttachmentInfo-resolveMode-09328
    如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 并且 nullColorAttachmentWithExternalFormatResolveVK_TRUE,则 imageView 必须VK_NULL_HANDLE

  • VUID-VkRenderingAttachmentInfo-resolveMode-09329
    如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 并且 nullColorAttachmentWithExternalFormatResolveVK_FALSE,则 imageView 必须为有效的 VkImageView

  • VUID-VkRenderingAttachmentInfo-resolveMode-09330
    如果 resolveModeVK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 并且 nullColorAttachmentWithExternalFormatResolveVK_FALSE,则 imageView 必须具有与 VkAndroidHardwareBufferFormatResolvePropertiesANDROID::colorAttachmentFormat 值相同的格式,该值是通过调用 vkGetAndroidHardwareBufferPropertiesANDROID 为用于创建 resolveImageView 的 Android 硬件缓冲区返回的。

有效使用 (隐式)
  • VUID-VkRenderingAttachmentInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO

  • VUID-VkRenderingAttachmentInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkRenderingAttachmentInfo-imageView-parameter
    如果 imageView 不是 VK_NULL_HANDLE,则 imageView 必须为有效的 VkImageView 句柄。

  • VUID-VkRenderingAttachmentInfo-imageLayout-parameter
    imageLayout 必须为有效的 VkImageLayout 值。

  • VUID-VkRenderingAttachmentInfo-resolveMode-parameter
    如果 resolveMode 不为 0,则 resolveMode 必须为有效的 VkResolveModeFlagBits 值。

  • VUID-VkRenderingAttachmentInfo-resolveImageView-parameter
    如果 resolveImageView 不是 VK_NULL_HANDLE,则 resolveImageView 必须为有效的 VkImageView 句柄。

  • VUID-VkRenderingAttachmentInfo-resolveImageLayout-parameter
    resolveImageLayout 必须为有效的 VkImageLayout 值。

  • VUID-VkRenderingAttachmentInfo-loadOp-parameter
    loadOp 必须为有效的 VkAttachmentLoadOp 值。

  • VUID-VkRenderingAttachmentInfo-storeOp-parameter
    storeOp 必须为有效的 VkAttachmentStoreOp 值。

  • VUID-VkRenderingAttachmentInfo-clearValue-parameter
    clearValue 必须为有效的 VkClearValue 联合体。

  • VUID-VkRenderingAttachmentInfo-commonparent
    imageViewresolveImageView 均为非忽略参数的有效句柄,它们必须是从同一个 VkDevice 创建、分配或检索的。

VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的定义如下:

// Provided by VK_KHR_fragment_shading_rate with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
typedef struct VkRenderingFragmentShadingRateAttachmentInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkImageView        imageView;
    VkImageLayout      imageLayout;
    VkExtent2D         shadingRateAttachmentTexelSize;
} VkRenderingFragmentShadingRateAttachmentInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • imageView 是将用作片段着色率附件的图像视图。

  • imageLayout 是渲染期间 imageView 将处于的布局。

  • shadingRateAttachmentTexelSize 指定 imageView 中每个纹素对应的像素数。

此结构可以包含在 VkRenderingInfopNext 链中,以定义片段着色率附件。如果 imageViewVK_NULL_HANDLE,或者未指定此结构,则实现的行为就好像指定了一个有效的着色率附件,其中所有纹素都指定每个片段一个像素。

有效用法
  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06147
    如果 imageView 不是 VK_NULL_HANDLE,则 layout 必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06148
    如果 imageView 不是 VK_NULL_HANDLE,则它必须使用 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 创建。

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06149
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.width 必须为 2 的幂。

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06150
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.width 必须小于或等于 maxFragmentShadingRateAttachmentTexelSize.width

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06151
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.width 必须大于或等于 minFragmentShadingRateAttachmentTexelSize.width

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06152
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.height 必须为 2 的幂。

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06153
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.height 必须小于或等于 maxFragmentShadingRateAttachmentTexelSize.height

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06154
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.height 必须 大于或等于 minFragmentShadingRateAttachmentTexelSize.height

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06155
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.widthshadingRateAttachmentTexelSize.height 的商 必须 小于或等于 maxFragmentShadingRateAttachmentTexelSizeAspectRatio

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06156
    如果 imageView 不是 VK_NULL_HANDLE,则 shadingRateAttachmentTexelSize.heightshadingRateAttachmentTexelSize.width 的商 必须 小于或等于 maxFragmentShadingRateAttachmentTexelSizeAspectRatio

有效使用 (隐式)
  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-parameter
    如果 imageView 不是 VK_NULL_HANDLE,则 imageView 必须为有效的 VkImageView 句柄。

  • VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageLayout-parameter
    imageLayout 必须为有效的 VkImageLayout 值。

VkRenderingFragmentDensityMapAttachmentInfoEXT 结构定义如下

// Provided by VK_EXT_fragment_density_map with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
typedef struct VkRenderingFragmentDensityMapAttachmentInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkImageView        imageView;
    VkImageLayout      imageLayout;
} VkRenderingFragmentDensityMapAttachmentInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • imageView 是将用作片段密度图附件的图像视图。

  • imageLayout 是渲染期间 imageView 将处于的布局。

此结构可以包含在 VkRenderingInfopNext 链中,以定义片段密度图。如果此结构未包含在 pNext 链中,则 imageView 被视为 VK_NULL_HANDLE

有效用法
  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06157
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT

  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06158
    如果 imageView 不是 VK_NULL_HANDLE,则它必须已使用 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT 创建。

  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06159
    如果 imageView 不是 VK_NULL_HANDLE,则它必须未用 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT 创建。

  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-apiVersion-07908
    如果 multiview 功能未启用,VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 imageView 不是 VK_NULL_HANDLE,则它的 layerCount 必须 等于 1

有效使用 (隐式)
  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT

  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-parameter
    imageView 必须 是有效的 VkImageView 句柄

  • VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageLayout-parameter
    imageLayout 必须为有效的 VkImageLayout 值。

要查询渲染过程实例的渲染区域粒度,请调用

// Provided by VK_VERSION_1_4
void vkGetRenderingAreaGranularity(
    VkDevice                                    device,
    const VkRenderingAreaInfo*                  pRenderingAreaInfo,
    VkExtent2D*                                 pGranularity);

或等效命令

// Provided by VK_KHR_maintenance5
void vkGetRenderingAreaGranularityKHR(
    VkDevice                                    device,
    const VkRenderingAreaInfo*                  pRenderingAreaInfo,
    VkExtent2D*                                 pGranularity);
  • device 是拥有渲染过程实例的逻辑设备。

  • pRenderingAreaInfo 是指向 VkRenderingAreaInfo 结构的指针,该结构指定要查询渲染区域粒度的渲染过程实例的详细信息。

  • pGranularity 是指向 VkExtent2D 结构的指针,其中返回粒度。

导致最佳 renderArea 的条件是

  • renderArea 中的 offset.x 成员是返回的 VkExtent2Dwidth 成员(水平粒度)的倍数。

  • renderArea 中的 offset.y 成员是返回的 VkExtent2Dheight 成员(垂直粒度)的倍数。

  • renderArea 中的 extent.width 成员是水平粒度的倍数,或者 offset.x+extent.width 等于渲染过程实例中使用的每个附件的 width

  • renderArea 中的 extent.height 成员是垂直粒度的倍数,或者 offset.y+extent.height 等于渲染过程实例中使用的每个附件的 height

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

  • VUID-vkGetRenderingAreaGranularity-pRenderingAreaInfo-parameter
    pRenderingAreaInfo 必须 是指向有效的 VkRenderingAreaInfo 结构的有效指针

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

VkRenderingAreaInfo 结构定义如下

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

或等效的

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

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

  • viewMask 是用于渲染的 viewMask。

  • colorAttachmentCountpColorAttachmentFormats 中的条目数

  • pColorAttachmentFormats 是指向 VkFormat 值数组的指针,这些值定义了渲染过程实例中使用的颜色附件的格式。

  • depthAttachmentFormat 是一个 VkFormat 值,定义了渲染过程实例中使用的深度附件的格式。

  • stencilAttachmentFormat 是一个 VkFormat 值,定义了渲染过程实例中使用的模板附件的格式。

有效使用 (隐式)
  • VUID-VkRenderingAreaInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDERING_AREA_INFO

  • VUID-VkRenderingAreaInfo-pNext-pNext
    pNext 必须NULL

VkRenderPassStripeBeginInfoARM 结构的定义如下:

// Provided by VK_ARM_render_pass_striped
typedef struct VkRenderPassStripeBeginInfoARM {
    VkStructureType                     sType;
    const void*                         pNext;
    uint32_t                            stripeInfoCount;
    const VkRenderPassStripeInfoARM*    pStripeInfos;
} VkRenderPassStripeBeginInfoARM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • stripeInfoCount 是此渲染过程实例中的条带数量。

  • pStripeInfos 是指向 stripeInfoCountVkRenderPassStripeInfoARM 结构数组的指针,这些结构描述了渲染过程实例使用的条带。

此结构可以包含在 VkRenderPassBeginInfoVkRenderingInfopNext 链中,以定义渲染过程实例如何分割为条带。

有效用法
  • VUID-VkRenderPassStripeBeginInfoARM-stripeInfoCount-09450
    stripeInfoCount 必须 小于或等于 VkPhysicalDeviceRenderPassStripedPropertiesARM::maxRenderPassStripes

  • VUID-VkRenderPassStripeBeginInfoARM-stripeArea-09451
    pStripeInfos 的每个元素定义的 stripeArea 必须 不与任何其他元素的 stripeArea 重叠

有效使用 (隐式)
  • VUID-VkRenderPassStripeBeginInfoARM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_BEGIN_INFO_ARM

  • VUID-VkRenderPassStripeBeginInfoARM-pStripeInfos-parameter
    pStripeInfos 必须 是指向 stripeInfoCount 个有效 VkRenderPassStripeInfoARM 结构数组的有效指针

  • VUID-VkRenderPassStripeBeginInfoARM-stripeInfoCount-arraylength
    stripeInfoCount 必须 大于 0

VkRenderPassStripeInfoARM 结构的定义如下:

// Provided by VK_ARM_render_pass_striped
typedef struct VkRenderPassStripeInfoARM {
    VkStructureType    sType;
    const void*        pNext;
    VkRect2D           stripeArea;
} VkRenderPassStripeInfoARM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • stripeArea 是条带区域,下面将详细介绍。

stripeArea 是渲染过程实例中此条带影响的渲染区域。它必须是渲染过程实例的 renderArea 的子区域。

有效用法
  • VUID-VkRenderPassStripeInfoARM-stripeArea-09452
    stripeArea.offset.x 必须VkPhysicalDeviceRenderPassStripedPropertiesARM::renderPassStripeGranularity.width 的倍数

  • VUID-VkRenderPassStripeInfoARM-stripeArea-09453
    stripeArea.extent.width 必须VkPhysicalDeviceRenderPassStripedPropertiesARM::renderPassStripeGranularity.width 的倍数,或者 stripeArea.offset.xstripeArea.extent.width 的总和必须等于渲染过程实例的 renderArea.extent.width

  • VUID-VkRenderPassStripeInfoARM-stripeArea-09454
    stripeArea.offset.y 必须VkPhysicalDeviceRenderPassStripedPropertiesARM::renderPassStripeGranularity.height 的倍数

  • VUID-VkRenderPassStripeInfoARM-stripeArea-09455
    stripeArea.extent.height 必须VkPhysicalDeviceRenderPassStripedPropertiesARM::renderPassStripeGranularity.height 的倍数,或者 stripeArea.offset.ystripeArea.extent.height 的总和必须等于渲染过程实例的 renderArea.extent.height

有效使用 (隐式)
  • VUID-VkRenderPassStripeInfoARM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_INFO_ARM

  • VUID-VkRenderPassStripeInfoARM-pNext-pNext
    pNext 必须NULL

要结束渲染过程实例,请调用

// Provided by VK_VERSION_1_3
void vkCmdEndRendering(
    VkCommandBuffer                             commandBuffer);

或等效命令

// Provided by VK_KHR_dynamic_rendering
void vkCmdEndRenderingKHR(
    VkCommandBuffer                             commandBuffer);
  • commandBuffer 是在其中记录命令的命令缓冲区。

如果用于开始此渲染过程实例的 pRenderingInfo->flags 的值包含 VK_RENDERING_SUSPENDING_BIT,则此渲染过程将被挂起,并在 提交顺序 中稍后恢复。

有效用法
  • VUID-vkCmdEndRendering-None-06161
    当前的渲染过程实例必须已使用 vkCmdBeginRendering 开始

  • VUID-vkCmdEndRendering-commandBuffer-06162
    当前的渲染过程实例必须commandBuffer 中开始

  • VUID-vkCmdEndRendering-None-06781
    当变换反馈处于活动状态时,必须不记录此命令

  • VUID-vkCmdEndRendering-None-06999
    如果在渲染过程内调用了 vkCmdBeginQuery*,则相应的 vkCmdEndQuery* 必须随后在同一子过程内调用

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

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

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

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

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

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

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

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

主要
次要

内部

外部

图形

操作
状态

对于更复杂的渲染图,可以预定义一个静态的渲染过程对象,该对象除了允许绘制命令外,还允许定义多个子过程之间的帧缓冲本地依赖关系。与 vkCmdBeginRendering 相比,这些对象的设置成本很高,但在某些设备上使用子过程依赖关系可以带来重要的性能优势。

VkTilePropertiesQCOM 结构的定义如下:

// Provided by VK_QCOM_tile_properties
typedef struct VkTilePropertiesQCOM {
    VkStructureType    sType;
    void*              pNext;
    VkExtent3D         tileSize;
    VkExtent2D         apronSize;
    VkOffset2D         origin;
} VkTilePropertiesQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • tileSize 是图块的尺寸,其中宽度和高度描述了图块的像素宽度和高度,深度对应于图块跨越的切片数。

  • apronSize 是围裙的尺寸。

  • origin 是附件空间中第一个图块的左上角。

所有图块都将紧密地围绕第一个图块排列,边缘与原点的距离是图块宽度和/或高度的倍数。

apronSize 的报告值将为零,其功能将在未来的扩展中描述。

有效使用 (隐式)
  • VUID-VkTilePropertiesQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM

  • VUID-VkTilePropertiesQCOM-pNext-pNext
    pNext 必须NULL

要在使用动态渲染时查询图块属性,请调用

// Provided by VK_QCOM_tile_properties
VkResult vkGetDynamicRenderingTilePropertiesQCOM(
    VkDevice                                    device,
    const VkRenderingInfo*                      pRenderingInfo,
    VkTilePropertiesQCOM*                       pProperties);
  • device 是与渲染通道关联的逻辑设备。

  • pRenderingInfo 是指向 VkRenderingInfo 结构的指针,该结构指定动态渲染中渲染通道实例的详细信息。

  • pProperties 是指向 VkTilePropertiesQCOM 结构的指针,该结构将返回属性。

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

  • VUID-vkGetDynamicRenderingTilePropertiesQCOM-pRenderingInfo-parameter
    pRenderingInfo 必须 是指向有效 VkRenderingInfo 结构的有效指针。

  • VUID-vkGetDynamicRenderingTilePropertiesQCOM-pProperties-parameter
    pProperties 必须 是指向有效的 VkTilePropertiesQCOM 结构的有效指针

返回代码
成功
  • VK_SUCCESS

失败

渲染通道对象

渲染通道对象表示附件、子通道以及子通道之间依赖关系的集合,并描述附件在子通道过程中如何被使用。

渲染通道由 VkRenderPass 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass)

附件描述描述附件的属性,包括其格式、采样计数,以及在每个渲染通道实例的开始和结束时如何处理其内容。

子通道表示渲染的一个阶段,该阶段读取和写入渲染通道中附件的子集。渲染命令被记录到渲染通道实例的特定子通道中。

子通道描述描述参与子通道执行的附件子集。每个子通道可以从一些附件读取数据作为输入附件,写入一些附件作为颜色附件深度/模板附件,对颜色附件深度/模板附件执行着色器解析操作,并对解析附件执行多重采样解析操作。子通道描述也可以包括一组保留附件,这些附件不会被子通道读取或写入,但其内容必须在整个子通道中保留。

如果附件是该子通道的颜色、深度/模板、解析、深度/模板解析、片段着色率或输入附件,则子通道使用附件(由VkSubpassDescriptionpColorAttachmentspDepthStencilAttachmentpResolveAttachmentsVkSubpassDescriptionDepthStencilResolve::pDepthStencilResolveAttachmentVkFragmentShadingRateAttachmentInfoKHR::pFragmentShadingRateAttachment->attachmentpInputAttachments成员确定)。如果子通道保留附件,则子通道不使用该附件。附件的首次使用是在使用该附件的编号最小的子通道中。类似地,附件的最后一次使用是在使用该附件的编号最大的子通道中。

渲染通道中的子通道都渲染到相同的尺寸,并且一个子通道中像素(x,y,layer)的片段只能读取先前子通道在相同(x,y,layer)位置写入的附件内容。对于多像素片段,从输入附件读取的像素是从实现相关的方式中选择的,该方式涵盖了该片段的像素。但是,对于VkDevice的生命周期内,任何具有相同着色率的片段,都必须一致地进行此选择。

通过预先描述完整的子通道集合,渲染通道为实现提供了优化子通道之间附件数据的存储和传输的机会。

实际上,这意味着具有简单帧缓冲区空间依赖性的子通道可能被合并为单个平铺渲染通道,从而在渲染通道实例期间将附件数据保留在芯片上。但是,渲染通道也只包含一个子通道的情况也很常见。

子通道依赖关系描述子通道之间的执行和内存依赖关系

子通道依赖关系链是渲染通道中子通道依赖关系的一个序列,其中每个子通道依赖关系(在第一个之后)的源子通道等于前一个依赖关系的目标子通道。

子通道的执行可能与其它子通道重叠或乱序执行,除非执行依赖强制要求。每个子通道仅尊重在同一子通道中记录的命令以及分隔渲染通道的vkCmdBeginRenderPassvkCmdEndRenderPass命令的提交顺序 - 不包括其他子通道内的命令。这会影响大多数其他隐式排序保证

渲染通道描述了独立于附件的任何特定图像视图的子通道和附件的结构。将用于附件的特定图像视图及其尺寸在 VkFramebuffer 对象中指定。帧缓冲区是根据帧缓冲区与之兼容的特定渲染通道创建的(请参阅渲染通道兼容性)。总体而言,渲染通道和帧缓冲区定义了一个或多个子通道的完整渲染目标状态以及子通道之间的算法依赖关系。

给定子通道的绘制命令的各个管线阶段可以在绘制命令内部和跨绘制命令同时和/或乱序执行,同时仍然尊重管线顺序。但是,对于给定的(x,y,layer,sample)采样位置,某些每采样操作以光栅化顺序执行。

VK_ATTACHMENT_UNUSED是一个常量,指示渲染通道附件未使用。

#define VK_ATTACHMENT_UNUSED              (~0U)

渲染通道创建

要创建渲染通道,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateRenderPass(
    VkDevice                                    device,
    const VkRenderPassCreateInfo*               pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkRenderPass*                               pRenderPass);
  • device 是创建渲染通道的逻辑设备。

  • pCreateInfo 是指向 VkRenderPassCreateInfo 结构的指针,该结构描述渲染通道的参数。

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

  • pRenderPass 是指向 VkRenderPass 句柄的指针,其中返回生成的渲染通道对象。

有效用法
  • VUID-vkCreateRenderPass-device-10000
    device 必须至少支持一个具有 VK_QUEUE_GRAPHICS_BIT 功能的队列族

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

  • VUID-vkCreateRenderPass-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkRenderPassCreateInfo 结构的有效指针

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

  • VUID-vkCreateRenderPass-pRenderPass-parameter
    pRenderPass 必须 是指向 VkRenderPass 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkRenderPassCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkRenderPassCreateInfo {
    VkStructureType                   sType;
    const void*                       pNext;
    VkRenderPassCreateFlags           flags;
    uint32_t                          attachmentCount;
    const VkAttachmentDescription*    pAttachments;
    uint32_t                          subpassCount;
    const VkSubpassDescription*       pSubpasses;
    uint32_t                          dependencyCount;
    const VkSubpassDependency*        pDependencies;
} VkRenderPassCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flagsVkRenderPassCreateFlagBits 的位掩码。

  • attachmentCount 是此渲染通道使用的附件数量。

  • pAttachments 是指向 attachmentCountVkAttachmentDescription 结构数组的指针,这些结构描述了渲染通道使用的附件。

  • subpassCount 是要创建的子通道数量。

  • pSubpasses 是指向 subpassCountVkSubpassDescription 结构数组的指针,这些结构描述了每个子通道。

  • dependencyCount 是子通道对之间内存依赖的数量。

  • pDependencies 是指向 dependencyCountVkSubpassDependency 结构数组的指针,这些结构描述了子通道对之间的依赖关系。

应注意避免此处的数据竞争;如果任何子通道访问具有重叠内存位置的附件,并且其中一个访问是写入,则需要在它们之间包含子通道依赖关系。

有效用法
  • VUID-VkRenderPassCreateInfo-attachment-00834
    如果 pInputAttachmentspColorAttachmentspResolveAttachmentspDepthStencilAttachment 的任何元素的 attachment 成员,或者 pSubpasses 的任何元素的 pPreserveAttachments 的任何元素不是 VK_ATTACHMENT_UNUSED,那么它必须小于 attachmentCount

  • VUID-VkRenderPassCreateInfo-fragmentDensityMapAttachment-06471
    如果 pNext 链包含一个 VkRenderPassFragmentDensityMapCreateInfoEXT 结构,并且 fragmentDensityMapAttachment 成员不是 VK_ATTACHMENT_UNUSED,那么 attachment 必须小于 attachmentCount

  • VUID-VkRenderPassCreateInfo-pAttachments-00836
    对于 pAttachments 的任何 loadOp 等于 VK_ATTACHMENT_LOAD_OP_CLEAR 的成员,该附件的首次使用必须不指定 layout 等于 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderPassCreateInfo-pAttachments-02511
    对于 pAttachments 的任何 stencilLoadOp 等于 VK_ATTACHMENT_LOAD_OP_CLEAR 的成员,该附件的首次使用必须不指定 layout 等于 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderPassCreateInfo-pAttachments-01566
    对于 pAttachments 的任何 loadOp 等于 VK_ATTACHMENT_LOAD_OP_CLEAR 的成员,该附件的首次使用必须不指定 layout 等于 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkRenderPassCreateInfo-pAttachments-01567
    对于 pAttachments 的任何 stencilLoadOp 等于 VK_ATTACHMENT_LOAD_OP_CLEAR 的成员,该附件的首次使用必须不指定 layout 等于 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkRenderPassCreateInfo-pNext-01926
    如果 pNext 链包含一个 VkRenderPassInputAttachmentAspectCreateInfo 结构,则其 pAspectReferences 成员的每个元素的 subpass 成员必须小于 subpassCount

  • VUID-VkRenderPassCreateInfo-pNext-01927
    如果 pNext 链包含一个 VkRenderPassInputAttachmentAspectCreateInfo 结构,则其 pAspectReferences 成员的每个元素的 inputAttachmentIndex 成员必须小于由其 subpass 成员标识的 pSubpasses 元素的 inputAttachmentCount 的值。

  • VUID-VkRenderPassCreateInfo-pNext-01963
    如果 pNext 链包含一个 VkRenderPassInputAttachmentAspectCreateInfo 结构,对于 pSubpasses 的任何元素的 pInputAttachments 的任何成员,其中 attachment 成员不是 VK_ATTACHMENT_UNUSED,则 VkRenderPassInputAttachmentAspectCreateInfo::pAspectReferences 的对应元素的 aspectMask 成员必须仅包含在由 attachment 处的 pAttachments 元素指定的格式的图像中存在的方面。

  • VUID-VkRenderPassCreateInfo-pNext-01928
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,并且其 subpassCount 成员不为零,则该成员必须等于 subpassCount 的值。

  • VUID-VkRenderPassCreateInfo-pNext-01929
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,如果其 dependencyCount 成员不为零,则它必须等于 dependencyCount

  • VUID-VkRenderPassCreateInfo-pNext-01930
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,对于 pViewOffsets 的每个非零元素,pDependencies 在相同索引处的 srcSubpassdstSubpass 成员必须不相等。

  • VUID-VkRenderPassCreateInfo-pNext-02512
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,对于 pDependencies 的任何 dependencyFlags 成员不包含 VK_DEPENDENCY_VIEW_LOCAL_BIT 的元素,该 VkRenderPassMultiviewCreateInfo 实例的 pViewOffsets 成员的对应元素必须0

  • VUID-VkRenderPassCreateInfo-pNext-02513
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,则其 pViewMasks 成员的元素必须全部为 0,或者全部不为 0

  • VUID-VkRenderPassCreateInfo-pNext-02514
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,并且其 pViewMasks 成员的每个元素都是 0,则 pDependencies 的每个元素的 dependencyFlags 成员必须不包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-VkRenderPassCreateInfo-pNext-02515
    如果 pNext 链包含一个 VkRenderPassMultiviewCreateInfo 结构,并且其 pViewMasks 成员的每个元素都是 0,则其 correlationMaskCount 成员必须0

  • VUID-VkRenderPassCreateInfo-pDependencies-00837
    对于 pDependencies 中的任何元素,如果 srcSubpass 不是 VK_SUBPASS_EXTERNAL,则该依赖项的 srcStageMask 成员中包含的所有阶段标志 必须 是源子通道的 pipelineBindPoint 成员标识的管线支持的管线阶段。

  • VUID-VkRenderPassCreateInfo-pDependencies-00838
    对于 pDependencies 中的任何元素,如果 dstSubpass 不是 VK_SUBPASS_EXTERNAL,则该依赖项的 dstStageMask 成员中包含的所有阶段标志 必须 是目标子通道的 pipelineBindPoint 成员标识的管线支持的管线阶段。

  • VUID-VkRenderPassCreateInfo-pDependencies-06866
    对于 pDependencies 中的任何元素,如果其 srcSubpass 不是 VK_SUBPASS_EXTERNAL,则它 必须 小于 subpassCount

  • VUID-VkRenderPassCreateInfo-pDependencies-06867
    对于 pDependencies 中的任何元素,如果其 dstSubpass 不是 VK_SUBPASS_EXTERNAL,则它 必须 小于 subpassCount

有效使用 (隐式)
  • VUID-VkRenderPassCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO

  • VUID-VkRenderPassCreateInfo-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员 必须NULL 或指向 VkRenderPassFragmentDensityMapCreateInfoEXTVkRenderPassInputAttachmentAspectCreateInfoVkRenderPassMultiviewCreateInfo 的有效实例的指针。

  • VUID-VkRenderPassCreateInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkRenderPassCreateInfo-flags-parameter
    flags 必须VkRenderPassCreateFlagBits 值的有效组合。

  • VUID-VkRenderPassCreateInfo-pAttachments-parameter
    如果 attachmentCount 不为 0,则 pAttachments 必须 是指向 attachmentCount 个有效 VkAttachmentDescription 结构体的数组的有效指针。

  • VUID-VkRenderPassCreateInfo-pSubpasses-parameter
    pSubpasses 必须 是指向 subpassCount 个有效 VkSubpassDescription 结构体的数组的有效指针。

  • VUID-VkRenderPassCreateInfo-pDependencies-parameter
    如果 dependencyCount 不为 0,则 pDependencies 必须 是指向 dependencyCount 个有效 VkSubpassDependency 结构体的数组的有效指针。

  • VUID-VkRenderPassCreateInfo-subpassCount-arraylength
    subpassCount 必须 大于 0

可以在 VkRenderPassCreateInfo::flags 中设置的位,用于描述渲染通道的附加属性,如下所示:

// Provided by VK_VERSION_1_0
typedef enum VkRenderPassCreateFlagBits {
  // Provided by VK_QCOM_render_pass_transform
    VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM = 0x00000002,
} VkRenderPassCreateFlagBits;
  • VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM 指定创建的渲染通道与渲染通道变换兼容。

// Provided by VK_VERSION_1_0
typedef VkFlags VkRenderPassCreateFlags;

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

如果 VkRenderPassCreateInfo::pNext 链包含 VkRenderPassMultiviewCreateInfo 结构,则该结构包含渲染通道的视图掩码、视图偏移量和相关掩码的数组。

VkRenderPassMultiviewCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkRenderPassMultiviewCreateInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           subpassCount;
    const uint32_t*    pViewMasks;
    uint32_t           dependencyCount;
    const int32_t*     pViewOffsets;
    uint32_t           correlationMaskCount;
    const uint32_t*    pCorrelationMasks;
} VkRenderPassMultiviewCreateInfo;

或等效的

// Provided by VK_KHR_multiview
typedef VkRenderPassMultiviewCreateInfo VkRenderPassMultiviewCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • subpassCount 为零或渲染通道中子通道的数量。

  • pViewMasks 是指向 subpassCount 个视图掩码的数组的指针,其中每个掩码都是视图索引的位域,描述在启用多视图时,每个子通道中的渲染被广播到哪些视图。如果 subpassCount 为零,则每个视图掩码都被视为零。

  • dependencyCount 为零或渲染通道中依赖项的数量。

  • pViewOffsets 是指向 dependencyCount 个视图偏移量的数组的指针,每个依赖项一个。如果 dependencyCount 为零,则每个依赖项的视图偏移量都被视为零。每个视图偏移量控制目标子通道中的视图依赖于源子通道中的哪些视图。

  • correlationMaskCount 为零或相关掩码的数量。

  • pCorrelationMasks 是指向 correlationMaskCount 个视图掩码的数组的指针,指示可能更高效地同时渲染的视图集。

当子通道使用非零视图掩码时,将认为启用了多视图功能。多视图对于渲染通道来说是完全的 - 也就是说,要么所有子通道 必须 具有非零视图掩码(尽管某些子通道 可能 只有一个视图),要么所有子通道 必须 为零。多视图使子通道中的所有绘制和清除命令的行为就像它们被广播到每个视图一样,其中视图由帧缓冲附件的一个层表示。所有绘制和清除操作都将广播到视图掩码中设置了位的每个视图索引。视图索引在 ViewIndex 着色器输入变量中提供,颜色、深度/模板和输入附件都读取/写入与视图索引相对应的帧缓冲层。

如果所有子通道的视图掩码都为零,则认为多视图已禁用,并且所有绘制命令都正常执行,而没有此额外的广播。

某些实现 可能 不支持将多视图与网格着色器几何着色器细分着色器结合使用。

启用多视图时,依赖项中的 VK_DEPENDENCY_VIEW_LOCAL_BIT可以 用于表示视图局部依赖项,这意味着目标子通道中的每个视图都依赖于源子通道中的单个视图。与管线屏障不同,子通道依赖项 可以 在源子通道和目标子通道中具有不同的视图掩码。如果依赖项是视图局部的,则目标子通道中的每个视图(dstView)都依赖于源子通道中的视图 dstView + pViewOffsets[dependency]。如果源子通道中不存在这样的视图,则此依赖项不会影响目标子通道中的该视图。如果依赖项不是视图局部的,则目标子通道中的所有视图都依赖于源子通道中的所有视图,并且视图偏移量将被忽略。在自依赖项中不允许使用非零视图偏移量。

pCorrelationMasks 的元素是一组视图掩码,指示同一掩码中的视图之间可能存在空间一致性,从而使同时渲染它们更有效率。相关掩码 必须 不会对多视图渲染的结果产生功能性影响。

启用多视图时,在每个子通道的开头,所有非渲染通道状态都是未定义的。特别是,每次调用 vkCmdBeginRenderPassvkCmdNextSubpass 时,必须绑定图形管线,必须绑定任何相关的描述符集或顶点/索引缓冲区,并且必须在使用之前设置任何相关的动态状态或推送常量。

多视图子通道可以声明其着色器将为单个调用中的所有视图写入每个视图的属性,方法是在子通道描述中设置 VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX 位。唯一支持的每个视图属性是位置和视口掩码,并且每个视图的位置和视口掩码分别写入用 PositionPerViewNVViewportMaskPerViewNV 修饰的输出数组变量。如果不支持且未启用 VK_NV_viewport_array2 扩展,则必须不使用 ViewportMaskPerViewNV。写入到 PositionPerViewNVViewportMaskPerViewNV 元素的数值必须不依赖于 ViewIndex。着色器必须还写入到用 Position 修饰的输出变量,并且写入到 Position 的数值必须等于写入到 PositionPerViewNV[ViewIndex] 的数值。类似地,如果写入了 ViewportMaskPerViewNV,则着色器必须还写入到用 ViewportMaskNV 修饰的输出变量,并且写入到 ViewportMaskNV 的数值必须等于写入到 ViewportMaskPerViewNV[ViewIndex] 的数值。实现将使用从 PositionViewportMaskNV 获取的值并为每个视图调用着色器一次,或者将使用从 PositionPerViewNVViewportMaskPerViewNV 获取的值并较少地调用着色器。写入到 PositionViewportMaskNV 的数值必须不依赖于写入到 PositionPerViewNVViewportMaskPerViewNV 的数值,反之亦然(以允许编译器消除未使用的输出)。所有没有 *PerViewNV 对应项的属性必须不依赖于 ViewIndex

对于一个子通道,每个视图的属性是全有或全无的。也就是说,针对包含 VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX 位的子通道编译的所有管线,必须将每个视图的属性写入到 *PerViewNV[] 着色器输出,此外还包括非每个视图(例如 Position)的输出。针对不包含此位的子通道编译的管线,必须不在其接口中包含 *PerViewNV[] 输出。

有效用法
  • VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841
    每个视图索引必须不在 pCorrelationMasks 的多个元素中设置。

  • VUID-VkRenderPassMultiviewCreateInfo-multiview-06555
    如果未启用 multiview 功能,则 pViewMasks 的每个元素必须0

  • VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-06697
    pViewMasks 的每个元素中最高有效位的索引必须小于 maxMultiviewViewCount

有效使用 (隐式)
  • VUID-VkRenderPassMultiviewCreateInfo-sType-sType
    sType必须VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO

  • VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter
    如果 subpassCount 不为 0,则 pViewMasks必须是指向 subpassCountuint32_t 值数组的有效指针。

  • VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter
    如果 dependencyCount 不为 0,则 pViewOffsets必须是指向 dependencyCountint32_t 值数组的有效指针。

  • VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter
    如果 correlationMaskCount 不为 0,则 pCorrelationMasks必须是指向 correlationMaskCountuint32_t 值数组的有效指针。

VkMultiviewPerViewAttributesInfoNVX 结构定义为

// Provided by VK_NVX_multiview_per_view_attributes with VK_VERSION_1_3 or VK_KHR_dynamic_rendering
typedef struct VkMultiviewPerViewAttributesInfoNVX {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           perViewAttributes;
    VkBool32           perViewAttributesPositionXOnly;
} VkMultiviewPerViewAttributesInfoNVX;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • perViewAttributes 指定为此管线编译的着色器在每个顶点处理阶段的单个调用中写入所有视图的属性。在包含此位的渲染通道实例中执行的所有管线,必须将每个视图的属性写入到 *PerViewNV[] 着色器输出,此外还包括非每个视图(例如 Position)的输出。

  • perViewAttributesPositionXOnly 指定为此管线编译的着色器使用仅在 x 分量中值不同的每个视图位置。每个视图的视口掩码可以也使用。

当使用动态渲染通道实例时,不是在子通道描述标志中指定 VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVXVK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX,而是必须通过 VkMultiviewPerViewAttributesInfoNVX 结构指定渲染通道实例的每个属性属性。在为动态渲染创建图形管线时,将 VkMultiviewPerViewAttributesInfoNVX 结构包含在 VkGraphicsPipelineCreateInfopNext 链中;在启动动态渲染通道实例时,将其包含在 VkRenderingInfo 中;并在为二级命令缓冲区指定动态渲染通道实例参数时,将其包含在 VkCommandBufferInheritanceInfo 中。

有效使用 (隐式)
  • VUID-VkMultiviewPerViewAttributesInfoNVX-sType-sType
    sType必须VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX

如果 VkRenderPassCreateInfo::pNext 链包含一个 VkRenderPassFragmentDensityMapCreateInfoEXT 结构,则该结构包括渲染通道的片段密度映射附件。

VkRenderPassFragmentDensityMapCreateInfoEXT 结构定义为

// Provided by VK_EXT_fragment_density_map
typedef struct VkRenderPassFragmentDensityMapCreateInfoEXT {
    VkStructureType          sType;
    const void*              pNext;
    VkAttachmentReference    fragmentDensityMapAttachment;
} VkRenderPassFragmentDensityMapCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • fragmentDensityMapAttachment 是用于渲染通道的片段密度映射。

片段密度映射在与附件的图像视图 flags 确定的以下约束相关的实现定义的时间读取

  • VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT 指定设备将在 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT 期间读取片段密度映射。

  • VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT 指定主机将在渲染通道记录到的主命令缓冲区的 vkEndCommandBuffer 期间读取片段密度映射。

  • 否则,主机将在 vkCmdBeginRenderPass 期间读取片段密度映射。

对于任何模式,设备可以VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT 期间额外读取片段密度映射。

如果不存在此结构,则如同将 fragmentDensityMapAttachment 指定为 VK_ATTACHMENT_UNUSED

有效用法
  • VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02548
    如果 fragmentDensityMapAttachment 不是 VK_ATTACHMENT_UNUSED,则 fragmentDensityMapAttachment必须不是任何子通道的 VkSubpassDescription::pInputAttachmentsVkSubpassDescription::pColorAttachmentsVkSubpassDescription::pResolveAttachmentsVkSubpassDescription::pDepthStencilAttachmentVkSubpassDescription::pPreserveAttachments 的元素。

  • VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02549
    如果 fragmentDensityMapAttachment 不是 VK_ATTACHMENT_UNUSED,则 layout 必须 等于 VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXTVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550
    如果 fragmentDensityMapAttachment 不是 VK_ATTACHMENT_UNUSED,则 fragmentDensityMapAttachment 必须 引用一个 loadOp 等于 VK_ATTACHMENT_LOAD_OP_LOADVK_ATTACHMENT_LOAD_OP_DONT_CARE 的附件。

  • VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551
    如果 fragmentDensityMapAttachment 不是 VK_ATTACHMENT_UNUSED,则 fragmentDensityMapAttachment 必须 引用一个 storeOp 等于 VK_ATTACHMENT_STORE_OP_DONT_CARE 的附件。

有效使用 (隐式)
  • VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT

  • VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-parameter
    fragmentDensityMapAttachment 必须 是一个有效的 VkAttachmentReference 结构体。

VkAttachmentDescription 结构体的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkAttachmentDescription {
    VkAttachmentDescriptionFlags    flags;
    VkFormat                        format;
    VkSampleCountFlagBits           samples;
    VkAttachmentLoadOp              loadOp;
    VkAttachmentStoreOp             storeOp;
    VkAttachmentLoadOp              stencilLoadOp;
    VkAttachmentStoreOp             stencilStoreOp;
    VkImageLayout                   initialLayout;
    VkImageLayout                   finalLayout;
} VkAttachmentDescription;
  • flags 是一个 VkAttachmentDescriptionFlagBits 的位掩码,用于指定附件的附加属性。

  • format 是一个 VkFormat 值,用于指定将用于附件的图像视图的格式。

  • samples 是一个 VkSampleCountFlagBits 值,用于指定图像的样本数量。

  • loadOp 是一个 VkAttachmentLoadOp 值,用于指定在第一次使用附件的子通道开始时,如何处理附件的颜色和深度分量的内容。

  • storeOp 是一个 VkAttachmentStoreOp 值,用于指定在最后一次使用附件的子通道结束时,如何处理附件的颜色和深度分量的内容。

  • stencilLoadOp 是一个 VkAttachmentLoadOp 值,用于指定在第一次使用附件的子通道开始时,如何处理附件的模板分量的内容。

  • stencilStoreOp 是一个 VkAttachmentStoreOp 值,用于指定在最后一次使用附件的子通道结束时,如何处理附件的模板分量的内容。

  • initialLayout 是渲染通道实例开始时,附件图像子资源的布局。

  • finalLayout 是渲染通道实例结束时,附件图像子资源将转换到的布局。

如果附件使用颜色格式,则使用 loadOpstoreOp,而 stencilLoadOpstencilStoreOp 将被忽略。如果格式具有深度和/或模板分量,则 loadOpstoreOp 仅适用于深度数据,而 stencilLoadOpstencilStoreOp 定义如何处理模板数据。loadOpstencilLoadOp 定义附件的加载操作storeOpstencilStoreOp 定义附件的存储操作。如果任何子通道都不使用附件,则该附件的 loadOpstoreOpstencilStoreOpstencilLoadOp 将被忽略,并且不会执行加载或存储操作。但是,由 initialLayoutfinalLayout 指定的任何转换仍将执行。

如果 flags 包括 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT,则该附件将被视为与同一渲染通道中的另一个附件共享物理内存。此信息限制了实现重新排序某些操作(如布局转换和 loadOp)的能力,从而避免与其他通过不同附件对同一物理内存的使用进行错误地重新排序。这将在下面更详细地描述。

如果渲染通道使用多个别名同一设备内存的附件,则这些附件的附件描述标志中必须包含 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 位。别名同一内存的附件以多种方式出现:

  • 多个附件被分配相同的图像视图作为帧缓冲创建的一部分。

  • 附件使用与图像的同一图像子资源对应的不同图像视图。

  • 附件使用与绑定到重叠内存范围的不同图像子资源的视图。

渲染通道必须在任何两个操作相同附件或别名附件的子通道之间包含子通道依赖项(直接或通过子通道依赖项链),并且这些子通道依赖项必须包含分隔别名使用的执行和内存依赖项,如果至少有一个子通道写入其中一个别名。如果别名是内存中重叠的不同图像子资源的视图,则这些依赖项不能包括 VK_DEPENDENCY_BY_REGION_BIT

别名相同内存的多个附件不能在单个子通道中使用。给定的附件索引不能在单个子通道中多次使用,但有一个例外:如果至少有一个用作输入附件并且两个都没有用作解析或保留附件,则两个子通道附件可以使用相同的附件索引。换句话说,同一视图可以同时用作输入和颜色或深度/模板附件,但不能用作多个颜色或深度/模板附件,也不能用作解析或保留附件。

如果一组附件相互别名,则所有除渲染通道中第一个使用的附件之外的附件必须使用 VK_IMAGE_LAYOUT_UNDEFINEDinitialLayout,因为较早使用其他别名会使其内容未定义。一旦使用了一个别名,并且在此之后使用了另一个不同的别名,则第一个别名不得在任何后续的子通道中使用。但是,应用程序可以将相同的图像视图分配给多个别名附件索引,这允许即使在使用了其他别名之间,也可以多次使用该图像视图。

一旦附件需要 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 位,引入额外的别名应该不会有额外的开销,并且使用这些额外的别名可能允许通过 VK_ATTACHMENT_LOAD_OP_CLEAR 更高效地清除多次使用的附件。

有效用法
  • VUID-VkAttachmentDescription-format-06699
    如果 format 包含颜色或深度分量且 loadOpVK_ATTACHMENT_LOAD_OP_LOAD,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_UNDEFINED

  • VUID-VkAttachmentDescription-finalLayout-00843
    finalLayout 必须不能为 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkAttachmentDescription-format-03280
    如果 format 是颜色格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03281
    如果 format 是深度/模板格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription-format-03282
    如果 format 是颜色格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03283
    如果 format 是深度/模板格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription-format-06487
    如果 format 是颜色格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription-format-06488
    如果 format 是颜色格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription-separateDepthStencilLayouts-03284
    如果 separateDepthStencilLayouts 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-separateDepthStencilLayouts-03285
    如果 separateDepthStencilLayouts 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03286
    如果 format 是颜色格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03287
    如果 format 是颜色格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-06906
    如果 format 是包含深度和模板分量的深度/模板格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-06907
    如果 format 是包含深度和模板分量的深度/模板格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03290
    如果 format 是仅包含深度分量的深度/模板格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03291
    如果 format 是仅包含深度分量的深度/模板格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-synchronization2-06908
    如果 synchronization2 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkAttachmentDescription-synchronization2-06909
    如果 synchronization2 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkAttachmentDescription-attachmentFeedbackLoopLayout-07309
    如果 attachmentFeedbackLoopLayout 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkAttachmentDescription-attachmentFeedbackLoopLayout-07310
    如果 attachmentFeedbackLoopLayout 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkAttachmentDescription-samples-08745
    samples 必须VkSampleCountFlagBits 中的一个有效值,该值在给定 formatimageCreateSampleCounts 中设置(如 图像创建限制 中所定义)

  • VUID-VkAttachmentDescription-dynamicRenderingLocalRead-09544
    如果 dynamicRenderingLocalRead 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkAttachmentDescription-dynamicRenderingLocalRead-09545
    如果 dynamicRenderingLocalRead 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkAttachmentDescription-format-06698
    format 必须 不是 VK_FORMAT_UNDEFINED

  • VUID-VkAttachmentDescription-format-06700
    如果 format 包含模板分量且 stencilLoadOpVK_ATTACHMENT_LOAD_OP_LOAD,则 initialLayout 必须 不是 VK_IMAGE_LAYOUT_UNDEFINED

  • VUID-VkAttachmentDescription-format-03292
    如果 format 是仅包含模板分量的深度/模板格式,则 initialLayout 必须 不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-03293
    如果 format 是仅包含模板分量的深度/模板格式,则 finalLayout 必须 不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-06242
    如果 format 是包含深度和模板分量的深度/模板格式,则 initialLayout 必须 不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription-format-06243
    如果 format 是包含深度和模板分量的深度/模板格式,则 finalLayout 必须 不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

有效使用 (隐式)
  • VUID-VkAttachmentDescription-flags-parameter
    flags 必须VkAttachmentDescriptionFlagBits 值的有效组合

  • VUID-VkAttachmentDescription-format-parameter
    format 必须 是有效的 VkFormat

  • VUID-VkAttachmentDescription-samples-parameter
    samples 必须 是有效的 VkSampleCountFlagBits

  • VUID-VkAttachmentDescription-loadOp-parameter
    loadOp 必须为有效的 VkAttachmentLoadOp 值。

  • VUID-VkAttachmentDescription-storeOp-parameter
    storeOp 必须为有效的 VkAttachmentStoreOp 值。

  • VUID-VkAttachmentDescription-stencilLoadOp-parameter
    stencilLoadOp 必须 是有效的 VkAttachmentLoadOp

  • VUID-VkAttachmentDescription-stencilStoreOp-parameter
    stencilStoreOp 必须 是有效的 VkAttachmentStoreOp

  • VUID-VkAttachmentDescription-initialLayout-parameter
    initialLayout 必须 是有效的 VkImageLayout

  • VUID-VkAttachmentDescription-finalLayout-parameter
    finalLayout 必须 是有效的 VkImageLayout

VkAttachmentDescription::flags可以设置的位,描述了附件的附加属性,是

// Provided by VK_VERSION_1_0
typedef enum VkAttachmentDescriptionFlagBits {
    VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001,
} VkAttachmentDescriptionFlagBits;
  • VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 指定附件与其它附件使用相同的设备内存别名。

// Provided by VK_VERSION_1_0
typedef VkFlags VkAttachmentDescriptionFlags;

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

VkRenderPassInputAttachmentAspectCreateInfo 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkRenderPassInputAttachmentAspectCreateInfo {
    VkStructureType                            sType;
    const void*                                pNext;
    uint32_t                                   aspectReferenceCount;
    const VkInputAttachmentAspectReference*    pAspectReferences;
} VkRenderPassInputAttachmentAspectCreateInfo;

或等效的

// Provided by VK_KHR_maintenance2
typedef VkRenderPassInputAttachmentAspectCreateInfo VkRenderPassInputAttachmentAspectCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • aspectReferenceCountpAspectReferences 数组中的元素数量。

  • pAspectReferences 是一个指向 aspectReferenceCountVkInputAttachmentAspectReference 结构的数组的指针,该结构包含一个掩码,用于描述在给定的子通道中,可以访问给定输入附件的哪个或哪些方面。

要指定输入附件的哪些方面可以被读取,请将 VkRenderPassInputAttachmentAspectCreateInfo 结构添加到 VkRenderPassCreateInfo 结构的 pNext 链中

应用程序可以访问在 pAspectReferences 数组中没有指定方面掩码的输入附件的任何方面。否则,应用程序必须不访问输入附件的方面,除非该方面位于其指定的方面掩码中。

有效使用 (隐式)
  • VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO

  • VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter
    pAspectReferences 必须 是指向 aspectReferenceCount 个有效 VkInputAttachmentAspectReference 结构数组的有效指针

  • VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength
    aspectReferenceCount 必须 大于 0

VkInputAttachmentAspectReference 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkInputAttachmentAspectReference {
    uint32_t              subpass;
    uint32_t              inputAttachmentIndex;
    VkImageAspectFlags    aspectMask;
} VkInputAttachmentAspectReference;

或等效的

// Provided by VK_KHR_maintenance2
typedef VkInputAttachmentAspectReference VkInputAttachmentAspectReferenceKHR;
  • subpass 是父 VkRenderPassCreateInfo 结构的 pSubpasses 数组中的索引。

  • inputAttachmentIndex 是指定子通道的 pInputAttachments 中的索引。

  • aspectMask 是一个掩码,指示在指定子通道中可以访问的方面。

此结构指定渲染通道中特定子通道的特定输入附件的方面掩码。

subpassinputAttachmentIndex 索引到渲染通道的方式如下:

pCreateInfo->pSubpasses[subpass].pInputAttachments[inputAttachmentIndex]
有效用法
  • VUID-VkInputAttachmentAspectReference-aspectMask-01964
    aspectMask 必须 不包含 VK_IMAGE_ASPECT_METADATA_BIT

  • VUID-VkInputAttachmentAspectReference-aspectMask-02250
    aspectMask 必须 不包含任何索引 *i* 的 VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT

有效使用 (隐式)
  • VUID-VkInputAttachmentAspectReference-aspectMask-parameter
    aspectMask 必须VkImageAspectFlagBits 值的有效组合

  • VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask
    aspectMask 必须 不能为 0

VkSubpassDescription 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkSubpassDescription {
    VkSubpassDescriptionFlags       flags;
    VkPipelineBindPoint             pipelineBindPoint;
    uint32_t                        inputAttachmentCount;
    const VkAttachmentReference*    pInputAttachments;
    uint32_t                        colorAttachmentCount;
    const VkAttachmentReference*    pColorAttachments;
    const VkAttachmentReference*    pResolveAttachments;
    const VkAttachmentReference*    pDepthStencilAttachment;
    uint32_t                        preserveAttachmentCount;
    const uint32_t*                 pPreserveAttachments;
} VkSubpassDescription;
  • flags 是一个 VkSubpassDescriptionFlagBits 的位掩码,指定子通道的用法。

  • pipelineBindPoint 是一个 VkPipelineBindPoint 值,指定此子通道支持的管线类型。

  • inputAttachmentCount 是输入附件的数量。

  • pInputAttachments 是指向 VkAttachmentReference 结构数组的指针,这些结构定义了此子通道的输入附件及其布局。

  • colorAttachmentCount 是颜色附件的数量。

  • pColorAttachments 是指向 colorAttachmentCountVkAttachmentReference 结构数组的指针,这些结构定义了此子通道的颜色附件及其布局。

  • pResolveAttachmentsNULL 或指向 colorAttachmentCountVkAttachmentReference 结构数组的指针,这些结构定义了此子通道的解析附件及其布局。

  • pDepthStencilAttachment 是指向 VkAttachmentReference 结构的指针,该结构指定此子通道的深度/模板附件及其布局。

  • preserveAttachmentCount 是保留附件的数量。

  • pPreserveAttachments 是指向一个 preserveAttachmentCount 个渲染通道附件索引数组的指针,这些索引标识了此子通道未使用的附件,但其内容必须在整个子通道中保留。

pInputAttachments 数组的每个元素对应于片段着色器中的输入附件索引,例如,如果着色器声明了一个使用 InputAttachmentIndexX 修饰的图像变量,那么它将使用 pInputAttachments[X] 中提供的附件。输入附件必须也绑定到描述符集中的管线。如果 pInputAttachments 的任何元素的 attachment 成员为 VK_ATTACHMENT_UNUSED,则应用程序必须不从相应的输入附件索引读取。片段着色器可以使用子通道输入变量来访问片段的 (xf,yf) 帧缓冲区坐标和层处的输入附件内容。在启用渲染通道变换的渲染通道内的任何子通道中,不能使用输入附件。

pColorAttachments 数组的每个元素对应于着色器中的一个输出位置,例如,如果着色器声明了一个使用 LocationX 修饰的输出变量,那么它将使用 pColorAttachments[X] 中提供的附件。如果 pColorAttachments 的任何元素的 attachment 成员为 VK_ATTACHMENT_UNUSED,或者如果颜色写入启用已针对相应的附件索引禁用,则片段着色器对相应位置的写入将被丢弃。

如果 flags 不包含 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,并且如果 pResolveAttachments 不为 NULL,则其每个元素都对应于一个颜色附件(pColorAttachments 中相同索引处的元素),并且为每个附件定义了多重采样解析操作,除非解析附件索引为 VK_ATTACHMENT_UNUSED

类似地,如果 flags 不包含 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,并且 VkSubpassDescriptionDepthStencilResolve::pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,则它对应于 pDepthStencilAttachment 中的深度/模板附件,并且深度和模板的多重采样解析操作分别由 VkSubpassDescriptionDepthStencilResolve::depthResolveModeVkSubpassDescriptionDepthStencilResolve::stencilResolveMode 定义。如果 VkSubpassDescriptionDepthStencilResolve::depthResolveModeVK_RESOLVE_MODE_NONEpDepthStencilResolveAttachment 不具有深度方面,则不为深度附件执行解析操作。如果 VkSubpassDescriptionDepthStencilResolve::stencilResolveModeVK_RESOLVE_MODE_NONEpDepthStencilResolveAttachment 不具有模板方面,则不为模板附件执行解析操作。

如果由深度/模板附件引用的图像子资源范围是使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的,则多重采样解析操作将使用 VkRenderPassSampleLocationsBeginInfoEXT::pPostSubpassSampleLocations 的元素中为子通道指定的 sampleLocationsInfo 成员中的采样位置状态。

如果 pDepthStencilAttachmentNULL,或者其附件索引为 VK_ATTACHMENT_UNUSED,则表示子通道中将不使用深度/模板附件。

如果满足以下所有条件,则附件在渲染区域内的内容在子通道 S 的开始时变为未定义

  • 附件在渲染通道中的任何子通道中用作颜色、深度/模板或解析附件。

  • 存在一个子通道 S1 使用或保留该附件,以及从 S1S 的子通道依赖关系。

  • 附件在子通道 S 中未使用或保留。

此外,如果满足以下所有条件,则附件在渲染区域内的内容在子通道 S 的开始时变为未定义

  • 设置了 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM

  • 附件在子通道中用作颜色或深度/模板。

一旦附件的内容在子通道 S 中变为未定义,它们将在以子通道 S 开头的子通道依赖链中的子通道中保持未定义,直到再次写入它们为止。但是,如果其他子通道依赖链(从子通道 S1 开始)中的子通道使用或保留该附件,则它们对于这些子通道仍然有效。

有效用法
  • VUID-VkSubpassDescription-attachment-06912
    如果 pInputAttachments 的元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06913
    如果 pColorAttachments 的元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06914
    如果 pResolveAttachments 的元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06915
    如果 pDepthStencilAttachmentattachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06916
    如果 pColorAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06917
    如果 pResolveAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06918
    如果 pInputAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06919
    如果 pColorAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06920
    如果 pResolveAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription-attachment-06921
    如果 pInputAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR

  • VUID-VkSubpassDescription-attachment-06922
    如果 pColorAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkSubpassDescription-attachment-06923
    如果 pResolveAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkSubpassDescription-pipelineBindPoint-04952
    pipelineBindPoint 必须VK_PIPELINE_BIND_POINT_GRAPHICSVK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI

  • VUID-VkSubpassDescription-colorAttachmentCount-00845
    colorAttachmentCount 必须小于或等于 VkPhysicalDeviceLimits::maxColorAttachments

  • VUID-VkSubpassDescription-loadOp-00846
    如果一个附件在此渲染通道中的首次使用是作为输入附件,并且该附件在同一子通道中也没有用作颜色或深度/模板附件,则 loadOp 必须不是 VK_ATTACHMENT_LOAD_OP_CLEAR

  • VUID-VkSubpassDescription-pResolveAttachments-00847
    如果 pResolveAttachments 不是 NULL,对于每个不是 VK_ATTACHMENT_UNUSED 的解析附件,其对应的颜色附件必须不是 VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescription-pResolveAttachments-00848
    如果 pResolveAttachments 不是 NULL,对于每个不是 VK_ATTACHMENT_UNUSED 的解析附件,其对应的颜色附件必须不具有 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-VkSubpassDescription-pResolveAttachments-00849
    如果 pResolveAttachments 不是 NULL,则每个不是 VK_ATTACHMENT_UNUSED 的解析附件必须具有 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-VkSubpassDescription-pResolveAttachments-00850
    如果 pResolveAttachments 不是 NULL,则每个不是 VK_ATTACHMENT_UNUSED 的解析附件必须具有与其对应的颜色附件相同的 VkFormat

  • VUID-VkSubpassDescription-pColorAttachments-09430
    pColorAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有相同的采样计数

  • VUID-VkSubpassDescription-pInputAttachments-02647
    pInputAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性至少包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkSubpassDescription-pColorAttachments-02648
    pColorAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-VkSubpassDescription-pResolveAttachments-02649
    pResolveAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-VkSubpassDescription-pDepthStencilAttachment-02650
    如果 pDepthStencilAttachment 不是 NULL 且该附件不是 VK_ATTACHMENT_UNUSED,则它必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkSubpassDescription-linearColorAttachment-06496
    如果启用了linearColorAttachment特性,并且图像是用 VK_IMAGE_TILING_LINEAR 创建的,则 pInputAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkSubpassDescription-linearColorAttachment-06497
    如果启用了linearColorAttachment特性,并且图像是用 VK_IMAGE_TILING_LINEAR 创建的,则 pColorAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkSubpassDescription-linearColorAttachment-06498
    如果启用了linearColorAttachment特性,并且图像是用 VK_IMAGE_TILING_LINEAR 创建的,则 pResolveAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkSubpassDescription-None-09431
    如果启用了以下任一条件:

    pColorAttachments 中所有非 VK_ATTACHMENT_UNUSED 的附件的采样计数必须小于或等于 pDepthStencilAttachment 的采样计数(如果它不是 VK_ATTACHMENT_UNUSED)。

  • VUID-VkSubpassDescription-pDepthStencilAttachment-01418
    如果 pDepthStencilAttachment 不是 VK_ATTACHMENT_UNUSED,并且 pColorAttachments 中的任何附件不是 VK_ATTACHMENT_UNUSED,则它们的采样计数必须相同,如果没有启用以下任何条件:

  • VUID-VkSubpassDescription-attachment-00853
    pPreserveAttachments 的每个元素必须不是 VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescription-pPreserveAttachments-00854
    pPreserveAttachments 的每个元素必须也不能是子通道描述的任何其他成员的元素。

  • VUID-VkSubpassDescription-layout-02519
    如果任何附件被多个 VkAttachmentReference 成员使用,则每次使用必须使用相同的 layout

  • VUID-VkSubpassDescription-flags-00856
    如果 flags 包括 VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX,则它也必须包括 VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX

  • VUID-VkSubpassDescription-flags-03341
    如果 flags 包括 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,并且如果 pResolveAttachments 不是 NULL,则每个解析附件必须VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescription-flags-03343
    如果 flags 包括 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,则子通道必须是子通道依赖链中的最后一个子通道。

  • VUID-VkSubpassDescription-pInputAttachments-02868
    如果渲染通道是使用 VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM 创建的,则 pInputAttachments 的每个元素必须VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescription-pDepthStencilAttachment-04438
    pDepthStencilAttachmentpColorAttachments 必须不包含对同一附件的引用。

有效使用 (隐式)
  • VUID-VkSubpassDescription-flags-parameter
    flags 必须VkSubpassDescriptionFlagBits 值的有效组合。

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

  • VUID-VkSubpassDescription-pInputAttachments-parameter
    如果 inputAttachmentCount 不为 0,则 pInputAttachments 必须是指向 inputAttachmentCount 个有效 VkAttachmentReference 结构的有效指针。

  • VUID-VkSubpassDescription-pColorAttachments-parameter
    如果 colorAttachmentCount 不为 0,则 pColorAttachments 必须是指向 colorAttachmentCount 个有效 VkAttachmentReference 结构的有效指针。

  • VUID-VkSubpassDescription-pResolveAttachments-parameter
    如果 colorAttachmentCount 不为 0,并且 pResolveAttachments 不为 NULL,则 pResolveAttachments 必须是指向 colorAttachmentCount 个有效 VkAttachmentReference 结构的有效指针。

  • VUID-VkSubpassDescription-pDepthStencilAttachment-parameter
    如果 pDepthStencilAttachment 不为 NULL,则 pDepthStencilAttachment 必须是指向有效 VkAttachmentReference 结构的有效指针。

  • VUID-VkSubpassDescription-pPreserveAttachments-parameter
    如果 preserveAttachmentCount 不为 0,则 pPreserveAttachments 必须是指向 preserveAttachmentCountuint32_t 值的有效指针。

可以在 VkSubpassDescription::flags 中设置的位,用于指定子通道的用法,如下:

// Provided by VK_VERSION_1_0
typedef enum VkSubpassDescriptionFlagBits {
  // Provided by VK_NVX_multiview_per_view_attributes
    VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX = 0x00000001,
  // Provided by VK_NVX_multiview_per_view_attributes
    VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0x00000002,
  // Provided by VK_QCOM_render_pass_shader_resolve
    VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM = 0x00000004,
  // Provided by VK_QCOM_render_pass_shader_resolve
    VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM = 0x00000008,
  // Provided by VK_EXT_rasterization_order_attachment_access
    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT = 0x00000010,
  // Provided by VK_EXT_rasterization_order_attachment_access
    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000020,
  // Provided by VK_EXT_rasterization_order_attachment_access
    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000040,
  // Provided by VK_EXT_legacy_dithering
    VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000080,
  // Provided by VK_ARM_rasterization_order_attachment_access
    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT,
  // Provided by VK_ARM_rasterization_order_attachment_access
    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT,
  // Provided by VK_ARM_rasterization_order_attachment_access
    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,
} VkSubpassDescriptionFlagBits;
  • VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX 指定为此子通道编译的着色器在每次调用预光栅化着色器阶段时写入所有视图的属性。所有针对包含此位的子通道编译的管线必须将每个视图的属性写入 *PerViewNV[] 着色器输出,以及非每个视图(例如,Position)的输出。

  • VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX 指定为此子通道编译的着色器使用仅在 x 分量的值上不同的每个视图位置。也可以使用每个视图的视口遮罩。

  • VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM 指定帧缓冲区区域是片段区域,也就是说,最小区域依赖关系是按像素而不是按采样,因此任何片段着色器调用可以访问与该片段着色器调用关联的任何采样。

  • VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM 指定子通道执行着色器解析操作。

  • VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT 指定此子通道支持使用 VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT 创建的管线。

  • VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT 指定此子通道支持使用 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT 创建的管线。

  • VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT 指定此子通道支持使用 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT 创建的管线。

  • VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT 指定此子通道启用了传统抖动

着色器解析操作允许自定义解析操作,但过度绘制像素可能会产生性能和/或功耗成本。此外,由于任何深度模板附件或颜色附件的内容在着色器解析子通道的开始处是未定义的,因此任何源自这些未定义值的深度测试、模板测试或混合操作也具有未定义的结果值。

// Provided by VK_VERSION_1_0
typedef VkFlags VkSubpassDescriptionFlags;

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

VkAttachmentReference 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkAttachmentReference {
    uint32_t         attachment;
    VkImageLayout    layout;
} VkAttachmentReference;
  • attachment 是一个整数值,用于标识 VkRenderPassCreateInfo::pAttachments 中相应索引处的附件,或者 VK_ATTACHMENT_UNUSED,表示不使用此附件。

  • layout 是一个 VkImageLayout 值,用于指定附件在子通道期间使用的布局。

有效用法
  • VUID-VkAttachmentReference-layout-03077
    如果 attachment 不是 VK_ATTACHMENT_UNUSED,则 layout 必须不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZEDVK_IMAGE_LAYOUT_PRESENT_SRC_KHR

  • VUID-VkAttachmentReference-separateDepthStencilLayouts-03313
    如果未启用 separateDepthStencilLayouts 功能,且 attachment 不为 VK_ATTACHMENT_UNUSED,则 layout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentReference-synchronization2-06910
    如果未启用 synchronization2 功能,则 layout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkAttachmentReference-attachmentFeedbackLoopLayout-07311
    如果未启用 attachmentFeedbackLoopLayout 功能,则 layout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkAttachmentReference-dynamicRenderingLocalRead-09546
    如果未启用 dynamicRenderingLocalRead 功能,则 layout 必须不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

有效使用 (隐式)
  • VUID-VkAttachmentReference-layout-parameter
    layout 必须是有效的 VkImageLayout 值。

VK_SUBPASS_EXTERNAL 是一个特殊的子通道索引值,它将同步范围扩展到子通道之外。有关详细信息,请参阅 VkSubpassDependency

#define VK_SUBPASS_EXTERNAL               (~0U)

VkSubpassDependency 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkSubpassDependency {
    uint32_t                srcSubpass;
    uint32_t                dstSubpass;
    VkPipelineStageFlags    srcStageMask;
    VkPipelineStageFlags    dstStageMask;
    VkAccessFlags           srcAccessMask;
    VkAccessFlags           dstAccessMask;
    VkDependencyFlags       dependencyFlags;
} VkSubpassDependency;

如果 srcSubpass 等于 dstSubpass,则 VkSubpassDependency 不直接定义 依赖关系。相反,它允许在标识的子通道内的渲染通道实例中使用管线屏障,其中一个管线屏障的范围必须是由一个子通道依赖关系描述的范围的子集。以这种方式指定的子通道依赖关系在 srcStageMask 中包含 帧缓冲区空间阶段必须仅在 dstStageMask 中包含 帧缓冲区空间阶段,并且必须包含 VK_DEPENDENCY_BY_REGION_BIT。当以这种方式为视图掩码中具有多个视图的子通道指定子通道依赖关系时,其 dependencyFlags 必须包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

如果 srcSubpassdstSubpass 不相等,则当包含子通道依赖关系的渲染通道实例提交到队列时,它会在由 srcSubpassdstSubpass 标识的子通道之间定义 依赖关系

如果 srcSubpass 等于 VK_SUBPASS_EXTERNAL,则第一个 同步范围 包括在 提交顺序 中早于用于开始渲染通道实例的 vkCmdBeginRenderPass 的命令。否则,第一组命令包括作为由 srcSubpass 标识的子通道实例的一部分提交的所有命令,以及在 srcSubpass 中使用的附件上的任何 加载存储多重采样解析 操作。在任何情况下,第一个同步范围都限制为由 srcStageMask 指定的 源阶段掩码 确定的管线阶段上的操作。

如果 dstSubpass 等于 VK_SUBPASS_EXTERNAL,则第二个 同步范围 包括在 提交顺序 中晚于用于结束渲染通道实例的 vkCmdEndRenderPass 的命令。否则,第二组命令包括作为由 dstSubpass 标识的子通道实例的一部分提交的所有命令,以及在 dstSubpass 中使用的附件上的任何 加载存储多重采样解析 操作。在任何情况下,第二个同步范围都限制为由 dstStageMask 指定的 目标阶段掩码 确定的管线阶段上的操作。

第一个 访问范围 限制为由 srcStageMask 指定的 源阶段掩码 确定的管线阶段中的访问。它还限制为由 srcAccessMask 指定的 源访问掩码 中的访问类型。

第二个 访问范围 限制为由 dstStageMask 指定的 目标阶段掩码 确定的管线阶段中的访问。它还限制为由 dstAccessMask 指定的 目标访问掩码 中的访问类型。

由子通道依赖关系定义的 可用性和可见性操作 会影响渲染通道内 图像布局转换 的执行。

对于非附件资源,子通道依赖关系表达的内存依赖关系与作为 vkCmdPipelineBarrier 的一部分提交的 VkMemoryBarrier(具有匹配的 srcAccessMaskdstAccessMask 参数)几乎相同(具有匹配的 srcStageMaskdstStageMask 参数)。唯一的区别在于其范围仅限于标识的子通道,而不是可能影响之前和之后的所有内容。

然而,对于附件来说,子通道依赖关系更像是 VkImageMemoryBarrier,其定义方式类似于上面的 VkMemoryBarrier,队列族索引设置为 VK_QUEUE_FAMILY_IGNORED,布局如下:

  • oldLayout 的等效项是附件根据 srcSubpass 的子通道描述所定义的布局。

  • newLayout 的等效项是附件根据 dstSubpass 的子通道描述所定义的布局。

有效用法
  • VUID-VkSubpassDependency-srcStageMask-04090
    如果 geometryShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-VkSubpassDependency-srcStageMask-04091
    如果 tessellationShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkSubpassDependency-srcStageMask-04092
    如果 conditionalRendering 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkSubpassDependency-srcStageMask-04093
    如果 fragmentDensityMap 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkSubpassDependency-srcStageMask-04094
    如果 transformFeedback 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkSubpassDependency-srcStageMask-04095
    如果 meshShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-VkSubpassDependency-srcStageMask-04096
    如果 taskShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-VkSubpassDependency-srcStageMask-07318
    如果 shadingRateImageattachmentFragmentShadingRate 功能都未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkSubpassDependency-srcStageMask-03937
    如果 synchronization2 功能未启用,则 srcStageMask 必须 不为 0

  • VUID-VkSubpassDependency-srcStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能都未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkSubpassDependency-dstStageMask-04090
    如果 geometryShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-VkSubpassDependency-dstStageMask-04091
    如果 tessellationShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkSubpassDependency-dstStageMask-04092
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkSubpassDependency-dstStageMask-04093
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkSubpassDependency-dstStageMask-04094
    如果 transformFeedback 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkSubpassDependency-dstStageMask-04095
    如果 meshShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-VkSubpassDependency-dstStageMask-04096
    如果 taskShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-VkSubpassDependency-dstStageMask-07318
    如果 shadingRateImageattachmentFragmentShadingRate 功能都未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkSubpassDependency-dstStageMask-03937
    如果 synchronization2 功能未启用,则 dstStageMask 必须 不为 0

  • VUID-VkSubpassDependency-dstStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能都未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkSubpassDependency-srcSubpass-00864
    为了避免循环依赖并确保有效的执行顺序,srcSubpass 必须 小于或等于 dstSubpass,除非其中一个为 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency-srcSubpass-00865
    srcSubpassdstSubpass 必须 不能同时等于 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency-srcSubpass-06809
    如果 srcSubpass 等于 dstSubpass 并且 srcStageMask 包含 帧缓冲空间阶段,则 dstStageMask 必须 仅包含 帧缓冲空间阶段

  • VUID-VkSubpassDependency-srcAccessMask-00868
    srcAccessMask 中包含的任何访问标志 必须srcStageMask 中某个管线阶段的支持,如支持的访问类型表中所指定。

  • VUID-VkSubpassDependency-dstAccessMask-00869
    dstAccessMask 中包含的任何访问标志必须dstStageMask 中的一个管线阶段支持,如支持的访问类型表中所述。

  • VUID-VkSubpassDependency-srcSubpass-02243
    如果 srcSubpass 等于 dstSubpass,并且 srcStageMaskdstStageMask 都包含一个帧缓冲区空间阶段,则 dependencyFlags 必须包含 VK_DEPENDENCY_BY_REGION_BIT

  • VUID-VkSubpassDependency-dependencyFlags-02520
    如果 dependencyFlags 包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则 srcSubpass 必须不等于 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency-dependencyFlags-02521
    如果 dependencyFlags 包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则 dstSubpass 必须不等于 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency-srcSubpass-00872
    如果 srcSubpass 等于 dstSubpass 并且该子通道在视图掩码中设置了多个位,则 dependencyFlags 必须包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-VkSubpassDependency-dependencyFlags-10203
    dependencyFlags 必须不包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR

有效使用 (隐式)
  • VUID-VkSubpassDependency-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits 值的有效组合。

  • VUID-VkSubpassDependency-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits 值的有效组合。

  • VUID-VkSubpassDependency-srcAccessMask-parameter
    srcAccessMask 必须VkAccessFlagBits 值的有效组合。

  • VUID-VkSubpassDependency-dstAccessMask-parameter
    dstAccessMask 必须VkAccessFlagBits 值的有效组合。

  • VUID-VkSubpassDependency-dependencyFlags-parameter
    dependencyFlags 必须VkDependencyFlagBits 值的有效组合。

当启用多视图时,一个子通道的多个视图的执行可能不会同时或甚至背靠背发生,而是可能与其他子通道的执行交错进行。加载和存储操作以每个视图为基础应用于附件。例如,使用 VK_ATTACHMENT_LOAD_OP_CLEAR 的附件将在首次使用时清除每个视图,但一个视图的首次使用在时间上可能与另一个视图的首次使用相距很远。

多视图的一个好的心理模型是将多视图子通道视为一组单独的(每个视图)子通道,它们在逻辑上分组在一起,并在 API 中描述为单个多视图子通道。类似地,多视图附件可以被认为是单个图像中的多个层。两个多视图子通道之间的视图本地依赖关系就像对应的一对一对每个视图的子通道的依赖关系集。两个多视图子通道之间的视图全局依赖关系就像源和目标中所有成对的每个视图子通道之间的 N × M 个依赖关系集。因此,它是一种更紧凑的表示,也清楚地表明了子通道中视图之间存在的共性和重用。这种解释激发了诸如“加载操作何时应用”之类的问题的答案 - 它是在首次使用附件的每个视图时,就好像每个视图都是一个单独的附件一样。

每个视图的内容遵循附件内容行为中的描述。特别是,如果保留了附件,则保留附件中的所有视图。

如果渲染通道的任何两个子通道将变换反馈激活到相同的绑定变换反馈缓冲区,则它们之间必须包含一个子通道依赖关系(直接或通过一些中间子通道)。

如果没有从 VK_SUBPASS_EXTERNAL 到使用附件的第一个子通道的子通道依赖关系,则存在从 VK_SUBPASS_EXTERNAL 到首次使用它的子通道的隐式子通道依赖关系。仅当存在从 initialLayout 自动布局转换时,才存在隐式子通道依赖关系。子通道依赖关系的操作方式就像使用以下参数定义的一样:

VkSubpassDependency implicitDependency = {
    .srcSubpass = VK_SUBPASS_EXTERNAL,
    .dstSubpass = firstSubpass, // First subpass attachment is used in
    .srcStageMask = VK_PIPELINE_STAGE_NONE,
    .dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
    .srcAccessMask = 0,
    .dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
                     VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
                     VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
                     VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
                     VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
    .dependencyFlags = 0
};

同样,如果没有从使用附件的最后一个子通道到 VK_SUBPASS_EXTERNAL 的子通道依赖关系,则存在从使用它的最后一个子通道到 VK_SUBPASS_EXTERNAL 的隐式子通道依赖关系。仅当存在到 finalLayout 的自动布局转换时,才存在隐式子通道依赖关系。子通道依赖关系的操作方式就像使用以下参数定义的一样:

VkSubpassDependency implicitDependency = {
    .srcSubpass = lastSubpass, // Last subpass attachment is used in
    .dstSubpass = VK_SUBPASS_EXTERNAL,
    .srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
    .dstStageMask = VK_PIPELINE_STAGE_NONE,
    .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
                     VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
    .dstAccessMask = 0,
    .dependencyFlags = 0
};

由于子通道可能会与其他子通道重叠或乱序执行,除非子通道依赖关系链另有说明,否则应用程序无法知道子通道之间所需的布局转换。相反,应用程序提供每个附件在渲染通道开始和结束时必须处于的布局,以及在其使用的每个子通道期间必须处于的布局。然后,实现必须执行子通道之间的布局转换,以确保图像处于每个子通道所需的布局中,并且在渲染通道结束时处于最终布局中。

自动布局转换应用于附加到帧缓冲区的整个图像子资源。如果未启用多视图,并且附件是 1D 或 2D 图像的视图,则自动布局转换将应用于 VkFramebufferCreateInfo::layers 指定的层数。如果启用多视图,并且附件是 1D 或 2D 图像的视图,则自动布局转换将应用于与渲染通道中某个子通道使用的视图相对应的层,即使该子通道不引用给定的附件也是如此。如果附件视图是 3D 图像的 2D 或 2D 数组视图,即使附件视图仅引用 3D 图像所选 mip 级别的切片子集,自动布局转换也适用于引用的整个子资源,即本例中的整个 mip 级别。

离开子通道中使用的布局的自动布局转换发生在以该子通道为 srcSubpass 的所有依赖项的可用性操作之后。

自动布局转换到子通道中使用的布局,发生在以该子通道为dstSubpass的所有依赖项的可见性操作之前。

自动布局从 initialLayout 转换离开,发生在 srcSubpass 等于 VK_SUBPASS_EXTERNAL 的所有依赖项的可用性操作之后,其中 dstSubpass 使用将要转换的附件。对于使用 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 创建的附件,自动布局从 initialLayout 转换离开,发生在 srcSubpass 等于 VK_SUBPASS_EXTERNAL 的所有依赖项的可用性操作之后,其中 dstSubpass 使用任何别名附件。

自动布局转换到 finalLayout ,发生在 dstSubpass 等于 VK_SUBPASS_EXTERNAL 的所有依赖项的可见性操作之前,其中 srcSubpass 使用将要转换的附件。对于使用 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 创建的附件,自动布局转换到 finalLayout ,发生在 dstSubpass 等于 VK_SUBPASS_EXTERNAL 的所有依赖项的可见性操作之前,其中 srcSubpass 使用任何别名附件。

引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的图像的深度/模板附件的深度方面的图像布局,取决于最后一次用于渲染到该附件的采样位置,因此自动布局转换使用 VkRenderPassSampleLocationsBeginInfoEXT 中指定的采样位置状态。

引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的附件的自动布局转换,使用附件引用的图像子资源范围最后一次渲染时使用的采样位置。如果当前渲染通道在之前的任何子通道中都没有将该附件用作深度/模板附件,则自动布局转换使用 VkRenderPassSampleLocationsBeginInfoEXT::pAttachmentInitialSampleLocations 数组元素的 sampleLocationsInfo 成员中指定的采样位置状态,该元素的 attachmentIndex 成员等于附件的附件索引(如果指定)。否则,自动布局转换使用 VkRenderPassSampleLocationsBeginInfoEXT::pPostSubpassSampleLocations 数组元素的 sampleLocationsInfo 成员中指定的采样位置状态,该元素的 subpassIndex 成员等于最后一次将该附件用作深度/模板附件的子通道的索引(如果指定)。

如果对于引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的附件执行的自动布局转换没有指定采样位置状态,则深度/模板附件的深度方面的内容将变为未定义,就像附件的布局是从 VK_IMAGE_LAYOUT_UNDEFINED 布局转换而来一样。

如果两个子通道使用相同的附件,并且两个子通道都以只读布局使用该附件,则不需要在这两个子通道之间指定子通道依赖项。如果实现将这些布局分开处理,则必须在这两个子通道之间插入一个隐式的子通道依赖项,以分隔每个布局中的使用。子通道依赖项的操作方式就像使用以下参数定义一样

// Used for input attachments
VkPipelineStageFlags inputAttachmentStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
VkAccessFlags inputAttachmentDstAccess = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;

// Used for depth/stencil attachments
VkPipelineStageFlags depthStencilAttachmentStages = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
VkAccessFlags depthStencilAttachmentDstAccess = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;

VkSubpassDependency implicitDependency = {
    .srcSubpass = firstSubpass;
    .dstSubpass = secondSubpass;
    .srcStageMask = inputAttachmentStages | depthStencilAttachmentStages;
    .dstStageMask = inputAttachmentStages | depthStencilAttachmentStages;
    .srcAccessMask = 0;
    .dstAccessMask = inputAttachmentDstAccess | depthStencilAttachmentDstAccess;
    .dependencyFlags = 0;
};

当使用着色器对象进行绘制时,或者当使用在VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置的 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建图形管线时,应用程序必须指定在渲染通道期间写入的附件类型,这些附件类型也将在渲染通道中作为非附件访问。

动态设置管线是否可以在作为被写入的附件的同时,也作为非附件访问资源,请调用

// Provided by VK_EXT_attachment_feedback_loop_dynamic_state
void vkCmdSetAttachmentFeedbackLoopEnableEXT(
    VkCommandBuffer                             commandBuffer,
    VkImageAspectFlags                          aspectMask);
  • commandBuffer 是将要记录命令的命令缓冲区。

  • aspectMask 指定将启用反馈循环的附件类型。 其方面未包含在 aspectMask 中的附件类型将禁用反馈循环。

对于在渲染通道中写入的附件,只有具有在 aspectMask 中指定的方面的附件,才能被后续的绘图命令作为非附件访问。

有效用法
  • VUID-vkCmdSetAttachmentFeedbackLoopEnableEXT-attachmentFeedbackLoopDynamicState-08862
    必须启用attachmentFeedbackLoopDynamicState功能

  • VUID-vkCmdSetAttachmentFeedbackLoopEnableEXT-aspectMask-08863
    aspectMask 必须只包括 VK_IMAGE_ASPECT_NONEVK_IMAGE_ASPECT_COLOR_BITVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdSetAttachmentFeedbackLoopEnableEXT-attachmentFeedbackLoopLayout-08864
    如果未启用 attachmentFeedbackLoopLayout 功能,则 aspectMask 必须VK_IMAGE_ASPECT_NONE

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

  • VUID-vkCmdSetAttachmentFeedbackLoopEnableEXT-aspectMask-parameter
    aspectMask 必须VkImageAspectFlagBits 值的有效组合

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

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

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

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

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

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

主要
次要

两者

外部

图形

状态

下面还定义了渲染通道创建的更可扩展版本。

要创建渲染通道,请调用

// Provided by VK_VERSION_1_2
VkResult vkCreateRenderPass2(
    VkDevice                                    device,
    const VkRenderPassCreateInfo2*              pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkRenderPass*                               pRenderPass);

或等效命令

// Provided by VK_KHR_create_renderpass2
VkResult vkCreateRenderPass2KHR(
    VkDevice                                    device,
    const VkRenderPassCreateInfo2*              pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkRenderPass*                               pRenderPass);
  • device 是创建渲染通道的逻辑设备。

  • pCreateInfo 是指向一个 VkRenderPassCreateInfo2 结构的指针,该结构描述了渲染通道的参数。

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

  • pRenderPass 是指向 VkRenderPass 句柄的指针,其中返回生成的渲染通道对象。

此命令在功能上与 vkCreateRenderPass 相同,但包括可扩展的子结构,其中包括 sTypepNext 参数,使其更容易扩展。

有效用法
  • VUID-vkCreateRenderPass2-device-10001
    device 必须至少支持一个具有 VK_QUEUE_GRAPHICS_BIT 功能的队列族

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

  • VUID-vkCreateRenderPass2-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkRenderPassCreateInfo2 结构的有效指针

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

  • VUID-vkCreateRenderPass2-pRenderPass-parameter
    pRenderPass 必须 是指向 VkRenderPass 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkRenderPassCreateInfo2 结构定义为

// Provided by VK_VERSION_1_2
typedef struct VkRenderPassCreateInfo2 {
    VkStructureType                    sType;
    const void*                        pNext;
    VkRenderPassCreateFlags            flags;
    uint32_t                           attachmentCount;
    const VkAttachmentDescription2*    pAttachments;
    uint32_t                           subpassCount;
    const VkSubpassDescription2*       pSubpasses;
    uint32_t                           dependencyCount;
    const VkSubpassDependency2*        pDependencies;
    uint32_t                           correlatedViewMaskCount;
    const uint32_t*                    pCorrelatedViewMasks;
} VkRenderPassCreateInfo2;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkRenderPassCreateInfo2 VkRenderPassCreateInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 保留供将来使用。

  • attachmentCount 是此渲染通道使用的附件数量。

  • pAttachments 是一个指向 attachmentCountVkAttachmentDescription2 结构的数组的指针,这些结构描述了渲染通道使用的附件。

  • subpassCount 是要创建的子通道数量。

  • pSubpasses 是一个指向 subpassCountVkSubpassDescription2 结构的数组的指针,这些结构描述了每个子通道。

  • dependencyCount 是子通道对之间依赖关系的数量。

  • pDependencies 是一个指向 dependencyCountVkSubpassDependency2 结构的数组的指针,这些结构描述了子通道对之间的依赖关系。

  • correlatedViewMaskCount 是相关掩码的数量。

  • pCorrelatedViewMasks 是一个指向视图掩码数组的指针,该数组指示可能更有效地并发渲染的视图集。

此结构定义的参数与 VkRenderPassCreateInfo 中同名的参数具有相同的效果;子结构是 VkRenderPassCreateInfo 中使用的变体,它们添加了 sTypepNext 参数,从而允许对其进行扩展。

如果 pSubpasses 的任何元素的 VkSubpassDescription2::viewMask 成员不为零,则认为此渲染通道启用了多视图功能。

correlatedViewMaskCountpCorrelatedViewMasks 的效果分别与 VkRenderPassMultiviewCreateInfo::correlationMaskCountVkRenderPassMultiviewCreateInfo::pCorrelationMasks 相同。

有效用法
  • VUID-VkRenderPassCreateInfo2-None-03049
    如果任何两个子通道操作具有重叠的相同 VkDeviceMemory 对象范围的附件,并且至少有一个子通道写入 VkDeviceMemory 的该区域,则必须在它们之间包含子通道依赖关系(直接或通过一些中间子通道)。

  • VUID-VkRenderPassCreateInfo2-attachment-03050
    如果 pInputAttachmentspColorAttachmentspResolveAttachmentspDepthStencilAttachment 的任何元素的 attachment 成员,或 pSubpasses 的任何元素中 pPreserveAttachments 的任何元素索引的附件,绑定到与任何子通道(包括同一子通道)中的任何其他附件重叠的 VkDeviceMemory 对象范围,则描述它们的 VkAttachmentDescription2 结构**必须**在 flags 中包含 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT

  • VUID-VkRenderPassCreateInfo2-attachment-03051
    如果 pInputAttachmentspColorAttachmentspResolveAttachmentspDepthStencilAttachment 的任何元素的 attachment 成员,或者 pSubpasses 的任何元素的 pPreserveAttachments 的任何元素不是 VK_ATTACHMENT_UNUSED,那么它必须小于 attachmentCount

  • VUID-VkRenderPassCreateInfo2-fragmentDensityMapAttachment-06472
    如果 pNext 链包含一个 VkRenderPassFragmentDensityMapCreateInfoEXT 结构,并且 fragmentDensityMapAttachment 成员不是 VK_ATTACHMENT_UNUSED,那么 attachment 必须小于 attachmentCount

  • VUID-VkRenderPassCreateInfo2-pSubpasses-06473
    如果 pSubpasses 的 pNext 链包含 VkSubpassDescriptionDepthStencilResolve 结构,并且 pDepthStencilResolveAttachment 成员不是 NULL 且不具有 VK_ATTACHMENT_UNUSED 值,则 attachment **必须**小于 attachmentCount

  • VUID-VkRenderPassCreateInfo2-pAttachments-02522
    对于 pAttachments 中任何 loadOp 等于 VK_ATTACHMENT_LOAD_OP_CLEAR 的成员,该附件的首次使用**必须**不指定等于 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMALlayout

  • VUID-VkRenderPassCreateInfo2-pAttachments-02523
    对于 pAttachments 中任何 stencilLoadOp 等于 VK_ATTACHMENT_LOAD_OP_CLEAR 的成员,该附件的首次使用**必须**不指定等于 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALlayout

  • VUID-VkRenderPassCreateInfo2-pDependencies-03054
    对于 pDependencies 中的任何元素,如果 srcSubpass 不是 VK_SUBPASS_EXTERNAL,则该依赖项的 srcStageMask 成员中包含的所有阶段标志 必须 是源子通道的 pipelineBindPoint 成员标识的管线支持的管线阶段。

  • VUID-VkRenderPassCreateInfo2-pDependencies-03055
    对于 pDependencies 中的任何元素,如果 dstSubpass 不是 VK_SUBPASS_EXTERNAL,则该依赖项的 dstStageMask 成员中包含的所有阶段标志 必须 是目标子通道的 pipelineBindPoint 成员标识的管线支持的管线阶段。

  • VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-03056
    pCorrelatedViewMasks 的任何元素中包含的位集合**必须**不与 pCorrelatedViewMasks 的任何其他元素中包含的位集合重叠。

  • VUID-VkRenderPassCreateInfo2-viewMask-03057
    如果 pSubpasses 的所有元素的 VkSubpassDescription2::viewMask 成员为 0,则 correlatedViewMaskCount **必须**为 0

  • VUID-VkRenderPassCreateInfo2-viewMask-03058
    pSubpasses 的所有元素的 VkSubpassDescription2::viewMask 成员**必须**全部为 0,或全部不为 0

  • VUID-VkRenderPassCreateInfo2-viewMask-03059
    如果 pSubpasses 的所有元素的 VkSubpassDescription2::viewMask 成员为 0,则 pDependencies 的任何元素的 dependencyFlags 成员**必须**不包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-VkRenderPassCreateInfo2-pDependencies-03060
    对于 pDependencies 的任何元素,如果其 srcSubpass 成员等于其 dstSubpass 成员,并且 pSubpasses 的相应元素的 viewMask 成员包含多个位,则其 dependencyFlags 成员**必须**包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-VkRenderPassCreateInfo2-attachment-02525
    如果 pSubpasses 的任何元素的 pInputAttachments 成员的任何元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则 pInputAttachments 的该元素的 aspectMask 成员**必须**仅包含由 attachment 指定的 pAttachments 元素指定的格式的图像中存在的方面。

  • VUID-VkRenderPassCreateInfo2-srcSubpass-02526
    pDependencies 的每个元素的 srcSubpass 成员**必须**小于 subpassCount

  • VUID-VkRenderPassCreateInfo2-dstSubpass-02527
    pDependencies 的每个元素的 dstSubpass 成员**必须**小于 subpassCount

  • VUID-VkRenderPassCreateInfo2-pAttachments-04585
    如果 pAttachments 的任何元素在任何子通道中用作片段着色率附件,则它**必须**不在此渲染通道中用作任何其他附件。

  • VUID-VkRenderPassCreateInfo2-pAttachments-09387
    如果 pAttachments 的任何元素用作片段着色率附件,则该附件的 loadOp **必须**不是 VK_ATTACHMENT_LOAD_OP_CLEAR

  • VUID-VkRenderPassCreateInfo2-flags-04521
    如果 flags 包含 VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM,则 pSubpasses 的一个元素在其 pNext 链中包含 VkFragmentShadingRateAttachmentInfoKHR 的实例,并且该结构的 pFragmentShadingRateAttachment 成员不等于 NULL,则 pFragmentShadingRateAttachmentattachment 成员必须VK_ATTACHMENT_UNUSED

  • VUID-VkRenderPassCreateInfo2-pAttachments-04586
    如果 pAttachments 的任何元素在任何子通道中用作片段着色率附件,则它必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkRenderPassCreateInfo2-rasterizationSamples-04905
    如果管道是使用片段着色器状态创建的,并且启用了 VK_QCOM_render_pass_shader_resolve 扩展,并且如果子通道有任何输入附件,并且子通道描述包含 VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM,则输入附件的采样计数必须等于 rasterizationSamples

  • VUID-VkRenderPassCreateInfo2-sampleShadingEnable-04906
    如果管道是使用片段着色器状态创建的,并且启用了 VK_QCOM_render_pass_shader_resolve 扩展,并且子通道描述包含 VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM,则 sampleShadingEnable 必须为 false。

  • VUID-VkRenderPassCreateInfo2-flags-04907
    如果 flags 包括 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,并且如果 pResolveAttachments 不是 NULL,则每个解析附件必须VK_ATTACHMENT_UNUSED

  • VUID-VkRenderPassCreateInfo2-flags-04908
    如果 flags 包含 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,并且如果 pDepthStencilResolveAttachment 不为 NULL,则深度/模板解析附件必须VK_ATTACHMENT_UNUSED

  • VUID-VkRenderPassCreateInfo2-flags-04909
    如果 flags 包括 VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,则子通道必须是子通道依赖链中的最后一个子通道。

  • VUID-VkRenderPassCreateInfo2-attachment-06244
    如果 pSubpasses 的元素的 pDepthStencilAttachment 成员的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则该结构的 layout 成员为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,并且该结构的 pNext 链不包含 VkAttachmentReferenceStencilLayout 结构,则 pAttachments 中索引等于 attachment 的元素必须不具有同时包含深度和模板分量的 format

  • VUID-VkRenderPassCreateInfo2-attachment-06245
    如果 pSubpasses 的元素的 pDepthStencilAttachment 成员的 attachment 成员不为 VK_ATTACHMENT_UNUSED,并且该结构的 layout 成员为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 pAttachments 中索引等于 attachment 的元素必须具有仅包含模板分量的 format

  • VUID-VkRenderPassCreateInfo2-attachment-06246
    如果 pSubpasses 的元素的 pDepthStencilAttachment 成员的 attachment 成员不为 VK_ATTACHMENT_UNUSED,并且该结构的 layout 成员为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则 pAttachments 中索引等于 attachment 的元素必须不具有仅包含模板分量的 format

  • VUID-VkRenderPassCreateInfo2-pResolveAttachments-09331
    如果 pSubpasses 的任何元素的 pResolveAttachments 的任何元素引用格式为 VK_FORMAT_UNDEFINED 的附件描述,则 VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment->attachment 必须VK_ATTACHMENT_UNUSED

有效使用 (隐式)
  • VUID-VkRenderPassCreateInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2

  • VUID-VkRenderPassCreateInfo2-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkRenderPassCreationControlEXTVkRenderPassCreationFeedbackCreateInfoEXTVkRenderPassFragmentDensityMapCreateInfoEXT 的有效实例的指针。

  • VUID-VkRenderPassCreateInfo2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkRenderPassCreateInfo2-flags-parameter
    flags 必须VkRenderPassCreateFlagBits 值的有效组合。

  • VUID-VkRenderPassCreateInfo2-pAttachments-parameter
    如果 attachmentCount 不为 0,则 pAttachments 必须是指向 attachmentCount 个有效 VkAttachmentDescription2 结构数组的有效指针。

  • VUID-VkRenderPassCreateInfo2-pSubpasses-parameter
    pSubpasses 必须是指向 subpassCount 个有效 VkSubpassDescription2 结构数组的有效指针。

  • VUID-VkRenderPassCreateInfo2-pDependencies-parameter
    如果 dependencyCount 不为 0,则 pDependencies 必须是指向 dependencyCount 个有效 VkSubpassDependency2 结构数组的有效指针。

  • VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-parameter
    如果 correlatedViewMaskCount 不为 0,则 pCorrelatedViewMasks 必须是指向 correlatedViewMaskCountuint32_t 值数组的有效指针。

  • VUID-VkRenderPassCreateInfo2-subpassCount-arraylength
    subpassCount 必须 大于 0

VkAttachmentDescription2 结构定义为

// Provided by VK_VERSION_1_2
typedef struct VkAttachmentDescription2 {
    VkStructureType                 sType;
    const void*                     pNext;
    VkAttachmentDescriptionFlags    flags;
    VkFormat                        format;
    VkSampleCountFlagBits           samples;
    VkAttachmentLoadOp              loadOp;
    VkAttachmentStoreOp             storeOp;
    VkAttachmentLoadOp              stencilLoadOp;
    VkAttachmentStoreOp             stencilStoreOp;
    VkImageLayout                   initialLayout;
    VkImageLayout                   finalLayout;
} VkAttachmentDescription2;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkAttachmentDescription2 VkAttachmentDescription2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkAttachmentDescriptionFlagBits 的位掩码,用于指定附件的附加属性。

  • format 是一个 VkFormat 值,指定将用于附件的图像的格式。

  • samples 是一个 VkSampleCountFlagBits 值,用于指定图像的样本数量。

  • loadOp 是一个 VkAttachmentLoadOp 值,用于指定在第一次使用附件的子通道开始时,如何处理附件的颜色和深度分量的内容。

  • storeOp 是一个 VkAttachmentStoreOp 值,用于指定在最后一次使用附件的子通道结束时,如何处理附件的颜色和深度分量的内容。

  • stencilLoadOp 是一个 VkAttachmentLoadOp 值,用于指定在第一次使用附件的子通道开始时,如何处理附件的模板分量的内容。

  • stencilStoreOp 是一个 VkAttachmentStoreOp 值,用于指定在最后一次使用附件的子通道结束时,如何处理附件的模板分量的内容。

  • initialLayout 是渲染通道实例开始时,附件图像子资源的布局。

  • finalLayout 是渲染通道实例结束时,附件图像子资源将转换到的布局。

此结构中定义的与 VkAttachmentDescription 中同名的参数具有与这些参数相同的效果。

如果启用了 separateDepthStencilLayouts 特性,并且 format 是深度/模板格式,则 initialLayoutfinalLayout 可以设置为仅指定深度方面布局的布局。

如果 pNext 链包含一个 VkAttachmentDescriptionStencilLayout 结构体,那么 stencilInitialLayoutstencilFinalLayout 成员指定深度/模板格式的模板方面的初始和最终布局,而 initialLayoutfinalLayout 仅适用于深度方面。对于仅深度格式,VkAttachmentDescriptionStencilLayout 结构体将被忽略。对于仅模板格式,如果存在 VkAttachmentDescriptionStencilLayout 结构体,则从该结构体获取模板方面的初始和最终布局;否则,从 initialLayoutfinalLayout 获取。

如果 format 是深度/模板格式,并且 initialLayoutfinalLayout 没有指定模板方面的布局,那么应用程序**必须**通过在 pNext 链中包含一个 VkAttachmentDescriptionStencilLayout 结构体来指定模板方面的初始和最终布局。

对于片段着色率附件,loadOpstoreOp 将被忽略。loadOpstoreOp 中不会执行对着色率附件的访问。相反,当栅格化片段时,会执行对 VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR 的访问。

有效用法
  • VUID-VkAttachmentDescription2-format-06699
    如果 format 包含颜色或深度分量且 loadOpVK_ATTACHMENT_LOAD_OP_LOAD,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_UNDEFINED

  • VUID-VkAttachmentDescription2-finalLayout-00843
    finalLayout 必须不能为 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkAttachmentDescription2-format-03280
    如果 format 是颜色格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03281
    如果 format 是深度/模板格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03282
    如果 format 是颜色格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03283
    如果 format 是深度/模板格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription2-format-06487
    如果 format 是颜色格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription2-format-06488
    如果 format 是颜色格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03284
    如果 separateDepthStencilLayouts 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03285
    如果 separateDepthStencilLayouts 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03286
    如果 format 是颜色格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03287
    如果 format 是颜色格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-06906
    如果 format 是包含深度和模板分量的深度/模板格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-06907
    如果 format 是包含深度和模板分量的深度/模板格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03290
    如果 format 是仅包含深度分量的深度/模板格式,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-03291
    如果 format 是仅包含深度分量的深度/模板格式,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-synchronization2-06908
    如果 synchronization2 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkAttachmentDescription2-synchronization2-06909
    如果 synchronization2 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkAttachmentDescription2-attachmentFeedbackLoopLayout-07309
    如果 attachmentFeedbackLoopLayout 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkAttachmentDescription2-attachmentFeedbackLoopLayout-07310
    如果 attachmentFeedbackLoopLayout 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkAttachmentDescription2-samples-08745
    samples 必须VkSampleCountFlagBits 中的一个有效值,该值在给定 formatimageCreateSampleCounts 中设置(如 图像创建限制 中所定义)

  • VUID-VkAttachmentDescription2-dynamicRenderingLocalRead-09544
    如果 dynamicRenderingLocalRead 功能未启用,则 initialLayout 必须不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkAttachmentDescription2-dynamicRenderingLocalRead-09545
    如果 dynamicRenderingLocalRead 功能未启用,则 finalLayout 必须不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkAttachmentDescription2-pNext-06704
    如果 pNext 链不包含 VkAttachmentDescriptionStencilLayout 结构体,format 包含模板组件,并且 stencilLoadOpVK_ATTACHMENT_LOAD_OP_LOAD,那么 initialLayout **必须**不是 VK_IMAGE_LAYOUT_UNDEFINED

  • VUID-VkAttachmentDescription2-pNext-06705
    如果 pNext 链包含 VkAttachmentDescriptionStencilLayout 结构体,format 包含模板组件,并且 stencilLoadOpVK_ATTACHMENT_LOAD_OP_LOAD,那么 VkAttachmentDescriptionStencilLayout::stencilInitialLayout **必须**不是 VK_IMAGE_LAYOUT_UNDEFINED

  • VUID-VkAttachmentDescription2-format-06249
    如果 format 是包含深度和模板组件的深度/模板格式,并且 initialLayoutVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则 pNext 链**必须**包含一个 VkAttachmentDescriptionStencilLayout 结构体

  • VUID-VkAttachmentDescription2-format-06250
    如果 format 是包含深度和模板组件的深度/模板格式,并且 finalLayoutVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则 pNext 链**必须**包含一个 VkAttachmentDescriptionStencilLayout 结构体

  • VUID-VkAttachmentDescription2-format-06247
    如果 pNext 链不包含 VkAttachmentDescriptionStencilLayout 结构体,并且 format 仅包含模板组件,则 initialLayout **必须**不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-06248
    如果 pNext 链不包含 VkAttachmentDescriptionStencilLayout 结构体,并且 format 仅包含模板组件,则 finalLayout **必须**不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentDescription2-format-09332
    如果未启用 externalFormatResolve 功能,则 format **必须**不是 VK_FORMAT_UNDEFINED

  • VUID-VkAttachmentDescription2-format-09334
    如果 formatVK_FORMAT_UNDEFINED,则在 pNext 链中**必须**有一个 VkExternalFormatANDROID 结构体,其 externalFormat 不等于 0

有效使用 (隐式)
  • VUID-VkAttachmentDescription2-sType-sType
    sType **必须**为 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2

  • VUID-VkAttachmentDescription2-pNext-pNext
    pNext 链中任何结构体(包括本结构体)的每个 pNext 成员必须NULL 或指向 VkAttachmentDescriptionStencilLayoutVkExternalFormatANDROID 有效实例的指针。

  • VUID-VkAttachmentDescription2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkAttachmentDescription2-flags-parameter
    flags 必须VkAttachmentDescriptionFlagBits 值的有效组合

  • VUID-VkAttachmentDescription2-format-parameter
    format 必须 是有效的 VkFormat

  • VUID-VkAttachmentDescription2-samples-parameter
    samples 必须 是有效的 VkSampleCountFlagBits

  • VUID-VkAttachmentDescription2-loadOp-parameter
    loadOp 必须为有效的 VkAttachmentLoadOp 值。

  • VUID-VkAttachmentDescription2-storeOp-parameter
    storeOp 必须为有效的 VkAttachmentStoreOp 值。

  • VUID-VkAttachmentDescription2-stencilLoadOp-parameter
    stencilLoadOp 必须 是有效的 VkAttachmentLoadOp

  • VUID-VkAttachmentDescription2-stencilStoreOp-parameter
    stencilStoreOp 必须 是有效的 VkAttachmentStoreOp

  • VUID-VkAttachmentDescription2-initialLayout-parameter
    initialLayout 必须 是有效的 VkImageLayout

  • VUID-VkAttachmentDescription2-finalLayout-parameter
    finalLayout 必须 是有效的 VkImageLayout

VkAttachmentDescriptionStencilLayout 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkAttachmentDescriptionStencilLayout {
    VkStructureType    sType;
    void*              pNext;
    VkImageLayout      stencilInitialLayout;
    VkImageLayout      stencilFinalLayout;
} VkAttachmentDescriptionStencilLayout;

或等效的

// Provided by VK_KHR_separate_depth_stencil_layouts
typedef VkAttachmentDescriptionStencilLayout VkAttachmentDescriptionStencilLayoutKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • stencilInitialLayout 是渲染通道实例开始时附件图像子资源的模板方面将处于的布局。

  • stencilFinalLayout 是渲染通道实例结束时附件图像子资源的模板方面将转换到的布局。

有效用法
  • VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-03308
    stencilInitialLayout **必须** 不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03309
    stencilFinalLayout **必须** 不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03310
    stencilFinalLayout **必须** 不为 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

有效使用 (隐式)
  • VUID-VkAttachmentDescriptionStencilLayout-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT

  • VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-parameter
    stencilInitialLayout **必须** 为有效的 VkImageLayout 值。

  • VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-parameter
    stencilFinalLayout **必须** 为有效的 VkImageLayout 值。

VkSubpassDescription2 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkSubpassDescription2 {
    VkStructureType                  sType;
    const void*                      pNext;
    VkSubpassDescriptionFlags        flags;
    VkPipelineBindPoint              pipelineBindPoint;
    uint32_t                         viewMask;
    uint32_t                         inputAttachmentCount;
    const VkAttachmentReference2*    pInputAttachments;
    uint32_t                         colorAttachmentCount;
    const VkAttachmentReference2*    pColorAttachments;
    const VkAttachmentReference2*    pResolveAttachments;
    const VkAttachmentReference2*    pDepthStencilAttachment;
    uint32_t                         preserveAttachmentCount;
    const uint32_t*                  pPreserveAttachments;
} VkSubpassDescription2;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkSubpassDescription2 VkSubpassDescription2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkSubpassDescriptionFlagBits 的位掩码,指定子通道的用法。

  • pipelineBindPoint 是一个 VkPipelineBindPoint 值,指定此子通道支持的管线类型。

  • viewMask 是视图索引的位域,当启用多视图时,它描述了此子通道中渲染广播到的视图。

  • inputAttachmentCount 是输入附件的数量。

  • pInputAttachments 是指向 VkAttachmentReference2 结构数组的指针,该数组定义了此子通道的输入附件及其布局。

  • colorAttachmentCount 是颜色附件的数量。

  • pColorAttachments 是指向 colorAttachmentCountVkAttachmentReference2 结构数组的指针,该数组定义了此子通道的颜色附件及其布局。

  • pResolveAttachmentsNULL 或指向 colorAttachmentCountVkAttachmentReference2 结构数组的指针,该数组定义了此子通道的解析附件及其布局。

  • pDepthStencilAttachment 是指向 VkAttachmentReference2 结构的指针,该结构指定了此子通道的深度/模板附件及其布局。

  • preserveAttachmentCount 是保留附件的数量。

  • pPreserveAttachments 是指向一个 preserveAttachmentCount 个渲染通道附件索引数组的指针,这些索引标识了此子通道未使用的附件,但其内容必须在整个子通道中保留。

此结构定义的参数与 VkSubpassDescription 中同名的参数具有相同的效果。

viewMask 对所描述的子通道具有与 VkRenderPassMultiviewCreateInfo::pViewMasks 对每个相应子通道的效果相同。

如果 pNext 链中包含 VkFragmentShadingRateAttachmentInfoKHR 结构,且 pFragmentShadingRateAttachment 不为 NULL,并且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则标识的附件定义了该子通道的片段着色率附件。

如果 pResolveAttachments 的任何元素是使用 VkExternalFormatANDROID 指定的图像,则相应颜色附件中的值将以与为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 指定的方式相同的方式解析到解析附件。

如果 nullColorAttachmentWithExternalFormatResolve 限制为 VK_TRUE,则在渲染开始时,颜色附件中的值将从解析附件加载,并且可能在发生解析或写入解析附件之后的任何时间重新加载;如果发生这种情况,它必须在任何在触发此解析之后发生的对颜色附件的写入之前发生。如果外部格式中的任何颜色分量被二次采样,则在加载时将从图像中的最近样本读取值。如果颜色附件也用作输入附件,则适用相同的行为。

当使用外部解析附件且 nullColorAttachmentWithExternalFormatResolve 限制为 VK_TRUE 时,将颜色附件设置为 VK_ATTACHMENT_UNUSED 不会导致丢弃该附件的颜色附件写入。

nullColorAttachmentWithExternalFormatResolveVK_TRUE 时,子通道的颜色输出仍然可以通过输入附件读取;但是应用程序无法为颜色附件绑定图像视图,因为没有绑定这样的图像视图。相反,为了将数据作为输入附件访问,应用程序可以使用解析附件代替 - 使用解析附件图像作为描述符,并将 pInputAttachments 的相应元素设置为解析附件的索引。

从解析附件进行的加载或输入附件读取操作,其执行方式如同使用以下参数的 VkSamplerYcbcrConversionCreateInfo

VkSamplerYcbcrConversionCreateInfo createInfo = {
    .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
    .pNext = NULL,
    .format = VK_FORMAT_UNDEFINED,
    .ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
    .ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
    .components = {
        .r = VK_COMPONENT_SWIZZLE_B
        .g = VK_COMPONENT_SWIZZLE_R
        .b = VK_COMPONENT_SWIZZLE_G
        .a = VK_COMPONENT_SWIZZLE_IDENTITY},
    .xChromaOffset = properties.chromaOffsetX,
    .yChromaOffset = properties.chromaOffsetY,
    .chromaFilter = VK_FILTER_NEAREST,
    .forceExplicitReconstruction = ... };

其中 properties 等于设备返回的 VkPhysicalDeviceExternalFormatResolvePropertiesANDROID,并且 forceExplicitReconstruction 被有效忽略,因为使用了 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY 模型。应用的 swizzle 与 VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY 模型应用的有效 swizzle 相同,但不会应用范围扩展。

有效用法
  • VUID-VkSubpassDescription2-attachment-06912
    如果 pInputAttachments 的元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06913
    如果 pColorAttachments 的元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06914
    如果 pResolveAttachments 的元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不为 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06915
    如果 pDepthStencilAttachmentattachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06916
    如果 pColorAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06917
    如果 pResolveAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06918
    如果 pInputAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06919
    如果 pColorAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06920
    如果 pResolveAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription2-attachment-06921
    如果 pInputAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR

  • VUID-VkSubpassDescription2-attachment-06922
    如果 pColorAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkSubpassDescription2-attachment-06923
    如果 pResolveAttachments 的一个元素的 attachment 成员不是 VK_ATTACHMENT_UNUSED,则其 layout 成员必须不是 VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkSubpassDescription2-attachment-06251
    如果 pDepthStencilAttachmentattachment 成员不是 VK_ATTACHMENT_UNUSED 且其 pNext 链包含 VkAttachmentReferenceStencilLayout 结构,则 pDepthStencilAttachmentlayout 成员必须不是 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkSubpassDescription2-pipelineBindPoint-04953
    pipelineBindPoint 必须VK_PIPELINE_BIND_POINT_GRAPHICSVK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI

  • VUID-VkSubpassDescription2-colorAttachmentCount-03063
    colorAttachmentCount 必须小于或等于 VkPhysicalDeviceLimits::maxColorAttachments

  • VUID-VkSubpassDescription2-loadOp-03064
    如果一个附件在此渲染通道中的首次使用是作为输入附件,并且该附件在同一子通道中也没有用作颜色或深度/模板附件,则 loadOp 必须不是 VK_ATTACHMENT_LOAD_OP_CLEAR

  • VUID-VkSubpassDescription2-pResolveAttachments-03067
    如果 pResolveAttachments 不是 NULL,则每个不是 VK_ATTACHMENT_UNUSED 的解析附件必须具有 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-VkSubpassDescription2-externalFormatResolve-09335
    如果 externalFormatResolve 功能未启用,且 pResolveAttachments 不是 NULL,则对于每个值不是 VK_ATTACHMENT_UNUSED 的解析附件,对应的颜色附件必须不能为 VK_ATTACHMENT_UNUSED 值。

  • VUID-VkSubpassDescription2-nullColorAttachmentWithExternalFormatResolve-09336
    如果 nullColorAttachmentWithExternalFormatResolve 属性为 VK_FALSEpResolveAttachments 不是 NULL,则对于每个格式为 VK_FORMAT_UNDEFINED 的解析附件,对应的颜色附件必须不能为 VK_ATTACHMENT_UNUSED 值。

  • VUID-VkSubpassDescription2-nullColorAttachmentWithExternalFormatResolve-09337
    如果 nullColorAttachmentWithExternalFormatResolve 属性为 VK_TRUEpResolveAttachments 不是 NULL,则对于每个格式为 VK_FORMAT_UNDEFINED 的解析附件,对应的颜色附件必须VK_ATTACHMENT_UNUSED 值。

  • VUID-VkSubpassDescription2-externalFormatResolve-09338
    如果 externalFormatResolve 功能未启用,且 pResolveAttachments 不是 NULL,则对于每个不是 VK_ATTACHMENT_UNUSED 的解析附件,对应的颜色附件必须不能具有 VK_SAMPLE_COUNT_1_BIT 的采样计数。

  • VUID-VkSubpassDescription2-externalFormatResolve-09339
    如果 externalFormatResolve 功能未启用,则 pResolveAttachments 的每个元素必须与其对应的颜色附件具有相同的 VkFormat

  • VUID-VkSubpassDescription2-multisampledRenderToSingleSampled-06869
    如果 multisampledRenderToSingleSampled 功能未启用,则 pColorAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有相同的采样计数。

  • VUID-VkSubpassDescription2-pInputAttachments-02897
    pInputAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件,并且满足以下任何一个条件:

    必须具有图像格式,其潜在格式功能至少包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkSubpassDescription2-pColorAttachments-02898
    pColorAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-VkSubpassDescription2-pResolveAttachments-09343
    pResolveAttachments 中所有非 VK_ATTACHMENT_UNUSED 且图像格式不为 VK_FORMAT_UNDEFINED 的附件,其图像格式的潜在格式特性必须包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-VkSubpassDescription2-pDepthStencilAttachment-02900
    如果 pDepthStencilAttachment 不是 NULL 且该附件不是 VK_ATTACHMENT_UNUSED,则它必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkSubpassDescription2-linearColorAttachment-06499
    如果启用了linearColorAttachment特性,并且图像是用 VK_IMAGE_TILING_LINEAR 创建的,则 pInputAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkSubpassDescription2-linearColorAttachment-06500
    如果启用了linearColorAttachment特性,并且图像是用 VK_IMAGE_TILING_LINEAR 创建的,则 pColorAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkSubpassDescription2-linearColorAttachment-06501
    如果启用了linearColorAttachment特性,并且图像是用 VK_IMAGE_TILING_LINEAR 创建的,则 pResolveAttachments 中所有不是 VK_ATTACHMENT_UNUSED 的附件必须具有图像格式,其潜在格式特性必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkSubpassDescription2-None-09456
    如果启用了以下任一条件:

    pColorAttachments 中所有非 VK_ATTACHMENT_UNUSED 的附件的采样计数必须小于或等于 pDepthStencilAttachment 的采样计数(如果它不是 VK_ATTACHMENT_UNUSED)。

  • VUID-VkSubpassDescription2-pNext-06870
    如果 pNext 链包含一个 multisampledRenderToSingleSampledEnable 等于 VK_TRUEVkMultisampledRenderToSingleSampledInfoEXT 结构体,那么 pColorAttachmentspDepthStencilAttachment 中所有非 VK_ATTACHMENT_UNUSED 的附件的采样计数必须VK_SAMPLE_COUNT_1_BIT 或者等于 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples

  • VUID-VkSubpassDescription2-pNext-06871
    如果 pNext 链包含一个 multisampledRenderToSingleSampledEnable 等于 VK_TRUEVkMultisampledRenderToSingleSampledInfoEXT 结构体,且 pDepthStencilAttachment 不为 NULL、不为 VK_ATTACHMENT_UNUSED 且采样计数为 VK_SAMPLE_COUNT_1_BIT,那么 pNext必须同时包含一个 VkSubpassDescriptionDepthStencilResolve 结构体,且 pDepthStencilResolveAttachmentNULL 或者 值为 VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescription2-multisampledRenderToSingleSampled-06872
    如果以下条件均未启用,则 pDepthStencilAttachmentpColorAttachments 中所有非 VK_ATTACHMENT_UNUSED 的附件的采样计数必须相同。

  • VUID-VkSubpassDescription2-attachment-03073
    pPreserveAttachments 的每个元素必须不是 VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescription2-pPreserveAttachments-03074
    pPreserveAttachments 的每个元素必须也不能是子通道描述的任何其他成员的元素。

  • VUID-VkSubpassDescription2-layout-02528
    如果任何附件被多个 VkAttachmentReference2 成员使用,则每次使用必须使用相同的 layout

  • VUID-VkSubpassDescription2-flags-03076
    如果 flags 包括 VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX,则它也必须包括 VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX

  • VUID-VkSubpassDescription2-attachment-02799
    如果 pInputAttachments 中任何元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 aspectMask 成员必须VkImageAspectFlagBits 的有效组合。

  • VUID-VkSubpassDescription2-attachment-02800
    如果 pInputAttachments 中任何元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 aspectMask 成员必须不为 0

  • VUID-VkSubpassDescription2-attachment-02801
    如果 pInputAttachments 中任何元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 aspectMask 成员必须不包含 VK_IMAGE_ASPECT_METADATA_BIT

  • VUID-VkSubpassDescription2-attachment-04563
    如果 pInputAttachments 中任何元素的 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 aspectMask 成员必须不包含任何索引为 *i* 的 VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT

  • VUID-VkSubpassDescription2-pDepthStencilAttachment-04440
    附件必须不能同时用于 pDepthStencilAttachmentpColorAttachments

  • VUID-VkSubpassDescription2-multiview-06558
    如果 multiview 功能未启用,则 viewMask 必须0

  • VUID-VkSubpassDescription2-viewMask-06706
    viewMask 中最高有效位的索引 必须小于 maxMultiviewViewCount

  • VUID-VkSubpassDescription2-externalFormatResolve-09344
    如果 externalFormatResolve 功能已启用,pResolveAttachments 不为 NULL,且 colorAttachmentCount 不为 1,则 pResolveAttachments 中任何不为 VK_ATTACHMENT_UNUSED 的元素的格式必须不为 VK_FORMAT_UNDEFINED

  • VUID-VkSubpassDescription2-externalFormatResolve-09345
    如果 externalFormatResolve 功能已启用,pResolveAttachments 不为 NULLpResolveAttachments 中任何不为 VK_ATTACHMENT_UNUSED 且格式为 VK_FORMAT_UNDEFINED 的元素,以及 pColorAttachments 中对应的元素不为 VK_ATTACHMENT_UNUSED,则颜色附件的 samples必须1

  • VUID-VkSubpassDescription2-externalFormatResolve-09346
    如果 externalFormatResolve 功能已启用,pResolveAttachments 不为 NULL,且 pResolveAttachments 中任何不为 VK_ATTACHMENT_UNUSED 且格式为 VK_FORMAT_UNDEFINED 的元素,则 viewMask必须0

  • VUID-VkSubpassDescription2-externalFormatResolve-09347
    如果 externalFormatResolve 功能已启用,pResolveAttachments 不为 NULL,且 pResolveAttachments 中任何不为 VK_ATTACHMENT_UNUSED 且格式为 VK_FORMAT_UNDEFINED 的元素,则 VkFragmentShadingRateAttachmentInfoKHR::pFragmentShadingRateAttachment必须NULL 或是一个 attachment 值为 VK_ATTACHMENT_UNUSEDVkAttachmentReference2 结构体。

  • VUID-VkSubpassDescription2-externalFormatResolve-09348
    如果启用了 externalFormatResolve 特性,并且 pResolveAttachments 不为 NULL,并且 pResolveAttachments 的任何元素不为 VK_ATTACHMENT_UNUSED 且具有 VK_FORMAT_UNDEFINED 的格式,则在此子通道中引用颜色附件或解析附件的 pInputAttachments 的元素在其 aspectMask必须不包含任何索引 iVK_IMAGE_ASPECT_PLANE_i_BIT

有效使用 (隐式)
  • VUID-VkSubpassDescription2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2

  • VUID-VkSubpassDescription2-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkFragmentShadingRateAttachmentInfoKHRVkMultisampledRenderToSingleSampledInfoEXTVkRenderPassCreationControlEXTVkRenderPassSubpassFeedbackCreateInfoEXTVkSubpassDescriptionDepthStencilResolve 的有效实例的指针。

  • VUID-VkSubpassDescription2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkSubpassDescription2-flags-parameter
    flags 必须VkSubpassDescriptionFlagBits 值的有效组合。

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

  • VUID-VkSubpassDescription2-pInputAttachments-parameter
    如果 inputAttachmentCount 不为 0,则 pInputAttachments 必须是指向 inputAttachmentCount 个有效 VkAttachmentReference2 结构数组的有效指针。

  • VUID-VkSubpassDescription2-pColorAttachments-parameter
    如果 colorAttachmentCount 不为 0,则 pColorAttachments 必须是指向 colorAttachmentCount 个有效 VkAttachmentReference2 结构数组的有效指针。

  • VUID-VkSubpassDescription2-pResolveAttachments-parameter
    如果 colorAttachmentCount 不为 0,并且 pResolveAttachments 不为 NULL,则 pResolveAttachments 必须是指向 colorAttachmentCount 个有效 VkAttachmentReference2 结构数组的有效指针。

  • VUID-VkSubpassDescription2-pDepthStencilAttachment-parameter
    如果 pDepthStencilAttachment 不为 NULL,则 pDepthStencilAttachment 必须是指向有效 VkAttachmentReference2 结构的有效指针。

  • VUID-VkSubpassDescription2-pPreserveAttachments-parameter
    如果 preserveAttachmentCount 不为 0,则 pPreserveAttachments 必须是指向 preserveAttachmentCountuint32_t 值的有效指针。

VkSubpassDescriptionDepthStencilResolve 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkSubpassDescriptionDepthStencilResolve {
    VkStructureType                  sType;
    const void*                      pNext;
    VkResolveModeFlagBits            depthResolveMode;
    VkResolveModeFlagBits            stencilResolveMode;
    const VkAttachmentReference2*    pDepthStencilResolveAttachment;
} VkSubpassDescriptionDepthStencilResolve;

或等效的

// Provided by VK_KHR_depth_stencil_resolve
typedef VkSubpassDescriptionDepthStencilResolve VkSubpassDescriptionDepthStencilResolveKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • depthResolveMode 是一个 VkResolveModeFlagBits 值,描述深度解析模式。

  • stencilResolveMode 是一个 VkResolveModeFlagBits 值,描述模板解析模式。

  • pDepthStencilResolveAttachmentNULL 或指向 VkAttachmentReference2 结构的指针,该结构定义此子通道的深度/模板解析附件及其布局。

如果 VkSubpassDescription2pNext 链包含 VkSubpassDescriptionDepthStencilResolve 结构,则该结构描述子通道中深度/模板附件的多重采样解析操作。如果此结构不包含在 VkSubpassDescription2pNext 链中,或者如果包含但 pDepthStencilResolveAttachmentNULL 或其附件索引为 VK_ATTACHMENT_UNUSED,则表示子通道中不会使用深度/模板解析附件。

有效用法
  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03177
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,则 pDepthStencilAttachment 必须不为 NULL 或具有值 VK_ATTACHMENT_UNUSED

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03179
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,则 pDepthStencilAttachment 必须不具有 VK_SAMPLE_COUNT_1_BIT 的采样计数。

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03180
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,则 pDepthStencilResolveAttachment 必须具有 VK_SAMPLE_COUNT_1_BIT 的采样计数。

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-02651
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,则它必须具有图像格式,其潜在格式特性包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED 并且 pDepthStencilResolveAttachmentVkFormat 具有深度分量,则 pDepthStencilAttachmentVkFormat 必须具有深度分量,该深度分量具有相同数量的位和 数值格式

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03182
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,并且 pDepthStencilResolveAttachmentVkFormat 具有模板分量,则 pDepthStencilAttachmentVkFormat 必须具有模板分量,该模板分量具有相同数量的位和 数值格式

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03178
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,则 depthResolveModestencilResolveMode 必须不能都为 VK_RESOLVE_MODE_NONE

  • VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-03183
    如果 pDepthStencilResolveAttachment 不为 NULL 且不具有值 VK_ATTACHMENT_UNUSED,并且 pDepthStencilResolveAttachmentVkFormat 具有深度分量,则 depthResolveMode 的值必须VkPhysicalDeviceDepthStencilResolveProperties::supportedDepthResolveModesVK_RESOLVE_MODE_NONE 中设置的位之一。

  • VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-03184
    如果 pDepthStencilResolveAttachment 不为 NULL 且值不为 VK_ATTACHMENT_UNUSED,并且 pDepthStencilResolveAttachmentVkFormat 具有模板分量,则 stencilResolveMode 的值必须VkPhysicalDeviceDepthStencilResolveProperties::supportedStencilResolveModes 中设置的位之一,或 VK_RESOLVE_MODE_NONE

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03185
    如果 pDepthStencilResolveAttachment 不为 NULL 且值不为 VK_ATTACHMENT_UNUSED,并且 pDepthStencilResolveAttachmentVkFormat 同时具有深度和模板分量,VkPhysicalDeviceDepthStencilResolveProperties::independentResolveVK_FALSE,并且 VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNoneVK_FALSE,则 depthResolveModestencilResolveMode 的值必须相同。

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03186
    如果 pDepthStencilResolveAttachment 不为 NULL 且值不为 VK_ATTACHMENT_UNUSED,并且 pDepthStencilResolveAttachmentVkFormat 同时具有深度和模板分量,VkPhysicalDeviceDepthStencilResolveProperties::independentResolveVK_FALSE,并且 VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNoneVK_TRUE,则 depthResolveModestencilResolveMode 的值必须相同,或者其中一个必须VK_RESOLVE_MODE_NONE

  • VUID-VkSubpassDescriptionDepthStencilResolve-pNext-06873
    如果 VkSubpassDescription2pNext 链中包含 VkMultisampledRenderToSingleSampledInfoEXT 结构,且 multisampledRenderToSingleSampledEnable 字段为 VK_TRUE,并且 pDepthStencilAttachment 不为 NULL 且值不为 VK_ATTACHMENT_UNUSED,则 depthResolveModestencilResolveMode 不能都为 VK_RESOLVE_MODE_NONE

  • VUID-VkSubpassDescriptionDepthStencilResolve-pNext-06874
    如果 VkSubpassDescription2pNext 链中包含 VkMultisampledRenderToSingleSampledInfoEXT 结构,其 multisampledRenderToSingleSampledEnable 字段为 VK_TRUE,并且 pDepthStencilAttachment 不为 NULL,值不为 VK_ATTACHMENT_UNUSED,且具有包含深度分量的 VkFormat,则 depthResolveMode 的值必须VkPhysicalDeviceDepthStencilResolveProperties::supportedDepthResolveModes 中设置的位之一,或 VK_RESOLVE_MODE_NONE

  • VUID-VkSubpassDescriptionDepthStencilResolve-pNext-06875
    如果 VkSubpassDescription2pNext 链中包含 VkMultisampledRenderToSingleSampledInfoEXT 结构,其 multisampledRenderToSingleSampledEnable 字段为 VK_TRUE,并且 pDepthStencilAttachment 不为 NULL,值不为 VK_ATTACHMENT_UNUSED,且具有包含模板分量的 VkFormat,则 stencilResolveMode 的值必须VkPhysicalDeviceDepthStencilResolveProperties::supportedStencilResolveModes 中设置的位之一,或 VK_RESOLVE_MODE_NONE

  • VUID-VkSubpassDescriptionDepthStencilResolve-pNext-06876
    如果 VkSubpassDescription2pNext 链中包含 VkMultisampledRenderToSingleSampledInfoEXT 结构,其 multisampledRenderToSingleSampledEnable 字段为 VK_TRUE,并且 pDepthStencilAttachment 不为 NULL,值不为 VK_ATTACHMENT_UNUSED,且具有同时包含深度和模板分量的 VkFormat,并且 VkPhysicalDeviceDepthStencilResolveProperties::independentResolveVkPhysicalDeviceDepthStencilResolveProperties::independentResolveNone 都为 VK_FALSE,则 depthResolveModestencilResolveMode 的值必须相同。

  • VUID-VkSubpassDescriptionDepthStencilResolve-pNext-06877
    如果 VkSubpassDescription2pNext 链中包含 VkMultisampledRenderToSingleSampledInfoEXT 结构,其 multisampledRenderToSingleSampledEnable 字段为 VK_TRUE,并且 pDepthStencilAttachment 不为 NULL,值不为 VK_ATTACHMENT_UNUSED,且具有同时包含深度和模板分量的 VkFormatVkPhysicalDeviceDepthStencilResolveProperties::independentResolveVK_FALSE,并且 VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNoneVK_TRUE,则 depthResolveModestencilResolveMode 的值必须相同,或者其中一个必须VK_RESOLVE_MODE_NONE

有效使用 (隐式)
  • VUID-VkSubpassDescriptionDepthStencilResolve-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE

  • VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-parameter
    如果 pDepthStencilResolveAttachment 不为 NULL,则 pDepthStencilResolveAttachment 必须是指向有效 VkAttachmentReference2 结构的有效指针。

VkFragmentShadingRateAttachmentInfoKHR 结构定义如下:

// Provided by VK_KHR_fragment_shading_rate
typedef struct VkFragmentShadingRateAttachmentInfoKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    const VkAttachmentReference2*    pFragmentShadingRateAttachment;
    VkExtent2D                       shadingRateAttachmentTexelSize;
} VkFragmentShadingRateAttachmentInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pFragmentShadingRateAttachmentNULL 或指向 VkAttachmentReference2 结构的指针,该结构定义此子通道的片元着色率附件。

  • shadingRateAttachmentTexelSize 指定 pFragmentShadingRateAttachment 中每个纹素对应的帧缓冲区部分的大小。

如果未指定着色率附件,或者未指定此结构,则实现的行为如同指定了一个有效的着色率附件,该附件的所有纹素都指定每个片段一个像素。

有效用法
  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04524
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则其 layout 成员必须等于 VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04525
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.width 必须是 2 的幂值

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04526
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.width 必须小于或等于 maxFragmentShadingRateAttachmentTexelSize.width

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04527
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.width 必须大于或等于 minFragmentShadingRateAttachmentTexelSize.width

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04528
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.height 必须是 2 的幂值

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04529
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.height 必须小于或等于 maxFragmentShadingRateAttachmentTexelSize.height

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04530
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.height 必须大于或等于 minFragmentShadingRateAttachmentTexelSize.height

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04531
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.widthshadingRateAttachmentTexelSize.height 的商必须小于或等于 maxFragmentShadingRateAttachmentTexelSizeAspectRatio

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04532
    如果 pFragmentShadingRateAttachment 不为 NULL 且其 attachment 成员不为 VK_ATTACHMENT_UNUSED,则 shadingRateAttachmentTexelSize.heightshadingRateAttachmentTexelSize.width 的商必须小于或等于 maxFragmentShadingRateAttachmentTexelSizeAspectRatio

有效使用 (隐式)
  • VUID-VkFragmentShadingRateAttachmentInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR

  • VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-parameter
    如果 pFragmentShadingRateAttachment 不为 NULL,则 pFragmentShadingRateAttachment 必须是指向有效的 VkAttachmentReference2 结构的有效指针

如果 VkSubpassDescription2VkRenderingInfopNext 链包含 VkMultisampledRenderToSingleSampledInfoEXT 结构,则该结构描述如何在子通道中的单采样附件上执行多采样渲染。

VkMultisampledRenderToSingleSampledInfoEXT 结构定义如下

// Provided by VK_EXT_multisampled_render_to_single_sampled
typedef struct VkMultisampledRenderToSingleSampledInfoEXT {
    VkStructureType          sType;
    const void*              pNext;
    VkBool32                 multisampledRenderToSingleSampledEnable;
    VkSampleCountFlagBits    rasterizationSamples;
} VkMultisampledRenderToSingleSampledInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • multisampledRenderToSingleSampledEnable 控制是否按照以下描述执行多采样渲染到单采样附件。

  • rasterizationSamples 是一个 VkSampleCountFlagBits,用于指定光栅化中使用的采样数。

有效用法
  • VUID-VkMultisampledRenderToSingleSampledInfoEXT-rasterizationSamples-06878
    rasterizationSamples 的值必须不能是 VK_SAMPLE_COUNT_1_BIT

  • VUID-VkMultisampledRenderToSingleSampledInfoEXT-pNext-06880
    如果添加到 VkRenderingInfopNext 链中,则 VkRenderingInfo::pColorAttachmentsVkRenderingInfo::pDepthAttachmentVkRenderingInfo::pStencilAttachment 的任何元素的每个 imageView 成员(不是 VK_NULL_HANDLE必须具有支持 rasterizationSamples 中指定的采样数的格式

有效使用 (隐式)
  • VUID-VkMultisampledRenderToSingleSampledInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT

  • VUID-VkMultisampledRenderToSingleSampledInfoEXT-rasterizationSamples-parameter
    rasterizationSamples 必须是有效的 VkSampleCountFlagBits

如果 VkSubpassDescription2VkRenderingInfopNext 链包含一个 multisampledRenderToSingleSampledEnable 字段为 VK_TRUEVkMultisampledRenderToSingleSampledInfoEXT 结构,则图形管线必须具有等于 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamplesVkGraphicsPipelineCreateInfo::rasterizationSamples,并且子通道附件的采样计数可以VK_SAMPLE_COUNT_1_BIT。对于采样计数为 VK_SAMPLE_COUNT_1_BIT 的附件,多重采样渲染将执行到中间多重采样图像,该图像具有 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples 个采样,由实现隐式分配,其存在时间为子通道的持续时间。对于此类附件

  • 如果 loadOp 等于 VK_ATTACHMENT_LOAD_OP_LOAD,则隐式图像的采样通过复制附件中相应像素的值进行初始化。

  • 如果 storeOpstencilStoreOp 等于 VK_ATTACHMENT_STORE_OP_STORE,则隐式图像在存储到附件之前被隐式解析。

由于高图元计数引起的内存约束可能导致子通道的隐式拆分。这等效于渲染通道中几何体的部分光栅化,该渲染通道以等于 VK_ATTACHMENT_STORE_OP_STOREstoreOpstencilStoreOp 结束,然后是另一个渲染通道,其 loadOpstencilLoadOp 等于 VK_ATTACHMENT_LOAD_OP_LOAD,两者之间有适当的屏障。当使用 VkMultisampledRenderToSingleSampledInfoEXT 时,允许实现解析采样计数为 VK_SAMPLE_COUNT_1_BIT 的附件,并在这种拆分时丢失多重采样数据。即使子通道使用相同的 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples 值,实现也可以类似地在子通道边界处拆分渲染通道。

VkAttachmentReference2 结构定义为

// Provided by VK_VERSION_1_2
typedef struct VkAttachmentReference2 {
    VkStructureType       sType;
    const void*           pNext;
    uint32_t              attachment;
    VkImageLayout         layout;
    VkImageAspectFlags    aspectMask;
} VkAttachmentReference2;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkAttachmentReference2 VkAttachmentReference2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • attachment 要么是标识 VkRenderPassCreateInfo2::pAttachments 中对应索引处的附件的整数值,要么是 VK_ATTACHMENT_UNUSED,表示不使用此附件。

  • layout 是一个 VkImageLayout 值,用于指定附件在子通道期间使用的布局。

  • aspectMask 是一个掩码,指示哪些方面可以在指定的子通道内作为输入附件进行访问。

此结构定义的参数与 VkAttachmentReference 中具有相同名称的参数具有相同的效果。

当此结构用于描述输入附件引用以外的任何内容时,aspectMask 将被忽略。

如果启用了 separateDepthStencilLayouts 功能,并且 attachment 具有深度/模板格式,则 layout 可以设置为仅指定深度方面布局的布局。

如果 layout 仅指定附件的深度方面的布局,则模板方面的布局由包含在 pNext 链中的 VkAttachmentReferenceStencilLayout 结构的 stencilLayout 成员指定。否则,layout 描述所有相关图像方面的布局。

有效用法
  • VUID-VkAttachmentReference2-layout-03077
    如果 attachment 不是 VK_ATTACHMENT_UNUSED,则 layout 必须不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZEDVK_IMAGE_LAYOUT_PRESENT_SRC_KHR

  • VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313
    如果未启用 separateDepthStencilLayouts 功能,且 attachment 不为 VK_ATTACHMENT_UNUSED,则 layout 必须不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VUID-VkAttachmentReference2-synchronization2-06910
    如果未启用 synchronization2 功能,则 layout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkAttachmentReference2-attachmentFeedbackLoopLayout-07311
    如果未启用 attachmentFeedbackLoopLayout 功能,则 layout 必须不能为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkAttachmentReference2-dynamicRenderingLocalRead-09546
    如果未启用 dynamicRenderingLocalRead 功能,则 layout 必须不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

有效使用 (隐式)
  • VUID-VkAttachmentReference2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2

  • VUID-VkAttachmentReference2-pNext-pNext
    pNext 必须NULL 或指向 VkAttachmentReferenceStencilLayout 的有效实例的指针

  • VUID-VkAttachmentReference2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkAttachmentReference2-layout-parameter
    layout 必须是有效的 VkImageLayout 值。

VkAttachmentReferenceStencilLayout 结构定义为

// Provided by VK_VERSION_1_2
typedef struct VkAttachmentReferenceStencilLayout {
    VkStructureType    sType;
    void*              pNext;
    VkImageLayout      stencilLayout;
} VkAttachmentReferenceStencilLayout;

或等效的

// Provided by VK_KHR_separate_depth_stencil_layouts
typedef VkAttachmentReferenceStencilLayout VkAttachmentReferenceStencilLayoutKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • stencilLayout 是一个 VkImageLayout 值,指定子通道期间附件的模板方面使用的布局。

有效用法
  • VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318
    stencilLayout 必须不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZEDVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_PRESENT_SRC_KHR

有效使用 (隐式)
  • VUID-VkAttachmentReferenceStencilLayout-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT

  • VUID-VkAttachmentReferenceStencilLayout-stencilLayout-parameter
    stencilLayout 必须是有效的 VkImageLayout

VkSubpassDependency2 结构定义为

// Provided by VK_VERSION_1_2
typedef struct VkSubpassDependency2 {
    VkStructureType         sType;
    const void*             pNext;
    uint32_t                srcSubpass;
    uint32_t                dstSubpass;
    VkPipelineStageFlags    srcStageMask;
    VkPipelineStageFlags    dstStageMask;
    VkAccessFlags           srcAccessMask;
    VkAccessFlags           dstAccessMask;
    VkDependencyFlags       dependencyFlags;
    int32_t                 viewOffset;
} VkSubpassDependency2;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkSubpassDependency2 VkSubpassDependency2KHR;

此结构定义的参数与 VkSubpassDependency 中具有相同名称的参数具有相同的效果。

viewOffset 对所描述的子通道依赖关系具有与 VkRenderPassMultiviewCreateInfo::pViewOffsets 对每个对应的子通道依赖关系相同的效果。

如果 pNext 链中包含 VkMemoryBarrier2,则将忽略 srcStageMaskdstStageMasksrcAccessMaskdstAccessMask 参数。同步和访问范围改为由 VkMemoryBarrier2 的参数定义。

有效用法
  • VUID-VkSubpassDependency2-srcStageMask-04090
    如果 geometryShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-VkSubpassDependency2-srcStageMask-04091
    如果 tessellationShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkSubpassDependency2-srcStageMask-04092
    如果 conditionalRendering 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkSubpassDependency2-srcStageMask-04093
    如果 fragmentDensityMap 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkSubpassDependency2-srcStageMask-04094
    如果 transformFeedback 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkSubpassDependency2-srcStageMask-04095
    如果 meshShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-VkSubpassDependency2-srcStageMask-04096
    如果 taskShader 功能未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-VkSubpassDependency2-srcStageMask-07318
    如果 shadingRateImageattachmentFragmentShadingRate 功能都未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkSubpassDependency2-srcStageMask-03937
    如果 synchronization2 功能未启用,则 srcStageMask 必须 不为 0

  • VUID-VkSubpassDependency2-srcStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能都未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkSubpassDependency2-dstStageMask-04090
    如果 geometryShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-VkSubpassDependency2-dstStageMask-04091
    如果 tessellationShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkSubpassDependency2-dstStageMask-04092
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkSubpassDependency2-dstStageMask-04093
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkSubpassDependency2-dstStageMask-04094
    如果 transformFeedback 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkSubpassDependency2-dstStageMask-04095
    如果 meshShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-VkSubpassDependency2-dstStageMask-04096
    如果 taskShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-VkSubpassDependency2-dstStageMask-07318
    如果 shadingRateImageattachmentFragmentShadingRate 功能都未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkSubpassDependency2-dstStageMask-03937
    如果 synchronization2 功能未启用,则 dstStageMask 必须 不为 0

  • VUID-VkSubpassDependency2-dstStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能都未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkSubpassDependency2-srcSubpass-03084
    为了避免循环依赖并确保有效的执行顺序,srcSubpass 必须 小于或等于 dstSubpass,除非其中一个为 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency2-srcSubpass-03085
    srcSubpassdstSubpass 必须 不能同时等于 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency2-srcSubpass-06810
    如果 srcSubpass 等于 dstSubpass 并且 srcStageMask 包含 帧缓冲空间阶段,则 dstStageMask 必须 仅包含 帧缓冲空间阶段

  • VUID-VkSubpassDependency2-srcAccessMask-03088
    srcAccessMask 中包含的任何访问标志 必须srcStageMask 中某个管线阶段的支持,如支持的访问类型表中所指定。

  • VUID-VkSubpassDependency2-dstAccessMask-03089
    dstAccessMask 中包含的任何访问标志必须dstStageMask 中的一个管线阶段支持,如支持的访问类型表中所述。

  • VUID-VkSubpassDependency2-dependencyFlags-03090
    如果 dependencyFlags 包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则 srcSubpass 必须不等于 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency2-dependencyFlags-03091
    如果 dependencyFlags 包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则 dstSubpass 必须不等于 VK_SUBPASS_EXTERNAL

  • VUID-VkSubpassDependency2-srcSubpass-02245
    如果 srcSubpass 等于 dstSubpass,并且 srcStageMaskdstStageMask 都包含一个帧缓冲区空间阶段,则 dependencyFlags 必须包含 VK_DEPENDENCY_BY_REGION_BIT

  • VUID-VkSubpassDependency2-viewOffset-02530
    如果 viewOffset 不等于 0,则 srcSubpass 必须不等于 dstSubpass

  • VUID-VkSubpassDependency2-dependencyFlags-03092
    如果 dependencyFlags 不包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则 viewOffset 必须0

  • VUID-VkSubpassDependency2-dependencyFlags-10204
    dependencyFlags 必须不包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR

有效使用 (隐式)
  • VUID-VkSubpassDependency2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2

  • VUID-VkSubpassDependency2-pNext-pNext
    pNext 必须NULL 或指向 VkMemoryBarrier2 的有效实例的指针

  • VUID-VkSubpassDependency2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkSubpassDependency2-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits 值的有效组合。

  • VUID-VkSubpassDependency2-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits 值的有效组合。

  • VUID-VkSubpassDependency2-srcAccessMask-parameter
    srcAccessMask 必须VkAccessFlagBits 值的有效组合。

  • VUID-VkSubpassDependency2-dstAccessMask-parameter
    dstAccessMask 必须VkAccessFlagBits 值的有效组合。

  • VUID-VkSubpassDependency2-dependencyFlags-parameter
    dependencyFlags 必须VkDependencyFlagBits 值的有效组合。

要销毁渲染通道,请调用

// Provided by VK_VERSION_1_0
void vkDestroyRenderPass(
    VkDevice                                    device,
    VkRenderPass                                renderPass,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁渲染通道的逻辑设备。

  • renderPass 是要销毁的渲染通道的句柄。

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

有效用法
  • VUID-vkDestroyRenderPass-renderPass-00873
    所有引用 renderPass 的已提交命令必须已完成执行

  • VUID-vkDestroyRenderPass-renderPass-00874
    如果创建 renderPass 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyRenderPass-renderPass-00875
    如果创建 renderPass 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyRenderPass-renderPass-parameter
    如果 renderPass 不是 VK_NULL_HANDLE,则 renderPass 必须是有效的 VkRenderPass 句柄

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

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

主机同步
  • renderPass 的主机访问必须外部同步

渲染通道兼容性

帧缓冲区和图形管线是基于特定的渲染通道对象创建的。它们必须仅与该渲染通道对象或与其兼容的对象一起使用。

如果两个附件引用具有匹配的格式和采样计数,或者均为 VK_ATTACHMENT_UNUSED 或包含引用的指针为 NULL,则它们是兼容的。

如果所有对应的附件对都兼容,则两个附件引用数组是兼容的。如果数组的长度不同,则较小数组中不存在的附件引用将被视为 VK_ATTACHMENT_UNUSED

如果两个渲染通道的对应颜色、输入、解析和深度/模板附件引用兼容,并且除了以下情况外它们是相同的,则这两个渲染通道是兼容的

  • 附件描述中的初始和最终图像布局

  • 附件描述中的加载和存储操作

  • 附件引用中的图像布局

作为额外的特殊情况,如果两个渲染通道只有一个子通道,则解析附件引用和深度/模板解析模式的兼容性要求将被忽略。

如果帧缓冲区是使用相同的渲染通道或兼容的渲染通道创建的,则该帧缓冲区与渲染通道兼容。

帧缓冲区

渲染通道与帧缓冲区结合使用。帧缓冲区表示渲染通道实例使用的一组特定内存附件。

帧缓冲区由 VkFramebuffer 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)

要创建帧缓冲区,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateFramebuffer(
    VkDevice                                    device,
    const VkFramebufferCreateInfo*              pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkFramebuffer*                              pFramebuffer);
  • device 是创建帧缓冲区的逻辑设备。

  • pCreateInfo 是指向 VkFramebufferCreateInfo 结构的指针,该结构描述了有关帧缓冲区创建的其他信息。

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

  • pFramebuffer 是指向 VkFramebuffer 句柄的指针,其中返回生成的帧缓冲区对象。

有效用法
  • VUID-vkCreateFramebuffer-device-10002
    device 必须至少支持一个具有 VK_QUEUE_GRAPHICS_BIT 功能的队列族

  • VUID-vkCreateFramebuffer-pCreateInfo-02777
    如果 pCreateInfo->flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,且 attachmentCount 不为 0,则 pCreateInfo->pAttachments 的每个元素 必须device 上创建。

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

  • VUID-vkCreateFramebuffer-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效的 VkFramebufferCreateInfo 结构的有效指针。

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

  • VUID-vkCreateFramebuffer-pFramebuffer-parameter
    pFramebuffer 必须 是指向 VkFramebuffer 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkFramebufferCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkFramebufferCreateInfo {
    VkStructureType             sType;
    const void*                 pNext;
    VkFramebufferCreateFlags    flags;
    VkRenderPass                renderPass;
    uint32_t                    attachmentCount;
    const VkImageView*          pAttachments;
    uint32_t                    width;
    uint32_t                    height;
    uint32_t                    layers;
} VkFramebufferCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flagsVkFramebufferCreateFlagBits 的位掩码。

  • renderPass 是一个渲染通道,定义帧缓冲将与之兼容的渲染通道。有关详细信息,请参阅 渲染通道兼容性

  • attachmentCount 是附件的数量。

  • pAttachments 是指向 VkImageView 句柄数组的指针,每个句柄将在渲染通道实例中用作相应的附件。如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则忽略此参数。

  • widthheightlayers 定义帧缓冲的尺寸。如果渲染通道使用多视口,则 layers 必须 为 1,并且每个附件都需要大于在其使用的子通道中视图掩码中设置的最大位索引的层数。

子通道可以使用没有颜色或深度/模板附件是合法的,要么是因为它没有附件引用,要么是因为所有附件引用都是 VK_ATTACHMENT_UNUSED。这种子通道 可以 使用着色器副作用(例如图像存储和原子操作)来生成输出。在这种情况下,子通道继续使用帧缓冲的 widthheightlayers 来定义渲染区域的尺寸,并使用每个管线的 VkPipelineMultisampleStateCreateInfo 中的 rasterizationSamples 来定义光栅化中使用的样本数;但是,如果 VkPhysicalDeviceFeatures::variableMultisampleRateVK_FALSE,则要与子通道绑定的所有管线 必须 具有相同的 VkPipelineMultisampleStateCreateInfo::rasterizationSamples 值。在所有这些情况下,rasterizationSamples 必须 是一个有效的 VkSampleCountFlagBits 值,该值在 VkPhysicalDeviceLimits::framebufferNoAttachmentsSampleCounts 中设置。

有效用法
  • VUID-VkFramebufferCreateInfo-attachmentCount-00876
    attachmentCount 必须 等于 renderPass 中指定的附件计数。

  • VUID-VkFramebufferCreateInfo-flags-02778
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BITattachmentCount 不为 0,则 pAttachments 必须 是指向 attachmentCount 个有效 VkImageView 句柄的有效指针。

  • VUID-VkFramebufferCreateInfo-pAttachments-00877
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中用作 renderPass 的颜色附件或解析附件的每个元素 必须 已使用包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITusage 值创建。

  • VUID-VkFramebufferCreateInfo-pAttachments-02633
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中用作 renderPass 的深度/模板附件的每个元素 必须 已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-VkFramebufferCreateInfo-pAttachments-02634
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中用作 renderPass 的深度/模板解析附件的每个元素 必须 已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-VkFramebufferCreateInfo-pAttachments-00879
    如果 renderpass 不是 VK_NULL_HANDLEflags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中用作 renderPass 的输入附件的每个元素 必须 已使用包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITusage 值创建。

  • VUID-VkFramebufferCreateInfo-pAttachments-02552
    pAttachments 中用作 renderPass 的片段密度图附件的每个元素 必须 没有使用包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXTflags 值创建。

  • VUID-VkFramebufferCreateInfo-renderPass-02553
    如果 renderPass 具有片段密度图附件,并且未启用 fragmentDensityMapNonSubsampledImages 功能,则 pAttachments 的每个元素 必须 使用包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXTflags 值创建,除非该元素是片段密度图附件。

  • VUID-VkFramebufferCreateInfo-renderPass-06502
    如果 renderPass 是使用 片段密度图偏移(而不是 (0,0))创建的,则 pAttachments 的每个元素 必须 已使用包含 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOMflags 值创建。

  • VUID-VkFramebufferCreateInfo-pAttachments-00880
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 的每个元素 必须 已使用与 renderPass 中相应 VkAttachmentDescription 指定的 VkFormat 值匹配的 VkFormat 值创建。

  • VUID-VkFramebufferCreateInfo-pAttachments-00881
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 的每个元素必须使用与 renderPass 中相应 VkAttachmentDescription 指定的 samples 值匹配的 samples 值创建。

  • VUID-VkFramebufferCreateInfo-flags-04533
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中被 renderPass 用作输入、颜色、解析或深度/模板附件的每个元素必须使用大于或等于 widthVkImageCreateInfo::extent.width 创建。

  • VUID-VkFramebufferCreateInfo-flags-04534
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中被 renderPass 用作输入、颜色、解析或深度/模板附件的每个元素必须使用大于或等于 heightVkImageCreateInfo::extent.height 创建。

  • VUID-VkFramebufferCreateInfo-flags-04535
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 中被 renderPass 用作输入、颜色、解析或深度/模板附件的每个元素必须使用大于或等于 layersVkImageViewCreateInfo::subresourceRange.layerCount 创建。

  • VUID-VkFramebufferCreateInfo-renderPass-04536
    如果 renderPass 是使用非零视图掩码指定的,则 pAttachments 中被 renderPass 用作输入、颜色、解析或深度/模板附件的每个元素的 layerCount 必须大于任何这些视图掩码中设置的最高有效位的索引。

  • VUID-VkFramebufferCreateInfo-renderPass-02746
    pAttachments 中被 fragmentDensityMapAttachment 引用的每个元素的 layerCount 必须等于 1,或者如果 renderPass 是使用非零视图掩码指定的,则大于任何这些视图掩码中设置的最高有效位的索引。

  • VUID-VkFramebufferCreateInfo-pAttachments-02555
    If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of pAttachments that is referenced by fragmentDensityMapAttachment must have a width at least as large as

  • VUID-VkFramebufferCreateInfo-pAttachments-02556
    If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of pAttachments that is referenced by fragmentDensityMapAttachment must have a height at least as large as

  • VUID-VkFramebufferCreateInfo-flags-04537
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,且 renderPass 是使用非零视图掩码指定的,则 pAttachments 中被 renderPass 用作片段着色率附件的每个元素的 layerCount 必须1 或大于任何这些视图掩码中设置的最高有效位的索引。

  • VUID-VkFramebufferCreateInfo-flags-04538
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,且 renderPass 不是使用非零视图掩码指定的,则 pAttachments 中被 renderPass 用作片段着色率附件的每个元素的 layerCount 必须1 或大于 layers

  • VUID-VkFramebufferCreateInfo-flags-04539
    如果 maintenance7 功能未启用,或者 robustFragmentShadingRateAttachmentAccess 限制为 VK_FALSE,或者 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员是使用大于 0 的 VkImageSubresourceRange::baseMipLevel 创建的,则 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,且 pAttachments 中用作片段着色率附件的元素必须具有至少为 width / texelWidth 的宽度,其中 texelWidth 是引用该附件的 VkFragmentShadingRateAttachmentInfoKHRshadingRateAttachmentTexelSize.width 的最大值。

  • VUID-VkFramebufferCreateInfo-flags-04540
    如果 maintenance7 功能未启用,或者 robustFragmentShadingRateAttachmentAccess 限制为 VK_FALSE,或者 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构的 imageView 成员是使用大于 0 的 VkImageSubresourceRange::baseMipLevel 创建的,则 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,且 pAttachments 中用作片段着色率附件的元素必须具有至少为 height / texelHeight 的高度,其中 texelHeight 是引用该附件的 VkFragmentShadingRateAttachmentInfoKHRshadingRateAttachmentTexelSize.height 的最大值。

  • VUID-VkFramebufferCreateInfo-pAttachments-00883
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 的每个元素必须仅指定一个 mip 级别。

  • VUID-VkFramebufferCreateInfo-pAttachments-00884
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 的每个元素必须使用单位混洗创建。

  • VUID-VkFramebufferCreateInfo-width-00885
    width 必须大于 0

  • VUID-VkFramebufferCreateInfo-width-00886
    width 必须小于或等于 maxFramebufferWidth

  • VUID-VkFramebufferCreateInfo-height-00887
    height 必须大于 0

  • VUID-VkFramebufferCreateInfo-height-00888
    height 必须小于或等于 maxFramebufferHeight

  • VUID-VkFramebufferCreateInfo-layers-00889
    layers 必须大于 0

  • VUID-VkFramebufferCreateInfo-layers-00890
    layers 必须小于或等于 maxFramebufferLayers

  • VUID-VkFramebufferCreateInfo-renderPass-02531
    如果 renderPass 指定了非零视图遮罩,则 layers 必须1

  • VUID-VkFramebufferCreateInfo-pAttachments-00891
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 的每个元素(从 3D 图像获取的 2D 或 2D 数组图像视图)必须不是深度/模板格式

  • VUID-VkFramebufferCreateInfo-flags-03189
    如果 imagelessFramebuffer 功能未启用,则 flags 必须不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT

  • VUID-VkFramebufferCreateInfo-flags-03190
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext必须包含 VkFramebufferAttachmentsCreateInfo 结构体

  • VUID-VkFramebufferCreateInfo-flags-03191
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 attachmentImageInfoCount 成员 必须等于零或 attachmentCount

  • VUID-VkFramebufferCreateInfo-flags-04541
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(在 renderPass 中用作输入、颜色、解析或深度/模板附件)的 width 成员 必须大于或等于 width

  • VUID-VkFramebufferCreateInfo-flags-04542
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(在 renderPass 中用作输入、颜色、解析或深度/模板附件)的 height 成员 必须大于或等于 height

  • VUID-VkFramebufferCreateInfo-flags-03196
    If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure in the pNext chain that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass must be greater than or equal to

  • VUID-VkFramebufferCreateInfo-flags-03197
    If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass must be greater than or equal to

  • VUID-VkFramebufferCreateInfo-flags-04543
    如果 maintenance7 功能未启用,或者 robustFragmentShadingRateAttachmentAccess 限制为 VK_FALSE,或者 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构体的 imageView 成员是用 VkImageSubresourceRange::baseMipLevel 大于 0 创建的,并且 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(用作片元着色率附件)的 width 成员 必须大于或等于 width / texelWidth,其中 texelWidth 是引用该附件的 VkFragmentShadingRateAttachmentInfoKHRshadingRateAttachmentTexelSize.width 的最大值

  • VUID-VkFramebufferCreateInfo-flags-04544
    如果 maintenance7 功能未启用,或者 robustFragmentShadingRateAttachmentAccess 限制为 VK_FALSE,或者 VkRenderingFragmentShadingRateAttachmentInfoKHR 结构体的 imageView 成员是用 VkImageSubresourceRange::baseMipLevel 大于 0 创建的,并且 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(用作片元着色率附件)的 height 成员 必须大于或等于 height / texelHeight,其中 texelHeight 是引用该附件的 VkFragmentShadingRateAttachmentInfoKHRshadingRateAttachmentTexelSize.height 的最大值

  • VUID-VkFramebufferCreateInfo-flags-04545
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(用作片元着色率附件)的 layerCount 成员 必须1,或大于或等于 layers

  • VUID-VkFramebufferCreateInfo-flags-04587
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BITrenderPass 指定了非零视图遮罩,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(用作片元着色率附件)的 layerCount 成员 必须1,或大于那些视图遮罩中设置的最高有效位的索引

  • VUID-VkFramebufferCreateInfo-renderPass-03198
    如果为 renderPass 启用了多视图且 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pNext 链中 VkFramebufferAttachmentsCreateInfo 结构体的 pAttachmentImageInfos 成员的任何元素(在 renderPass 中用作输入、颜色、解析或深度/模板附件)的 layerCount 成员 必须大于 renderPass 中使用它的子通道中的视图遮罩中设置的最大位索引

  • VUID-VkFramebufferCreateInfo-renderPass-04546
    如果 renderPass 未启用多视图,且 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为输入、颜色、解析或深度/模板附件在 renderPass 中使用的,作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 layerCount 成员必须大于或等于 layers

  • VUID-VkFramebufferCreateInfo-flags-03201
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为 renderPass 的颜色附件或解析附件使用的,作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 usage 成员必须包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT

  • VUID-VkFramebufferCreateInfo-flags-03202
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为 renderPass 的深度/模板附件使用的,作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 usage 成员必须包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkFramebufferCreateInfo-flags-03203
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为 renderPass 的深度/模板解析附件使用的,作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 usage 成员必须包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkFramebufferCreateInfo-flags-03204
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为 renderPass 的输入附件使用的,作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 usage 成员必须包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkFramebufferCreateInfo-flags-03205
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 pViewFormats 成员的至少一个元素必须等于用于创建 renderPassVkAttachmentDescription::format 的对应值。

  • VUID-VkFramebufferCreateInfo-flags-04113
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 pAttachments 的每个元素必须已使用不等于 VK_IMAGE_VIEW_TYPE_3DVkImageViewCreateInfo::viewType 创建。

  • VUID-VkFramebufferCreateInfo-flags-04548
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则由 renderPass 用作片段着色率附件的 pAttachments 的每个元素必须已使用包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHRusage 值创建。

  • VUID-VkFramebufferCreateInfo-flags-04549
    如果 flags 包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则作为 renderPass 的片段着色率附件使用的,作为输入的 pNext 链中包含的 VkFramebufferAttachmentsCreateInfo 结构的 pAttachmentImageInfos 成员的任何元素的 usage 成员必须包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkFramebufferCreateInfo-samples-06881
    如果为任何子通道启用了多采样渲染到单采样,则该子通道中使用的所有颜色、深度/模板和输入附件(其 VkAttachmentDescription::samplesVkAttachmentDescription2::samples 等于 VK_SAMPLE_COUNT_1_BIT必须已在其 VkImageCreateInfo::flags 中使用 VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT 创建。

  • VUID-VkFramebufferCreateInfo-samples-07009
    如果为任何子通道启用了多采样渲染到单采样,则该子通道中使用的所有颜色、深度/模板和输入附件(其 VkAttachmentDescription::samplesVkAttachmentDescription2::samples 等于 VK_SAMPLE_COUNT_1_BIT)的格式必须支持 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples 中指定的采样计数。

  • VUID-VkFramebufferCreateInfo-nullColorAttachmentWithExternalFormatResolve-09349
    如果 nullColorAttachmentWithExternalFormatResolveVK_FALSE,且 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则 renderPass 中每个子通道的颜色附件(包含外部格式图像作为解析附件)的格式必须具有与 VkAndroidHardwareBufferFormatResolvePropertiesANDROID::colorAttachmentFormat 的值相等的格式,该值由调用 vkGetAndroidHardwareBufferPropertiesANDROID 返回,用于创建用作其解析附件的图像视图的 Android 硬件缓冲区。

  • VUID-VkFramebufferCreateInfo-pAttachments-09350
    如果 flags 不包含 VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,则如果 pAttachments 的某个元素的格式为 VK_FORMAT_UNDEFINED,则该元素必须已使用与 renderPass 中相应的 VkAttachmentDescription2 指定的 VkExternalFormatANDROID::externalFormat 中提供的值相同的 VkExternalFormatANDROID::externalFormat 值创建。

有效使用 (隐式)
  • VUID-VkFramebufferCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO

  • VUID-VkFramebufferCreateInfo-pNext-pNext
    pNext 必须NULL 或指向 VkFramebufferAttachmentsCreateInfo 的有效实例的指针。

  • VUID-VkFramebufferCreateInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkFramebufferCreateInfo-flags-parameter
    flags 必须VkFramebufferCreateFlagBits 值的有效组合。

  • VUID-VkFramebufferCreateInfo-renderPass-parameter
    renderPass 必须是有效的 VkRenderPass 句柄。

  • VUID-VkFramebufferCreateInfo-commonparent
    renderPasspAttachments 中作为有效句柄且未被忽略的参数元素,必须由同一个 VkDevice 创建、分配或检索。

VkFramebufferAttachmentsCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkFramebufferAttachmentsCreateInfo {
    VkStructureType                            sType;
    const void*                                pNext;
    uint32_t                                   attachmentImageInfoCount;
    const VkFramebufferAttachmentImageInfo*    pAttachmentImageInfos;
} VkFramebufferAttachmentsCreateInfo;

或等效的

// Provided by VK_KHR_imageless_framebuffer
typedef VkFramebufferAttachmentsCreateInfo VkFramebufferAttachmentsCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • attachmentImageInfoCount 是所描述的附件的数量。

  • pAttachmentImageInfos 是指向 VkFramebufferAttachmentImageInfo 结构数组的指针,每个结构描述渲染通道实例中相应附件的一些参数。

有效使用 (隐式)
  • VUID-VkFramebufferAttachmentsCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO

  • VUID-VkFramebufferAttachmentsCreateInfo-pAttachmentImageInfos-parameter
    如果 attachmentImageInfoCount 不为 0,则 pAttachmentImageInfos 必须是一个有效的指针,指向一个包含 attachmentImageInfoCount 个有效 VkFramebufferAttachmentImageInfo 结构的数组。

VkFramebufferAttachmentImageInfo 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkFramebufferAttachmentImageInfo {
    VkStructureType       sType;
    const void*           pNext;
    VkImageCreateFlags    flags;
    VkImageUsageFlags     usage;
    uint32_t              width;
    uint32_t              height;
    uint32_t              layerCount;
    uint32_t              viewFormatCount;
    const VkFormat*       pViewFormats;
} VkFramebufferAttachmentImageInfo;

或等效的

// Provided by VK_KHR_imageless_framebuffer
typedef VkFramebufferAttachmentImageInfo VkFramebufferAttachmentImageInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkImageCreateFlagBits 的位掩码,与用于创建将用于此帧缓冲区的图像的 VkImageCreateInfo::flags 的值匹配。

  • usage 是一个 VkImageUsageFlagBits 的位掩码,与用于创建将用于此帧缓冲区的图像的 VkImageCreateInfo::usage 的值匹配。

  • width 是用于渲染的图像视图的宽度。

  • height 是用于渲染的图像视图的高度。

  • layerCount 是用于渲染的图像视图的数组层数。

  • viewFormatCountpViewFormats 数组中的条目数,与用于创建将用于此帧缓冲区的图像的 VkImageFormatListCreateInfo::viewFormatCount 的值匹配。

  • pViewFormats 是指向 VkFormat 值数组的指针,该数组指定创建图像视图时可以使用的所有格式,与用于创建将用于此帧缓冲区的图像的 VkImageFormatListCreateInfo::pViewFormats 的值匹配。

当开始渲染通道时,如 VkRenderPassAttachmentBeginInfo 所指定,可以与帧缓冲区一起使用的图像,必须使用与此处指定的参数相同的参数创建。

有效用法
  • VUID-VkFramebufferAttachmentImageInfo-viewFormatCount-09536
    如果 viewFormatCount 不为 0,并且渲染通道不与外部格式解析附件一起使用,则 pViewFormats 的每个元素必须不是 VK_FORMAT_UNDEFINED

有效使用 (隐式)
  • VUID-VkFramebufferAttachmentImageInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO

  • VUID-VkFramebufferAttachmentImageInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkFramebufferAttachmentImageInfo-flags-parameter
    flags 必须VkImageCreateFlagBits 值的有效组合。

  • VUID-VkFramebufferAttachmentImageInfo-usage-parameter
    usage 必须VkImageUsageFlagBits 值的有效组合。

  • VUID-VkFramebufferAttachmentImageInfo-usage-requiredbitmask
    usage 必须不为 0

  • VUID-VkFramebufferAttachmentImageInfo-pViewFormats-parameter
    如果 viewFormatCount 不为 0,则 pViewFormats 必须是一个有效的指针,指向一个包含 viewFormatCount 个有效 VkFormat 值的数组。

可以在 VkFramebufferCreateInfo::flags 中设置的位,指定帧缓冲区的选项,如下所示:

// Provided by VK_VERSION_1_0
typedef enum VkFramebufferCreateFlagBits {
  // Provided by VK_VERSION_1_2
    VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0x00000001,
  // Provided by VK_KHR_imageless_framebuffer
    VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,
} VkFramebufferCreateFlagBits;
// Provided by VK_VERSION_1_0
typedef VkFlags VkFramebufferCreateFlags;

VkFramebufferCreateFlags 是一种位掩码类型,用于设置零个或多个 VkFramebufferCreateFlagBits 的掩码。

要销毁帧缓冲区,请调用:

// Provided by VK_VERSION_1_0
void vkDestroyFramebuffer(
    VkDevice                                    device,
    VkFramebuffer                               framebuffer,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁帧缓冲区的逻辑设备。

  • framebuffer 是要销毁的帧缓冲区的句柄。

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

有效用法
  • VUID-vkDestroyFramebuffer-framebuffer-00892
    所有引用 framebuffer 的已提交命令必须已完成执行。

  • VUID-vkDestroyFramebuffer-framebuffer-00893
    如果在创建 framebuffer 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调。

  • VUID-vkDestroyFramebuffer-framebuffer-00894
    如果在创建 framebuffer 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyFramebuffer-framebuffer-parameter
    如果 framebuffer 不是 VK_NULL_HANDLE,则 framebuffer 必须是有效的 VkFramebuffer 句柄。

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

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

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

渲染通道加载操作

渲染通道加载操作定义渲染通道实例期间附件的初始值。

对于具有深度/模板格式的附件,加载操作在 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 管线阶段执行。对于具有颜色格式的附件,加载操作在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段执行。附件中每个样本的加载操作发生在任何记录的命令之前,这些命令通过该附件或别名在渲染通道实例中访问该样本。

由于加载操作总是首先发生,因此与附件访问的外部同步只需要将加载操作与之前的命令同步;而不是渲染通道实例中的操作。当使用 VK_ATTACHMENT_LOAD_OP_NONE 时,此规则不适用。

加载操作仅更新渲染通道实例的已定义渲染区域内的值。然而,加载操作(由其访问掩码定义)对给定附件执行的任何写入可能会读取和写回该附件绑定的图像子资源内的任何内存位置。对于深度/模板图像,如果未启用 maintenance7 功能或 separateDepthStencilAttachmentAccessVK_FALSE,则对一个方面的写入可能也会导致对另一个方面执行读-修改-写操作。如果子资源处于 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 布局中,则实现必须不访问渲染区域之外的像素。

由于整个子资源可能被加载操作访问,因此当使用修改值的加载操作时,应用程序无法在渲染通道实例期间安全地访问渲染区域之外的值。

可以用于渲染通道的加载操作是

// Provided by VK_VERSION_1_0
typedef enum VkAttachmentLoadOp {
    VK_ATTACHMENT_LOAD_OP_LOAD = 0,
    VK_ATTACHMENT_LOAD_OP_CLEAR = 1,
    VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2,
  // Provided by VK_VERSION_1_4
    VK_ATTACHMENT_LOAD_OP_NONE = 1000400000,
  // Provided by VK_EXT_load_store_op_none
    VK_ATTACHMENT_LOAD_OP_NONE_EXT = VK_ATTACHMENT_LOAD_OP_NONE,
  // Provided by VK_KHR_load_store_op_none
    VK_ATTACHMENT_LOAD_OP_NONE_KHR = VK_ATTACHMENT_LOAD_OP_NONE,
} VkAttachmentLoadOp;
  • VK_ATTACHMENT_LOAD_OP_LOAD 指定渲染区域内图像的先前内容将保留为初始值。对于具有深度/模板格式的附件,这使用 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT 访问类型。对于具有颜色格式的附件,这使用 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT 访问类型。

  • VK_ATTACHMENT_LOAD_OP_CLEAR 指定渲染区域内的内容将被清除为统一值,该值在开始渲染通道实例时指定。对于具有深度/模板格式的附件,这使用 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 访问类型。对于具有颜色格式的附件,这使用 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 访问类型。

  • VK_ATTACHMENT_LOAD_OP_DONT_CARE 指定不需要保留区域内的先前内容;附件的内容将在渲染区域内是未定义的。对于具有深度/模板格式的附件,这使用 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 访问类型。对于具有颜色格式的附件,这使用 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 访问类型。

  • VK_ATTACHMENT_LOAD_OP_NONE 指定图像的先前内容在渲染通道内是未定义的。由于不访问图像,因此不使用任何访问类型。

在渲染通道实例期间,具有 8、16 或 32 位分量大小的颜色格式的输入和颜色附件必须在整个实例中以附件的格式表示。具有其他浮点或定点颜色格式或具有深度分量的附件可以以精度高于附件格式的格式表示,但必须以相同的范围表示。当通过 loadOp 加载此类分量时,它将被转换为渲染通道使用的特定于实现的格式。此类分量在通过 storeOp 在渲染通道实例结束时解析或存储之前,必须从渲染通道格式转换为附件的格式。转换按照 数值表示和计算定点数据转换 中所述进行。

渲染通道存储操作

渲染通道存储操作定义了渲染通道实例期间写入附件的值如何存储到内存中。

对于具有深度/模板格式的附件,存储操作在 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 管线阶段执行。对于具有颜色格式的附件,存储操作在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段执行。附件中每个样本的存储操作发生在通过该附件或别名访问该样本的任何记录的命令之后。

由于存储操作总是在渲染通道实例中的其他访问之后发生,因此在较早的渲染通道中与附件访问的外部同步只需要与存储操作同步;而不是渲染通道实例中的操作。当使用 VK_ATTACHMENT_STORE_OP_NONE 时,此规则不适用。

存储操作仅更新渲染通道实例的已定义渲染区域内的值。然而,存储操作(由其访问掩码定义)对给定附件执行的任何写入可能会读取和写回该附件绑定的图像子资源内的任何内存位置。对于深度/模板图像,如果 separateDepthStencilAttachmentAccessVK_FALSE,则对一个方面的写入可能也会导致对另一个方面执行读-修改-写操作。如果子资源处于 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 布局中,则实现必须不访问渲染区域之外的像素。

由于整个子资源可能被存储操作访问,因此当使用修改值的存储操作时,应用程序无法在渲染通道实例期间通过别名资源安全地访问渲染区域之外的值。

VkAttachmentDescription::storeOpstencilStoreOp 的可能值,指定如何处理附件的内容,是

// Provided by VK_VERSION_1_0
typedef enum VkAttachmentStoreOp {
    VK_ATTACHMENT_STORE_OP_STORE = 0,
    VK_ATTACHMENT_STORE_OP_DONT_CARE = 1,
  // Provided by VK_VERSION_1_3
    VK_ATTACHMENT_STORE_OP_NONE = 1000301000,
  // Provided by VK_KHR_dynamic_rendering, VK_KHR_load_store_op_none
    VK_ATTACHMENT_STORE_OP_NONE_KHR = VK_ATTACHMENT_STORE_OP_NONE,
  // Provided by VK_QCOM_render_pass_store_ops
    VK_ATTACHMENT_STORE_OP_NONE_QCOM = VK_ATTACHMENT_STORE_OP_NONE,
  // Provided by VK_EXT_load_store_op_none
    VK_ATTACHMENT_STORE_OP_NONE_EXT = VK_ATTACHMENT_STORE_OP_NONE,
} VkAttachmentStoreOp;
  • VK_ATTACHMENT_STORE_OP_STORE 指定在渲染通道期间以及在渲染区域内生成的内容写入到内存中。对于具有深度/模板格式的附件,这使用 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 访问类型。对于具有颜色格式的附件,这使用 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 访问类型。

  • VK_ATTACHMENT_STORE_OP_DONT_CARE 指定在渲染后不需要渲染区域内的内容,并且可能被丢弃;附件的内容将在渲染区域内是未定义的。对于具有深度/模板格式的附件,这使用 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 访问类型。对于具有颜色格式的附件,这使用 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 访问类型。

  • VK_ATTACHMENT_STORE_OP_NONE 指定只要在渲染通道期间不向附件写入任何值,存储操作就不会访问渲染区域内的内容。如果在渲染通道期间写入值,则其行为与 VK_ATTACHMENT_STORE_OP_DONT_CARE 相同,并具有匹配的访问语义。

即使在当前渲染通道期间没有发生对附件的写入,VK_ATTACHMENT_STORE_OP_DONT_CARE 可以导致在到达内存之前丢弃先前渲染通道期间生成的内容。

渲染通道多重采样解析操作

渲染通道多重采样解析操作将多重采样附件中单个像素的样本值组合在一起,并将结果存储到单样本附件中的相应像素。

多重采样附件的解析操作在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段执行。渲染区域中所有像素的最终解析操作发生在任何已记录的命令之后,这些命令通过要解析的多重采样附件或在其指定的子通道中的显式别名写入像素。用于多重采样解析操作的任何单样本附件,一旦渲染通道实例开始渲染,可能在任何时候修改其内容。从多重采样附件的读取可以使用 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT 进行同步。对单样本附件的访问可以使用 VK_ACCESS_COLOR_ATTACHMENT_READ_BITVK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 进行同步。无论附件是颜色附件还是深度/模板附件,都使用这些管线阶段和访问类型。

当使用渲染通道对象时,使用上述管线阶段和访问标志指定的子通道依赖关系将确保与该子通道最后访问的任何附件的多重采样解析操作同步。这允许后续的子通道将解析后的值读取为输入附件。

解析操作仅更新渲染通道实例的定义渲染区域内的值。但是,解析操作(由其访问掩码定义)对给定附件执行的任何写入操作可能读取并写回该附件绑定的图像子资源内的任何内存位置。对于深度/模板图像,如果 separateDepthStencilAttachmentAccessVK_FALSE,则对一个方面的写入操作可能还会导致对另一个方面的读-修改-写操作。如果子资源处于 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 布局中,则实现必须不访问渲染区域之外的像素。

由于整个子资源可能被多重采样解析操作访问,因此当执行多重采样解析操作时,应用程序无法在渲染通道实例期间安全地通过别名资源访问渲染区域之外的值。

多重采样附件中的多重采样值会根据所使用的解析模式进行组合

// Provided by VK_VERSION_1_2
typedef enum VkResolveModeFlagBits {
    VK_RESOLVE_MODE_NONE = 0,
    VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0x00000001,
    VK_RESOLVE_MODE_AVERAGE_BIT = 0x00000002,
    VK_RESOLVE_MODE_MIN_BIT = 0x00000004,
    VK_RESOLVE_MODE_MAX_BIT = 0x00000008,
  // Provided by VK_ANDROID_external_format_resolve with VK_KHR_dynamic_rendering or VK_VERSION_1_3
    VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID = 0x00000010,
  // Provided by VK_KHR_depth_stencil_resolve
    VK_RESOLVE_MODE_NONE_KHR = VK_RESOLVE_MODE_NONE,
  // Provided by VK_KHR_depth_stencil_resolve
    VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
  // Provided by VK_KHR_depth_stencil_resolve
    VK_RESOLVE_MODE_AVERAGE_BIT_KHR = VK_RESOLVE_MODE_AVERAGE_BIT,
  // Provided by VK_KHR_depth_stencil_resolve
    VK_RESOLVE_MODE_MIN_BIT_KHR = VK_RESOLVE_MODE_MIN_BIT,
  // Provided by VK_KHR_depth_stencil_resolve
    VK_RESOLVE_MODE_MAX_BIT_KHR = VK_RESOLVE_MODE_MAX_BIT,
} VkResolveModeFlagBits;

或等效的

// Provided by VK_KHR_depth_stencil_resolve
typedef VkResolveModeFlagBits VkResolveModeFlagBitsKHR;
  • VK_RESOLVE_MODE_NONE 指定不进行解析操作。

  • VK_RESOLVE_MODE_SAMPLE_ZERO_BIT 指定解析操作的结果等于样本 0 的值。

  • VK_RESOLVE_MODE_AVERAGE_BIT 指定解析操作的结果是样本值的平均值。

  • VK_RESOLVE_MODE_MIN_BIT 指定解析操作的结果是样本值的最小值。

  • VK_RESOLVE_MODE_MAX_BIT 指定解析操作的结果是样本值的最大值。

  • VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 指定不是多重采样解析,而是将单个采样的颜色附件下采样为外部 Android 格式指定的 Y′CBCR 格式图像。与其他解析模式不同,实现可以在渲染期间多次解析,甚至完全绕过写入颜色附件的操作,只要最终值被解析到解析附件即可。颜色附件的 GBR 通道中的值将分别写入外部格式图像的 YCBCR 通道。色度值的计算方式就好像使用线性滤波器以全速率从颜色附件采样,采样位置根据 VkPhysicalDeviceExternalFormatResolvePropertiesANDROID::chromaOffsetXVkPhysicalDeviceExternalFormatResolvePropertiesANDROID::chromaOffsetY 和解析图像的色度采样率确定。

如果没有另外指定解析模式,则使用 VK_RESOLVE_MODE_AVERAGE_BIT

VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 不执行范围压缩或 Y′CBCR 模型转换;应用程序必须自行进行这些转换。预期输出值与通过 使用 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY 的 Y′CBCR 采样器读取的值匹配。这些值应处的颜色空间由平台定义,不会通过 Vulkan 暴露。

// Provided by VK_VERSION_1_2
typedef VkFlags VkResolveModeFlags;

或等效的

// Provided by VK_KHR_depth_stencil_resolve
typedef VkResolveModeFlags VkResolveModeFlagsKHR;

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

渲染通道命令

应用程序通过开始一个渲染通道实例,迭代子通道以记录该子通道的命令,然后结束渲染通道实例,来一次记录一个子通道的渲染通道实例命令。

要开始渲染通道实例,请调用

// Provided by VK_VERSION_1_0
void vkCmdBeginRenderPass(
    VkCommandBuffer                             commandBuffer,
    const VkRenderPassBeginInfo*                pRenderPassBegin,
    VkSubpassContents                           contents);
  • commandBuffer 是在其中记录命令的命令缓冲区。

  • pRenderPassBegin 是一个指向 VkRenderPassBeginInfo 结构的指针,该结构指定要开始实例的渲染通道,以及该实例使用的帧缓冲。

  • contents 是一个 VkSubpassContents 值,指定如何提供第一个子通道中的命令。

开始渲染通道实例后,命令缓冲区已准备好记录该渲染通道的第一个子通道的命令。

有效用法
  • VUID-vkCmdBeginRenderPass-initialLayout-00895
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescription 结构的任何 initialLayoutfinalLayout 成员或 VkAttachmentReference 结构的 layout 成员为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-01758
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescription 结构的任何 initialLayoutfinalLayout 成员或 VkAttachmentReference 结构的 layout 成员为 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-02842
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescription 结构的任何 initialLayoutfinalLayout 成员或 VkAttachmentReference 结构的 layout 成员为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-stencilInitialLayout-02843
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescriptionStencilLayout 结构的任何 stencilInitialLayoutstencilFinalLayout 成员或 VkAttachmentReferenceStencilLayout 结构的 stencilLayout 成员为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-00897
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-00898
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_TRANSFER_SRC_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-00899
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_TRANSFER_DST_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-00900
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,任何 VkAttachmentDescription 结构的 initialLayout 成员不是 VK_IMAGE_LAYOUT_UNDEFINED,则每个这样的 initialLayout 必须等于 pRenderPassBeginframebuffer 成员中指定的相应附件图像子资源的当前布局。

  • VUID-vkCmdBeginRenderPass-srcStageMask-06451
    用于创建 renderPassVkRenderPassCreateInfopDependencies 成员中任何元素的 srcStageMask 成员必须受用于创建 commandBuffer 所分配的命令缓冲池的 VkCommandPoolCreateInfoqueueFamilyIndex 成员标识的队列族的 capabilities 支持。

  • VUID-vkCmdBeginRenderPass-dstStageMask-06452
    用于创建 renderPassVkRenderPassCreateInfopDependencies 成员中任何元素的 dstStageMask 成员必须受用于创建 commandBuffer 所分配的命令缓冲池的 VkCommandPoolCreateInfoqueueFamilyIndex 成员标识的队列族的 capabilities 支持。

  • VUID-vkCmdBeginRenderPass-framebuffer-02532
    对于 framebuffer 中被 renderPass 使用,并且绑定到也绑定到 renderPass 使用的另一个附件的内存位置的任何附件,如果至少有一个使用会导致写入其中一个附件,则这两个附件必须都设置了 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT

  • VUID-vkCmdBeginRenderPass-framebuffer-09045
    如果 framebuffer 中指定的任何附件被 renderPass 使用并且绑定到重叠的内存位置,则在任何子通道中,必须只有一个附件用作颜色附件、深度/模板或解析附件。

  • VUID-vkCmdBeginRenderPass-initialLayout-07000
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 以及 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT 使用位之一的 usage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-07001
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用 VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 使用位的 usage 值创建。

  • VUID-vkCmdBeginRenderPass-initialLayout-09537
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_STORAGE_BIT,或者 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 两者之一的 usage 值创建。

  • VUID-vkCmdBeginRenderPass-contents-09640
    如果 contentsVK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR,则必须启用以下功能中的至少一项:

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

  • VUID-vkCmdBeginRenderPass-pRenderPassBegin-parameter
    pRenderPassBegin 必须是指向有效的 VkRenderPassBeginInfo 结构的有效指针。

  • VUID-vkCmdBeginRenderPass-contents-parameter
    contents 必须是一个有效的 VkSubpassContents 值。

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

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

  • VUID-vkCmdBeginRenderPass-renderpass
    此命令必须仅在渲染过程实例之外调用。

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

  • VUID-vkCmdBeginRenderPass-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

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

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

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

主要

外部

外部

图形

操作
状态
同步

或者,要开始渲染通道,请调用

// Provided by VK_VERSION_1_2
void vkCmdBeginRenderPass2(
    VkCommandBuffer                             commandBuffer,
    const VkRenderPassBeginInfo*                pRenderPassBegin,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo);

或等效命令

// Provided by VK_KHR_create_renderpass2
void vkCmdBeginRenderPass2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkRenderPassBeginInfo*                pRenderPassBegin,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo);
  • commandBuffer 是在其中记录命令的命令缓冲区。

  • pRenderPassBegin 是一个指向 VkRenderPassBeginInfo 结构的指针,该结构指定要开始实例的渲染通道,以及该实例使用的帧缓冲。

  • pSubpassBeginInfo 是指向 VkSubpassBeginInfo 结构的指针,其中包含有关即将开始渲染的子通道的信息。

开始渲染通道实例后,命令缓冲区已准备好记录该渲染通道的第一个子通道的命令。

有效用法
  • VUID-vkCmdBeginRenderPass2-framebuffer-02779
    pRenderPassBeginframebufferrenderPass 成员必须在分配 commandBuffer 的同一个 VkDevice 上创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-03094
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescription 结构的任何 initialLayoutfinalLayout 成员或 VkAttachmentReference 结构的 layout 成员为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-03096
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescription 结构的任何 initialLayoutfinalLayout 成员或 VkAttachmentReference 结构的 layout 成员为 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-02844
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescription 结构的任何 initialLayoutfinalLayout 成员或 VkAttachmentReference 结构的 layout 成员为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-stencilInitialLayout-02845
    如果在 pRenderPassBeginrenderPass 成员中指定的渲染通道创建时,VkAttachmentDescriptionStencilLayout 结构的任何 stencilInitialLayoutstencilFinalLayout 成员或 VkAttachmentReferenceStencilLayout 结构的 stencilLayout 成员为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的帧缓冲的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-03097
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-03098
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_TRANSFER_SRC_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-03099
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_TRANSFER_DST_BITusage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-03100
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,任何 VkAttachmentDescription 结构的 initialLayout 成员不是 VK_IMAGE_LAYOUT_UNDEFINED,则每个这样的 initialLayout 必须等于 pRenderPassBeginframebuffer 成员中指定的相应附件图像子资源的当前布局。

  • VUID-vkCmdBeginRenderPass2-srcStageMask-06453
    用于创建 renderPassVkRenderPassCreateInfopDependencies 成员中任何元素的 srcStageMask 成员必须受用于创建 commandBuffer 所分配的命令缓冲池的 VkCommandPoolCreateInfoqueueFamilyIndex 成员标识的队列族的 capabilities 支持。

  • VUID-vkCmdBeginRenderPass2-dstStageMask-06454
    用于创建 renderPassVkRenderPassCreateInfopDependencies 成员中任何元素的 dstStageMask 成员必须受用于创建 commandBuffer 所分配的命令缓冲池的 VkCommandPoolCreateInfoqueueFamilyIndex 成员标识的队列族的 capabilities 支持。

  • VUID-vkCmdBeginRenderPass2-framebuffer-02533
    对于 framebuffer 中被 renderPass 使用,并且绑定到也绑定到 renderPass 使用的另一个附件的内存位置的任何附件,如果至少有一个使用会导致写入其中一个附件,则这两个附件必须都设置了 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT

  • VUID-vkCmdBeginRenderPass2-framebuffer-09046
    如果 framebuffer 中指定的任何附件被 renderPass 使用并且绑定到重叠的内存位置,则在任何子通道中,必须只有一个附件用作颜色附件、深度/模板或解析附件。

  • VUID-vkCmdBeginRenderPass2-initialLayout-07002
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 以及 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT 使用位之一的 usage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-07003
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用 VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 使用位的 usage 值创建。

  • VUID-vkCmdBeginRenderPass2-initialLayout-09538
    如果在创建 pRenderPassBegin 成员中指定的渲染通道时,VkAttachmentDescription 结构的 initialLayoutfinalLayout 成员,或者 VkAttachmentReference 结构的 layout 成员指定为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,则 pRenderPassBeginframebuffer 成员中指定的相应附件图像视图必须已使用包含 VK_IMAGE_USAGE_STORAGE_BIT,或者 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 两者之一的 usage 值创建。

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

  • VUID-vkCmdBeginRenderPass2-pRenderPassBegin-parameter
    pRenderPassBegin 必须是指向有效的 VkRenderPassBeginInfo 结构的有效指针。

  • VUID-vkCmdBeginRenderPass2-pSubpassBeginInfo-parameter
    pSubpassBeginInfo 必须是指向有效 VkSubpassBeginInfo 结构的有效指针。

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

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

  • VUID-vkCmdBeginRenderPass2-renderpass
    此命令必须仅在渲染过程实例之外调用。

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

  • VUID-vkCmdBeginRenderPass2-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

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

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

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

主要

外部

外部

图形

操作
状态
同步

VkRenderPassBeginInfo 结构的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkRenderPassBeginInfo {
    VkStructureType        sType;
    const void*            pNext;
    VkRenderPass           renderPass;
    VkFramebuffer          framebuffer;
    VkRect2D               renderArea;
    uint32_t               clearValueCount;
    const VkClearValue*    pClearValues;
} VkRenderPassBeginInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • renderPass 是要开始实例化的渲染通道。

  • framebuffer 是包含用于渲染通道的附件的帧缓冲。

  • renderArea 是受渲染通道实例影响的渲染区域,将在下面详细描述。

  • clearValueCountpClearValues 中元素的数量。

  • pClearValues 是指向一个包含 clearValueCountVkClearValue 结构的数组的指针,该数组包含每个附件的清除值,如果附件使用了 loadOp 值为 VK_ATTACHMENT_LOAD_OP_CLEAR,或者如果附件具有深度/模板格式并使用 stencilLoadOp 值为 VK_ATTACHMENT_LOAD_OP_CLEAR。数组的索引是附件编号。只使用与清除的附件相对应的元素。pClearValues 的其他元素将被忽略。

renderArea 是受渲染通道实例影响的渲染区域。附件的加载、存储和多重采样解析操作的效果仅限于所有附件上 x 和 y 坐标落在渲染区域内的像素。渲染区域扩展到 framebuffer 的所有层。应用程序必须确保(必要时使用裁剪)所有渲染都包含在渲染区域内。在应用 VkRenderPassTransformBeginInfoQCOM::transform 指定的任何变换之后,渲染区域必须包含在帧缓冲的尺寸内。

如果启用了 渲染通道变换,则 renderArea 必须等于帧缓冲的预变换尺寸。在 renderAreaVkRenderPassTransformBeginInfoQCOM::transform 变换之后,结果渲染区域必须等于帧缓冲的尺寸。

如果在 renderPass 中启用了多视图,并且启用了 multiviewPerViewRenderAreas 功能,并且在 pNext 链中包含了一个 perViewRenderAreaCount 不等于 0VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM 实例,则 VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM::pPerViewRenderAreas 的元素将覆盖 renderArea 并为每个视图定义一个渲染区域。在这种情况下,renderArea 必须是至少与所有每个视图的渲染区域的并集一样大的区域。

如果启用了 subpassShading 功能,则 renderArea 必须等于帧缓冲的尺寸。

对于使用小于帧缓冲的渲染区域,除非它与渲染通道的渲染区域粒度匹配,否则可能存在性能成本。

有效用法
有效使用 (隐式)

深度/模板附件的深度方面的图像布局(指使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的图像)取决于最后用于渲染图像子资源的采样位置。因此,为了在子通道边界之间保留此类深度/模板附件的内容,应用程序需要在附件的布局转换可能发生时指定这些采样位置。此信息可以通过将 VkRenderPassSampleLocationsBeginInfoEXT 结构添加到 VkRenderPassBeginInfopNext 链中来提供。

VkRenderPassSampleLocationsBeginInfoEXT 结构的定义如下:

// Provided by VK_EXT_sample_locations
typedef struct VkRenderPassSampleLocationsBeginInfoEXT {
    VkStructureType                          sType;
    const void*                              pNext;
    uint32_t                                 attachmentInitialSampleLocationsCount;
    const VkAttachmentSampleLocationsEXT*    pAttachmentInitialSampleLocations;
    uint32_t                                 postSubpassSampleLocationsCount;
    const VkSubpassSampleLocationsEXT*       pPostSubpassSampleLocations;
} VkRenderPassSampleLocationsBeginInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • attachmentInitialSampleLocationsCountpAttachmentInitialSampleLocations 数组中的元素数量。

  • pAttachmentInitialSampleLocations 是指向 attachmentInitialSampleLocationsCountVkAttachmentSampleLocationsEXT 结构的数组的指针,这些结构指定了附件的索引及其对应的采样位置状态。 pAttachmentInitialSampleLocations 的每个元素可以指定在执行自动布局转换时使用的采样位置状态,以便将深度/模板附件从附件的初始布局转换为使用该附件的第一个子通道中为该附件指定的图像布局。

  • postSubpassSampleLocationsCountpPostSubpassSampleLocations 数组中的元素数量。

  • pPostSubpassSampleLocations 是指向 postSubpassSampleLocationsCountVkSubpassSampleLocationsEXT 结构的数组的指针,这些结构指定了子通道的索引及其对应的采样位置状态。 pPostSubpassSampleLocations 的每个元素可以指定在执行自动布局转换时使用的采样位置状态,以便将指定子通道使用的深度/模板附件转换为依赖子通道中指定的图像布局,或者如果指定的子通道是使用该附件的最后一个子通道,则转换为该附件的最终布局。此外,如果 VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocationsVK_FALSE,则 pPostSubpassSampleLocations 的每个元素必须指定与在指定子通道期间将绑定到命令缓冲区的所有管道使用的采样位置匹配的采样位置状态。 如果 variableSampleLocationsVK_TRUE,则用于光栅化的采样位置不依赖于 pPostSubpassSampleLocations

有效使用 (隐式)
  • VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT

  • VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter
    如果 attachmentInitialSampleLocationsCount 不为 0,则 pAttachmentInitialSampleLocations 必须是指向 attachmentInitialSampleLocationsCount 个有效的 VkAttachmentSampleLocationsEXT 结构数组的有效指针

  • VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter
    如果 postSubpassSampleLocationsCount 不为 0,则 pPostSubpassSampleLocations 必须是指向 postSubpassSampleLocationsCount 个有效的 VkSubpassSampleLocationsEXT 结构数组的有效指针

VkAttachmentSampleLocationsEXT 结构的定义如下:

// Provided by VK_EXT_sample_locations
typedef struct VkAttachmentSampleLocationsEXT {
    uint32_t                    attachmentIndex;
    VkSampleLocationsInfoEXT    sampleLocationsInfo;
} VkAttachmentSampleLocationsEXT;
  • attachmentIndex 是提供采样位置状态的附件的索引。

  • sampleLocationsInfo 是用于给定附件的布局转换的采样位置状态,该转换从附件的初始布局到使用它的第一个子通道中为该附件指定的图像布局。

如果索引为 attachmentIndex 的帧缓冲区附件引用的图像不是使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的,则会忽略 sampleLocationsInfo 中指定的值。

有效用法
有效使用 (隐式)
  • VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter
    sampleLocationsInfo 必须是一个有效的 VkSampleLocationsInfoEXT 结构

VkSubpassSampleLocationsEXT 结构的定义如下:

// Provided by VK_EXT_sample_locations
typedef struct VkSubpassSampleLocationsEXT {
    uint32_t                    subpassIndex;
    VkSampleLocationsInfoEXT    sampleLocationsInfo;
} VkSubpassSampleLocationsEXT;
  • subpassIndex 是提供采样位置状态的子通道的索引。

  • sampleLocationsInfo 是用于深度/模板附件的布局转换的采样位置状态,该转换从在 subpassIndex 中指定的子通道中使用的图像布局移开。

如果由 subpassIndex 标识的子通道中使用的深度/模板附件引用的图像不是使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的,或者如果子通道不使用深度/模板附件,并且 VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocationsVK_TRUE,则会忽略 sampleLocationsInfo 中指定的值。

有效用法
有效使用 (隐式)
  • VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter
    sampleLocationsInfo 必须是一个有效的 VkSampleLocationsInfoEXT 结构

要开始启用 渲染通道变换 的渲染通道实例,请将 VkRenderPassTransformBeginInfoQCOM 添加到传递给 vkCmdBeginRenderPass 命令的 VkRenderPassBeginInfo 结构的 pNext 链中,以指定渲染通道变换。

VkRenderPassTransformBeginInfoQCOM 结构的定义如下:

// Provided by VK_QCOM_render_pass_transform
typedef struct VkRenderPassTransformBeginInfoQCOM {
    VkStructureType                  sType;
    void*                            pNext;
    VkSurfaceTransformFlagBitsKHR    transform;
} VkRenderPassTransformBeginInfoQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • transform 是一个 VkSurfaceTransformFlagBitsKHR 值,描述要应用于光栅化的变换。

有效用法
  • VUID-VkRenderPassTransformBeginInfoQCOM-transform-02871
    transform 必须VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR

  • VUID-VkRenderPassTransformBeginInfoQCOM-flags-02872
    必须使用包含 VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOMVkRenderPassCreateInfo::flags 创建 renderpass

有效使用 (隐式)
  • VUID-VkRenderPassTransformBeginInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM

VkSubpassBeginInfo 结构的定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkSubpassBeginInfo {
    VkStructureType      sType;
    const void*          pNext;
    VkSubpassContents    contents;
} VkSubpassBeginInfo;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkSubpassBeginInfo VkSubpassBeginInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • contents 是一个 VkSubpassContents 值,指定如何在下一个子通道中提供命令。

有效用法
  • VUID-VkSubpassBeginInfo-contents-09382
    如果 contentsVK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR,则必须启用以下功能中的至少一项:

有效使用 (隐式)
  • VUID-VkSubpassBeginInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO

  • VUID-VkSubpassBeginInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkSubpassBeginInfo-contents-parameter
    contents 必须是一个有效的 VkSubpassContents 值。

vkCmdBeginRenderPass::contents 的可能值(指定如何在第一个子通道中提供命令)如下:

// Provided by VK_VERSION_1_0
typedef enum VkSubpassContents {
    VK_SUBPASS_CONTENTS_INLINE = 0,
    VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1,
  // Provided by VK_KHR_maintenance7
    VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR = 1000451000,
  // Provided by VK_EXT_nested_command_buffer
    VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_EXT = VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR,
} VkSubpassContents;
  • VK_SUBPASS_CONTENTS_INLINE 指定子通道的内容将以内联方式记录在主命令缓冲区中,并且不得在子通道内执行辅助命令缓冲区。

  • VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS 指定内容记录在二级命令缓冲区中,这些二级命令缓冲区将从主命令缓冲区中调用,并且在执行 vkCmdNextSubpassvkCmdEndRenderPass 之前,vkCmdExecuteCommands 是命令缓冲区中唯一有效的命令。

  • VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR 指定子通道的内容可以内联记录,也可以通过 vkCmdExecuteCommands 从该命令缓冲区执行的二级命令缓冲区中记录。

如果 VkRenderPassBeginInfoVkRenderingInfopNext 链包含 VkDeviceGroupRenderPassBeginInfo 结构,则该结构包含渲染通道实例的设备掩码和渲染区域集合。

VkDeviceGroupRenderPassBeginInfo 结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkDeviceGroupRenderPassBeginInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           deviceMask;
    uint32_t           deviceRenderAreaCount;
    const VkRect2D*    pDeviceRenderAreas;
} VkDeviceGroupRenderPassBeginInfo;

或等效的

// Provided by VK_KHR_device_group
typedef VkDeviceGroupRenderPassBeginInfo VkDeviceGroupRenderPassBeginInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • deviceMask 是渲染通道实例的设备掩码。

  • deviceRenderAreaCountpDeviceRenderAreas 数组中的元素数量。

  • pDeviceRenderAreas 是指向 VkRect2D 结构数组的指针,这些结构定义了每个物理设备的渲染区域。

deviceMask 有几个用途。它是渲染通道实例期间可以使用的物理设备集合的上限,也是渲染通道实例开始时的初始设备掩码。此外,过渡到渲染通道实例中的下一个子通道的命令和结束渲染通道实例的命令,以及相应的渲染通道加载存储多重采样解析操作以及与渲染通道实例对应的子通道依赖关系,都在此处提供的设备掩码中包含的物理设备上执行。

如果 deviceRenderAreaCount 不为零,则 pDeviceRenderAreas 的元素将覆盖 VkRenderPassBeginInfo::renderArea 的值,并为每个物理设备提供特定的渲染区域。这些渲染区域与 VkRenderPassBeginInfo::renderArea 的作用相同,包括控制由 VK_ATTACHMENT_LOAD_OP_CLEAR 清除和解析为解析附件的附件区域。

如果此结构不存在,则渲染通道实例的设备掩码为 VkDeviceGroupCommandBufferBeginInfo::deviceMask 的值。如果此结构不存在或 deviceRenderAreaCount 为零,则所有物理设备都使用 VkRenderPassBeginInfo::renderArea

有效用法
  • VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905
    deviceMask 必须是有效的设备掩码值

  • VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906
    deviceMask 不得为零

  • VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907
    deviceMask 必须是命令缓冲区初始设备掩码的子集

  • VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908
    deviceRenderAreaCount 必须为零或等于逻辑设备中物理设备的数量

  • VUID-VkDeviceGroupRenderPassBeginInfo-offset-06166
    pDeviceRenderAreas 的任何元素的 offset.x 成员必须大于或等于 0

  • VUID-VkDeviceGroupRenderPassBeginInfo-offset-06167
    pDeviceRenderAreas 的任何元素的 offset.y 成员必须大于或等于 0

  • VUID-VkDeviceGroupRenderPassBeginInfo-offset-06168
    pDeviceRenderAreas 的任何元素的 offset.xextent.width 成员的总和必须小于或等于 maxFramebufferWidth

  • VUID-VkDeviceGroupRenderPassBeginInfo-offset-06169
    pDeviceRenderAreas 的任何元素的 offset.yextent.height 成员的总和必须小于或等于 maxFramebufferHeight

  • VUID-VkDeviceGroupRenderPassBeginInfo-extent-08998
    pDeviceRenderAreas 的任何元素的 extent.width 成员必须大于 0

  • VUID-VkDeviceGroupRenderPassBeginInfo-extent-08999
    pDeviceRenderAreas 的任何元素的 extent.height 成员必须大于 0

有效使用 (隐式)
  • VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO

  • VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter
    如果 deviceRenderAreaCount 不为 0,则 pDeviceRenderAreas 必须是指向 deviceRenderAreaCountVkRect2D 结构数组的有效指针

VkRenderPassAttachmentBeginInfo 结构的定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkRenderPassAttachmentBeginInfo {
    VkStructureType       sType;
    const void*           pNext;
    uint32_t              attachmentCount;
    const VkImageView*    pAttachments;
} VkRenderPassAttachmentBeginInfo;

或等效的

// Provided by VK_KHR_imageless_framebuffer
typedef VkRenderPassAttachmentBeginInfo VkRenderPassAttachmentBeginInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • attachmentCount 是附件的数量。

  • pAttachments 是指向 VkImageView 句柄数组的指针,每个句柄都将在渲染通道实例中用作相应的附件。

有效用法
  • VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03218
    pAttachments 的每个元素必须仅指定一个 mip 级别

  • VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03219
    pAttachments 的每个元素必须使用 恒等置换 创建

  • VUID-VkRenderPassAttachmentBeginInfo-pAttachments-04114
    pAttachments 的每个元素必须使用 VkImageViewCreateInfo::viewType 创建,且该值不等于 VK_IMAGE_VIEW_TYPE_3D

  • VUID-VkRenderPassAttachmentBeginInfo-pAttachments-07010
    如果为任何子通道启用了多重采样渲染到单采样,则 pAttachments 中所有采样计数等于 VK_SAMPLE_COUNT_1_BIT 的元素必须具有支持 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples 中指定的采样计数的格式

有效使用 (隐式)
  • VUID-VkRenderPassAttachmentBeginInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO

  • VUID-VkRenderPassAttachmentBeginInfo-pAttachments-parameter
    如果 attachmentCount 不为 0,则 pAttachments 必须是指向 attachmentCount 个有效的 VkImageView 句柄数组的有效指针

如果渲染通道实例启用了多视口,并且启用了multiviewPerViewRenderAreas 特性,则可以将 VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM 结构包含在 VkRenderPassBeginInfoVkRenderingInfopNext 链中

VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM 结构的定义如下:

// Provided by VK_QCOM_multiview_per_view_render_areas
typedef struct VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           perViewRenderAreaCount;
    const VkRect2D*    pPerViewRenderAreas;
} VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • perViewRenderAreaCountpPerViewRenderAreas 数组中的元素数量。

  • pPerViewRenderAreas 是一个指向 VkRect2D 结构体数组的指针,该数组定义了每个视图的渲染区域。

如果 perViewRenderAreaCount 不为零,则 pPerViewRenderAreas 的元素会覆盖 VkRenderPassBeginInfo::renderAreaVkRenderingInfo::renderArea 的值,并为多视图渲染通道的各个视图定义每个视图的渲染区域。视图索引为 i 的视图的渲染区域由 pPerViewRenderAreas[i] 指定。

每个视图的渲染区域定义了附件的每个视图区域,这些区域会根据渲染通道实例的 loadOpstoreOpresolveMode 值进行加载、存储和解析。定义每个视图的渲染区域时,VkRenderPassBeginInfo::renderAreaVkRenderingInfo::renderArea 的值必须是一个包含所有每个视图渲染区域的并集的渲染区域,可能会被实现用于优化,但不会影响加载、存储或解析。

如果存在此结构体,且 perViewRenderAreaCount 不为零,则 perViewRenderAreaCount 必须至少比 VkRenderPassMultiviewCreateInfo::pViewMasksVkRenderingInfo::viewMask 的任何元素中设置的最高有效位大一。

如果此结构体不存在或 perViewRenderAreaCount 为零,则 VkRenderPassBeginInfo::renderAreaVkRenderingInfo::renderArea 将用于所有视图。

有效用法
  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-offset-07861
    pPerViewRenderAreas 的任何元素的 offset.x 成员必须大于或等于 0

  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-offset-07862
    pPerViewRenderAreas 的任何元素的 offset.y 成员必须大于或等于 0

  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-offset-07863
    pPerViewRenderAreas 的任何元素的 offset.xextent.width 成员的总和必须小于或等于 maxFramebufferWidth

  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-offset-07864
    pPerViewRenderAreas 的任何元素的 offset.yextent.height 成员的总和必须小于或等于 maxFramebufferHeight

  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-pNext-07865
    如果此结构体位于 VkRenderPassBeginInfopNext 链中,并且如果渲染通道对象在 VkRenderPassMultiviewCreateInfo::pViewMasks 中包含设置了位 n 的元素,则 perViewRenderAreaCount 必须至少等于 n+1

  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-pNext-07866
    如果此结构体位于 VkRenderingInfopNext 链中,并且如果 VkRenderingInfo::viewMask 设置了位 n,则 perViewRenderAreaCount 必须至少等于 n+1

有效使用 (隐式)
  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM

  • VUID-VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM-pPerViewRenderAreas-parameter
    如果 perViewRenderAreaCount 不为 0,则 pPerViewRenderAreas 必须是一个指向 perViewRenderAreaCountVkRect2D 结构体数组的有效指针

要查询渲染区域粒度,请调用

// Provided by VK_VERSION_1_0
void vkGetRenderAreaGranularity(
    VkDevice                                    device,
    VkRenderPass                                renderPass,
    VkExtent2D*                                 pGranularity);
  • device 是拥有渲染通道的逻辑设备。

  • renderPass 是渲染通道的句柄。

  • pGranularity 是指向 VkExtent2D 结构的指针,其中返回粒度。

导致最佳 renderArea 的条件是

  • renderArea 中的 offset.x 成员是返回的 VkExtent2Dwidth 成员(水平粒度)的倍数。

  • renderArea 中的 offset.y 成员是返回的 VkExtent2Dheight 成员(垂直粒度)的倍数。

  • renderArea 中的 extent.width 成员是水平粒度的倍数,或者 offset.x+extent.width 等于 VkRenderPassBeginInfoframebufferwidth

  • renderArea 中的 extent.height 成员是垂直粒度的倍数,或者 offset.y+extent.height 等于 VkRenderPassBeginInfoframebufferheight

子通道依赖项不受渲染区域的影响,并且适用于附加到帧缓冲区的整个图像子资源,如 自动布局转换 的描述中所指定。同样,即使管线屏障的效果扩展到渲染区域之外,它们也是有效的。

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

  • VUID-vkGetRenderAreaGranularity-renderPass-parameter
    renderPass 必须是有效的 VkRenderPass 句柄。

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

  • VUID-vkGetRenderAreaGranularity-renderPass-parent
    renderPass 必须已从 device 创建、分配或检索。

要在记录子通道命令后过渡到渲染通道实例中的下一个子通道,请调用

// Provided by VK_VERSION_1_0
void vkCmdNextSubpass(
    VkCommandBuffer                             commandBuffer,
    VkSubpassContents                           contents);
  • commandBuffer 是在其中记录命令的命令缓冲区。

  • contents 指定下一个子通道中的命令的提供方式,与 vkCmdBeginRenderPass 的相应参数方式相同。

当记录 vkCmdBeginRenderPass 时,渲染通道的子通道索引从零开始,并且每次记录 vkCmdNextSubpass 时都会递增。

在过渡到下一个子通道后,应用程序可以记录该子通道的命令。

有效用法
  • VUID-vkCmdNextSubpass-None-00909
    当前子通道索引必须小于渲染通道中子通道的数量减一

  • VUID-vkCmdNextSubpass-None-02349
    当变换反馈处于活动状态时,必须不记录此命令

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

  • VUID-vkCmdNextSubpass-contents-parameter
    contents 必须是一个有效的 VkSubpassContents 值。

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

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

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

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

  • VUID-vkCmdNextSubpass-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

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

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

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

主要

内部

外部

图形

操作
状态
同步

要在记录子通道命令后过渡到渲染通道实例中的下一个子通道,请调用

// Provided by VK_VERSION_1_2
void vkCmdNextSubpass2(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo,
    const VkSubpassEndInfo*                     pSubpassEndInfo);

或等效命令

// Provided by VK_KHR_create_renderpass2
void vkCmdNextSubpass2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo,
    const VkSubpassEndInfo*                     pSubpassEndInfo);
  • commandBuffer 是在其中记录命令的命令缓冲区。

  • pSubpassBeginInfo 是指向 VkSubpassBeginInfo 结构的指针,其中包含有关即将开始渲染的子通道的信息。

  • pSubpassEndInfo 是一个指向 VkSubpassEndInfo 结构的指针,其中包含有关如何结束上一个子通道的信息。

vkCmdNextSubpass2 在语义上与 vkCmdNextSubpass 相同,不同之处在于它是可扩展的,并且 contents 是作为可扩展结构的一部分而不是作为平面参数提供的。

有效用法
  • VUID-vkCmdNextSubpass2-None-03102
    当前子通道索引必须小于渲染通道中子通道的数量减一

  • VUID-vkCmdNextSubpass2-None-02350
    当变换反馈处于活动状态时,必须不记录此命令

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

  • VUID-vkCmdNextSubpass2-pSubpassBeginInfo-parameter
    pSubpassBeginInfo 必须是指向有效 VkSubpassBeginInfo 结构的有效指针。

  • VUID-vkCmdNextSubpass2-pSubpassEndInfo-parameter
    pSubpassEndInfo 必须是指向有效 VkSubpassEndInfo 结构的有效指针

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

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

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

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

  • VUID-vkCmdNextSubpass2-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

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

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

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

主要

内部

外部

图形

操作
状态
同步

要在记录最后一个子通道的命令后记录结束渲染通道实例的命令,请调用

// Provided by VK_VERSION_1_0
void vkCmdEndRenderPass(
    VkCommandBuffer                             commandBuffer);
  • commandBuffer 是用于结束当前渲染通道实例的命令缓冲区。

结束渲染通道实例会对最后一个子通道执行任何多重采样解析操作。

有效用法
  • VUID-vkCmdEndRenderPass-None-00910
    当前的子通道索引必须等于渲染通道中的子通道数量减一

  • VUID-vkCmdEndRenderPass-None-02351
    当变换反馈处于活动状态时,必须不记录此命令

  • VUID-vkCmdEndRenderPass-None-06170
    当前的渲染通道实例必须没有使用 vkCmdBeginRendering 开始

  • VUID-vkCmdEndRenderPass-None-07004
    如果在渲染通道的子通道中调用了 vkCmdBeginQuery*,则必须随后在同一子通道中调用相应的 vkCmdEndQuery*

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

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

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

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

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

  • VUID-vkCmdEndRenderPass-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

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

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

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

主要

内部

外部

图形

操作
状态
同步

要在记录最后一个子通道的命令后记录结束渲染通道实例的命令,请调用

// Provided by VK_VERSION_1_2
void vkCmdEndRenderPass2(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassEndInfo*                     pSubpassEndInfo);

或等效命令

// Provided by VK_KHR_create_renderpass2
void vkCmdEndRenderPass2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassEndInfo*                     pSubpassEndInfo);
  • commandBuffer 是用于结束当前渲染通道实例的命令缓冲区。

  • pSubpassEndInfo 是一个指向 VkSubpassEndInfo 结构的指针,其中包含有关如何结束最后一个子通道的信息。

vkCmdEndRenderPass2 在语义上与 vkCmdEndRenderPass 相同,不同之处在于它是可扩展的。

有效用法
  • VUID-vkCmdEndRenderPass2-None-03103
    当前的子通道索引必须等于渲染通道中的子通道数量减一

  • VUID-vkCmdEndRenderPass2-None-02352
    当变换反馈处于活动状态时,必须不记录此命令

  • VUID-vkCmdEndRenderPass2-None-06171
    当前的渲染通道实例必须没有使用 vkCmdBeginRendering 开始

  • VUID-vkCmdEndRenderPass2-None-07005
    如果在渲染通道的子通道中调用了 vkCmdBeginQuery*,则必须随后在同一子通道中调用相应的 vkCmdEndQuery*

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

  • VUID-vkCmdEndRenderPass2-pSubpassEndInfo-parameter
    pSubpassEndInfo 必须是指向有效 VkSubpassEndInfo 结构的有效指针

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

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

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

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

  • VUID-vkCmdEndRenderPass2-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

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

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

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

主要

内部

外部

图形

操作
状态
同步

VkSubpassEndInfo 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkSubpassEndInfo {
    VkStructureType    sType;
    const void*        pNext;
} VkSubpassEndInfo;

或等效的

// Provided by VK_KHR_create_renderpass2
typedef VkSubpassEndInfo VkSubpassEndInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

有效使用 (隐式)
  • VUID-VkSubpassEndInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_END_INFO

  • VUID-VkSubpassEndInfo-pNext-pNext
    pNext 必须NULL 或指向 VkSubpassFragmentDensityMapOffsetEndInfoQCOM 的有效实例的指针

  • VUID-VkSubpassEndInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

如果 VkSubpassEndInfo::pNext 链包含 VkSubpassFragmentDensityMapOffsetEndInfoQCOM 结构,则该结构包含渲染通道的每个图层的片段密度图偏移量数组。

VkSubpassFragmentDensityMapOffsetEndInfoQCOM 结构定义如下:

// Provided by VK_QCOM_fragment_density_map_offset
typedef struct VkSubpassFragmentDensityMapOffsetEndInfoQCOM {
    VkStructureType      sType;
    const void*          pNext;
    uint32_t             fragmentDensityOffsetCount;
    const VkOffset2D*    pFragmentDensityOffsets;
} VkSubpassFragmentDensityMapOffsetEndInfoQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • fragmentDensityOffsetCount 是指定的偏移量数量。

  • pFragmentDensityOffsets 是指向 VkOffset2D 结构数组的指针,每个结构描述每个图层的偏移量。

数组元素按 获取密度值 定义的每 layer 给出,其中 index = layer。每个 (x,y) 偏移量均以帧缓冲区像素为单位,并将片段密度图的获取量移动该量。偏移量可以是正数或负数。

为渲染过程中的任何子过程(非最后一个子过程)指定的偏移值将被忽略。如果渲染过程的最后一个子过程的 VkSubpassEndInfo::pNext 链不包含 VkSubpassFragmentDensityMapOffsetEndInfoQCOM,或者如果 fragmentDensityOffsetCount 为零,则 提取密度值 将使用偏移量 (0,0)

有效用法
  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-fragmentDensityMapOffsets-06503
    如果 fragmentDensityMapOffset 功能未启用,或者在渲染过程中未启用片段密度图,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-fragmentDensityMapAttachment-06504
    如果 VkSubpassDescription::fragmentDensityMapAttachment 不是 VK_ATTACHMENT_UNUSED 且创建时未使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-pDepthStencilAttachment-06505
    如果 VkSubpassDescription::pDepthStencilAttachment 不是 VK_ATTACHMENT_UNUSED 且创建时未使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-pInputAttachments-06506
    如果 VkSubpassDescription::pInputAttachments 的任何元素不是 VK_ATTACHMENT_UNUSED 且创建时未使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-pColorAttachments-06507
    如果 VkSubpassDescription::pColorAttachments 的任何元素不是 VK_ATTACHMENT_UNUSED 且创建时未使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-pResolveAttachments-06508
    如果 VkSubpassDescription::pResolveAttachments 的任何元素不是 VK_ATTACHMENT_UNUSED 且创建时未使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-pPreserveAttachments-06509
    如果 VkSubpassDescription::pPreserveAttachments 的任何元素不是 VK_ATTACHMENT_UNUSED 且创建时未使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,则 fragmentDensityOffsetCount 必须 等于 0

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-fragmentDensityOffsetCount-06510
    如果 fragmentDensityOffsetCount 不为 0 且渲染过程启用了多视图,则 fragmentDensityOffsetCount 必须 等于创建片段密度图附件视图时指定的 layerCount

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-fragmentDensityOffsetCount-06511
    如果 fragmentDensityOffsetCount 不为 0 且渲染过程未启用多视图,则 fragmentDensityOffsetCount 必须 等于 1

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-x-06512
    pFragmentDensityOffsets 的每个元素的 x 分量必须fragmentDensityOffsetGranularity.width 的整数倍。

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-y-06513
    pFragmentDensityOffsets 的每个元素的 y 分量必须fragmentDensityOffsetGranularity.height 的整数倍。

有效使用 (隐式)
  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM

  • VUID-VkSubpassFragmentDensityMapOffsetEndInfoQCOM-pFragmentDensityOffsets-parameter
    如果 fragmentDensityOffsetCount 不为 0,则 pFragmentDensityOffsets 必须是指向 fragmentDensityOffsetCountVkOffset2D 结构的有效指针。

渲染过程创建反馈

VkRenderPassCreationControlEXT 结构可以包含在 VkRenderPassCreateInfo2pNext 链中,或者包含在 VkSubpassDescription2pNext 链中。VkRenderPassCreationControlEXT 结构定义如下:

// Provided by VK_EXT_subpass_merge_feedback
typedef struct VkRenderPassCreationControlEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           disallowMerging;
} VkRenderPassCreationControlEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • disallowMerging 是一个布尔值,指示是否禁用子过程合并。

如果 VkRenderPassCreationControlEXT 结构包含在 VkRenderPassCreateInfo2pNext 链中,且其 disallowMerging 的值为 VK_TRUE,则实现将禁用整个渲染过程的子过程合并。如果 VkRenderPassCreationControlEXT 结构包含在 VkSubpassDescription2pNext 链中,且其 disallowMerging 的值为 VK_TRUE,则实现将禁用所描述的子过程与渲染过程中的先前子过程的合并。

有效使用 (隐式)
  • VUID-VkRenderPassCreationControlEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT

要获取有关渲染过程创建的反馈,请在 VkRenderPassCreateInfo2pNext 链中包含 VkRenderPassCreationFeedbackCreateInfoEXT 结构。VkRenderPassCreationFeedbackCreateInfoEXT 结构定义如下:

// Provided by VK_EXT_subpass_merge_feedback
typedef struct VkRenderPassCreationFeedbackCreateInfoEXT {
    VkStructureType                         sType;
    const void*                             pNext;
    VkRenderPassCreationFeedbackInfoEXT*    pRenderPassFeedback;
} VkRenderPassCreationFeedbackCreateInfoEXT;
有效使用 (隐式)
  • VUID-VkRenderPassCreationFeedbackCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT

  • VUID-VkRenderPassCreationFeedbackCreateInfoEXT-pRenderPassFeedback-parameter
    pRenderPassFeedback 必须是指向 VkRenderPassCreationFeedbackInfoEXT 结构的有效指针。

VkRenderPassCreationFeedbackInfoEXT 结构定义如下:

// Provided by VK_EXT_subpass_merge_feedback
typedef struct VkRenderPassCreationFeedbackInfoEXT {
    uint32_t    postMergeSubpassCount;
} VkRenderPassCreationFeedbackInfoEXT;
  • postMergeSubpassCount 是合并后的子过程计数。

要获取有关子过程创建的反馈,可以VkSubpassDescription2pNext 链中包含 VkRenderPassSubpassFeedbackCreateInfoEXT 结构。VkRenderPassSubpassFeedbackCreateInfoEXT 结构定义如下:

// Provided by VK_EXT_subpass_merge_feedback
typedef struct VkRenderPassSubpassFeedbackCreateInfoEXT {
    VkStructureType                        sType;
    const void*                            pNext;
    VkRenderPassSubpassFeedbackInfoEXT*    pSubpassFeedback;
} VkRenderPassSubpassFeedbackCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pSubpassFeedback 是指向 VkRenderPassSubpassFeedbackInfoEXT 结构的指针,反馈信息将返回到该结构中。

有效使用 (隐式)
  • VUID-VkRenderPassSubpassFeedbackCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT

  • VUID-VkRenderPassSubpassFeedbackCreateInfoEXT-pSubpassFeedback-parameter
    pSubpassFeedback 必须是一个指向有效的 VkRenderPassSubpassFeedbackInfoEXT 结构的指针

VkRenderPassSubpassFeedbackInfoEXT 结构定义如下

// Provided by VK_EXT_subpass_merge_feedback
typedef struct VkRenderPassSubpassFeedbackInfoEXT {
    VkSubpassMergeStatusEXT    subpassMergeStatus;
    char                       description[VK_MAX_DESCRIPTION_SIZE];
    uint32_t                   postMergeIndex;
} VkRenderPassSubpassFeedbackInfoEXT;
  • subpassMergeStatus 是一个 VkSubpassMergeStatusEXT 值,指定了子通道是否与前一个子通道合并以及未合并的原因信息。

  • description 是一个包含以空字符结尾的 UTF-8 字符串的 VK_MAX_DESCRIPTION_SIZE 大小的 char 数组,提供额外的细节信息。

  • postMergeIndex 是子通道合并后的子通道索引。

VkRenderPassSubpassFeedbackInfoEXT:subpassMergeStatus 的可能值为

// Provided by VK_EXT_subpass_merge_feedback
typedef enum VkSubpassMergeStatusEXT {
    VK_SUBPASS_MERGE_STATUS_MERGED_EXT = 0,
    VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT = 1,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT = 2,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT = 3,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT = 4,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT = 5,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT = 6,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT = 7,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT = 8,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT = 9,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT = 10,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT = 11,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT = 12,
    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT = 13,
} VkSubpassMergeStatusEXT;
  • VK_SUBPASS_MERGE_STATUS_MERGED_EXT 指定子通道已与之前的子通道合并。

  • VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT 指定子通道未合并,因为使用 VkRenderPassCreationControlEXT 禁用了合并。如果渲染通道不允许子通道合并,则所有子通道状态都设置为此值。如果子通道描述不允许子通道合并,则只有该子通道的状态设置为此值。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT 指定子通道未合并,因为它包含副作用。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT 指定子通道未合并,因为样本计数与之前的子通道不兼容。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT 指定子通道未合并,因为视图掩码与之前的子通道不匹配。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT 指定子通道未合并,因为它们之间存在附件别名。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT 指定子通道未合并,因为子通道依赖关系不允许合并。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT 指定子通道未合并,因为输入附件不是来自之前子通道的颜色附件,或者格式不兼容。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT 指定子通道未合并,因为附件太多。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT 指定子通道未合并,因为内存不足。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT 指定子通道未合并,因为深度/模板附件太多。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT 指定子通道未合并,因为解析附件在后续子通道中被重用为输入附件。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT 指定子通道未合并,因为渲染通道只有一个子通道。

  • VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT 指定子通道由于未指明的原因而未合并。当没有其他 VkSubpassMergeStatusEXT 值适用时,实现**应该**返回此值。

常见的渲染通道数据竞争(信息性)

由于渲染执行方式的复杂性,应用程序可能会意外引入数据竞争,通常是做了一些看似无害但实际上不支持的操作。本节列出了一些更常见的情况作为指导,以帮助避免它们。

从只读附件采样

Vulkan 包括用于深度/模板图像的只读布局,允许在渲染通道期间读取图像以进行深度/模板测试,并将其作为非附件读取。

但是,由于 VK_ATTACHMENT_STORE_OP_STOREVK_ATTACHMENT_STORE_OP_DONT_CARE 可能会执行写操作,即使没有记录的命令写入附件,在使用这些存储操作的同时读取图像也可能导致数据竞争。如果从非附件的读取是在片元着色器中执行的,并且访问的样本与片元着色器覆盖的样本匹配,则不会发生数据竞争,因为存储操作保证在片元着色器执行之后对片元覆盖的样本集进行操作。值得注意的是,输入附件也可以用于这种情况。读取其他样本或在任何其他着色器阶段都可能导致由于潜在的数据竞争而产生意外行为,并且应为此生成验证错误。实际上,许多应用程序在没有观察到任何问题的情况下,已经发布了在覆盖的片元之外读取样本的情况,但是不能保证这种情况始终有效,并且不建议在新代码或重构的代码库中依赖这种情况。由于 VK_ATTACHMENT_STORE_OP_NONE 保证不执行任何写入,因此希望将图像同时作为附件和非附件读取的应用程序应使用此存储操作,并结合也不执行任何写入的加载操作。

资源之间的非重叠访问

在依赖附件和其他资源之间的非重叠访问时,重要的是要注意 加载存储 操作具有相当宽的对齐要求 - 可能会影响整个子资源和相邻的深度/模板方面。这使得访问同时用作附件且任一访问都执行写操作的非附件子资源无效。

唯一的例外是子资源处于 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局时,在这种情况下,重叠被定义为以每个像素的粒度发生,并且应用程序可以读取渲染区域之外像素的数据,而不会引入数据竞争。

深度/模板和输入附件

当仅渲染到图像的深度或模板方面时,仅在非常特定的条件下,访问另一方面的输入附件才不会导致数据竞争。为了避免数据竞争,未写入的方面**必须**处于只读布局中,并且在绘制状态下**必须**禁用对其的写入。例如,要从模板读取同时写入深度,附件**必须**处于 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL(或等效布局),并且模板写入掩码**必须**为 0。类似地,要从深度读取同时写入模板,附件**必须**处于 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL(或等效布局),并且深度写入启用**必须**为 VK_FALSE

同步选项

有几种同步选项可用于同步渲染通道内对资源的访问。下面概述了一些选项

  • 渲染通道对象中的 VkSubpassDependency 可以同步先前子通道的附件写入和 多重采样解析操作,以用于后续的输入附件读取。

  • 子通道内的 vkCmdPipelineBarrier 可以同步子通道中先前的附件写入与后续的输入附件读取。

  • 如果附件处于 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,则子通道内的 vkCmdPipelineBarrier 可以同步子通道中先前的附件写入与后续的非附件读取。

  • 如果将子资源用作颜色和输入附件,并且执行读取的管道是使用 VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT 创建的

  • 如果子资源被用作深度和输入附件,且执行读取的管线是使用 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT 创建的

  • 如果子资源被用作模板和输入附件,且执行读取的管线是使用 VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT 创建的

  • 如果子资源被用作两个独立的非附件资源,通过使用其中一个片段互锁执行模式,可以使片段着色器中对像素或单个样本的写入与另一个片段着色器中对同一像素或样本的访问同步。