清除命令

在渲染过程实例之外清除图像

颜色和深度/模板图像可以使用 vkCmdClearColorImagevkCmdClearDepthStencilImage 在渲染过程实例之外分别清除。这些命令只允许在渲染过程实例之外使用。

要清除一个或多个颜色图像的子范围,请调用

// Provided by VK_VERSION_1_0
void vkCmdClearColorImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     image,
    VkImageLayout                               imageLayout,
    const VkClearColorValue*                    pColor,
    uint32_t                                    rangeCount,
    const VkImageSubresourceRange*              pRanges);
  • commandBuffer 是将记录命令的命令缓冲区。

  • image 是要清除的图像。

  • imageLayout 指定要清除的图像子资源范围的当前布局,并且必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL

  • pColor 是指向包含图像子资源范围将被清除到的值的 VkClearColorValue 结构的指针(请参见下面的清除值)。

  • rangeCountpRanges 中图像子资源范围结构的数目。

  • pRanges 是指向 VkImageSubresourceRange 结构的数组的指针,该数组描述了要清除的 mipmap 级别、数组层和方面范围,如 图像视图中所述。

pRanges 中指定的每个范围都会被清除为 pColor 指定的值。

有效使用
  • VUID-vkCmdClearColorImage-image-01993
    image格式特性必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

  • VUID-vkCmdClearColorImage-image-00002
    image 必须已使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 使用标志创建

  • VUID-vkCmdClearColorImage-image-01545
    image 不能使用任何需要采样器 Y′CBCR 转换的格式

  • VUID-vkCmdClearColorImage-image-00003
    如果 image 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdClearColorImage-imageLayout-00004
    imageLayout 必须指定在 VkDevice 上执行此命令时 pRanges 中指定的 image 的图像子资源范围的布局

  • VUID-vkCmdClearColorImage-imageLayout-01394
    imageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdClearColorImage-aspectMask-02498
    pRanges 数组的元素的 VkImageSubresourceRange::aspectMask 成员必须每个只包含 VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-vkCmdClearColorImage-baseMipLevel-01470
    pRanges 数组的元素的 VkImageSubresourceRange::baseMipLevel 成员必须每个都小于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdClearColorImage-pRanges-01692
    对于 pRanges 的每个 VkImageSubresourceRange 元素,如果 levelCount 成员不是 VK_REMAINING_MIP_LEVELS,则 baseMipLevel + levelCount 必须小于或等于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdClearColorImage-baseArrayLayer-01472
    pRanges 数组的元素的 VkImageSubresourceRange::baseArrayLayer 成员必须每个都小于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdClearColorImage-pRanges-01693
    对于 pRanges 的每个 VkImageSubresourceRange 元素,如果 layerCount 成员不是 VK_REMAINING_ARRAY_LAYERS,则 baseArrayLayer + layerCount 必须小于或等于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdClearColorImage-image-00007
    image 不能具有压缩或深度/模板格式

  • VUID-vkCmdClearColorImage-pColor-04961
    pColor 必须 是指向 VkClearColorValue 联合体的有效指针

  • VUID-vkCmdClearColorImage-commandBuffer-01805
    如果 commandBuffer 是一个非保护的命令缓冲区,并且不支持protectedNoFault,则 image 必须 不是一个受保护的图像

  • VUID-vkCmdClearColorImage-commandBuffer-01806
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持protectedNoFault,则 必须 不是一个非保护的图像

  • VUID-vkCmdClearColorImage-image-09678
    如果 image 的格式具有 R 和 G 之外的组件,则它必须不具有 64 位组件宽度

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

  • VUID-vkCmdClearColorImage-image-parameter
    image 必须 是一个有效的 VkImage 句柄

  • VUID-vkCmdClearColorImage-imageLayout-parameter
    imageLayout 必须 是一个有效的 VkImageLayout

  • VUID-vkCmdClearColorImage-pRanges-parameter
    pRanges 必须 是指向 rangeCount 个有效的 VkImageSubresourceRange 结构体的数组的有效指针

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

  • VUID-vkCmdClearColorImage-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

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

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

  • VUID-vkCmdClearColorImage-rangeCount-arraylength
    rangeCount 必须 大于 0

  • VUID-vkCmdClearColorImage-commonparent
    commandBufferimage必须是从同一个 VkDevice 创建、分配或检索的

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

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

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


外部

外部

图形
计算

操作

要清除深度/模板图像的一个或多个子范围,请调用

// Provided by VK_VERSION_1_0
void vkCmdClearDepthStencilImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     image,
    VkImageLayout                               imageLayout,
    const VkClearDepthStencilValue*             pDepthStencil,
    uint32_t                                    rangeCount,
    const VkImageSubresourceRange*              pRanges);
  • commandBuffer 是将记录命令的命令缓冲区。

  • image 是要清除的图像。

  • imageLayout 指定要清除的图像子资源范围的当前布局,并且必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL

  • pDepthStencil 是指向 VkClearDepthStencilValue 结构的指针,该结构包含深度和模板图像子资源范围将被清除为的值(请参阅下面的清除值)。

  • rangeCountpRanges 中图像子资源范围结构的数目。

  • pRanges 是指向 VkImageSubresourceRange 结构的数组的指针,该数组描述了要清除的 mipmap 级别、数组层和方面范围,如 图像视图中所述。

有效使用
  • VUID-vkCmdClearDepthStencilImage-image-01994
    image格式特性必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

  • VUID-vkCmdClearDepthStencilImage-pRanges-02658
    如果 pRanges 的任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,并且 image 是使用单独的模板使用创建的,则 VK_IMAGE_USAGE_TRANSFER_DST_BIT 必须已包含在用于创建 imageVkImageStencilUsageCreateInfo::stencilUsage

  • VUID-vkCmdClearDepthStencilImage-pRanges-02659
    如果 pRanges 的任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,并且 image 不是使用单独的模板使用创建的,则 VK_IMAGE_USAGE_TRANSFER_DST_BIT 必须已包含在用于创建 imageVkImageCreateInfo::usage

  • VUID-vkCmdClearDepthStencilImage-pRanges-02660
    如果 pRanges 的任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_DEPTH_BIT,则 VK_IMAGE_USAGE_TRANSFER_DST_BIT 必须已包含在用于创建 imageVkImageCreateInfo::usage

  • VUID-vkCmdClearDepthStencilImage-image-00010
    如果 image 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdClearDepthStencilImage-imageLayout-00011
    imageLayout 必须指定在 VkDevice 上执行此命令时 pRanges 中指定的 image 的图像子资源范围的布局

  • VUID-vkCmdClearDepthStencilImage-imageLayout-00012
    imageLayout 必须VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdClearDepthStencilImage-aspectMask-02824
    pRanges 数组的每个元素的 VkImageSubresourceRange::aspectMask 成员必须不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 之外的位

  • VUID-vkCmdClearDepthStencilImage-image-02825
    如果 image 的格式没有模板组件,则 pRanges 数组的每个元素的 VkImageSubresourceRange::aspectMask 成员必须不包含 VK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdClearDepthStencilImage-image-02826
    如果 image 的格式没有深度组件,则 pRanges 数组的每个元素的 VkImageSubresourceRange::aspectMask 成员必须不包含 VK_IMAGE_ASPECT_DEPTH_BIT

  • VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474
    pRanges 数组的元素的 VkImageSubresourceRange::baseMipLevel 成员必须每个都小于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdClearDepthStencilImage-pRanges-01694
    对于 pRanges 的每个 VkImageSubresourceRange 元素,如果 levelCount 成员不是 VK_REMAINING_MIP_LEVELS,则 baseMipLevel + levelCount 必须小于或等于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476
    pRanges 数组的元素的 VkImageSubresourceRange::baseArrayLayer 成员必须每个都小于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdClearDepthStencilImage-pRanges-01695
    对于 pRanges 的每个 VkImageSubresourceRange 元素,如果 layerCount 成员不是 VK_REMAINING_ARRAY_LAYERS,则 baseArrayLayer + layerCount 必须小于或等于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdClearDepthStencilImage-image-00014
    image 必须具有深度/模板格式。

  • VUID-vkCmdClearDepthStencilImage-commandBuffer-01807
    如果 commandBuffer 是一个非保护的命令缓冲区,并且不支持protectedNoFault,则 image 必须 不是一个受保护的图像

  • VUID-vkCmdClearDepthStencilImage-commandBuffer-01808
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 image 必须不是一个未受保护的图像。

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

  • VUID-vkCmdClearDepthStencilImage-image-parameter
    image 必须 是一个有效的 VkImage 句柄

  • VUID-vkCmdClearDepthStencilImage-imageLayout-parameter
    imageLayout 必须 是一个有效的 VkImageLayout

  • VUID-vkCmdClearDepthStencilImage-pDepthStencil-parameter
    pDepthStencil 必须是一个指向有效的 VkClearDepthStencilValue 结构的有效指针。

  • VUID-vkCmdClearDepthStencilImage-pRanges-parameter
    pRanges 必须 是指向 rangeCount 个有效的 VkImageSubresourceRange 结构体的数组的有效指针

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

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

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

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

  • VUID-vkCmdClearDepthStencilImage-rangeCount-arraylength
    rangeCount 必须 大于 0

  • VUID-vkCmdClearDepthStencilImage-commonparent
    commandBufferimage必须是从同一个 VkDevice 创建、分配或检索的

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

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

出于内存屏障的目的,渲染通道实例外部的清除操作被视为传输操作。

在渲染通道实例内部清除图像

要在渲染通道实例内部清除一个或多个颜色和深度/模板附件区域,请调用

// Provided by VK_VERSION_1_0
void vkCmdClearAttachments(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    attachmentCount,
    const VkClearAttachment*                    pAttachments,
    uint32_t                                    rectCount,
    const VkClearRect*                          pRects);
  • commandBuffer 是将记录命令的命令缓冲区。

  • attachmentCountpAttachments 数组中的条目数。

  • pAttachments 是指向 VkClearAttachment 结构数组的指针,该数组定义要清除的附件和要使用的清除值。

  • rectCountpRects 数组中的条目数。

  • pRects 是指向 VkClearRect 结构数组的指针,该数组定义每个选定附件内要清除的区域。

如果渲染通道具有片段密度图附件,则清除操作遵循片段密度图的操作,就像每个清除区域都是生成片段的图元一样。清除颜色将应用于每个片段区域内的所有像素,而不管像素是否位于清除区域之外。清除操作可能具有与绘制操作不同的受支持片段区域集。

与其他的清除命令不同,vkCmdClearAttachments 不是传输命令。它以光栅化顺序执行其操作。对于颜色附件,操作作为颜色附件写入执行,由 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 阶段执行。对于深度/模板附件,操作作为深度写入模板写入执行,由 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 阶段执行。

vkCmdClearAttachments 不受绑定的管线状态的影响。

通常最好在渲染开始时使用 VK_ATTACHMENT_LOAD_OP_CLEAR 加载操作来清除附件,因为在某些实现上它更有效。

如果任何附件的要清除的 aspectMask 没有图像视图的支持,则清除操作对该方面无效。

如果正在清除的附件引用使用等于 VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BITVK_IMAGE_ASPECT_PLANE_2_BIT 之一的 aspectMask 创建的图像视图,则出于此命令的目的,它将被视为 VK_IMAGE_ASPECT_COLOR_BIT,并且 必须使用 图像视图创建 指定的 VK_IMAGE_ASPECT_COLOR_BIT 方面进行清除。

有效使用
  • VUID-vkCmdClearAttachments-aspectMask-07884
    如果当前渲染通道实例未使用动态渲染,并且 pAttachments 的任何元素的 aspectMask 成员包含 VK_IMAGE_ASPECT_DEPTH_BIT,则当前子通道实例的深度-模板附件 必须VK_ATTACHMENT_UNUSED 或该附件的 format 必须包含深度分量

  • VUID-vkCmdClearAttachments-aspectMask-07885
    如果当前渲染通道实例未使用动态渲染,并且 pAttachments 的任何元素的 aspectMask 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,则当前子通道实例的深度-模板附件 必须VK_ATTACHMENT_UNUSED 或该附件的 format 必须包含模板分量

  • VUID-vkCmdClearAttachments-aspectMask-07271
    如果 pAttachments 的任何元素的 aspectMask 成员包含 VK_IMAGE_ASPECT_COLOR_BIT,则 colorAttachment 必须是当前渲染通道实例中有效的颜色附件索引。

  • VUID-vkCmdClearAttachments-rect-02682
    pRects 的每个元素的 rect 成员的 extent.width 必须大于 0

  • VUID-vkCmdClearAttachments-rect-02683
    pRects 的每个元素的 rect 成员的 extent.height 必须大于 0

  • VUID-vkCmdClearAttachments-pRects-00016
    pRects 的每个元素指定的矩形区域 必须包含在当前渲染通道实例的渲染区域内。

  • VUID-vkCmdClearAttachments-pRects-06937
    pRects 的每个元素指定的层必须包含在 pAttachments 引用的每个附件中,即对于 pRects 的每个元素,VkClearRect::baseArrayLayer + VkClearRect::layerCount 必须小于或等于当前渲染过程实例中渲染的层数

  • VUID-vkCmdClearAttachments-layerCount-01934
    pRects 的每个元素的 layerCount 成员不能0

  • VUID-vkCmdClearAttachments-commandBuffer-02504
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则要清除的每个附件必须不是受保护的图像

  • VUID-vkCmdClearAttachments-commandBuffer-02505
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则要清除的每个附件必须不是未受保护的图像

  • VUID-vkCmdClearAttachments-baseArrayLayer-00018
    如果记录此命令的渲染过程实例使用了多视图,则 baseArrayLayer 必须为零,layerCount 必须为一

  • VUID-vkCmdClearAttachments-colorAttachment-09503
    pAttachments 的每个元素的 colorAttachment 成员必须不标识当前通过 VkRenderingAttachmentLocationInfocommandBuffer 中映射到 VK_ATTACHMENT_UNUSED 的颜色附件

  • VUID-vkCmdClearAttachments-aspectMask-09298
    如果记录此命令的子通道执行外部格式解析,则 pAttachments 的任何元素的 aspectMask 成员必须不包含任何索引 iVK_IMAGE_ASPECT_PLANE_i_BIT

  • VUID-vkCmdClearAttachments-None-09679
    如果附件格式具有 R 和 G 以外的组件,则它必须不具有 64 位组件宽度

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

  • VUID-vkCmdClearAttachments-pAttachments-parameter
    pAttachments 必须是指向 attachmentCount 个有效 VkClearAttachment 结构体的数组的有效指针

  • VUID-vkCmdClearAttachments-pRects-parameter
    pRects 必须是指向 rectCountVkClearRect 结构体的数组的有效指针

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

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

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

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

  • VUID-vkCmdClearAttachments-attachmentCount-arraylength
    attachmentCount 必须大于 0

  • VUID-vkCmdClearAttachments-rectCount-arraylength
    rectCount 必须大于 0

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

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

VkClearRect 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkClearRect {
    VkRect2D    rect;
    uint32_t    baseArrayLayer;
    uint32_t    layerCount;
} VkClearRect;
  • rect 是要清除的二维区域。

  • baseArrayLayer 是要清除的第一个图层。

  • layerCount 是要清除的图层数。

从附件图像视图的基础图层开始计数,图层 [baseArrayLayer, baseArrayLayer + layerCount) 将被清除。

VkClearAttachment 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkClearAttachment {
    VkImageAspectFlags    aspectMask;
    uint32_t              colorAttachment;
    VkClearValue          clearValue;
} VkClearAttachment;
  • aspectMask 是一个掩码,用于选择要清除的附件的颜色、深度和/或模板方面。

  • colorAttachment 仅当 aspectMask 中设置了 VK_IMAGE_ASPECT_COLOR_BIT 时才有意义,在这种情况下,它是绑定颜色附件的索引。

  • clearValue 是要将附件清除到的颜色或深度/模板值,如下面的 清除值 中所述。

有效使用
  • VUID-VkClearAttachment-aspectMask-00019
    如果 aspectMask 包含 VK_IMAGE_ASPECT_COLOR_BIT,则它必须不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-VkClearAttachment-aspectMask-00020
    aspectMask 必须不包含 VK_IMAGE_ASPECT_METADATA_BIT

  • VUID-VkClearAttachment-aspectMask-02246
    对于任何索引 iaspectMask 必须不包含 VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT

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

  • VUID-VkClearAttachment-aspectMask-requiredbitmask
    aspectMask 必须不为 0

清除值

VkClearColorValue 结构定义为

// Provided by VK_VERSION_1_0
typedef union VkClearColorValue {
    float       float32[4];
    int32_t     int32[4];
    uint32_t    uint32[4];
} VkClearColorValue;
  • 当图像或附件的格式是具有浮点数数值类型的数字格式之一时,float32 是颜色清除值。浮点值会自动转换为图像的格式,如果图像是 sRGB,则清除值将被视为线性值。

  • 当图像或附件的格式具有有符号整数 (SINT) 数值类型时,int32 是颜色清除值。有符号整数值通过转换为较小的类型来转换为图像的格式(负的 32 位值映射到较小类型中的负值)。如果整数清除值在目标类型中不可表示(例如,在转换为该类型时会溢出),则清除值是未定义的

  • 当图像或附件的格式具有无符号整数 (UINT) 数值类型时,uint32 是颜色清除值。无符号整数值通过转换为具有较少位的整数类型来转换为图像的格式。

清除颜色的四个数组元素按顺序映射到图像格式的 R、G、B 和 A 组件。

如果图像具有多个样本,则对于正在清除的任何像素,会将相同的值写入所有样本。

如果图像或附件格式具有 64 位组件宽度,则上面每个数组的前 2 个数组元素将重新解释为 R 组件的单个 64 位元素。接下来的 2 个数组元素以相同的方式用于 G 组件。换句话说,该联合体的行为就好像它具有以下附加成员一样

double float64[2];
int64_t int64[2];
uint64_t uint64[2];

VkClearDepthStencilValue 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkClearDepthStencilValue {
    float       depth;
    uint32_t    stencil;
} VkClearDepthStencilValue;
  • depth 是深度/模板附件的深度方面的清除值。它是一个浮点值,会自动转换为附件的格式。

  • stencil 是深度/模板附件的模板方面的清除值。它是一个 32 位整数值,通过取适当数量的最低有效位 (LSB) 转换为附件的格式。

有效使用
  • VUID-VkClearDepthStencilValue-depth-00022
    除非启用了 VK_EXT_depth_range_unrestricted 扩展,否则 depth 必须介于 0.01.0 之间(包括 0.01.0)。

VkClearValue 联合体的定义如下:

// Provided by VK_VERSION_1_0
typedef union VkClearValue {
    VkClearColorValue           color;
    VkClearDepthStencilValue    depthStencil;
} VkClearValue;
  • color 指定清除颜色图像或附件时要使用的颜色图像清除值。

  • depthStencil 指定清除深度/模板图像或附件时要使用的深度和模板清除值。

此联合体用于 API 的某些部分需要颜色或深度/模板清除值(具体取决于附件)的情况,并在 VkRenderPassBeginInfo 结构中定义初始清除值。

填充缓冲区

要清除缓冲区数据,请调用

// Provided by VK_VERSION_1_0
void vkCmdFillBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    VkDeviceSize                                size,
    uint32_t                                    data);
  • commandBuffer 是将记录命令的命令缓冲区。

  • dstBuffer 是要填充的缓冲区。

  • dstOffset 是开始填充的缓冲区中的字节偏移量,并且必须是 4 的倍数。

  • size 是要填充的字节数,并且必须是 4 的倍数,或者 VK_WHOLE_SIZE 来填充从 offset 到缓冲区末尾的范围。如果使用 VK_WHOLE_SIZE,且缓冲区的剩余大小不是 4 的倍数,则会使用最接近的较小倍数。

  • data 是重复写入缓冲区以填充 size 字节数据的 4 字节字。数据字按照主机字节序写入内存。

vkCmdFillBuffer 在同步屏障的目的上被视为“传输”操作。为了使缓冲区与 vkCmdFillBuffer 兼容,必须在 VkBufferCreateInfousage 中指定 VK_BUFFER_USAGE_TRANSFER_DST_BIT

有效使用
  • VUID-vkCmdFillBuffer-dstOffset-00024
    dstOffset 必须小于 dstBuffer 的大小

  • VUID-vkCmdFillBuffer-dstOffset-00025
    dstOffset 必须4 的倍数

  • VUID-vkCmdFillBuffer-size-00026
    如果 size 不等于 VK_WHOLE_SIZE,则 size 必须大于 0

  • VUID-vkCmdFillBuffer-size-00027
    如果 size 不等于 VK_WHOLE_SIZE,则 size 必须小于或等于 dstBuffer 的大小减去 dstOffset

  • VUID-vkCmdFillBuffer-size-00028
    如果 size 不等于 VK_WHOLE_SIZE,则 size 必须4 的倍数

  • VUID-vkCmdFillBuffer-dstBuffer-00029
    创建 dstBuffer必须使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 用法标志

  • VUID-vkCmdFillBuffer-apiVersion-07894
    如果未启用 VK_KHR_maintenance1 扩展,且 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则分配 commandBufferVkCommandPool 必须支持图形或计算操作

  • VUID-vkCmdFillBuffer-dstBuffer-00031
    如果 dstBuffer 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdFillBuffer-commandBuffer-01811
    如果 commandBuffer 是非保护的命令缓冲区,且不支持 protectedNoFault,则 dstBuffer 必须不是保护的缓冲区

  • VUID-vkCmdFillBuffer-commandBuffer-01812
    如果 commandBuffer 是保护的命令缓冲区,且不支持 protectedNoFault,则 dstBuffer 必须不是非保护的缓冲区

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

  • VUID-vkCmdFillBuffer-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄

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

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

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

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

  • VUID-vkCmdFillBuffer-commonparent
    commandBufferdstBuffer必须是从同一个 VkDevice 创建、分配或检索的

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

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

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


外部

外部

传输
图形
计算

操作

更新缓冲区

要在命令缓冲区中内联更新缓冲区数据,请调用

// Provided by VK_VERSION_1_0
void vkCmdUpdateBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    VkDeviceSize                                dataSize,
    const void*                                 pData);
  • commandBuffer 是将记录命令的命令缓冲区。

  • dstBuffer 是要更新的缓冲区的句柄。

  • dstOffset 是开始更新的缓冲区中的字节偏移量,并且必须是 4 的倍数。

  • dataSize 是要更新的字节数,并且必须是 4 的倍数。

  • pData 是指向缓冲区更新的源数据的指针,并且大小必须至少为 dataSize 字节。

dataSize 必须小于或等于 65536 字节。对于更大的更新,应用程序可以使用缓冲区到缓冲区 复制

使用 vkCmdUpdateBuffer 执行的缓冲区更新首先在记录命令时将数据复制到命令缓冲区内存中(这需要额外的存储空间,并可能导致额外的分配),然后在设备上执行命令时将数据从命令缓冲区复制到 dstBuffer 中。

缓冲区到缓冲区复制相比,此功能的额外成本意味着它只应用于少量数据,这也是为什么它被限制为最多 65536 字节的原因。应用程序可以通过向同一缓冲区的不同范围发出多个 vkCmdUpdateBuffer 命令来绕过此限制,但不建议这样做。

当调用该命令时,源数据将从 pData 复制到命令缓冲区。

vkCmdUpdateBuffer 只允许在渲染通道之外使用。此命令在同步屏障中被视为“传输”操作。为了使缓冲区与 vkCmdUpdateBuffer 兼容,必须VkBufferCreateInfousage 中指定 VK_BUFFER_USAGE_TRANSFER_DST_BIT

有效使用
  • VUID-vkCmdUpdateBuffer-dstOffset-00032
    dstOffset 必须小于 dstBuffer 的大小

  • VUID-vkCmdUpdateBuffer-dataSize-00033
    dataSize 必须小于或等于 dstBuffer 的大小减去 dstOffset

  • VUID-vkCmdUpdateBuffer-dstBuffer-00034
    创建 dstBuffer必须使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 用法标志

  • VUID-vkCmdUpdateBuffer-dstBuffer-00035
    如果 dstBuffer 是非稀疏的,那么它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdUpdateBuffer-dstOffset-00036
    dstOffset 必须4 的倍数

  • VUID-vkCmdUpdateBuffer-dataSize-00037
    dataSize 必须小于或等于 65536

  • VUID-vkCmdUpdateBuffer-dataSize-00038
    dataSize 必须4 的倍数

  • VUID-vkCmdUpdateBuffer-commandBuffer-01813
    如果 commandBuffer 是非保护的命令缓冲区,且不支持 protectedNoFault,则 dstBuffer 必须不是保护的缓冲区

  • VUID-vkCmdUpdateBuffer-commandBuffer-01814
    如果 commandBuffer 是保护的命令缓冲区,且不支持 protectedNoFault,则 dstBuffer 必须不是非保护的缓冲区

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

  • VUID-vkCmdUpdateBuffer-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄

  • VUID-vkCmdUpdateBuffer-pData-parameter
    pData 必须是指向 dataSize 字节数组的有效指针

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

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

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

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

  • VUID-vkCmdUpdateBuffer-dataSize-arraylength
    dataSize 必须大于 0

  • VUID-vkCmdUpdateBuffer-commonparent
    commandBufferdstBuffer必须是从同一个 VkDevice 创建、分配或检索的

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

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

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


外部

外部

传输
图形
计算

操作

在规范的 1.0.19 版本和 VK_HEADER_VERSION 19 的 Vulkan 头文件之前,pData 参数的类型为 uint32_t* 而不是 void*。这是一个历史遗留问题,因为源数据可能是其他类型。