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 
76  const char *name;
77  VkDescriptorType type;
78  const char *mem_layout; /* Storage images (rgba8, etc.) and buffers (std430, etc.) */
79  const char *mem_quali; /* readonly, writeonly, etc. */
80  const char *buf_content; /* For buffers */
81  uint32_t dimensions; /* Needed for e.g. sampler%iD */
82  uint32_t elems; /* 0 - scalar, 1 or more - vector */
83  VkShaderStageFlags stages;
84  VkSampler samplers[4]; /* Sampler to use for all elems */
86 
87 typedef struct FFVkBuffer {
88  VkBuffer buf;
89  VkDeviceMemory mem;
90  VkMemoryPropertyFlagBits flags;
91  size_t size;
92  VkDeviceAddress address;
93 
94  /* Local use only */
95  VkPipelineStageFlags2 stage;
96  VkAccessFlags2 access;
97 
98  /* Only valid when allocated via ff_vk_get_pooled_buffer with HOST_VISIBLE */
99  uint8_t *mapped_mem;
100 } FFVkBuffer;
101 
102 typedef struct FFVkQueueFamilyCtx {
106 
107 typedef struct FFVkExecContext {
108  uint32_t idx;
109  const struct FFVkExecPool *parent;
112 
113  /* Queue for the execution context */
114  VkQueue queue;
115  int qf;
116  int qi;
117 
118  /* Command buffer for the context */
119  VkCommandBuffer buf;
120 
121  /* Fence for the command buffer */
122  VkFence fence;
123 
124  void *query_data;
126 
127  /* Buffer dependencies */
130  unsigned int buf_deps_alloc_size;
131 
132  /* Frame dependencies */
134  unsigned int frame_deps_alloc_size;
136 
137  VkSemaphoreSubmitInfo *sem_wait;
138  unsigned int sem_wait_alloc;
140 
141  VkSemaphoreSubmitInfo *sem_sig;
142  unsigned int sem_sig_alloc;
144 
145  uint64_t **sem_sig_val_dst;
146  unsigned int sem_sig_val_dst_alloc;
148 
149  uint8_t *frame_locked;
151 
152  VkAccessFlagBits *access_dst;
153  unsigned int access_dst_alloc;
154 
155  VkImageLayout *layout_dst;
156  unsigned int layout_dst_alloc;
157 
158  uint32_t *queue_family_dst;
160 
161  uint8_t *frame_update;
164 
165 typedef struct FFVulkanDescriptorSet {
166  /* Descriptor buffer */
167  VkDeviceSize layout_size;
168  VkDeviceSize aligned_size; /* descriptorBufferOffsetAlignment */
169  VkBufferUsageFlags usage;
170 
171  VkDescriptorSetLayoutBinding *binding;
172  VkDeviceSize *binding_offset;
174 
175  /* Descriptor set is shared between all submissions */
176  int singular;
178 
179 typedef struct FFVulkanShader {
180  /* Name for id/debugging purposes */
181  const char *name;
182 
183  /* Shader text */
184  AVBPrint src;
185 
186  /* Compute shader local group sizes */
187  int lg_size[3];
188 
189  /* Shader bind point/type */
190  VkPipelineStageFlags stage;
191  VkPipelineBindPoint bind_point;
192 
193  /* Creation info */
194  VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info;
195 
196  /* Base shader object */
197  VkShaderEXT object;
198  VkPipeline pipeline;
199 
200  /* Pipeline layout */
201  VkPipelineLayout pipeline_layout;
202 
203  /* Push consts */
204  VkPushConstantRange *push_consts;
206 
207  /* Descriptor sets */
210 
211  /* Descriptor buffer */
212  VkDescriptorSetLayout *desc_layout;
214 
215  /* Descriptor pool */
216  int use_push;
217  VkDescriptorPoolSize *desc_pool_size;
220 
222  /* Descriptor buffer */
224  uint8_t *desc_mem;
226 
227 typedef struct FFVulkanShaderData {
228  /* Shader to which this data belongs to */
231 
232  /* Descriptor buffer */
234  VkDescriptorBufferBindingInfoEXT *desc_bind;
235 
236  /* Descriptor pools */
237  VkDescriptorSet *desc_sets;
238  VkDescriptorPool desc_pool;
240 
241 typedef struct FFVkExecPool {
244 
245  VkCommandPool cmd_buf_pool;
246  VkCommandBuffer *cmd_bufs;
248 
249  VkQueryPool query_pool;
250  void *query_data;
256  size_t qd_size;
257 
258  /* Registered shaders' data */
261 } FFVkExecPool;
262 
263 typedef struct FFVulkanContext {
264  const AVClass *class;
265  void *log_parent;
266 
269  VkPhysicalDeviceProperties2 props;
270  VkPhysicalDeviceDriverProperties driver_props;
271  VkPhysicalDeviceMemoryProperties mprops;
272  VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops;
273  VkPhysicalDeviceDescriptorBufferPropertiesEXT desc_buf_props;
274  VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props;
275  VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props;
276  VkPhysicalDeviceOpticalFlowPropertiesNV optical_flow_props;
277  VkQueueFamilyQueryResultStatusPropertiesKHR *query_props;
278  VkQueueFamilyVideoPropertiesKHR *video_props;
279  VkQueueFamilyProperties2 *qf_props;
281 
282  VkCooperativeMatrixPropertiesKHR *coop_mat_props;
284 
285  VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats;
286  VkPhysicalDeviceVulkan12Features feats_12;
287  VkPhysicalDeviceFeatures2 feats;
288 
292 
297 
298  uint32_t qfs[64];
299  int nb_qfs;
300 
301  /* Properties */
307 
308 static inline int ff_vk_count_images(AVVkFrame *f)
309 {
310  int cnt = 0;
311  while (cnt < FF_ARRAY_ELEMS(f->img) && f->img[cnt])
312  cnt++;
313 
314  return cnt;
315 }
316 
317 static inline const void *ff_vk_find_struct(const void *chain, VkStructureType stype)
318 {
319  const VkBaseInStructure *in = chain;
320  while (in) {
321  if (in->sType == stype)
322  return in;
323 
324  in = in->pNext;
325  }
326 
327  return NULL;
328 }
329 
330 static inline void ff_vk_link_struct(void *chain, const void *in)
331 {
332  VkBaseOutStructure *out = chain;
333  while (out->pNext)
334  out = out->pNext;
335 
336  out->pNext = (void *)in;
337 }
338 
339 /* Identity mapping - r = r, b = b, g = g, a = a */
340 extern const VkComponentMapping ff_comp_identity_map;
341 
342 /**
343  * Initializes the AVClass, in case this context is not used
344  * as the main user's context.
345  * May use either a frames context reference, or a device context reference.
346  */
347 int ff_vk_init(FFVulkanContext *s, void *log_parent,
348  AVBufferRef *device_ref, AVBufferRef *frames_ref);
349 
350 /**
351  * Converts Vulkan return values to strings
352  */
353 const char *ff_vk_ret2str(VkResult res);
354 
355 /**
356  * Returns 1 if pixfmt is a usable RGB format.
357  */
359 
360 /**
361  * Returns the format to use for images in shaders.
362  */
363 const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pixfmt);
364 
365 /**
366  * Loads props/mprops/driver_props
367  */
369 
370 /**
371  * Chooses a QF and loads it into a context.
372  */
374  VkQueueFlagBits dev_family);
375 
376 /**
377  * Allocates/frees an execution pool.
378  * ff_vk_exec_pool_init_desc() MUST be called if ff_vk_exec_descriptor_set_add()
379  * has been called.
380  */
382  FFVkExecPool *pool, int nb_contexts,
383  int nb_queries, VkQueryType query_type, int query_64bit,
384  const void *query_create_pnext);
386 
387 /**
388  * Retrieve an execution pool. Threadsafe.
389  */
391 
392 /**
393  * Performs nb_queries queries and returns their results and statuses.
394  * 64_BIT and WITH_STATUS flags are ignored as 64_BIT must be specified via
395  * query_64bit in ff_vk_exec_pool_init() and WITH_STATUS is always enabled.
396  */
398  void **data, VkQueryResultFlagBits flags);
399 
400 /**
401  * Start/submit/wait an execution.
402  * ff_vk_exec_start() always waits on a submission, so using ff_vk_exec_wait()
403  * is not necessary (unless using it is just better).
404  */
408 
409 /**
410  * Execution dependency management.
411  * Can attach buffers to executions that will only be unref'd once the
412  * buffer has finished executing.
413  * Adding a frame dep will *lock the frame*, until either the dependencies
414  * are discarded, the execution is submitted, or a failure happens.
415  * update_frame will update the frame's properties before it is unlocked,
416  * only if submission was successful.
417  */
419  AVBufferRef **deps, int nb_deps, int ref);
421  VkSemaphore *sem, int nb,
422  VkPipelineStageFlagBits2 stage,
423  int wait); /* Ownership transferred if !wait */
425  VkPipelineStageFlagBits2 wait_stage,
426  VkPipelineStageFlagBits2 signal_stage);
428  VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar);
430  VkSemaphore *dst, uint64_t *dst_val,
431  AVFrame *f);
433 
434 /**
435  * Create an imageview and add it as a dependency to an execution.
436  */
438  VkImageView views[AV_NUM_DATA_POINTERS],
439  AVFrame *f);
440 
442  AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar,
443  VkPipelineStageFlags src_stage,
444  VkPipelineStageFlags dst_stage,
445  VkAccessFlagBits new_access,
446  VkImageLayout new_layout,
447  uint32_t new_qf);
448 
449 /**
450  * Memory/buffer/image allocation helpers.
451  */
452 int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req,
453  VkMemoryPropertyFlagBits req_flags, void *alloc_extension,
454  VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem);
456  void *pNext, void *alloc_pNext,
457  VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags);
459  void *pNext, void *alloc_pNext,
460  VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags);
461 
462 /**
463  * Buffer management code.
464  */
465 int ff_vk_map_buffers(FFVulkanContext *s, FFVkBuffer **buf, uint8_t *mem[],
466  int nb_buffers, int invalidate);
467 int ff_vk_unmap_buffers(FFVulkanContext *s, FFVkBuffer **buf, int nb_buffers,
468  int flush);
469 
470 static inline int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem,
471  int invalidate)
472 {
473  return ff_vk_map_buffers(s, (FFVkBuffer *[]){ buf }, mem,
474  1, invalidate);
475 }
476 
477 static inline int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
478 {
479  return ff_vk_unmap_buffers(s, (FFVkBuffer *[]){ buf }, 1, flush);
480 }
481 
483 
484 /** Initialize a pool and create AVBufferRefs containing FFVkBuffer.
485  * Threadsafe to use. Buffers are automatically mapped on creation if
486  * VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT is set in mem_props. Users should
487  * synchronize access themselvesd. Mainly meant for device-local buffers. */
489  AVBufferRef **buf, VkBufferUsageFlags usage,
490  void *create_pNext, size_t size,
491  VkMemoryPropertyFlagBits mem_props);
492 
493 /**
494  * Create a sampler.
495  */
496 int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler,
497  int unnorm_coords, VkFilter filt);
498 
499 /**
500  * Initialize a shader object, with a specific set of extensions, type+bind,
501  * local group size, and subgroup requirements.
502  */
503 int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name,
504  VkPipelineStageFlags stage,
505  const char *extensions[], int nb_extensions,
506  int lg_x, int lg_y, int lg_z,
507  uint32_t required_subgroup_size);
508 
509 /**
510  * Output the shader code as logging data, with a specific
511  * priority.
512  */
513 void ff_vk_shader_print(void *ctx, FFVulkanShader *shd, int prio);
514 
515 /**
516  * Link a shader into an executable.
517  */
519  uint8_t *spirv, size_t spirv_len,
520  const char *entrypoint);
521 
522 /**
523  * Add/update push constants for execution.
524  */
526  VkShaderStageFlagBits stage);
527 
528 /**
529  * Add descriptor to a shader. Must be called before shader init.
530  */
533  int singular, int print_to_shader_only);
534 
535 /**
536  * Register a shader with an exec pool.
537  * Pool may be NULL if all descriptor sets are read-only.
538  */
540  FFVulkanShader *shd);
541 
542 /**
543  * Bind a shader.
544  */
546  FFVulkanShader *shd);
547 
548 /**
549  * Update push constant in a shader.
550  * Must be called before binding the shader.
551  */
553  FFVulkanShader *shd,
554  VkShaderStageFlagBits stage,
555  int offset, size_t size, void *src);
556 
557 /**
558  * Update a descriptor in a buffer with a buffer.
559  * Must be called before binding the shader.
560  */
562  FFVulkanShader *shd,
563  int set, int bind, int elem,
564  FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len,
565  VkFormat fmt);
566 
567 /**
568  * Update a descriptor in a buffer with an image array..
569  * Must be called before binding the shader.
570  */
572  FFVulkanShader *shd, AVFrame *f,
573  VkImageView *views, int set, int binding,
574  VkImageLayout layout, VkSampler sampler);
575 
576 /**
577  * Free a shader.
578  */
580 
581 /**
582  * Frees main context.
583  */
585 
586 #endif /* AVUTIL_VULKAN_H */
FFVulkanShader::bind_point
VkPipelineBindPoint bind_point
Definition: vulkan.h:191
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2262
pthread_mutex_t
_fmutex pthread_mutex_t
Definition: os2threads.h:53
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
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:296
ff_vk_uninit
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
Definition: vulkan.c:2301
FFVulkanContext::output_height
int output_height
Definition: vulkan.h:303
FFVkExecContext::frame_deps_alloc_size
unsigned int frame_deps_alloc_size
Definition: vulkan.h:134
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:243
FFVulkanExtensions
uint64_t FFVulkanExtensions
Definition: vulkan_functions.h:29
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
FFVulkanContext::device_ref
AVBufferRef * device_ref
Definition: vulkan.h:289
FFVkExecPool::contexts
FFVkExecContext * contexts
Definition: vulkan.h:242
FFVulkanDescriptorSetData
Definition: vulkan.h:221
FFVulkanShader::nb_desc_pool_size
int nb_desc_pool_size
Definition: vulkan.h:218
thread.h
FFVulkanShaderData
Definition: vulkan.h:227
FFVkExecContext::qf
int qf
Definition: vulkan.h:115
FFVkBuffer::access
VkAccessFlags2 access
Definition: vulkan.h:96
FFVulkanDescriptorSet::aligned_size
VkDeviceSize aligned_size
Definition: vulkan.h:168
FFVulkanShaderData::shd
FFVulkanShader * shd
Definition: vulkan.h:229
FFVkBuffer::stage
VkPipelineStageFlags2 stage
Definition: vulkan.h:95
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:1023
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
pixdesc.h
ff_vk_shader_print
void ff_vk_shader_print(void *ctx, FFVulkanShader *shd, int prio)
Output the shader code as logging data, with a specific priority.
Definition: vulkan.c:1501
FFVulkanDescriptorSetBinding::stages
VkShaderStageFlags stages
Definition: vulkan.h:83
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:2312
FFVulkanShader::subgroup_info
VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info
Definition: vulkan.h:194
FFVulkanShader::pipeline
VkPipeline pipeline
Definition: vulkan.h:198
FFVkExecContext::sem_sig_alloc
unsigned int sem_sig_alloc
Definition: vulkan.h:142
FFVulkanShaderData::desc_bind
VkDescriptorBufferBindingInfoEXT * desc_bind
Definition: vulkan.h:234
FFVulkanShader::src
AVBPrint src
Definition: vulkan.h:184
FFVulkanShader::use_push
int use_push
Definition: vulkan.h:216
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:807
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:762
FFVkBuffer::address
VkDeviceAddress address
Definition: vulkan.h:92
FFVkExecContext::sem_wait
VkSemaphoreSubmitInfo * sem_wait
Definition: vulkan.h:137
FFVulkanDescriptorSetBinding::buf_content
const char * buf_content
Definition: vulkan.h:80
FFVkExecPool::query_pool
VkQueryPool query_pool
Definition: vulkan.h:249
FFVkExecPool::nb_reg_shd
int nb_reg_shd
Definition: vulkan.h:260
FFVulkanDescriptorSetData::desc_mem
uint8_t * desc_mem
Definition: vulkan.h:224
FFVulkanShaderData::desc_sets
VkDescriptorSet * desc_sets
Definition: vulkan.h:237
FFVulkanContext::tot_nb_qfs
int tot_nb_qfs
Definition: vulkan.h:280
FFVkBuffer::buf
VkBuffer buf
Definition: vulkan.h:88
FFVkExecContext::lock
pthread_mutex_t lock
Definition: vulkan.h:110
ff_vk_shader_update_img_array
void ff_vk_shader_update_img_array(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Update a descriptor in a buffer with an image array.
Definition: vulkan.c:2205
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:485
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:781
FFVkExecContext::frame_update_alloc_size
unsigned int frame_update_alloc_size
Definition: vulkan.h:162
FFVulkanShader::desc_layout
VkDescriptorSetLayout * desc_layout
Definition: vulkan.h:212
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:457
ff_vk_shader_update_desc_buffer
int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Update a descriptor in a buffer with a buffer.
Definition: vulkan.c:2139
ff_vk_link_struct
static void ff_vk_link_struct(void *chain, const void *in)
Definition: vulkan.h:330
ff_vk_shader_add_descriptor_set
int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only)
Add descriptor to a shader.
Definition: vulkan.c:1790
FFVulkanDescriptorSet::nb_bindings
int nb_bindings
Definition: vulkan.h:173
FFVulkanContext::feats
VkPhysicalDeviceFeatures2 feats
Definition: vulkan.h:287
ff_vk_find_struct
static const void * ff_vk_find_struct(const void *chain, VkStructureType stype)
Definition: vulkan.h:317
FFVulkanDescriptorSet::layout_size
VkDeviceSize layout_size
Definition: vulkan.h:167
AVVulkanFramesContext
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
Definition: hwcontext_vulkan.h:213
FFVkExecPool::query_64bit
int query_64bit
Definition: vulkan.h:253
FFVulkanContext::subgroup_props
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props
Definition: vulkan.h:274
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:300
FFVulkanContext::frames_ref
AVBufferRef * frames_ref
Definition: vulkan.h:294
FFVulkanContext::atomic_float_feats
VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats
Definition: vulkan.h:285
FFVkExecPool::query_statuses
int query_statuses
Definition: vulkan.h:252
ff_vk_unmap_buffers
int ff_vk_unmap_buffers(FFVulkanContext *s, FFVkBuffer **buf, int nb_buffers, int flush)
Definition: vulkan.c:1097
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:171
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:1289
FFVulkanDescriptorSetBinding::type
VkDescriptorType type
Definition: vulkan.h:77
FFVulkanDescriptorSetData::buf
FFVkBuffer buf
Definition: vulkan.h:223
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:84
FFVkExecContext::frame_deps
AVFrame ** frame_deps
Definition: vulkan.h:133
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:158
FFVulkanDescriptorSetBinding::elems
uint32_t elems
Definition: vulkan.h:82
FFVulkanContext::output_width
int output_width
Definition: vulkan.h:302
FFVulkanShader::push_consts
VkPushConstantRange * push_consts
Definition: vulkan.h:204
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:1313
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanContext::log_parent
void * log_parent
Definition: vulkan.h:265
FFVulkanContext::driver_props
VkPhysicalDeviceDriverProperties driver_props
Definition: vulkan.h:270
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
FFVkExecContext::fence
VkFence fence
Definition: vulkan.h:122
FFVkExecContext::nb_buf_deps
int nb_buf_deps
Definition: vulkan.h:129
FFVulkanShader::stage
VkPipelineStageFlags stage
Definition: vulkan.h:190
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:1171
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:477
FFVulkanDescriptorSetBinding::mem_layout
const char * mem_layout
Definition: vulkan.h:78
FFVkExecContext::frame_update
uint8_t * frame_update
Definition: vulkan.h:161
FFVkExecContext::query_idx
int query_idx
Definition: vulkan.h:125
FFVkExecPool::query_status_stride
int query_status_stride
Definition: vulkan.h:254
FFVkExecContext::parent
const struct FFVkExecPool * parent
Definition: vulkan.h:109
AVVulkanDeviceContext
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_vulkan.h:59
FFVulkanShaderData::desc_set_buf
FFVulkanDescriptorSetData * desc_set_buf
Definition: vulkan.h:233
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
FFVkExecContext::sem_sig_val_dst_alloc
unsigned int sem_sig_val_dst_alloc
Definition: vulkan.h:146
NULL
#define NULL
Definition: coverity.c:32
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:153
FFVulkanDescriptorSet::singular
int singular
Definition: vulkan.h:176
FFVkExecContext::sem_sig_cnt
int sem_sig_cnt
Definition: vulkan.h:143
FFVulkanDescriptorSetBinding::dimensions
uint32_t dimensions
Definition: vulkan.h:81
FFVulkanContext::coop_matrix_props
VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props
Definition: vulkan.h:275
FFVulkanContext::qf_props
VkQueueFamilyProperties2 * qf_props
Definition: vulkan.h:279
hwcontext_vulkan.h
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:370
FFVkExecContext::qi
int qi
Definition: vulkan.h:116
ff_vk_shader_link
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, uint8_t *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
Definition: vulkan.c:1715
FFVkExecContext::had_submission
int had_submission
Definition: vulkan.h:111
FFVkBuffer::size
size_t size
Definition: vulkan.h:91
FFVkExecPool::nb_queries
int nb_queries
Definition: vulkan.h:255
FFVkBuffer::mapped_mem
uint8_t * mapped_mem
Definition: vulkan.h:99
FFVulkanContext
Definition: vulkan.h:263
FFVulkanShader::nb_descriptor_sets
int nb_descriptor_sets
Definition: vulkan.h:209
ff_vk_count_images
static int ff_vk_count_images(AVVkFrame *f)
Definition: vulkan.h:308
FFVulkanShader::bound_buffer_indices
uint32_t * bound_buffer_indices
Definition: vulkan.h:213
FFVkExecContext::query_data
void * query_data
Definition: vulkan.h:124
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:570
FFVulkanContext::device
AVHWDeviceContext * device
Definition: vulkan.h:290
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:508
ff_vk_shader_add_push_const
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
Definition: vulkan.c:1223
f
f
Definition: af_crystalizer.c:122
FFVkExecContext::layout_dst
VkImageLayout * layout_dst
Definition: vulkan.h:155
FFVkExecContext::queue_family_dst_alloc
unsigned int queue_family_dst_alloc
Definition: vulkan.h:159
FFVulkanDescriptorSetBinding
Definition: vulkan.h:75
FFVulkanShaderData::nb_descriptor_sets
int nb_descriptor_sets
Definition: vulkan.h:230
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:1050
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:873
size
int size
Definition: twinvq_data.h:10344
FFVulkanShader::desc_pool_size
VkDescriptorPoolSize * desc_pool_size
Definition: vulkan.h:217
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:390
FFVkExecContext::nb_frame_deps
int nb_frame_deps
Definition: vulkan.h:135
FFVkQueueFamilyCtx
Definition: vulkan.h:102
FFVulkanShader
Definition: vulkan.h:179
ff_vk_free_buf
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
Definition: vulkan.c:1135
FFVulkanShader::pipeline_layout
VkPipelineLayout pipeline_layout
Definition: vulkan.h:201
FFVkExecContext::sem_sig_val_dst_cnt
int sem_sig_val_dst_cnt
Definition: vulkan.h:147
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:692
FFVulkanContext::output_format
enum AVPixelFormat output_format
Definition: vulkan.h:304
ff_vk_exec_bind_shader
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd)
Bind a shader.
Definition: vulkan.c:2228
FFVkBuffer::flags
VkMemoryPropertyFlagBits flags
Definition: vulkan.h:90
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:107
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:76
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:621
FFVulkanContext::input_frames_ref
AVBufferRef * input_frames_ref
Definition: vulkan.h:293
FFVkExecContext::sem_wait_cnt
int sem_wait_cnt
Definition: vulkan.h:139
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:114
FFVulkanContext::qfs
uint32_t qfs[64]
Definition: vulkan.h:298
ff_vk_shader_register_exec
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
Definition: vulkan.c:1902
bprint.h
ff_vk_ret2str
const char * ff_vk_ret2str(VkResult res)
Converts Vulkan return values to strings.
Definition: vulkan.c:35
FFVulkanShaderData::desc_pool
VkDescriptorPool desc_pool
Definition: vulkan.h:238
VkFormat
enum VkFormat VkFormat
Definition: hwcontext_stub.c:25
FFVulkanShader::push_consts_num
int push_consts_num
Definition: vulkan.h:205
FFVkExecContext::layout_dst_alloc
unsigned int layout_dst_alloc
Definition: vulkan.h:156
FFVkExecPool::reg_shd
FFVulkanShaderData * reg_shd
Definition: vulkan.h:259
FFVkBuffer::mem
VkDeviceMemory mem
Definition: vulkan.h:89
FFVulkanContext::hprops
VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops
Definition: vulkan.h:272
FFVulkanContext::props
VkPhysicalDeviceProperties2 props
Definition: vulkan.h:269
FFVkExecContext::frame_locked_alloc_size
unsigned int frame_locked_alloc_size
Definition: vulkan.h:150
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:268
FFVulkanContext::nb_qfs
int nb_qfs
Definition: vulkan.h:299
FFVulkanContext::mprops
VkPhysicalDeviceMemoryProperties mprops
Definition: vulkan.h:271
FFVulkanDescriptorSet::binding_offset
VkDeviceSize * binding_offset
Definition: vulkan.h:172
FFVkExecContext::sem_wait_alloc
unsigned int sem_wait_alloc
Definition: vulkan.h:138
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:273
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:470
FFVulkanShader::name
const char * name
Definition: vulkan.h:181
FFVulkanContext::vkfn
FFVulkanFunctions vkfn
Definition: vulkan.h:267
FFVkExecPool
Definition: vulkan.h:241
FFVkExecContext::frame_locked
uint8_t * frame_locked
Definition: vulkan.h:149
ff_vk_exec_wait
void ff_vk_exec_wait(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:499
FFVkExecPool::query_data
void * query_data
Definition: vulkan.h:250
FFVkExecContext::sem_sig
VkSemaphoreSubmitInfo * sem_sig
Definition: vulkan.h:141
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:1276
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:119
FFVulkanContext::input_format
enum AVPixelFormat input_format
Definition: vulkan.h:305
FFVkQueueFamilyCtx::nb_queues
int nb_queues
Definition: vulkan.h:104
FFVulkanShader::desc_set
FFVulkanDescriptorSet * desc_set
Definition: vulkan.h:208
FFVulkanContext::coop_mat_props_nb
uint32_t coop_mat_props_nb
Definition: vulkan.h:283
vulkan_functions.h
ff_vk_shader_init
int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name, VkPipelineStageFlags stage, const char *extensions[], int nb_extensions, int lg_x, int lg_y, int lg_z, uint32_t required_subgroup_size)
Initialize a shader object, with a specific set of extensions, type+bind, local group size,...
Definition: vulkan.c:1430
FFVulkanContext::video_props
VkQueueFamilyVideoPropertiesKHR * video_props
Definition: vulkan.h:278
FFVulkanShader::object
VkShaderEXT object
Definition: vulkan.h:197
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:544
FFVulkanDescriptorSet::usage
VkBufferUsageFlags usage
Definition: vulkan.h:169
desc
const char * desc
Definition: libsvtav1.c:79
FFVulkanContext::hwctx
AVVulkanDeviceContext * hwctx
Definition: vulkan.h:291
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
FFVkExecPool::cmd_bufs
VkCommandBuffer * cmd_bufs
Definition: vulkan.h:246
FFVulkanContext::feats_12
VkPhysicalDeviceVulkan12Features feats_12
Definition: vulkan.h:286
FFVkExecContext::buf_deps_alloc_size
unsigned int buf_deps_alloc_size
Definition: vulkan.h:130
FFVkExecContext::buf_deps
AVBufferRef ** buf_deps
Definition: vulkan.h:128
FFVkBuffer
Definition: vulkan.h:87
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
hwcontext.h
FFVkExecPool::qd_size
size_t qd_size
Definition: vulkan.h:256
FFVulkanContext::frames
AVHWFramesContext * frames
Definition: vulkan.h:295
FFVulkanDescriptorSet
Definition: vulkan.h:165
FFVulkanContext::optical_flow_props
VkPhysicalDeviceOpticalFlowPropertiesNV optical_flow_props
Definition: vulkan.h:276
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:1387
FFVkExecPool::query_results
int query_results
Definition: vulkan.h:251
ff_vk_init_sampler
int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler, int unnorm_coords, VkFilter filt)
Create a sampler.
Definition: vulkan.c:1244
FFVkExecContext::sem_sig_val_dst
uint64_t ** sem_sig_val_dst
Definition: vulkan.h:145
FFVulkanContext::query_props
VkQueueFamilyQueryResultStatusPropertiesKHR * query_props
Definition: vulkan.h:277
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:928
FFVulkanDescriptorSetBinding::mem_quali
const char * mem_quali
Definition: vulkan.h:79
FFVulkanFunctions
Definition: vulkan_functions.h:263
FFVkExecPool::pool_size
int pool_size
Definition: vulkan.h:247
ff_vk_shader_update_push_const
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
Definition: vulkan.c:2218
FFVkExecPool::cmd_buf_pool
VkCommandPool cmd_buf_pool
Definition: vulkan.h:245
FFVulkanContext::coop_mat_props
VkCooperativeMatrixPropertiesKHR * coop_mat_props
Definition: vulkan.h:282
FFVkExecContext::idx
uint32_t idx
Definition: vulkan.h:108
src
#define src
Definition: vp8dsp.c:248
FFVkQueueFamilyCtx::queue_family
int queue_family
Definition: vulkan.h:103
FFVulkanShader::lg_size
int lg_size[3]
Definition: vulkan.h:187
FFVkExecContext::access_dst
VkAccessFlagBits * access_dst
Definition: vulkan.h:152