FFmpeg
hwcontext_vulkan.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #ifndef AVUTIL_HWCONTEXT_VULKAN_H
20 #define AVUTIL_HWCONTEXT_VULKAN_H
21 
22 #include <vulkan/vulkan.h>
23 
24 #include "pixfmt.h"
25 #include "frame.h"
26 
27 /**
28  * @file
29  * API-specific header for AV_HWDEVICE_TYPE_VULKAN.
30  *
31  * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs
32  * with the data pointer set to an AVVkFrame.
33  */
34 
35 /**
36  * Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
37  * All of these can be set before init to change what the context uses
38  */
39 typedef struct AVVulkanDeviceContext {
40  /**
41  * Custom memory allocator, else NULL
42  */
43  const VkAllocationCallbacks *alloc;
44  /**
45  * Vulkan instance. Must be at least version 1.1.
46  */
47  VkInstance inst;
48  /**
49  * Physical device
50  */
51  VkPhysicalDevice phys_dev;
52  /**
53  * Active device
54  */
55  VkDevice act_dev;
56  /**
57  * Queue family index for graphics
58  * @note av_hwdevice_create() will set all 3 queue indices if unset
59  * If there is no dedicated queue for compute or transfer operations,
60  * they will be set to the graphics queue index which can handle both.
61  * nb_graphics_queues indicates how many queues were enabled for the
62  * graphics queue (must be at least 1)
63  */
66  /**
67  * Queue family index to use for transfer operations, and the amount of queues
68  * enabled. In case there is no dedicated transfer queue, nb_tx_queues
69  * must be 0 and queue_family_tx_index must be the same as either the graphics
70  * queue or the compute queue, if available.
71  */
74  /**
75  * Queue family index for compute ops, and the amount of queues enabled.
76  * In case there are no dedicated compute queues, nb_comp_queues must be
77  * 0 and its queue family index must be set to the graphics queue.
78  */
81  /**
82  * Enabled instance extensions.
83  * If supplying your own device context, set this to an array of strings, with
84  * each entry containing the specified Vulkan extension string to enable.
85  * Duplicates are possible and accepted.
86  * If no extensions are enabled, set these fields to NULL, and 0 respectively.
87  */
88  const char * const *enabled_inst_extensions;
90  /**
91  * Enabled device extensions. By default, VK_KHR_external_memory_fd,
92  * VK_EXT_external_memory_dma_buf, VK_EXT_image_drm_format_modifier,
93  * VK_KHR_external_semaphore_fd and VK_EXT_external_memory_host are enabled if found.
94  * If supplying your own device context, these fields takes the same format as
95  * the above fields, with the same conditions that duplicates are possible
96  * and accepted, and that NULL and 0 respectively means no extensions are enabled.
97  */
98  const char * const *enabled_dev_extensions;
100  /**
101  * This structure should be set to the set of features that present and enabled
102  * during device creation. When a device is created by FFmpeg, it will default to
103  * enabling all that are present of the shaderImageGatherExtended,
104  * fragmentStoresAndAtomics, shaderInt64 and vertexPipelineStoresAndAtomics features.
105  */
106  VkPhysicalDeviceFeatures2 device_features;
108 
109 /**
110  * Allocated as AVHWFramesContext.hwctx, used to set pool-specific options
111  */
112 typedef struct AVVulkanFramesContext {
113  /**
114  * Controls the tiling of allocated frames.
115  */
116  VkImageTiling tiling;
117  /**
118  * Defines extra usage of output frames. If left as 0, the following bits
119  * are set: TRANSFER_SRC, TRANSFER_DST. SAMPLED and STORAGE.
120  */
121  VkImageUsageFlagBits usage;
122  /**
123  * Extension data for image creation.
124  */
126  /**
127  * Extension data for memory allocation. Must have as many entries as
128  * the number of planes of the sw_format.
129  * This will be chained to VkExportMemoryAllocateInfo, which is used
130  * to make all pool images exportable to other APIs if the necessary
131  * extensions are present in enabled_dev_extensions.
132  */
133  void *alloc_pnext[AV_NUM_DATA_POINTERS];
135 
136 /*
137  * Frame structure, the VkFormat of the image will always match
138  * the pool's sw_format.
139  * All frames, imported or allocated, will be created with the
140  * VK_IMAGE_CREATE_ALIAS_BIT flag set, so the memory may be aliased if needed.
141  *
142  * If all three queue family indices in the device context are the same,
143  * images will be created with the EXCLUSIVE sharing mode. Otherwise, all images
144  * will be created using the CONCURRENT sharing mode.
145  *
146  * @note the size of this structure is not part of the ABI, to allocate
147  * you must use @av_vk_frame_alloc().
148  */
149 typedef struct AVVkFrame {
150  /**
151  * Vulkan images to which the memory is bound to.
152  */
154 
155  /**
156  * The same tiling must be used for all images in the frame.
157  */
158  VkImageTiling tiling;
159 
160  /**
161  * Memory backing the images. Could be less than the amount of images
162  * if importing from a DRM or VAAPI frame.
163  */
164  VkDeviceMemory mem[AV_NUM_DATA_POINTERS];
166 
167  /**
168  * OR'd flags for all memory allocated
169  */
170  VkMemoryPropertyFlagBits flags;
171 
172  /**
173  * Updated after every barrier
174  */
175  VkAccessFlagBits access[AV_NUM_DATA_POINTERS];
176  VkImageLayout layout[AV_NUM_DATA_POINTERS];
177 
178  /**
179  * Synchronization semaphores. Must not be freed manually. Must be waited on
180  * and signalled at every queue submission.
181  * Could be less than the amount of images: either one per VkDeviceMemory
182  * or one for the entire frame. All others will be set to VK_NULL_HANDLE.
183  */
184  VkSemaphore sem[AV_NUM_DATA_POINTERS];
185 
186  /**
187  * Internal data.
188  */
189  struct AVVkFrameInternal *internal;
190 } AVVkFrame;
191 
192 /**
193  * Allocates a single AVVkFrame and initializes everything as 0.
194  * @note Must be freed via av_free()
195  */
197 
198 /**
199  * Returns the format of each image up to the number of planes for a given sw_format.
200  * Returns NULL on unsupported formats.
201  */
202 const VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p);
203 
204 #endif /* AVUTIL_HWCONTEXT_VULKAN_H */
#define AV_NUM_DATA_POINTERS
Definition: frame.h:309
VkDevice act_dev
Active device.
int queue_family_tx_index
Queue family index to use for transfer operations, and the amount of queues enabled.
const char *const * enabled_dev_extensions
Enabled device extensions.
VkMemoryPropertyFlagBits flags
OR&#39;d flags for all memory allocated.
void * create_pnext
Extension data for image creation.
VkPhysicalDeviceFeatures2 device_features
This structure should be set to the set of features that present and enabled during device creation...
#define img
int queue_family_index
Queue family index for graphics.
int queue_family_comp_index
Queue family index for compute ops, and the amount of queues enabled.
const VkFormat * av_vkfmt_from_pixfmt(enum AVPixelFormat p)
Returns the format of each image up to the number of planes for a given sw_format.
const char *const * enabled_inst_extensions
Enabled instance extensions.
ptrdiff_t size
Definition: opengl_enc.c:100
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
reference-counted frame API
VkInstance inst
Vulkan instance.
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
VkImageUsageFlagBits usage
Defines extra usage of output frames.
VkImageTiling tiling
The same tiling must be used for all images in the frame.
pixel format definitions
VkPhysicalDevice phys_dev
Physical device.
VkImageTiling tiling
Controls the tiling of allocated frames.
AVVkFrame * av_vk_frame_alloc(void)
Allocates a single AVVkFrame and initializes everything as 0.
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
const VkAllocationCallbacks * alloc
Custom memory allocator, else NULL.