内存解压缩

要解压缩一个或多个内存区域之间的数据,请调用

// Provided by VK_NV_memory_decompression
void vkCmdDecompressMemoryNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    decompressRegionCount,
    const VkDecompressMemoryRegionNV*           pDecompressMemoryRegions);
  • commandBuffer 是命令将被记录到的命令缓冲区。

  • decompressRegionCount 是要解压缩的内存区域的数量。

  • pDecompressMemoryRegions 是指向 decompressRegionCountVkDecompressMemoryRegionNV 结构的数组的指针,指定解压缩参数。

pDecompressMemoryRegions 中指定的每个区域都将基于指定的解压缩方法从源区域解压缩到目标区域。

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

  • VUID-vkCmdDecompressMemoryNV-pDecompressMemoryRegions-parameter
    pDecompressMemoryRegions 必须是指向 decompressRegionCount 个有效的 VkDecompressMemoryRegionNV 结构的数组的有效指针

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

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

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

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

  • VUID-vkCmdDecompressMemoryNV-decompressRegionCount-arraylength
    decompressRegionCount 必须大于 0

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

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

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

主要
辅助

外部

外部

图形
计算

操作

VkDecompressMemoryRegionNV 结构定义为

// Provided by VK_NV_memory_decompression
typedef struct VkDecompressMemoryRegionNV {
    VkDeviceAddress                       srcAddress;
    VkDeviceAddress                       dstAddress;
    VkDeviceSize                          compressedSize;
    VkDeviceSize                          decompressedSize;
    VkMemoryDecompressionMethodFlagsNV    decompressionMethod;
} VkDecompressMemoryRegionNV;
  • srcAddress 是存储压缩数据的地址。

  • dstAddress 是将写入解压缩数据的目标地址。

  • compressedSize 是压缩数据的大小(以字节为单位)。

  • decompressedSize 是解压缩数据的大小(以字节为单位)。

  • decompressionMethodVkMemoryDecompressionMethodFlagBitsNV 的位掩码,其中设置了单个位,指定用于解压缩数据的方法。

有效使用
  • VUID-VkDecompressMemoryRegionNV-srcAddress-07685
    srcAddress 必须是 4 字节对齐的

  • VUID-VkDecompressMemoryRegionNV-srcAddress-07686
    范围 srcAddresssrcAddress + compressedSize 中的内存 必须是有效的,并且已绑定到 VkDeviceMemory 对象

  • VUID-VkDecompressMemoryRegionNV-dstAddress-07687
    dstAddress 必须是 4 字节对齐的

  • VUID-VkDecompressMemoryRegionNV-decompressionMethod-09395
    如果 decompressionMethodVK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV,则 decompressedSize 必须小于或等于 65536 字节

  • VUID-VkDecompressMemoryRegionNV-dstAddress-07688
    位于 dstAddressdstAddress + decompressedSize 范围内的内存必须有效,并且绑定到一个 VkDeviceMemory 对象。

  • VUID-VkDecompressMemoryRegionNV-decompressedSize-07689
    decompressedSize 必须足够大,以便根据 decompressionMethod 保存解压后的数据。

  • VUID-VkDecompressMemoryRegionNV-decompressionMethod-07690
    decompressionMethod 必须只有一个位被设置。

  • VUID-VkDecompressMemoryRegionNV-srcAddress-07691
    srcAddresssrcAddress + compressedSize 的区域必须不与 dstAddressdstAddress + decompressedSize 的区域重叠。

有效使用(隐式)
  • VUID-VkDecompressMemoryRegionNV-decompressionMethod-parameter
    decompressionMethod 必须VkMemoryDecompressionMethodFlagBitsNV 值的有效组合。

  • VUID-VkDecompressMemoryRegionNV-decompressionMethod-requiredbitmask
    decompressionMethod 必须不能为 0

要通过在缓冲区中间接指定解压缩参数来解压缩一个或多个内存区域之间的数据,请调用:

// Provided by VK_NV_memory_decompression
void vkCmdDecompressMemoryIndirectCountNV(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             indirectCommandsAddress,
    VkDeviceAddress                             indirectCommandsCountAddress,
    uint32_t                                    stride);
  • commandBuffer 是命令将被记录到的命令缓冲区。

  • indirectCommandsAddress 是包含解压缩参数的设备地址,这些参数布局为 VkDecompressMemoryRegionNV 结构的数组。

  • indirectCommandsCountAddress 是包含解压缩计数的设备地址。

  • stride 是从 indirectCommandsAddress 开始的连续解压缩参数集之间的字节步幅。

indirectCommandsAddress 中指定的每个区域都根据指定的解压缩方法从源区域解压缩到目标区域。

有效使用
  • VUID-vkCmdDecompressMemoryIndirectCountNV-None-07692
    必须启用 memoryDecompression 功能

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsAddress-07693
    如果 indirectCommandsAddress 来自非稀疏缓冲区,则它必须完整且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsAddress-07694
    indirectCommandsAddress 来自的 VkBuffer 必须已使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位创建。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-offset-07695
    offset 必须4 的倍数。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsCountAddress-07696
    如果 indirectCommandsCountAddress 来自非稀疏缓冲区,则它必须完整且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsCountAddress-07697
    indirectCommandsCountAddress 来自的 VkBuffer 必须已使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位创建。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsCountAddress-07698
    indirectCommandsCountAddress 必须4 的倍数。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsCountAddress-07699
    存储在 indirectCommandsCountAddress 中的计数必须小于或等于 VkPhysicalDeviceMemoryDecompressionPropertiesNV::maxDecompressionIndirectCount

  • VUID-vkCmdDecompressMemoryIndirectCountNV-stride-07700
    stride 必须4 的倍数,并且必须大于或等于 sizeof(VkDecompressMemoryRegionNV)。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsCountAddress-07701
    如果存储在 indirectCommandsCountAddress 中的计数等于 1,则 (offset + sizeof(VkDecompressMemoryRegionNV)) 必须小于或等于 indirectCommandsAddress 来自的 VkBuffer 的大小。

  • VUID-vkCmdDecompressMemoryIndirectCountNV-indirectCommandsCountAddress-07702
    如果存储在 indirectCommandsCountAddress 中的计数大于 1,则 indirectCommandsAddress + sizeof(VkDecompressMemoryRegionNV) + (stride × (存储在 countBuffer 中的计数 - 1)) 必须小于或等于 indirectCommandsAddress 创建自的 VkBuffer 中的最后一个有效地址。

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

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

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

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

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

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

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

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

主要
辅助

外部

外部

图形
计算

操作

VkDecompressMemoryRegionNV::decompressionMethod 中可以设置的位指定要选择的解压缩方法,或者在 VkPhysicalDeviceMemoryDecompressionPropertiesNV::decompressionMethods 中返回的位指定可用的解压缩方法为:

// Provided by VK_NV_memory_decompression
// Flag bits for VkMemoryDecompressionMethodFlagBitsNV
typedef VkFlags64 VkMemoryDecompressionMethodFlagBitsNV;
static const VkMemoryDecompressionMethodFlagBitsNV VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = 0x00000001ULL;
  • VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV 指定使用 GDeflate 1.0 算法来解压缩数据。

// Provided by VK_NV_memory_decompression
typedef VkFlags64 VkMemoryDecompressionMethodFlagsNV;

VkMemoryDecompressionMethodFlagsNV 是一种位掩码类型,用于指定一个或多个 VkMemoryDecompressionMethodFlagBitsNV 的掩码。