{-# language CPP #-} -- | = Name -- -- VK_NV_optical_flow - device extension -- -- == VK_NV_optical_flow -- -- [__Name String__] -- @VK_NV_optical_flow@ -- -- [__Extension Type__] -- Device extension -- -- [__Registered Extension Number__] -- 465 -- -- [__Revision__] -- 1 -- -- [__Extension and Version Dependencies__] -- -- - Requires support for Vulkan 1.0 -- -- - Requires @VK_KHR_get_physical_device_properties2@ to be enabled -- for any device-level functionality -- -- - Requires @VK_KHR_format_feature_flags2@ to be enabled for any -- device-level functionality -- -- - Requires @VK_KHR_synchronization2@ to be enabled for any -- device-level functionality -- -- [__Contact__] -- -- - Carsten Rohde -- -- -- == Other Extension Metadata -- -- [__Last Modified Date__] -- 2022-09-26 -- -- [__Contributors__] -- -- - Carsten Rohde, NVIDIA -- -- - Vipul Parashar, NVIDIA -- -- - Jeff Bolz, NVIDIA -- -- - Eric Werness, NVIDIA -- -- == Description -- -- Optical flow are fundamental algorithms in computer vision (CV) area. -- This extension allows applications to estimate 2D displacement of pixels -- between two frames. -- -- == New Object Types -- -- - 'Vulkan.Extensions.Handles.OpticalFlowSessionNV' -- -- == New Commands -- -- - 'bindOpticalFlowSessionImageNV' -- -- - 'cmdOpticalFlowExecuteNV' -- -- - 'createOpticalFlowSessionNV' -- -- - 'destroyOpticalFlowSessionNV' -- -- - 'getPhysicalDeviceOpticalFlowImageFormatsNV' -- -- == New Structures -- -- - 'OpticalFlowExecuteInfoNV' -- -- - 'OpticalFlowImageFormatPropertiesNV' -- -- - 'OpticalFlowSessionCreateInfoNV' -- -- - Extending 'OpticalFlowSessionCreateInfoNV': -- -- - 'OpticalFlowSessionCreatePrivateDataInfoNV' -- -- - Extending -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2', -- 'Vulkan.Core10.Device.DeviceCreateInfo': -- -- - 'PhysicalDeviceOpticalFlowFeaturesNV' -- -- - Extending -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2', -- 'Vulkan.Core10.Image.ImageCreateInfo': -- -- - 'OpticalFlowImageFormatInfoNV' -- -- - Extending -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2': -- -- - 'PhysicalDeviceOpticalFlowPropertiesNV' -- -- == New Enums -- -- - 'OpticalFlowExecuteFlagBitsNV' -- -- - 'OpticalFlowGridSizeFlagBitsNV' -- -- - 'OpticalFlowPerformanceLevelNV' -- -- - 'OpticalFlowSessionBindingPointNV' -- -- - 'OpticalFlowSessionCreateFlagBitsNV' -- -- - 'OpticalFlowUsageFlagBitsNV' -- -- == New Bitmasks -- -- - 'OpticalFlowExecuteFlagsNV' -- -- - 'OpticalFlowGridSizeFlagsNV' -- -- - 'OpticalFlowSessionCreateFlagsNV' -- -- - 'OpticalFlowUsageFlagsNV' -- -- == New Enum Constants -- -- - 'NV_OPTICAL_FLOW_EXTENSION_NAME' -- -- - 'NV_OPTICAL_FLOW_SPEC_VERSION' -- -- - Extending 'Vulkan.Core13.Enums.AccessFlags2.AccessFlagBits2': -- -- - 'Vulkan.Core13.Enums.AccessFlags2.ACCESS_2_OPTICAL_FLOW_READ_BIT_NV' -- -- - 'Vulkan.Core13.Enums.AccessFlags2.ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV' -- -- - Extending 'Vulkan.Core10.Enums.Format.Format': -- -- - 'Vulkan.Core10.Enums.Format.FORMAT_R16G16_S10_5_NV' -- -- - Extending -- 'Vulkan.Core13.Enums.FormatFeatureFlags2.FormatFeatureFlagBits2': -- -- - 'Vulkan.Core13.Enums.FormatFeatureFlags2.FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV' -- -- - 'Vulkan.Core13.Enums.FormatFeatureFlags2.FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV' -- -- - 'Vulkan.Core13.Enums.FormatFeatureFlags2.FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV' -- -- - Extending 'Vulkan.Core10.Enums.ObjectType.ObjectType': -- -- - 'Vulkan.Core10.Enums.ObjectType.OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV' -- -- - Extending -- 'Vulkan.Core13.Enums.PipelineStageFlags2.PipelineStageFlagBits2': -- -- - 'Vulkan.Core13.Enums.PipelineStageFlags2.PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV' -- -- - Extending 'Vulkan.Core10.Enums.QueueFlagBits.QueueFlagBits': -- -- - 'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_OPTICAL_FLOW_BIT_NV' -- -- - Extending 'Vulkan.Core10.Enums.StructureType.StructureType': -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_INFO_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV' -- -- == Examples -- -- > // Example querying available input formats -- > VkOpticalFlowImageFormatInfoNV ofFormatInfo = { VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV }; -- > ofFormatInfo.usage = VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV; -- > -- > uint32_t count = 0; -- > vkGetPhysicalDeviceOpticalFlowImageFormatsNV(physicalDevice, &ofFormatInfo, &count, NULL); -- > VkOpticalFlowImageFormatPropertiesNV* fmt = new VkOpticalFlowImageFormatPropertiesNV[count]; -- > memset(fmt, 0, count * sizeof(VkOpticalFlowImageFormatPropertiesNV)); -- > for (uint32_t i = 0; i < count; i++) { -- > fmt[i].sType = VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV; -- > } -- > vkGetPhysicalDeviceOpticalFlowImageFormatsNV(physicalDevice, &ofFormatInfo, &count, fmt); -- > -- > // Pick one of the available formats -- > VkFormat inputFormat = fmt[0].format; -- > -- > // Check feature support for optimal tiling -- > VkFormatProperties3 formatProperties3 = { VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3 }; -- > VkFormatProperties2 formatProperties2 = { VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, &formatProperties3 }; -- > vkGetPhysicalDeviceFormatProperties2(physicalDevice, inputFormat, &formatProperties2); -- > if (!(formatProperties3.optimalTilingFeatures & VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV)) { -- > return false; -- > } -- > -- > // Check support for image creation parameters -- > VkPhysicalDeviceImageFormatInfo2 imageFormatInfo2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, &ofFormatInfo }; -- > imageFormatInfo2.format = inputFormat; -- > imageFormatInfo2.type = VK_IMAGE_TYPE_2D; -- > imageFormatInfo2.tiling = VK_IMAGE_TILING_OPTIMAL; -- > imageFormatInfo2.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; -- > -- > VkImageFormatProperties2 imageFormatProperties2 = { VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2 }; -- > if (vkGetPhysicalDeviceImageFormatProperties2(physicalDevice, &imageFormatInfo2, &imageFormatProperties2) != VK_SUCCESS) { -- > return false; -- > } -- > -- > VkImageCreateInfo imageCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, &ofFormatInfo }; -- > imageCreateInfo.imageType = VK_IMAGE_TYPE_2D; -- > imageCreateInfo.format = inputFormat; -- > imageCreateInfo.extent = { width, height, (uint32_t)1}; -- > imageCreateInfo.mipLevels = 1; -- > imageCreateInfo.arrayLayers = 1; -- > imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT; -- > imageCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;; -- > imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL; -- > -- > vkCreateImage(device, &imageCreateInfo, NULL, &input); -- > "allocate memory, bind image, create view" -- > -- > "do the same for reference and output" -- > -- > // Create optical flow session -- > VkOpticalFlowSessionCreateInfoNV sessionCreateInfo = { VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_INFO_NV }; -- > sessionCreateInfo.width = width; -- > sessionCreateInfo.height = height; -- > sessionCreateInfo.imageFormat = inputFormat; -- > sessionCreateInfo.flowVectorFormat = outputFormat; -- > sessionCreateInfo.outputGridSize = VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV; -- > sessionCreateInfo.performanceLevel = VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV; -- > VkOpticalFlowSessionNV session; -- > vkCreateOpticalFlowSessionNV(device, &sessionCreateInfo, NULL, &session); -- > -- > "allocate command buffer" -- > -- > "transfer images to VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV" -- > "transfer input images to VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV and output image to VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV" -- > -- > vkBindOpticalFlowSessionImageNV(device, session, VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV, inputView, VK_IMAGE_LAYOUT_GENERAL); -- > vkBindOpticalFlowSessionImageNV(device, session, VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV, refView, VK_IMAGE_LAYOUT_GENERAL); -- > vkBindOpticalFlowSessionImageNV(device, session, VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV, outputView, VK_IMAGE_LAYOUT_GENERAL); -- > -- > VkOpticalFlowExecuteInfoNV opticalFlowExecuteInfo = { VK_STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV }; -- > vkCmdOpticalFlowExecuteNV(cmd, session, &opticalFlowExecuteInfo); -- > -- > "submit command buffer" -- -- == Version History -- -- - Revision 1, 2022-09-26 (Carsten Rohde) -- -- - Internal revisions -- -- == See Also -- -- 'OpticalFlowExecuteFlagBitsNV', 'OpticalFlowExecuteFlagsNV', -- 'OpticalFlowExecuteInfoNV', 'OpticalFlowGridSizeFlagBitsNV', -- 'OpticalFlowGridSizeFlagsNV', 'OpticalFlowImageFormatInfoNV', -- 'OpticalFlowImageFormatPropertiesNV', 'OpticalFlowPerformanceLevelNV', -- 'OpticalFlowSessionBindingPointNV', -- 'OpticalFlowSessionCreateFlagBitsNV', 'OpticalFlowSessionCreateFlagsNV', -- 'OpticalFlowSessionCreateInfoNV', -- 'OpticalFlowSessionCreatePrivateDataInfoNV', -- 'Vulkan.Extensions.Handles.OpticalFlowSessionNV', -- 'OpticalFlowUsageFlagBitsNV', 'OpticalFlowUsageFlagsNV', -- 'PhysicalDeviceOpticalFlowFeaturesNV', -- 'PhysicalDeviceOpticalFlowPropertiesNV', -- 'bindOpticalFlowSessionImageNV', 'cmdOpticalFlowExecuteNV', -- 'createOpticalFlowSessionNV', 'destroyOpticalFlowSessionNV', -- 'getPhysicalDeviceOpticalFlowImageFormatsNV' -- -- == Document Notes -- -- For more information, see the -- -- -- This page is a generated document. Fixes and changes should be made to -- the generator scripts, not directly. module Vulkan.Extensions.VK_NV_optical_flow ( OpticalFlowExecuteInfoNV , OpticalFlowImageFormatInfoNV , OpticalFlowImageFormatPropertiesNV , OpticalFlowSessionCreateInfoNV , OpticalFlowSessionCreatePrivateDataInfoNV , PhysicalDeviceOpticalFlowFeaturesNV , PhysicalDeviceOpticalFlowPropertiesNV , OpticalFlowSessionBindingPointNV ) where import Vulkan.CStruct (FromCStruct) import Vulkan.CStruct (ToCStruct) import Data.Kind (Type) import {-# SOURCE #-} Vulkan.CStruct.Extends (Chain) import {-# SOURCE #-} Vulkan.CStruct.Extends (Extendss) import {-# SOURCE #-} Vulkan.CStruct.Extends (PeekChain) import {-# SOURCE #-} Vulkan.CStruct.Extends (PokeChain) data OpticalFlowExecuteInfoNV instance ToCStruct OpticalFlowExecuteInfoNV instance Show OpticalFlowExecuteInfoNV instance FromCStruct OpticalFlowExecuteInfoNV data OpticalFlowImageFormatInfoNV instance ToCStruct OpticalFlowImageFormatInfoNV instance Show OpticalFlowImageFormatInfoNV instance FromCStruct OpticalFlowImageFormatInfoNV data OpticalFlowImageFormatPropertiesNV instance ToCStruct OpticalFlowImageFormatPropertiesNV instance Show OpticalFlowImageFormatPropertiesNV instance FromCStruct OpticalFlowImageFormatPropertiesNV type role OpticalFlowSessionCreateInfoNV nominal data OpticalFlowSessionCreateInfoNV (es :: [Type]) instance ( Extendss OpticalFlowSessionCreateInfoNV es , PokeChain es ) => ToCStruct (OpticalFlowSessionCreateInfoNV es) instance Show (Chain es) => Show (OpticalFlowSessionCreateInfoNV es) instance ( Extendss OpticalFlowSessionCreateInfoNV es , PeekChain es ) => FromCStruct (OpticalFlowSessionCreateInfoNV es) data OpticalFlowSessionCreatePrivateDataInfoNV instance ToCStruct OpticalFlowSessionCreatePrivateDataInfoNV instance Show OpticalFlowSessionCreatePrivateDataInfoNV instance FromCStruct OpticalFlowSessionCreatePrivateDataInfoNV data PhysicalDeviceOpticalFlowFeaturesNV instance ToCStruct PhysicalDeviceOpticalFlowFeaturesNV instance Show PhysicalDeviceOpticalFlowFeaturesNV instance FromCStruct PhysicalDeviceOpticalFlowFeaturesNV data PhysicalDeviceOpticalFlowPropertiesNV instance ToCStruct PhysicalDeviceOpticalFlowPropertiesNV instance Show PhysicalDeviceOpticalFlowPropertiesNV instance FromCStruct PhysicalDeviceOpticalFlowPropertiesNV data OpticalFlowSessionBindingPointNV