FFmpeg
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_VULKAN_H
20 #define AVUTIL_VULKAN_H
21 
22 #define VK_NO_PROTOTYPES
23 
24 #include <stdatomic.h>
25 
26 #include "thread.h"
27 #include "pixdesc.h"
28 #include "bprint.h"
29 #include "hwcontext.h"
30 #include "vulkan_functions.h"
31 #include "hwcontext_vulkan.h"
32 
33 /* GLSL management macros */
34 #define INDENT(N) INDENT_##N
35 #define INDENT_0
36 #define INDENT_1 INDENT_0 " "
37 #define INDENT_2 INDENT_1 INDENT_1
38 #define INDENT_3 INDENT_2 INDENT_1
39 #define INDENT_4 INDENT_3 INDENT_1
40 #define INDENT_5 INDENT_4 INDENT_1
41 #define INDENT_6 INDENT_5 INDENT_1
42 #define C(N, S) INDENT(N) #S "\n"
43 
44 #define GLSLC(N, S) \
45  do { \
46  av_bprintf(&shd->src, C(N, S)); \
47  } while (0)
48 
49 #define GLSLA(...) \
50  do { \
51  av_bprintf(&shd->src, __VA_ARGS__); \
52  } while (0)
53 
54 #define GLSLF(N, S, ...) \
55  do { \
56  av_bprintf(&shd->src, C(N, S), __VA_ARGS__); \
57  } while (0)
58 
59 #define GLSLD(D) \
60  do { \
61  av_bprintf(&shd->src, "\n"); \
62  av_bprint_append_data(&shd->src, D, strlen(D)); \
63  av_bprintf(&shd->src, "\n"); \
64  } while (0)
65 
66 /* Helper, pretty much every Vulkan return value needs to be checked */
67 #define RET(x) \
68  do { \
69  if ((err = (x)) < 0) \
70  goto fail; \
71  } while (0)
72 
73 #define DUP_SAMPLER(x) { x, x, x, x }
74 
75 typedef struct FFVkSPIRVShader {
76  const char *name; /* Name for id/debugging purposes */
77  AVBPrint src;
78  int local_size[3]; /* Compute shader workgroup sizes */
79  VkPipelineShaderStageCreateInfo shader;
80  VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info;
82 
84  const char *name;
85  VkDescriptorType type;
86  const char *mem_layout; /* Storage images (rgba8, etc.) and buffers (std430, etc.) */
87  const char *mem_quali; /* readonly, writeonly, etc. */
88  const char *buf_content; /* For buffers */
89  uint32_t dimensions; /* Needed for e.g. sampler%iD */
90  uint32_t elems; /* 0 - scalar, 1 or more - vector */
91  VkShaderStageFlags stages;
92  VkSampler samplers[4]; /* Sampler to use for all elems */
94 
95 typedef struct FFVkBuffer {
96  VkBuffer buf;
97  VkDeviceMemory mem;
98  VkMemoryPropertyFlagBits flags;
99  size_t size;
100  VkDeviceAddress address;
101 
102  /* Local use only */
103  VkPipelineStageFlags2 stage;
104  VkAccessFlags2 access;
105 
106  /* Only valid when allocated via ff_vk_get_pooled_buffer with HOST_VISIBLE */
107  uint8_t *mapped_mem;
108 } FFVkBuffer;
109 
110 typedef struct FFVkQueueFamilyCtx {
114 
115 typedef struct FFVkExecContext {
116  uint32_t idx;
117  const struct FFVkExecPool *parent;
120 
121  /* Queue for the execution context */
122  VkQueue queue;
123  int qf;
124  int qi;
125 
126  /* Command buffer for the context */
127  VkCommandBuffer buf;
128 
129  /* Fence for the command buffer */
130  VkFence fence;
131 
132  void *query_data;
134 
135  /* Buffer dependencies */
138  unsigned int buf_deps_alloc_size;
139 
140  /* Frame dependencies */
142  unsigned int frame_deps_alloc_size;
144 
145  VkSemaphoreSubmitInfo *sem_wait;
146  unsigned int sem_wait_alloc;
148 
149  VkSemaphoreSubmitInfo *sem_sig;
150  unsigned int sem_sig_alloc;
152 
153  uint64_t **sem_sig_val_dst;
154  unsigned int sem_sig_val_dst_alloc;
156 
157  uint8_t *frame_locked;
159 
160  VkAccessFlagBits *access_dst;
161  unsigned int access_dst_alloc;
162 
163  VkImageLayout *layout_dst;
164  unsigned int layout_dst_alloc;
165 
166  uint32_t *queue_family_dst;
168 
169  uint8_t *frame_update;
172 
173 typedef struct FFVkExecPool {
176 
177  VkCommandPool cmd_buf_pool;
178  VkCommandBuffer *cmd_bufs;
180 
181  VkQueryPool query_pool;
182  void *query_data;
188  size_t qd_size;
189 } FFVkExecPool;
190 
191 typedef struct FFVulkanDescriptorSet {
193  uint8_t *desc_mem;
194  VkDeviceSize layout_size;
195  VkDeviceSize aligned_size; /* descriptorBufferOffsetAlignment */
196  VkDeviceSize total_size; /* Once registered to an exec context */
197  VkBufferUsageFlags usage;
198 
199  VkDescriptorSetLayoutBinding *binding;
200  VkDeviceSize *binding_offset;
202 
203  /* Descriptor set is shared between all submissions */
204  int singular;
206 
207 typedef struct FFVulkanPipeline {
208  VkPipelineBindPoint bind_point;
209 
210  /* Contexts */
211  VkPipelineLayout pipeline_layout;
212  VkPipeline pipeline;
213 
214  /* Push consts */
215  VkPushConstantRange *push_consts;
217 
218  /* Workgroup */
219  int wg_size[3];
220 
221  /* Descriptor buffer */
222  VkDescriptorSetLayout *desc_layout;
224  VkDescriptorBufferBindingInfoEXT *desc_bind;
227 
228  /* Descriptor pool */
229  int use_push;
230  VkDescriptorSet *desc_sets;
231  VkDescriptorPool desc_pool;
232  VkDescriptorPoolSize *desc_pool_size;
237 
238 typedef struct FFVulkanContext {
239  const AVClass *class;
240  void *log_parent;
241 
244  VkPhysicalDeviceProperties2 props;
245  VkPhysicalDeviceDriverProperties driver_props;
246  VkPhysicalDeviceMemoryProperties mprops;
247  VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops;
248  VkPhysicalDeviceDescriptorBufferPropertiesEXT desc_buf_props;
249  VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props;
250  VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props;
251  VkPhysicalDeviceOpticalFlowPropertiesNV optical_flow_props;
252  VkQueueFamilyQueryResultStatusPropertiesKHR *query_props;
253  VkQueueFamilyVideoPropertiesKHR *video_props;
254  VkQueueFamilyProperties2 *qf_props;
256 
257  VkCooperativeMatrixPropertiesKHR *coop_mat_props;
259 
260  VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats;
261  VkPhysicalDeviceVulkan12Features feats_12;
262  VkPhysicalDeviceFeatures2 feats;
263 
267 
272 
273  uint32_t qfs[64];
274  int nb_qfs;
275 
276  /* Properties */
282 
283 static inline int ff_vk_count_images(AVVkFrame *f)
284 {
285  int cnt = 0;
286  while (cnt < FF_ARRAY_ELEMS(f->img) && f->img[cnt])
287  cnt++;
288 
289  return cnt;
290 }
291 
292 static inline const void *ff_vk_find_struct(const void *chain, VkStructureType stype)
293 {
294  const VkBaseInStructure *in = chain;
295  while (in) {
296  if (in->sType == stype)
297  return in;
298 
299  in = in->pNext;
300  }
301 
302  return NULL;
303 }
304 
305 static inline void ff_vk_link_struct(void *chain, const void *in)
306 {
307  VkBaseOutStructure *out = chain;
308  while (out->pNext)
309  out = out->pNext;
310 
311  out->pNext = (void *)in;
312 }
313 
314 /* Identity mapping - r = r, b = b, g = g, a = a */
315 extern const VkComponentMapping ff_comp_identity_map;
316 
317 /**
318  * Initializes the AVClass, in case this context is not used
319  * as the main user's context.
320  * May use either a frames context reference, or a device context reference.
321  */
322 int ff_vk_init(FFVulkanContext *s, void *log_parent,
323  AVBufferRef *device_ref, AVBufferRef *frames_ref);
324 
325 /**
326  * Converts Vulkan return values to strings
327  */
328 const char *ff_vk_ret2str(VkResult res);
329 
330 /**
331  * Returns 1 if pixfmt is a usable RGB format.
332  */
334 
335 /**
336  * Returns the format to use for images in shaders.
337  */
338 const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pixfmt);
339 
340 /**
341  * Loads props/mprops/driver_props
342  */
344 
345 /**
346  * Chooses a QF and loads it into a context.
347  */
349  VkQueueFlagBits dev_family);
350 
351 /**
352  * Allocates/frees an execution pool.
353  * ff_vk_exec_pool_init_desc() MUST be called if ff_vk_exec_descriptor_set_add()
354  * has been called.
355  */
357  FFVkExecPool *pool, int nb_contexts,
358  int nb_queries, VkQueryType query_type, int query_64bit,
359  const void *query_create_pnext);
361 
362 /**
363  * Retrieve an execution pool. Threadsafe.
364  */
366 
367 /**
368  * Performs nb_queries queries and returns their results and statuses.
369  * 64_BIT and WITH_STATUS flags are ignored as 64_BIT must be specified via
370  * query_64bit in ff_vk_exec_pool_init() and WITH_STATUS is always enabled.
371  */
373  void **data, VkQueryResultFlagBits flags);
374 
375 /**
376  * Start/submit/wait an execution.
377  * ff_vk_exec_start() always waits on a submission, so using ff_vk_exec_wait()
378  * is not necessary (unless using it is just better).
379  */
383 
384 /**
385  * Execution dependency management.
386  * Can attach buffers to executions that will only be unref'd once the
387  * buffer has finished executing.
388  * Adding a frame dep will *lock the frame*, until either the dependencies
389  * are discarded, the execution is submitted, or a failure happens.
390  * update_frame will update the frame's properties before it is unlocked,
391  * only if submission was successful.
392  */
394  AVBufferRef **deps, int nb_deps, int ref);
396  VkSemaphore *sem, int nb,
397  VkPipelineStageFlagBits2 stage,
398  int wait); /* Ownership transferred if !wait */
400  VkPipelineStageFlagBits2 wait_stage,
401  VkPipelineStageFlagBits2 signal_stage);
403  VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar);
405  VkSemaphore *dst, uint64_t *dst_val,
406  AVFrame *f);
408 
409 /**
410  * Create an imageview and add it as a dependency to an execution.
411  */
413  VkImageView views[AV_NUM_DATA_POINTERS],
414  AVFrame *f);
415 
417  AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar,
418  VkPipelineStageFlags src_stage,
419  VkPipelineStageFlags dst_stage,
420  VkAccessFlagBits new_access,
421  VkImageLayout new_layout,
422  uint32_t new_qf);
423 
424 /**
425  * Memory/buffer/image allocation helpers.
426  */
427 int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req,
428  VkMemoryPropertyFlagBits req_flags, void *alloc_extension,
429  VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem);
431  void *pNext, void *alloc_pNext,
432  VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags);
434  void *pNext, void *alloc_pNext,
435  VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags);
436 
437 /**
438  * Buffer management code.
439  */
440 int ff_vk_map_buffers(FFVulkanContext *s, FFVkBuffer **buf, uint8_t *mem[],
441  int nb_buffers, int invalidate);
442 int ff_vk_unmap_buffers(FFVulkanContext *s, FFVkBuffer **buf, int nb_buffers,
443  int flush);
444 
445 static inline int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem,
446  int invalidate)
447 {
448  return ff_vk_map_buffers(s, (FFVkBuffer *[]){ buf }, mem,
449  1, invalidate);
450 }
451 
452 static inline int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
453 {
454  return ff_vk_unmap_buffers(s, (FFVkBuffer *[]){ buf }, 1, flush);
455 }
456 
458 
459 /** Initialize a pool and create AVBufferRefs containing FFVkBuffer.
460  * Threadsafe to use. Buffers are automatically mapped on creation if
461  * VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT is set in mem_props. Users should
462  * synchronize access themselvesd. Mainly meant for device-local buffers. */
464  AVBufferRef **buf, VkBufferUsageFlags usage,
465  void *create_pNext, size_t size,
466  VkMemoryPropertyFlagBits mem_props);
467 
468 /**
469  * Create a sampler.
470  */
471 int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler,
472  int unnorm_coords, VkFilter filt);
473 
474 /**
475  * Shader management.
476  */
477 int ff_vk_shader_init(FFVulkanPipeline *pl, FFVkSPIRVShader *shd, const char *name,
478  VkShaderStageFlags stage, uint32_t required_subgroup_size);
479 void ff_vk_shader_set_compute_sizes(FFVkSPIRVShader *shd, int x, int y, int z);
480 void ff_vk_shader_print(void *ctx, FFVkSPIRVShader *shd, int prio);
482  uint8_t *spirv, size_t spirv_size, const char *entrypoint);
484 
485 /**
486  * Add/update push constants for execution.
487  */
489  VkShaderStageFlagBits stage);
491  FFVulkanPipeline *pl,
492  VkShaderStageFlagBits stage,
493  int offset, size_t size, void *src);
494 
495 /**
496  * Add descriptor to a pipeline. Must be called before pipeline init.
497  */
499  FFVkSPIRVShader *shd,
501  int singular, int print_to_shader_only);
502 
503 /* Initialize/free a pipeline. */
505  FFVkSPIRVShader *shd);
507 
508 /**
509  * Register a pipeline with an exec pool.
510  * Pool may be NULL if all descriptor sets are read-only.
511  */
513  FFVulkanPipeline *pl);
514 
515 /* Bind pipeline */
517  FFVulkanPipeline *pl);
518 
520  FFVkExecContext *e, int set, int bind, int elem,
521  FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len,
522  VkFormat fmt);
523 
526  VkImageView *views, int set, int binding,
527  VkImageLayout layout, VkSampler sampler);
528 
529 /**
530  * Frees main context.
531  */
533 
534 #endif /* AVUTIL_VULKAN_H */
FFVulkanPipeline::bind_point
VkPipelineBindPoint bind_point
Definition: vulkan.h:208
pthread_mutex_t
_fmutex pthread_mutex_t
Definition: os2threads.h:53
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FFVulkanPipeline::desc_pool_size
VkDescriptorPoolSize * desc_pool_size
Definition: vulkan.h:232
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
FFVulkanContext::hwfc
AVVulkanFramesContext * hwfc
Definition: vulkan.h:271
ff_vk_uninit
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
Definition: vulkan.c:2130
FFVulkanContext::output_height
int output_height
Definition: vulkan.h:278
FFVulkanPipeline::use_push
int use_push
Definition: vulkan.h:229
FFVkExecContext::frame_deps_alloc_size
unsigned int frame_deps_alloc_size
Definition: vulkan.h:142
out
FILE * out
Definition: movenc.c:55
ff_vk_load_props
int ff_vk_load_props(FFVulkanContext *s)
Loads props/mprops/driver_props.
Definition: vulkan.c:106
FFVkExecPool::idx
atomic_int_least64_t idx
Definition: vulkan.h:175
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
FFVulkanPipeline::pipeline_layout
VkPipelineLayout pipeline_layout
Definition: vulkan.h:211
FFVulkanContext::device_ref
AVBufferRef * device_ref
Definition: vulkan.h:264
FFVkExecPool::contexts
FFVkExecContext * contexts
Definition: vulkan.h:174
thread.h
ff_vk_update_descriptor_img_array
void ff_vk_update_descriptor_img_array(FFVulkanContext *s, FFVulkanPipeline *pl, FFVkExecContext *e, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Definition: vulkan.c:1908
FFVulkanPipeline::nb_desc_pool_size
int nb_desc_pool_size
Definition: vulkan.h:233
FFVkExecContext::qf
int qf
Definition: vulkan.h:123
FFVkBuffer::access
VkAccessFlags2 access
Definition: vulkan.h:104
FFVulkanDescriptorSet::aligned_size
VkDeviceSize aligned_size
Definition: vulkan.h:195
ff_vk_add_push_constant
int ff_vk_add_push_constant(FFVulkanPipeline *pl, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
Definition: vulkan.c:1194
FFVkBuffer::stage
VkPipelineStageFlags2 stage
Definition: vulkan.h:103
ff_vk_create_avbuf
int ff_vk_create_avbuf(FFVulkanContext *s, AVBufferRef **ref, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
Definition: vulkan.c:994
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
pixdesc.h
FFVulkanDescriptorSetBinding::stages
VkShaderStageFlags stages
Definition: vulkan.h:91
ff_vk_init
int ff_vk_init(FFVulkanContext *s, void *log_parent, AVBufferRef *device_ref, AVBufferRef *frames_ref)
Initializes the AVClass, in case this context is not used as the main user's context.
Definition: vulkan.c:2141
ff_vk_set_descriptor_buffer
int ff_vk_set_descriptor_buffer(FFVulkanContext *s, FFVulkanPipeline *pl, FFVkExecContext *e, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Definition: vulkan.c:1843
FFVkExecContext::sem_sig_alloc
unsigned int sem_sig_alloc
Definition: vulkan.h:150
data
const char data[16]
Definition: mxf.c:148
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:778
ff_vk_exec_update_frame
void ff_vk_exec_update_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
Definition: vulkan.c:733
FFVkBuffer::address
VkDeviceAddress address
Definition: vulkan.h:100
FFVkExecContext::sem_wait
VkSemaphoreSubmitInfo * sem_wait
Definition: vulkan.h:145
FFVulkanPipeline::desc_pool
VkDescriptorPool desc_pool
Definition: vulkan.h:231
FFVulkanDescriptorSetBinding::buf_content
const char * buf_content
Definition: vulkan.h:88
FFVkExecPool::query_pool
VkQueryPool query_pool
Definition: vulkan.h:181
FFVulkanDescriptorSet::desc_mem
uint8_t * desc_mem
Definition: vulkan.h:193
FFVulkanContext::tot_nb_qfs
int tot_nb_qfs
Definition: vulkan.h:255
FFVkBuffer::buf
VkBuffer buf
Definition: vulkan.h:96
FFVkExecContext::lock
pthread_mutex_t lock
Definition: vulkan.h:118
ff_vk_exec_mirror_sem_value
int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *dst, uint64_t *dst_val, AVFrame *f)
Definition: vulkan.c:752
FFVkExecContext::frame_update_alloc_size
unsigned int frame_update_alloc_size
Definition: vulkan.h:170
ff_vk_exec_get_query
VkResult ff_vk_exec_get_query(FFVulkanContext *s, FFVkExecContext *e, void **data, VkQueryResultFlagBits flags)
Performs nb_queries queries and returns their results and statuses.
Definition: vulkan.c:435
ff_vk_link_struct
static void ff_vk_link_struct(void *chain, const void *in)
Definition: vulkan.h:305
FFVulkanPipeline::total_desc_sets
int total_desc_sets
Definition: vulkan.h:234
FFVulkanDescriptorSet::nb_bindings
int nb_bindings
Definition: vulkan.h:201
FFVulkanContext::feats
VkPhysicalDeviceFeatures2 feats
Definition: vulkan.h:262
ff_vk_find_struct
static const void * ff_vk_find_struct(const void *chain, VkStructureType stype)
Definition: vulkan.h:292
FFVulkanPipeline::wg_size
int wg_size[3]
Definition: vulkan.h:219
FFVulkanDescriptorSet::layout_size
VkDeviceSize layout_size
Definition: vulkan.h:194
AVVulkanFramesContext
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
Definition: hwcontext_vulkan.h:213
FFVulkanPipeline::pipeline
VkPipeline pipeline
Definition: vulkan.h:212
ff_vk_pipeline_free
void ff_vk_pipeline_free(FFVulkanContext *s, FFVulkanPipeline *pl)
Definition: vulkan.c:2092
ff_vk_shader_create
int ff_vk_shader_create(FFVulkanContext *s, FFVkSPIRVShader *shd, uint8_t *spirv, size_t spirv_size, const char *entrypoint)
Definition: vulkan.c:1468
FFVkExecPool::query_64bit
int query_64bit
Definition: vulkan.h:185
FFVulkanContext::subgroup_props
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props
Definition: vulkan.h:249
ff_vk_exec_pool_init
int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext)
Allocates/frees an execution pool.
Definition: vulkan.c:278
FFVulkanContext::frames_ref
AVBufferRef * frames_ref
Definition: vulkan.h:269
FFVulkanContext::atomic_float_feats
VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats
Definition: vulkan.h:260
FFVkExecPool::query_statuses
int query_statuses
Definition: vulkan.h:184
ff_vk_unmap_buffers
int ff_vk_unmap_buffers(FFVulkanContext *s, FFVkBuffer **buf, int nb_buffers, int flush)
Definition: vulkan.c:1068
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
FFVulkanDescriptorSet::binding
VkDescriptorSetLayoutBinding * binding
Definition: vulkan.h:199
ff_vk_shader_rep_fmt
const char * ff_vk_shader_rep_fmt(enum AVPixelFormat pixfmt)
Returns the format to use for images in shaders.
Definition: vulkan.c:1259
FFVulkanDescriptorSetBinding::type
VkDescriptorType type
Definition: vulkan.h:85
FFVulkanPipeline::desc_sets
VkDescriptorSet * desc_sets
Definition: vulkan.h:230
FFVulkanPipeline::nb_descriptor_sets
int nb_descriptor_sets
Definition: vulkan.h:226
ff_vk_shader_init
int ff_vk_shader_init(FFVulkanPipeline *pl, FFVkSPIRVShader *shd, const char *name, VkShaderStageFlags stage, uint32_t required_subgroup_size)
Shader management.
Definition: vulkan.c:1400
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
ff_vk_qf_init
int ff_vk_qf_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, VkQueueFlagBits dev_family)
Chooses a QF and loads it into a context.
Definition: vulkan.c:228
FFVulkanDescriptorSetBinding::samplers
VkSampler samplers[4]
Definition: vulkan.h:92
FFVkExecContext::frame_deps
AVFrame ** frame_deps
Definition: vulkan.h:141
set
static void set(uint8_t *a[], int ch, int index, int ch_count, enum AVSampleFormat f, double v)
Definition: swresample.c:59
FFVkExecContext::queue_family_dst
uint32_t * queue_family_dst
Definition: vulkan.h:166
FFVulkanDescriptorSetBinding::elems
uint32_t elems
Definition: vulkan.h:90
FFVulkanContext::output_width
int output_width
Definition: vulkan.h:277
ff_vk_create_imageviews
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f)
Create an imageview and add it as a dependency to an execution.
Definition: vulkan.c:1283
FFVulkanPipeline::assoc_pool
FFVkExecPool * assoc_pool
Definition: vulkan.h:235
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanContext::log_parent
void * log_parent
Definition: vulkan.h:240
FFVulkanContext::driver_props
VkPhysicalDeviceDriverProperties driver_props
Definition: vulkan.h:245
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
FFVkExecContext::fence
VkFence fence
Definition: vulkan.h:130
FFVulkanDescriptorSet::buf
FFVkBuffer buf
Definition: vulkan.h:192
FFVkExecContext::nb_buf_deps
int nb_buf_deps
Definition: vulkan.h:137
ff_vk_get_pooled_buffer
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVBufferPool **buf_pool, AVBufferRef **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
Definition: vulkan.c:1142
ctx
AVFormatContext * ctx
Definition: movenc.c:49
ff_vk_unmap_buffer
static int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
Definition: vulkan.h:452
ff_vk_shader_set_compute_sizes
void ff_vk_shader_set_compute_sizes(FFVkSPIRVShader *shd, int x, int y, int z)
Definition: vulkan.c:1426
FFVulkanDescriptorSetBinding::mem_layout
const char * mem_layout
Definition: vulkan.h:86
FFVkExecContext::frame_update
uint8_t * frame_update
Definition: vulkan.h:169
FFVkExecContext::query_idx
int query_idx
Definition: vulkan.h:133
FFVkExecPool::query_status_stride
int query_status_stride
Definition: vulkan.h:186
FFVkExecContext::parent
const struct FFVkExecPool * parent
Definition: vulkan.h:117
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:463
AVVulkanDeviceContext
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_vulkan.h:59
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
FFVkExecContext::sem_sig_val_dst_alloc
unsigned int sem_sig_val_dst_alloc
Definition: vulkan.h:154
NULL
#define NULL
Definition: coverity.c:32
ff_vk_init_compute_pipeline
int ff_vk_init_compute_pipeline(FFVulkanContext *s, FFVulkanPipeline *pl, FFVkSPIRVShader *shd)
Definition: vulkan.c:2021
ff_vk_exec_pool_free
void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
Definition: vulkan.c:238
FFVkExecContext::access_dst_alloc
unsigned int access_dst_alloc
Definition: vulkan.h:161
FFVulkanDescriptorSet::singular
int singular
Definition: vulkan.h:204
FFVkExecContext::sem_sig_cnt
int sem_sig_cnt
Definition: vulkan.h:151
FFVulkanDescriptorSetBinding::dimensions
uint32_t dimensions
Definition: vulkan.h:89
FFVulkanContext::coop_matrix_props
VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props
Definition: vulkan.h:250
FFVulkanContext::qf_props
VkQueueFamilyProperties2 * qf_props
Definition: vulkan.h:254
hwcontext_vulkan.h
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:370
FFVkExecContext::qi
int qi
Definition: vulkan.h:124
FFVkExecContext::had_submission
int had_submission
Definition: vulkan.h:119
FFVkBuffer::size
size_t size
Definition: vulkan.h:99
FFVkExecPool::nb_queries
int nb_queries
Definition: vulkan.h:187
FFVkBuffer::mapped_mem
uint8_t * mapped_mem
Definition: vulkan.h:107
FFVulkanContext
Definition: vulkan.h:238
ff_vk_count_images
static int ff_vk_count_images(AVVkFrame *f)
Definition: vulkan.h:283
FFVulkanPipeline
Definition: vulkan.h:207
FFVkExecContext::query_data
void * query_data
Definition: vulkan.h:132
ff_vk_exec_add_dep_buf
int ff_vk_exec_add_dep_buf(FFVulkanContext *s, FFVkExecContext *e, AVBufferRef **deps, int nb_deps, int ref)
Execution dependency management.
Definition: vulkan.c:541
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVkSPIRVShader *shd)
Definition: vulkan.c:1459
FFVulkanContext::device
AVHWDeviceContext * device
Definition: vulkan.h:265
usage
const char * usage
Definition: floatimg_cmp.c:60
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:479
f
f
Definition: af_crystalizer.c:122
FFVkExecContext::layout_dst
VkImageLayout * layout_dst
Definition: vulkan.h:163
FFVkExecContext::queue_family_dst_alloc
unsigned int queue_family_dst_alloc
Definition: vulkan.h:167
FFVulkanDescriptorSetBinding
Definition: vulkan.h:83
ff_vk_map_buffers
int ff_vk_map_buffers(FFVulkanContext *s, FFVkBuffer **buf, uint8_t *mem[], int nb_buffers, int invalidate)
Buffer management code.
Definition: vulkan.c:1021
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
AVVkFrame
Definition: hwcontext_vulkan.h:302
ff_vk_alloc_mem
int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req, VkMemoryPropertyFlagBits req_flags, void *alloc_extension, VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
Memory/buffer/image allocation helpers.
Definition: vulkan.c:844
size
int size
Definition: twinvq_data.h:10344
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:390
FFVkExecContext::nb_frame_deps
int nb_frame_deps
Definition: vulkan.h:143
FFVkQueueFamilyCtx
Definition: vulkan.h:110
ff_vk_free_buf
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
Definition: vulkan.c:1106
FFVkExecContext::sem_sig_val_dst_cnt
int sem_sig_val_dst_cnt
Definition: vulkan.h:155
ff_vk_exec_add_dep_frame
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
Definition: vulkan.c:663
FFVulkanContext::output_format
enum AVPixelFormat output_format
Definition: vulkan.h:279
FFVkBuffer::flags
VkMemoryPropertyFlagBits flags
Definition: vulkan.h:98
ff_vk_pipeline_descriptor_set_add
int ff_vk_pipeline_descriptor_set_add(FFVulkanContext *s, FFVulkanPipeline *pl, FFVkSPIRVShader *shd, FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only)
Add descriptor to a pipeline.
Definition: vulkan.c:1518
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
FFVkExecContext
Definition: vulkan.h:115
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:84
ff_comp_identity_map
const VkComponentMapping ff_comp_identity_map
Definition: vulkan.c:27
ff_vk_exec_add_dep_bool_sem
int ff_vk_exec_add_dep_bool_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *sem, int nb, VkPipelineStageFlagBits2 stage, int wait)
Definition: vulkan.c:592
FFVulkanContext::input_frames_ref
AVBufferRef * input_frames_ref
Definition: vulkan.h:268
FFVkExecContext::sem_wait_cnt
int sem_wait_cnt
Definition: vulkan.h:147
layout
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
Definition: filter_design.txt:18
FFVkExecContext::queue
VkQueue queue
Definition: vulkan.h:122
FFVulkanContext::qfs
uint32_t qfs[64]
Definition: vulkan.h:273
bprint.h
ff_vk_ret2str
const char * ff_vk_ret2str(VkResult res)
Converts Vulkan return values to strings.
Definition: vulkan.c:35
ff_vk_update_push_exec
void ff_vk_update_push_exec(FFVulkanContext *s, FFVkExecContext *e, FFVulkanPipeline *pl, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Definition: vulkan.c:1921
FFVulkanPipeline::push_consts
VkPushConstantRange * push_consts
Definition: vulkan.h:215
FFVkSPIRVShader::shader
VkPipelineShaderStageCreateInfo shader
Definition: vulkan.h:79
VkFormat
enum VkFormat VkFormat
Definition: hwcontext_stub.c:25
FFVkExecContext::layout_dst_alloc
unsigned int layout_dst_alloc
Definition: vulkan.h:164
FFVkBuffer::mem
VkDeviceMemory mem
Definition: vulkan.h:97
FFVulkanContext::hprops
VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops
Definition: vulkan.h:247
FFVkSPIRVShader::src
AVBPrint src
Definition: vulkan.h:77
FFVulkanContext::props
VkPhysicalDeviceProperties2 props
Definition: vulkan.h:244
FFVkExecContext::frame_locked_alloc_size
unsigned int frame_locked_alloc_size
Definition: vulkan.h:158
len
int len
Definition: vorbis_enc_data.h:426
filt
static const int8_t filt[NUMTAPS *2]
Definition: af_earwax.c:40
FFVulkanContext::extensions
FFVulkanExtensions extensions
Definition: vulkan.h:243
FFVulkanContext::nb_qfs
int nb_qfs
Definition: vulkan.h:274
FFVulkanContext::mprops
VkPhysicalDeviceMemoryProperties mprops
Definition: vulkan.h:246
FFVulkanDescriptorSet::binding_offset
VkDeviceSize * binding_offset
Definition: vulkan.h:200
FFVkExecContext::sem_wait_alloc
unsigned int sem_wait_alloc
Definition: vulkan.h:146
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:115
atomic_int_least64_t
intptr_t atomic_int_least64_t
Definition: stdatomic.h:68
FFVulkanContext::desc_buf_props
VkPhysicalDeviceDescriptorBufferPropertiesEXT desc_buf_props
Definition: vulkan.h:248
FFVulkanPipeline::push_consts_num
int push_consts_num
Definition: vulkan.h:216
pixfmt
enum AVPixelFormat pixfmt
Definition: kmsgrab.c:367
ff_vk_map_buffer
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
Definition: vulkan.h:445
FFVulkanContext::vkfn
FFVulkanFunctions vkfn
Definition: vulkan.h:242
FFVkExecPool
Definition: vulkan.h:173
FFVkExecContext::frame_locked
uint8_t * frame_locked
Definition: vulkan.h:157
ff_vk_exec_wait
void ff_vk_exec_wait(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:470
FFVkExecPool::query_data
void * query_data
Definition: vulkan.h:182
FFVkExecContext::sem_sig
VkSemaphoreSubmitInfo * sem_sig
Definition: vulkan.h:149
ff_vk_mt_is_np_rgb
int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt)
Returns 1 if pixfmt is a usable RGB format.
Definition: vulkan.c:1246
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:127
FFVulkanContext::input_format
enum AVPixelFormat input_format
Definition: vulkan.h:280
FFVkQueueFamilyCtx::nb_queues
int nb_queues
Definition: vulkan.h:112
FFVulkanContext::coop_mat_props_nb
uint32_t coop_mat_props_nb
Definition: vulkan.h:258
FFVkSPIRVShader
Definition: vulkan.h:75
vulkan_functions.h
FFVulkanPipeline::desc_set
FFVulkanDescriptorSet * desc_set
Definition: vulkan.h:223
FFVulkanContext::video_props
VkQueueFamilyVideoPropertiesKHR * video_props
Definition: vulkan.h:253
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:112
ff_vk_exec_discard_deps
void ff_vk_exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:515
FFVulkanDescriptorSet::total_size
VkDeviceSize total_size
Definition: vulkan.h:196
FFVulkanDescriptorSet::usage
VkBufferUsageFlags usage
Definition: vulkan.h:197
FFVkSPIRVShader::subgroup_info
VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info
Definition: vulkan.h:80
desc
const char * desc
Definition: libsvtav1.c:79
ff_vk_exec_pipeline_register
int ff_vk_exec_pipeline_register(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanPipeline *pl)
Register a pipeline with an exec pool.
Definition: vulkan.c:1630
FFVulkanContext::hwctx
AVVulkanDeviceContext * hwctx
Definition: vulkan.h:266
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
FFVkExecPool::cmd_bufs
VkCommandBuffer * cmd_bufs
Definition: vulkan.h:178
FFVkSPIRVShader::name
const char * name
Definition: vulkan.h:76
FFVulkanContext::feats_12
VkPhysicalDeviceVulkan12Features feats_12
Definition: vulkan.h:261
FFVulkanExtensions
FFVulkanExtensions
Definition: vulkan_functions.h:29
FFVkSPIRVShader::local_size
int local_size[3]
Definition: vulkan.h:78
FFVkExecContext::buf_deps_alloc_size
unsigned int buf_deps_alloc_size
Definition: vulkan.h:138
FFVkExecContext::buf_deps
AVBufferRef ** buf_deps
Definition: vulkan.h:136
FFVkBuffer
Definition: vulkan.h:95
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
hwcontext.h
FFVkExecPool::qd_size
size_t qd_size
Definition: vulkan.h:188
FFVulkanContext::frames
AVHWFramesContext * frames
Definition: vulkan.h:270
FFVulkanDescriptorSet
Definition: vulkan.h:191
FFVulkanContext::optical_flow_props
VkPhysicalDeviceOpticalFlowPropertiesNV optical_flow_props
Definition: vulkan.h:251
ff_vk_frame_barrier
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlagBits new_access, VkImageLayout new_layout, uint32_t new_qf)
Definition: vulkan.c:1357
ff_vk_shader_print
void ff_vk_shader_print(void *ctx, FFVkSPIRVShader *shd, int prio)
Definition: vulkan.c:1437
FFVulkanPipeline::desc_bind
VkDescriptorBufferBindingInfoEXT * desc_bind
Definition: vulkan.h:224
FFVkExecPool::query_results
int query_results
Definition: vulkan.h:183
ff_vk_init_sampler
int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler, int unnorm_coords, VkFilter filt)
Create a sampler.
Definition: vulkan.c:1214
FFVkExecContext::sem_sig_val_dst
uint64_t ** sem_sig_val_dst
Definition: vulkan.h:153
FFVulkanContext::query_props
VkQueueFamilyQueryResultStatusPropertiesKHR * query_props
Definition: vulkan.h:252
ff_vk_create_buf
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
Definition: vulkan.c:899
FFVulkanPipeline::desc_layout
VkDescriptorSetLayout * desc_layout
Definition: vulkan.h:222
FFVulkanDescriptorSetBinding::mem_quali
const char * mem_quali
Definition: vulkan.h:87
FFVulkanFunctions
Definition: vulkan_functions.h:255
FFVkExecPool::pool_size
int pool_size
Definition: vulkan.h:179
FFVkExecPool::cmd_buf_pool
VkCommandPool cmd_buf_pool
Definition: vulkan.h:177
FFVulkanContext::coop_mat_props
VkCooperativeMatrixPropertiesKHR * coop_mat_props
Definition: vulkan.h:257
FFVkExecContext::idx
uint32_t idx
Definition: vulkan.h:116
src
#define src
Definition: vp8dsp.c:248
FFVulkanPipeline::bound_buffer_indices
uint32_t * bound_buffer_indices
Definition: vulkan.h:225
FFVkQueueFamilyCtx::queue_family
int queue_family
Definition: vulkan.h:111
ff_vk_exec_bind_pipeline
void ff_vk_exec_bind_pipeline(FFVulkanContext *s, FFVkExecContext *e, FFVulkanPipeline *pl)
Definition: vulkan.c:2063
FFVkExecContext::access_dst
VkAccessFlagBits * access_dst
Definition: vulkan.h:160