光流

光流队列

VK_NV_optical_flowVkQueueFlagBits 添加了一个光流队列类型位 VK_QUEUE_OPTICAL_FLOW_BIT_NV。具有 VK_QUEUE_OPTICAL_FLOW_BIT_NV 声明队列功能的队列支持光流操作。与其他队列类型一样,应用程序必须使用 vkGetPhysicalDeviceQueueFamilyProperties 来查询物理设备是否支持光流队列。当实现报告队列系列的 VK_QUEUE_OPTICAL_FLOW_BIT_NV 位时,它声明了对 设备和队列中描述的 Vulkan 队列操作的一般支持。

光流图像格式

要枚举特定光流用法支持的图像格式,请调用

// Provided by VK_NV_optical_flow
VkResult vkGetPhysicalDeviceOpticalFlowImageFormatsNV(
    VkPhysicalDevice                            physicalDevice,
    const VkOpticalFlowImageFormatInfoNV*       pOpticalFlowImageFormatInfo,
    uint32_t*                                   pFormatCount,
    VkOpticalFlowImageFormatPropertiesNV*       pImageFormatProperties);
  • physicalDevice 是正在查询的物理设备。

  • pOpticalFlowImageFormatInfo 是指向 VkOpticalFlowImageFormatInfoNV 结构的指针,该结构指定返回信息的光流用法。

  • pFormatCount 是指向一个整数的指针,该整数与可用或查询的光流属性的数量相关,如下所述。

  • pImageFormatProperties 是指向 VkOpticalFlowImageFormatPropertiesNV 结构数组的指针,其中返回支持的格式和图像参数。

如果 pImageFormatPropertiesNULL,则在 pFormatCount 中返回给定的 physicalDevice 支持的光流属性的数量。否则,pFormatCount 必须指向应用程序设置为 pImageFormatProperties 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pImageFormatProperties 的值数量覆盖。如果 pFormatCount 的值小于支持的光流属性数量,则最多将 pFormatCount 个值写入 pImageFormatProperties,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示未返回所有可用的值。

在创建用作光流帧的图像之前,请使用 vkGetPhysicalDeviceFormatProperties2vkGetPhysicalDeviceImageFormatProperties2 并使用报告的格式之一查询支持的图像创建参数,并将 VkOpticalFlowImageFormatInfoNV 添加到 VkPhysicalDeviceImageFormatInfo2pNext 链。

当使用 vkGetPhysicalDeviceImageFormatProperties2 查询用于光流操作的图像的参数时,VkOpticalFlowImageFormatInfoNV::usage 字段必须包含在 VkOpticalFlowUsageFlagBitsNV 中定义的一个或多个位。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceOpticalFlowImageFormatsNV-physicalDevice-parameter
    physicalDevice 必须是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceOpticalFlowImageFormatsNV-pOpticalFlowImageFormatInfo-parameter
    pOpticalFlowImageFormatInfo 必须是指向有效 VkOpticalFlowImageFormatInfoNV 结构的有效指针

  • VUID-vkGetPhysicalDeviceOpticalFlowImageFormatsNV-pFormatCount-parameter
    pFormatCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetPhysicalDeviceOpticalFlowImageFormatsNV-pImageFormatProperties-parameter
    如果 pFormatCount 引用的值不为 0,并且 pImageFormatProperties 不为 NULL,则 pImageFormatProperties 必须是指向 pFormatCountVkOpticalFlowImageFormatPropertiesNV 结构数组的有效指针

返回码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_EXTENSION_NOT_PRESENT

  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_FORMAT_NOT_SUPPORTED

VK_FORMAT_B8G8R8A8_UNORMVK_FORMAT_R8_UNORMVK_FORMAT_G8_B8R8_2PLANE_420_UNORM 最初支持具有 光学用途 VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV 的图像。

VK_FORMAT_R16G16_SFIXED5_NV 最初支持用于具有光流用途的图像,包括 VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NVVK_OPTICAL_FLOW_USAGE_HINT_BIT_NVVK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV

VK_FORMAT_R8_UINTVK_FORMAT_R32_UINT 最初支持用于具有光流用途的图像,包括 VK_OPTICAL_FLOW_USAGE_COST_BIT_NV。建议使用 VK_FORMAT_R8_UINT,因为它具有较低的带宽。

VkOpticalFlowImageFormatInfoNV 结构定义如下:

// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowImageFormatInfoNV {
    VkStructureType              sType;
    const void*                  pNext;
    VkOpticalFlowUsageFlagsNV    usage;
} VkOpticalFlowImageFormatInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • usage 是一个 VkOpticalFlowUsageFlagBitsNV 的位掩码,用于描述图像的预期光流用途。

有效用法(隐式)
  • VUID-VkOpticalFlowImageFormatInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV

  • VUID-VkOpticalFlowImageFormatInfoNV-usage-parameter
    usage 必须VkOpticalFlowUsageFlagBitsNV 值的有效组合

  • VUID-VkOpticalFlowImageFormatInfoNV-usage-requiredbitmask
    usage 必须不能为 0

可以在 VkOpticalFlowImageFormatInfoNV::usage 中设置的位,用于控制光流用途,包括:

// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowUsageFlagBitsNV {
    VK_OPTICAL_FLOW_USAGE_UNKNOWN_NV = 0,
    VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV = 0x00000001,
    VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV = 0x00000002,
    VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV = 0x00000004,
    VK_OPTICAL_FLOW_USAGE_COST_BIT_NV = 0x00000008,
    VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV = 0x00000010,
} VkOpticalFlowUsageFlagBitsNV;
  • VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV 指定图像可以用作光流操作的输入或参考帧。

  • VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV 指定图像可以用作光流操作的输出流矢量图。

  • VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV 指定图像可以用作光流操作的提示流矢量图。

  • VK_OPTICAL_FLOW_USAGE_COST_BIT_NV 指定图像可以用作光流操作的输出成本图。

  • VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV 指定图像可以用作光流操作的全局流矢量。

// Provided by VK_NV_optical_flow
typedef VkFlags   VkOpticalFlowUsageFlagsNV;

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

VkOpticalFlowImageFormatPropertiesNV 结构定义如下:

// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowImageFormatPropertiesNV {
    VkStructureType    sType;
    const void*        pNext;
    VkFormat           format;
} VkOpticalFlowImageFormatPropertiesNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • format 是一个 VkFormat,用于指定可以与指定的光流图像用途一起使用的格式。

有效用法(隐式)
  • VUID-VkOpticalFlowImageFormatPropertiesNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV

  • VUID-VkOpticalFlowImageFormatPropertiesNV-pNext-pNext
    pNext 必须NULL

光流会话

光流会话对象

光流会话对象被抽象化并由 VkOpticalFlowSessionNV 句柄表示

// Provided by VK_NV_optical_flow
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkOpticalFlowSessionNV)

创建光流会话

要创建光流会话对象,请调用:

// Provided by VK_NV_optical_flow
VkResult vkCreateOpticalFlowSessionNV(
    VkDevice                                    device,
    const VkOpticalFlowSessionCreateInfoNV*     pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkOpticalFlowSessionNV*                     pSession);
  • device 是创建光流会话对象的逻辑设备。

  • pCreateInfo 是一个指向 VkOpticalFlowSessionCreateInfoNV 结构的指针,该结构包含指定光流会话创建的参数。

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

  • pSession 是一个指向 VkOpticalFlowSessionNV 句柄的指针,该句柄指定当此函数返回 VK_SUCCESS 时将创建的光流会话对象。

有效用法(隐式)
  • VUID-vkCreateOpticalFlowSessionNV-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkCreateOpticalFlowSessionNV-pCreateInfo-parameter
    pCreateInfo 必须是一个指向有效 VkOpticalFlowSessionCreateInfoNV 结构的有效指针

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

  • VUID-vkCreateOpticalFlowSessionNV-pSession-parameter
    pSession 必须是一个指向 VkOpticalFlowSessionNV 句柄的有效指针

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

VkOpticalFlowSessionCreateInfoNV 结构定义如下:

// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowSessionCreateInfoNV {
    VkStructureType                      sType;
    void*                                pNext;
    uint32_t                             width;
    uint32_t                             height;
    VkFormat                             imageFormat;
    VkFormat                             flowVectorFormat;
    VkFormat                             costFormat;
    VkOpticalFlowGridSizeFlagsNV         outputGridSize;
    VkOpticalFlowGridSizeFlagsNV         hintGridSize;
    VkOpticalFlowPerformanceLevelNV      performanceLevel;
    VkOpticalFlowSessionCreateFlagsNV    flags;
} VkOpticalFlowSessionCreateInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • width 是要绑定到此光流会话的输入或参考帧的宽度(以像素为单位)。

  • height 是要绑定到此光流会话的输入或参考帧的高度(以像素为单位)。

  • imageFormat 是要绑定到此光流会话的输入和参考帧的 VkFormat

  • flowVectorFormat 是要绑定到此光流会话的流矢量图(输出或提示)的 VkFormat

  • costFormat 是要绑定到此光流会话的成本图的 VkFormat

  • outputGridSizeVkOpticalFlowGridSizeFlagsNV 的一个位,指定要绑定到此光流会话的输出流和成本图的网格大小。输出流和成本图的大小由 VkOpticalFlowSessionCreateInfoNV::widthVkOpticalFlowSessionCreateInfoNV::height 除以 VkOpticalFlowSessionCreateInfoNV::outputGridSize 确定。

  • hintGridSizeVkOpticalFlowGridSizeFlagsNV 的一个位,指定要绑定到此光流会话的提示流矢量图的网格大小。提示图的大小由 VkOpticalFlowSessionCreateInfoNV::widthVkOpticalFlowSessionCreateInfoNV::height 除以 VkOpticalFlowSessionCreateInfoNV::hintGridSize 确定。

  • performanceLevel 是用于此光流会话的 VkOpticalFlowPerformanceLevelNV

  • flags 是用于此光流会话的 VkOpticalFlowSessionCreateFlagsNV

有效用法
  • VUID-VkOpticalFlowSessionCreateInfoNV-width-07581
    width 必须大于或等于 VkPhysicalDeviceOpticalFlowPropertiesNV::minWidth,并且小于或等于 VkPhysicalDeviceOpticalFlowPropertiesNV::maxWidth

  • VUID-VkOpticalFlowSessionCreateInfoNV-height-07582
    height 必须大于或等于 VkPhysicalDeviceOpticalFlowPropertiesNV::minHeight,并且小于或等于 VkPhysicalDeviceOpticalFlowPropertiesNV::maxHeight

  • VUID-VkOpticalFlowSessionCreateInfoNV-imageFormat-07583
    imageFormat 必须vkGetPhysicalDeviceOpticalFlowImageFormatsNVVK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV 返回的格式之一

  • VUID-VkOpticalFlowSessionCreateInfoNV-flowVectorFormat-07584
    flowVectorFormat 必须vkGetPhysicalDeviceOpticalFlowImageFormatsNVVK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV 返回的格式之一

  • VUID-VkOpticalFlowSessionCreateInfoNV-costFormat-07585
    如果 flags 中设置了 VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV,则 costFormat 必须vkGetPhysicalDeviceOpticalFlowImageFormatsNVVK_OPTICAL_FLOW_USAGE_COST_BIT_NV 返回的格式之一

  • VUID-VkOpticalFlowSessionCreateInfoNV-outputGridSize-07586
    outputGridSize 必须VkPhysicalDeviceOpticalFlowPropertiesNV::supportedOutputGridSizes 中报告的位之一

  • VUID-VkOpticalFlowSessionCreateInfoNV-hintGridSize-07587
    如果 flags 中设置了 VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV,则 hintGridSize 必须VkPhysicalDeviceOpticalFlowPropertiesNV::supportedHintGridSizes 中报告的位之一

  • VUID-VkOpticalFlowSessionCreateInfoNV-flags-07588
    如果 VkPhysicalDeviceOpticalFlowPropertiesNV::hintSupportedVK_FALSE,则 flags必须未设置 VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV

  • VUID-VkOpticalFlowSessionCreateInfoNV-flags-07589
    如果 VkPhysicalDeviceOpticalFlowPropertiesNV::costSupportedVK_FALSE,则 flags必须未设置 VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV

  • VUID-VkOpticalFlowSessionCreateInfoNV-flags-07590
    如果 VkPhysicalDeviceOpticalFlowPropertiesNV::globalFlowSupportedVK_FALSE,则 flags必须未设置 VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV

  • VUID-VkOpticalFlowSessionCreateInfoNV-flags-07591
    如果 VkPhysicalDeviceOpticalFlowPropertiesNV::maxNumRegionsOfInterest 为 0,则 flags必须未设置 VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV

  • VUID-VkOpticalFlowSessionCreateInfoNV-flags-07592
    如果 VkPhysicalDeviceOpticalFlowPropertiesNV::bidirectionalFlowSupportedVK_FALSE,则 flags必须未设置 VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV

有效用法(隐式)
  • VUID-VkOpticalFlowSessionCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_INFO_NV

  • VUID-VkOpticalFlowSessionCreateInfoNV-pNext-pNext
    pNext 必须NULL 或指向 VkOpticalFlowSessionCreatePrivateDataInfoNV 的有效实例的指针

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

  • VUID-VkOpticalFlowSessionCreateInfoNV-imageFormat-parameter
    imageFormat 必须是有效的 VkFormat

  • VUID-VkOpticalFlowSessionCreateInfoNV-flowVectorFormat-parameter
    flowVectorFormat 必须是有效的 VkFormat

  • VUID-VkOpticalFlowSessionCreateInfoNV-costFormat-parameter
    如果 costFormat 不为 0,则 costFormat 必须是有效的 VkFormat

  • VUID-VkOpticalFlowSessionCreateInfoNV-outputGridSize-parameter
    outputGridSize 必须VkOpticalFlowGridSizeFlagBitsNV 值的有效组合

  • VUID-VkOpticalFlowSessionCreateInfoNV-outputGridSize-requiredbitmask
    outputGridSize 必须不为 0

  • VUID-VkOpticalFlowSessionCreateInfoNV-hintGridSize-parameter
    hintGridSize 必须VkOpticalFlowGridSizeFlagBitsNV 值的有效组合

  • VUID-VkOpticalFlowSessionCreateInfoNV-performanceLevel-parameter
    如果 performanceLevel 不为 0,则 performanceLevel 必须是有效的 VkOpticalFlowPerformanceLevelNV

  • VUID-VkOpticalFlowSessionCreateInfoNV-flags-parameter
    flags 必须VkOpticalFlowSessionCreateFlagBitsNV 值的有效组合

VkOpticalFlowSessionCreatePrivateDataInfoNV 结构仅供 NV 内部使用,其定义如下:

// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowSessionCreatePrivateDataInfoNV {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           id;
    uint32_t           size;
    const void*        pPrivateData;
} VkOpticalFlowSessionCreatePrivateDataInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • id 是数据的标识符,该数据在 VkOpticalFlowSessionCreatePrivateDataInfoNV::pPrivateData 中指定的内存位置传递。

  • size 是在 VkOpticalFlowSessionCreatePrivateDataInfoNV::pPrivateData 中指定的内存位置传递的数据的大小(以字节为单位)。

  • pPrivateData 是指向 NV 内部数据的指针。

有效用法(隐式)
  • VUID-VkOpticalFlowSessionCreatePrivateDataInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV

  • VUID-VkOpticalFlowSessionCreatePrivateDataInfoNV-pPrivateData-parameter
    pPrivateData 必须是指针值

光流向量是按块生成的,每个 NxN 像素块(称为网格)有一个向量。

可以在 VkOpticalFlowSessionCreateInfoNV::outputGridSizeVkOpticalFlowSessionCreateInfoNV::hintGridSize 中设置,或者在 VkPhysicalDeviceOpticalFlowPropertiesNV::supportedOutputGridSizesVkPhysicalDeviceOpticalFlowPropertiesNV::supportedHintGridSizes 中返回的用于控制光流网格大小的位是:

// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowGridSizeFlagBitsNV {
    VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV = 0,
    VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV = 0x00000001,
    VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV = 0x00000002,
    VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV = 0x00000004,
    VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV = 0x00000008,
} VkOpticalFlowGridSizeFlagBitsNV;
  • VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV 指定网格为 1x1 像素。

  • VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV 指定网格为 2x2 像素。

  • VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV 指定网格为 4x4 像素。

  • VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV 指定网格为 8x8 像素。

// Provided by VK_NV_optical_flow
typedef VkFlags   VkOpticalFlowGridSizeFlagsNV;

VkOpticalFlowGridSizeFlagsNV 是用于设置零个或多个 VkOpticalFlowGridSizeFlagBitsNV 的掩码的位掩码类型。

光流公开了应用程序可以根据所需的性能和质量要求选择的性能级别。

光流性能级别类型定义如下:

// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowPerformanceLevelNV {
    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_UNKNOWN_NV = 0,
    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV = 1,
    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV = 2,
    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV = 3,
} VkOpticalFlowPerformanceLevelNV;
  • VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV 是性能较慢但质量较高的级别。

  • VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV 是具有中等性能和中等质量的级别。

  • VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV 是一个预设值,它具有更高的性能,但质量较低。

VkOpticalFlowSessionCreateInfoNV::flags可以设置的位,用于控制光流会话操作,包括:

// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowSessionCreateFlagBitsNV {
    VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV = 0x00000001,
    VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV = 0x00000002,
    VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV = 0x00000004,
    VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV = 0x00000008,
    VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV = 0x00000010,
} VkOpticalFlowSessionCreateFlagBitsNV;
  • VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV 指定将使用带有外部流向量的 VkImageView 作为运动搜索的提示,并且必须绑定到 VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV

  • VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV 指定前向流的代价将在一个 VkImageView 中生成,该视图必须绑定到 VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV。此外,如果还设置了 VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV,则反向流的代价将在一个 VkImageView 中生成,该视图必须绑定到 VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV。代价是帧中每个网格的流向量的置信度。代价表示流向量的(不)准确程度。较高的代价值表示流向量不太准确,反之亦然。

  • VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV 指定全局流向量将从前向流中估计,并在单个像素的 VkImageView 中输出,该视图必须绑定到 VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV

  • VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV 指定可以在 VkOpticalFlowExecuteInfoNV 中指定感兴趣的区域。

  • VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV 指定除了始终生成的前向流之外,还会生成反向流。

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

// Provided by VK_NV_optical_flow
typedef VkFlags   VkOpticalFlowSessionCreateFlagsNV;

销毁光流会话

要销毁光流会话对象,请调用

// Provided by VK_NV_optical_flow
void vkDestroyOpticalFlowSessionNV(
    VkDevice                                    device,
    VkOpticalFlowSessionNV                      session,
    const VkAllocationCallbacks*                pAllocator);
  • device 是用于创建光流会话的设备。

  • session 是要销毁的光流会话。

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

有效用法(隐式)
  • VUID-vkDestroyOpticalFlowSessionNV-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkDestroyOpticalFlowSessionNV-session-parameter
    session 必须是有效的 VkOpticalFlowSessionNV 句柄

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

  • VUID-vkDestroyOpticalFlowSessionNV-session-parent
    session 必须已从 device 创建、分配或检索

将 Vulkan 图像视图绑定到光流会话

要将 Vulkan 图像绑定到光流会话对象,请调用

// Provided by VK_NV_optical_flow
VkResult vkBindOpticalFlowSessionImageNV(
    VkDevice                                    device,
    VkOpticalFlowSessionNV                      session,
    VkOpticalFlowSessionBindingPointNV          bindingPoint,
    VkImageView                                 view,
    VkImageLayout                               layout);
  • device 是拥有光流会话对象 session 的设备。

  • session 是要绑定图像视图的光流会话对象。

  • bindingPoint 指定要绑定图像视图的绑定点 VkOpticalFlowSessionBindingPointNV

  • view 是要绑定的 VkImageView

  • layout 必须指定在 vkCmdOpticalFlowExecuteNVVkDevice 上计算光流向量时,从 view 可访问的图像子资源的布局。

有效用法(隐式)
  • VUID-vkBindOpticalFlowSessionImageNV-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkBindOpticalFlowSessionImageNV-session-parameter
    session 必须是有效的 VkOpticalFlowSessionNV 句柄

  • VUID-vkBindOpticalFlowSessionImageNV-bindingPoint-parameter
    bindingPoint 必须是有效的 VkOpticalFlowSessionBindingPointNV

  • VUID-vkBindOpticalFlowSessionImageNV-view-parameter
    如果 view 不是 VK_NULL_HANDLE,则 view 必须是有效的 VkImageView 句柄

  • VUID-vkBindOpticalFlowSessionImageNV-layout-parameter
    layout 必须是有效的 VkImageLayout

  • VUID-vkBindOpticalFlowSessionImageNV-session-parent
    session 必须已从 device 创建、分配或检索

  • VUID-vkBindOpticalFlowSessionImageNV-view-parent
    如果 view 是有效的句柄,则它必须已从 device 创建、分配或检索

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

光流会话绑定点定义如下:

// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowSessionBindingPointNV {
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_UNKNOWN_NV = 0,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV = 1,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV = 2,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV = 3,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV = 4,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV = 5,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV = 6,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV = 7,
    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV = 8,
} VkOpticalFlowSessionBindingPointNV;
  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV 指定输入帧的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV 指定输入参考帧的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV 指定可选的外部提示流向量的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV 指定默认前向流计算的输出流向量的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV 指定可选的反向流计算的可选输出流向量图的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV 指定默认前向流计算的可选输出代价图的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV 指定可选的反向流计算的可选输出代价图的绑定点。

  • VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV 指定默认前向流计算的可选全局流值的绑定点。

光流执行

流估计的默认方向是前向,它计算从输入帧到参考帧的光流。可选地,还可以额外计算反向流估计。输出流向量 (Vx, Vy) 表示输入帧的当前像素 (x, y) 可以在参考帧中的位置 (x+Vx, y+Vy) 找到。反向流向量 (Vx, Vy) 表示参考帧的当前像素 (x, y) 可以在输入帧中的位置 (x+Vx, y+Vy) 找到。

要从两个输入帧计算光流向量,请调用

// Provided by VK_NV_optical_flow
void vkCmdOpticalFlowExecuteNV(
    VkCommandBuffer                             commandBuffer,
    VkOpticalFlowSessionNV                      session,
    const VkOpticalFlowExecuteInfoNV*           pExecuteInfo);
  • commandBuffer 是将要记录命令的命令缓冲区。

  • session 是此命令在其上操作的光流会话对象。

  • pExecuteInfo Info 是指向 VkOpticalFlowExecuteInfoNV 的指针。

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

  • VUID-vkCmdOpticalFlowExecuteNV-session-parameter
    session 必须是有效的 VkOpticalFlowSessionNV 句柄

  • VUID-vkCmdOpticalFlowExecuteNV-pExecuteInfo-parameter
    pExecuteInfo 必须 是指向有效 VkOpticalFlowExecuteInfoNV 结构的有效指针

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

  • VUID-vkCmdOpticalFlowExecuteNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持光流操作

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

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

  • VUID-vkCmdOpticalFlowExecuteNV-commonparent
    commandBuffersession必须从同一个 VkDevice 创建、分配或检索。

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

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

主要
次要

外部

外部

光流

动作

VkOpticalFlowExecuteInfoNV 结构定义如下

// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowExecuteInfoNV {
    VkStructureType                sType;
    void*                          pNext;
    VkOpticalFlowExecuteFlagsNV    flags;
    uint32_t                       regionCount;
    const VkRect2D*                pRegions;
} VkOpticalFlowExecuteInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是用于此命令的 VkOpticalFlowExecuteFlagsNV

  • regionCount 是在 pRegions 中指定的感兴趣区域的数量。

  • pRegions 是指向 regionCountVkRect2D 感兴趣区域的指针。

有效用法
  • VUID-VkOpticalFlowExecuteInfoNV-regionCount-07593
    如果未为在其上执行此命令的 VkOpticalFlowSessionNV 设置 VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV,则 regionCount 必须为 0

有效用法(隐式)
  • VUID-VkOpticalFlowExecuteInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV

  • VUID-VkOpticalFlowExecuteInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkOpticalFlowExecuteInfoNV-flags-parameter
    flags 必须VkOpticalFlowExecuteFlagBitsNV 值的有效组合

  • VUID-VkOpticalFlowExecuteInfoNV-pRegions-parameter
    如果 regionCount 不为 0,则 pRegions 必须是指向 regionCountVkRect2D 结构数组的有效指针

VkOpticalFlowExecuteInfoNV::flags可以设置的位,用于控制光流执行,有

// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowExecuteFlagBitsNV {
    VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV = 0x00000001,
} VkOpticalFlowExecuteFlagBitsNV;
  • VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV 指定不使用先前生成的流向量的时间提示。 如果启用时间提示,则来自先前 vkCmdOpticalFlowExecuteNV 调用的光流向量将自动用作当前 vkCmdOpticalFlowExecuteNV 调用的提示,以利用视频序列中的时间相关性。 如果事先知道没有时间相关性(例如,场景变化、独立的连续帧对),则应禁用时间提示。

VkOpticalFlowExecuteFlagsNV 是一种位掩码类型,用于设置零个或多个 VkOpticalFlowExecuteFlagBitsNV 的掩码。

// Provided by VK_NV_optical_flow
typedef VkFlags   VkOpticalFlowExecuteFlagsNV;