1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#ifndef AVUTIL_HWCONTEXT_VULKAN_H 20cabdff1aSopenharmony_ci#define AVUTIL_HWCONTEXT_VULKAN_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#if defined(_WIN32) && !defined(VK_USE_PLATFORM_WIN32_KHR) 23cabdff1aSopenharmony_ci#define VK_USE_PLATFORM_WIN32_KHR 24cabdff1aSopenharmony_ci#endif 25cabdff1aSopenharmony_ci#include <vulkan/vulkan.h> 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "pixfmt.h" 28cabdff1aSopenharmony_ci#include "frame.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci/** 31cabdff1aSopenharmony_ci * @file 32cabdff1aSopenharmony_ci * API-specific header for AV_HWDEVICE_TYPE_VULKAN. 33cabdff1aSopenharmony_ci * 34cabdff1aSopenharmony_ci * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs 35cabdff1aSopenharmony_ci * with the data pointer set to an AVVkFrame. 36cabdff1aSopenharmony_ci */ 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci/** 39cabdff1aSopenharmony_ci * Main Vulkan context, allocated as AVHWDeviceContext.hwctx. 40cabdff1aSopenharmony_ci * All of these can be set before init to change what the context uses 41cabdff1aSopenharmony_ci */ 42cabdff1aSopenharmony_citypedef struct AVVulkanDeviceContext { 43cabdff1aSopenharmony_ci /** 44cabdff1aSopenharmony_ci * Custom memory allocator, else NULL 45cabdff1aSopenharmony_ci */ 46cabdff1aSopenharmony_ci const VkAllocationCallbacks *alloc; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci /** 49cabdff1aSopenharmony_ci * Pointer to the instance-provided vkGetInstanceProcAddr loading function. 50cabdff1aSopenharmony_ci * If NULL, will pick either libvulkan or libvolk, depending on libavutil's 51cabdff1aSopenharmony_ci * compilation settings, and set this field. 52cabdff1aSopenharmony_ci */ 53cabdff1aSopenharmony_ci PFN_vkGetInstanceProcAddr get_proc_addr; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci /** 56cabdff1aSopenharmony_ci * Vulkan instance. Must be at least version 1.2. 57cabdff1aSopenharmony_ci */ 58cabdff1aSopenharmony_ci VkInstance inst; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci /** 61cabdff1aSopenharmony_ci * Physical device 62cabdff1aSopenharmony_ci */ 63cabdff1aSopenharmony_ci VkPhysicalDevice phys_dev; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci /** 66cabdff1aSopenharmony_ci * Active device 67cabdff1aSopenharmony_ci */ 68cabdff1aSopenharmony_ci VkDevice act_dev; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci /** 71cabdff1aSopenharmony_ci * This structure should be set to the set of features that present and enabled 72cabdff1aSopenharmony_ci * during device creation. When a device is created by FFmpeg, it will default to 73cabdff1aSopenharmony_ci * enabling all that are present of the shaderImageGatherExtended, 74cabdff1aSopenharmony_ci * fragmentStoresAndAtomics, shaderInt64 and vertexPipelineStoresAndAtomics features. 75cabdff1aSopenharmony_ci */ 76cabdff1aSopenharmony_ci VkPhysicalDeviceFeatures2 device_features; 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci /** 79cabdff1aSopenharmony_ci * Enabled instance extensions. 80cabdff1aSopenharmony_ci * If supplying your own device context, set this to an array of strings, with 81cabdff1aSopenharmony_ci * each entry containing the specified Vulkan extension string to enable. 82cabdff1aSopenharmony_ci * Duplicates are possible and accepted. 83cabdff1aSopenharmony_ci * If no extensions are enabled, set these fields to NULL, and 0 respectively. 84cabdff1aSopenharmony_ci */ 85cabdff1aSopenharmony_ci const char * const *enabled_inst_extensions; 86cabdff1aSopenharmony_ci int nb_enabled_inst_extensions; 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci /** 89cabdff1aSopenharmony_ci * Enabled device extensions. By default, VK_KHR_external_memory_fd, 90cabdff1aSopenharmony_ci * VK_EXT_external_memory_dma_buf, VK_EXT_image_drm_format_modifier, 91cabdff1aSopenharmony_ci * VK_KHR_external_semaphore_fd and VK_EXT_external_memory_host are enabled if found. 92cabdff1aSopenharmony_ci * If supplying your own device context, these fields takes the same format as 93cabdff1aSopenharmony_ci * the above fields, with the same conditions that duplicates are possible 94cabdff1aSopenharmony_ci * and accepted, and that NULL and 0 respectively means no extensions are enabled. 95cabdff1aSopenharmony_ci */ 96cabdff1aSopenharmony_ci const char * const *enabled_dev_extensions; 97cabdff1aSopenharmony_ci int nb_enabled_dev_extensions; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci /** 100cabdff1aSopenharmony_ci * Queue family index for graphics operations, and the number of queues 101cabdff1aSopenharmony_ci * enabled for it. If unavaiable, will be set to -1. Not required. 102cabdff1aSopenharmony_ci * av_hwdevice_create() will attempt to find a dedicated queue for each 103cabdff1aSopenharmony_ci * queue family, or pick the one with the least unrelated flags set. 104cabdff1aSopenharmony_ci * Queue indices here may overlap if a queue has to share capabilities. 105cabdff1aSopenharmony_ci */ 106cabdff1aSopenharmony_ci int queue_family_index; 107cabdff1aSopenharmony_ci int nb_graphics_queues; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci /** 110cabdff1aSopenharmony_ci * Queue family index for transfer operations and the number of queues 111cabdff1aSopenharmony_ci * enabled. Required. 112cabdff1aSopenharmony_ci */ 113cabdff1aSopenharmony_ci int queue_family_tx_index; 114cabdff1aSopenharmony_ci int nb_tx_queues; 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_ci /** 117cabdff1aSopenharmony_ci * Queue family index for compute operations and the number of queues 118cabdff1aSopenharmony_ci * enabled. Required. 119cabdff1aSopenharmony_ci */ 120cabdff1aSopenharmony_ci int queue_family_comp_index; 121cabdff1aSopenharmony_ci int nb_comp_queues; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci /** 124cabdff1aSopenharmony_ci * Queue family index for video encode ops, and the amount of queues enabled. 125cabdff1aSopenharmony_ci * If the device doesn't support such, queue_family_encode_index will be -1. 126cabdff1aSopenharmony_ci * Not required. 127cabdff1aSopenharmony_ci */ 128cabdff1aSopenharmony_ci int queue_family_encode_index; 129cabdff1aSopenharmony_ci int nb_encode_queues; 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci /** 132cabdff1aSopenharmony_ci * Queue family index for video decode ops, and the amount of queues enabled. 133cabdff1aSopenharmony_ci * If the device doesn't support such, queue_family_decode_index will be -1. 134cabdff1aSopenharmony_ci * Not required. 135cabdff1aSopenharmony_ci */ 136cabdff1aSopenharmony_ci int queue_family_decode_index; 137cabdff1aSopenharmony_ci int nb_decode_queues; 138cabdff1aSopenharmony_ci} AVVulkanDeviceContext; 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci/** 141cabdff1aSopenharmony_ci * Defines the behaviour of frame allocation. 142cabdff1aSopenharmony_ci */ 143cabdff1aSopenharmony_citypedef enum AVVkFrameFlags { 144cabdff1aSopenharmony_ci /* Unless this flag is set, autodetected flags will be OR'd based on the 145cabdff1aSopenharmony_ci * device and tiling during av_hwframe_ctx_init(). */ 146cabdff1aSopenharmony_ci AV_VK_FRAME_FLAG_NONE = (1ULL << 0), 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci /* Image planes will be allocated in a single VkDeviceMemory, rather 149cabdff1aSopenharmony_ci * than as per-plane VkDeviceMemory allocations. Required for exporting 150cabdff1aSopenharmony_ci * to VAAPI on Intel devices. */ 151cabdff1aSopenharmony_ci AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY = (1ULL << 1), 152cabdff1aSopenharmony_ci} AVVkFrameFlags; 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci/** 155cabdff1aSopenharmony_ci * Allocated as AVHWFramesContext.hwctx, used to set pool-specific options 156cabdff1aSopenharmony_ci */ 157cabdff1aSopenharmony_citypedef struct AVVulkanFramesContext { 158cabdff1aSopenharmony_ci /** 159cabdff1aSopenharmony_ci * Controls the tiling of allocated frames. If left as optimal tiling, 160cabdff1aSopenharmony_ci * then during av_hwframe_ctx_init() will decide based on whether the device 161cabdff1aSopenharmony_ci * supports DRM modifiers, or if the linear_images flag is set, otherwise 162cabdff1aSopenharmony_ci * will allocate optimally-tiled images. 163cabdff1aSopenharmony_ci */ 164cabdff1aSopenharmony_ci VkImageTiling tiling; 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci /** 167cabdff1aSopenharmony_ci * Defines extra usage of output frames. If left as 0, the following bits 168cabdff1aSopenharmony_ci * are set: TRANSFER_SRC, TRANSFER_DST. SAMPLED and STORAGE. 169cabdff1aSopenharmony_ci */ 170cabdff1aSopenharmony_ci VkImageUsageFlagBits usage; 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci /** 173cabdff1aSopenharmony_ci * Extension data for image creation. 174cabdff1aSopenharmony_ci * If VkImageDrmFormatModifierListCreateInfoEXT is present in the chain, 175cabdff1aSopenharmony_ci * and the device supports DRM modifiers, then images will be allocated 176cabdff1aSopenharmony_ci * with the specific requested DRM modifiers. 177cabdff1aSopenharmony_ci * Additional structures may be added at av_hwframe_ctx_init() time, 178cabdff1aSopenharmony_ci * which will be freed automatically on uninit(), so users need only free 179cabdff1aSopenharmony_ci * any structures they've allocated themselves. 180cabdff1aSopenharmony_ci */ 181cabdff1aSopenharmony_ci void *create_pnext; 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_ci /** 184cabdff1aSopenharmony_ci * Extension data for memory allocation. Must have as many entries as 185cabdff1aSopenharmony_ci * the number of planes of the sw_format. 186cabdff1aSopenharmony_ci * This will be chained to VkExportMemoryAllocateInfo, which is used 187cabdff1aSopenharmony_ci * to make all pool images exportable to other APIs if the necessary 188cabdff1aSopenharmony_ci * extensions are present in enabled_dev_extensions. 189cabdff1aSopenharmony_ci */ 190cabdff1aSopenharmony_ci void *alloc_pnext[AV_NUM_DATA_POINTERS]; 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci /** 193cabdff1aSopenharmony_ci * A combination of AVVkFrameFlags. Unless AV_VK_FRAME_FLAG_NONE is set, 194cabdff1aSopenharmony_ci * autodetected flags will be OR'd based on the device and tiling during 195cabdff1aSopenharmony_ci * av_hwframe_ctx_init(). 196cabdff1aSopenharmony_ci */ 197cabdff1aSopenharmony_ci AVVkFrameFlags flags; 198cabdff1aSopenharmony_ci} AVVulkanFramesContext; 199cabdff1aSopenharmony_ci 200cabdff1aSopenharmony_ci/* 201cabdff1aSopenharmony_ci * Frame structure, the VkFormat of the image will always match 202cabdff1aSopenharmony_ci * the pool's sw_format. 203cabdff1aSopenharmony_ci * All frames, imported or allocated, will be created with the 204cabdff1aSopenharmony_ci * VK_IMAGE_CREATE_ALIAS_BIT flag set, so the memory may be aliased if needed. 205cabdff1aSopenharmony_ci * 206cabdff1aSopenharmony_ci * If all queue family indices in the device context are the same, 207cabdff1aSopenharmony_ci * images will be created with the EXCLUSIVE sharing mode. Otherwise, all images 208cabdff1aSopenharmony_ci * will be created using the CONCURRENT sharing mode. 209cabdff1aSopenharmony_ci * 210cabdff1aSopenharmony_ci * @note the size of this structure is not part of the ABI, to allocate 211cabdff1aSopenharmony_ci * you must use @av_vk_frame_alloc(). 212cabdff1aSopenharmony_ci */ 213cabdff1aSopenharmony_citypedef struct AVVkFrame { 214cabdff1aSopenharmony_ci /** 215cabdff1aSopenharmony_ci * Vulkan images to which the memory is bound to. 216cabdff1aSopenharmony_ci */ 217cabdff1aSopenharmony_ci VkImage img[AV_NUM_DATA_POINTERS]; 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci /** 220cabdff1aSopenharmony_ci * The same tiling must be used for all images in the frame. 221cabdff1aSopenharmony_ci */ 222cabdff1aSopenharmony_ci VkImageTiling tiling; 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci /** 225cabdff1aSopenharmony_ci * Memory backing the images. Could be less than the amount of planes, 226cabdff1aSopenharmony_ci * in which case the offset value will indicate the binding offset of 227cabdff1aSopenharmony_ci * each plane in the memory. 228cabdff1aSopenharmony_ci */ 229cabdff1aSopenharmony_ci VkDeviceMemory mem[AV_NUM_DATA_POINTERS]; 230cabdff1aSopenharmony_ci size_t size[AV_NUM_DATA_POINTERS]; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci /** 233cabdff1aSopenharmony_ci * OR'd flags for all memory allocated 234cabdff1aSopenharmony_ci */ 235cabdff1aSopenharmony_ci VkMemoryPropertyFlagBits flags; 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci /** 238cabdff1aSopenharmony_ci * Updated after every barrier 239cabdff1aSopenharmony_ci */ 240cabdff1aSopenharmony_ci VkAccessFlagBits access[AV_NUM_DATA_POINTERS]; 241cabdff1aSopenharmony_ci VkImageLayout layout[AV_NUM_DATA_POINTERS]; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci /** 244cabdff1aSopenharmony_ci * Synchronization timeline semaphores, one for each sw_format plane. 245cabdff1aSopenharmony_ci * Must not be freed manually. Must be waited on at every submission using 246cabdff1aSopenharmony_ci * the value in sem_value, and must be signalled at every submission, 247cabdff1aSopenharmony_ci * using an incremented value. 248cabdff1aSopenharmony_ci */ 249cabdff1aSopenharmony_ci VkSemaphore sem[AV_NUM_DATA_POINTERS]; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci /** 252cabdff1aSopenharmony_ci * Up to date semaphore value at which each image becomes accessible. 253cabdff1aSopenharmony_ci * Clients must wait on this value when submitting a command queue, 254cabdff1aSopenharmony_ci * and increment it when signalling. 255cabdff1aSopenharmony_ci */ 256cabdff1aSopenharmony_ci uint64_t sem_value[AV_NUM_DATA_POINTERS]; 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci /** 259cabdff1aSopenharmony_ci * Internal data. 260cabdff1aSopenharmony_ci */ 261cabdff1aSopenharmony_ci struct AVVkFrameInternal *internal; 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci /** 264cabdff1aSopenharmony_ci * Describes the binding offset of each plane to the VkDeviceMemory. 265cabdff1aSopenharmony_ci */ 266cabdff1aSopenharmony_ci ptrdiff_t offset[AV_NUM_DATA_POINTERS]; 267cabdff1aSopenharmony_ci} AVVkFrame; 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci/** 270cabdff1aSopenharmony_ci * Allocates a single AVVkFrame and initializes everything as 0. 271cabdff1aSopenharmony_ci * @note Must be freed via av_free() 272cabdff1aSopenharmony_ci */ 273cabdff1aSopenharmony_ciAVVkFrame *av_vk_frame_alloc(void); 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci/** 276cabdff1aSopenharmony_ci * Returns the format of each image up to the number of planes for a given sw_format. 277cabdff1aSopenharmony_ci * Returns NULL on unsupported formats. 278cabdff1aSopenharmony_ci */ 279cabdff1aSopenharmony_ciconst VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p); 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci#endif /* AVUTIL_HWCONTEXT_VULKAN_H */ 282