19#ifndef AVUTIL_VULKAN_H
20#define AVUTIL_VULKAN_H
22#define VK_NO_PROTOTYPES
39 if ((err = (x)) < 0) \
44#define SPEC_LIST_MAX 256
45#define SPEC_LIST_CREATE(name, max_length, max_size) \
46 av_assert1((max_length) < (SPEC_LIST_MAX - 3)); \
47 uint8_t name##_data[(max_size) + 3*sizeof(uint32_t)]; \
48 VkSpecializationMapEntry name##_entries[(max_length) + 3]; \
49 VkSpecializationInfo name##_info = { \
50 .pMapEntries = name##_entries, \
51 .pData = name##_data, \
53 VkSpecializationInfo *name = &name##_info;
55#define SPEC_LIST_ADD(name, idx, val_bits, val) \
57 unsigned int name##_cnt = name->mapEntryCount; \
58 size_t name##_off = name->dataSize; \
59 uint8_t *name##_dp = (uint8_t *)name->pData; \
60 void *name##_ep = (void *)&name->pMapEntries[name##_cnt]; \
61 AV_WN(val_bits, name##_dp + name##_off, (val)); \
62 VkSpecializationMapEntry name##_new_entry = { \
63 .constantID = (idx), \
64 .offset = name##_off, \
65 .size = val_bits >> 3, \
67 memcpy(name##_ep, &name##_new_entry, \
68 sizeof(VkSpecializationMapEntry)); \
69 name->dataSize = name##_off + (val_bits >> 3); \
70 name->mapEntryCount = name##_cnt + 1; \
73#define DUP_SAMPLER(x) { x, x, x, x }
75#define FF_VK_MAX_DESCRIPTOR_SETS 4
76#define FF_VK_MAX_DESCRIPTOR_BINDINGS 16
77#define FF_VK_MAX_DESCRIPTOR_TYPES 16
78#define FF_VK_MAX_PUSH_CONSTS 4
79#define FF_VK_MAX_SHADERS 16
115#define FF_VK_EXEC_MAX_FRAME_DEPS 64
116#define FF_VK_EXEC_MAX_BUF_DEPS 256
117#define FF_VK_EXEC_MAX_SW_FRAME_DEPS 16
118#define FF_VK_EXEC_MAX_SEM_OPS (FF_VK_EXEC_MAX_FRAME_DEPS*AV_NUM_DATA_POINTERS)
121#define FF_VK_DEFAULT_EXEC_CONTEXTS 4
304 VkPhysicalDeviceExternalMemoryHostPropertiesEXT
hprops;
310#ifdef VK_EXT_shader_long_vector
311 VkPhysicalDeviceShaderLongVectorPropertiesEXT long_vector_props;
315#ifdef VK_KHR_maintenance9
316 VkQueueFamilyOwnershipTransferPropertiesKHR *ownership_props;
330#ifdef VK_KHR_unified_image_layouts
331 VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR unified_layout_feats;
367 const VkBaseInStructure *in = chain;
369 if (in->sType == stype)
380 VkBaseOutStructure *
out = chain;
384 out->pNext = (
void *)in;
387#define FF_VK_STRUCT_EXT(CTX, BASE, STRUCT_P, EXT_FLAG, TYPE) \
389 if ((EXT_FLAG == FF_VK_EXT_NO_FLAG) || \
390 ((CTX)->extensions & EXT_FLAG)) { \
391 (STRUCT_P)->sType = TYPE; \
392 ff_vk_link_struct(BASE, STRUCT_P); \
459 VkQueueFlagBits dev_family,
460 VkVideoCodecOperationFlagBitsKHR vid_ops);
471 int nb_queries, VkQueryType query_type,
int query_64bit,
472 const void *query_create_pnext);
486 void **
data, VkQueryResultFlagBits
flags);
523 VkObjectType
type, uint64_t obj);
526 VkSemaphore sem, uint64_t
val,
527 VkPipelineStageFlagBits2 stage);
529 VkSemaphore *sem,
int nb,
530 VkPipelineStageFlagBits2 stage,
533 VkPipelineStageFlagBits2 wait_stage,
534 VkPipelineStageFlagBits2 signal_stage);
538 VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar);
540 VkSemaphore *
dst, uint64_t *dst_val,
548 VkImageView *img_view, VkImageAspectFlags *aspect,
575#define ff_vk_buf_barrier(dst, vkb, s_stage, s_access, s_access2, \
576 d_stage, d_access, d_access2, offs, bsz) \
578 dst = (VkBufferMemoryBarrier2) { \
579 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, \
580 .srcStageMask = VK_PIPELINE_STAGE_2_ ##s_stage, \
581 .srcAccessMask = VK_ACCESS_2_ ##s_access | \
582 VK_ACCESS_2_ ##s_access2, \
583 .dstStageMask = VK_PIPELINE_STAGE_2_ ##d_stage, \
584 .dstAccessMask = VK_ACCESS_2_ ##d_access | \
585 VK_ACCESS_2_ ##d_access2, \
586 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, \
587 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, \
588 .buffer = vkb->buf, \
595 AVFrame *pic, VkImageMemoryBarrier2 *bar,
int *nb_bar,
596 VkPipelineStageFlags2 src_stage,
597 VkPipelineStageFlags2 dst_stage,
598 VkAccessFlagBits2 new_access,
599 VkImageLayout new_layout,
611 VkImageTiling tiling, VkImageUsageFlags
usage,
612 VkImageCreateFlags
flags,
void *create_pnext);
621 VkMemoryPropertyFlagBits req_flags,
void *alloc_extension,
622 VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem);
624 void *pNext,
void *alloc_pNext,
625 VkBufferUsageFlags
usage, VkMemoryPropertyFlagBits
flags);
631 VkDeviceSize
offset, VkDeviceSize mem_size,
638 int nb_buffers,
int invalidate);
662 void *create_pNext,
size_t size,
663 VkMemoryPropertyFlagBits mem_props);
670 uint8_t *src_data, VkDeviceSize
size,
672 VkBufferUsageFlags
usage);
678 int unnorm_coords, VkFilter
filt);
686 VkPipelineStageFlags stage, VkSpecializationInfo *spec,
687 uint32_t wg_size[3], uint32_t required_subgroup_size);
693 const char *spirv,
size_t spirv_len,
694 const char *entrypoint);
700 VkShaderStageFlagBits stage);
728 VkShaderStageFlagBits stage,
737 int set,
int bind,
int elem,
746 VkImageView view, VkImageLayout
layout,
755 VkImageView *views,
int set,
int binding,
756 VkImageLayout
layout, VkSampler sampler);
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static double val(void *priv, double ch)
static const char *const format[]
static const int8_t filt[NUMTAPS *2]
simple assert() macros that are a bit more flexible than ISO C assert().
#define flags(name, subs,...)
static enum AVPixelFormat pix_fmt
void(* flush)(AVBSFContext *ctx)
intptr_t atomic_uint_least64_t
#define AV_NUM_DATA_POINTERS
API-specific header for AV_HWDEVICE_TYPE_VULKAN.
const VkComponentMapping ff_comp_identity_map
AVPixelFormat
Pixel format.
#define FF_ARRAY_ELEMS(a)
A reference to a data buffer.
Describe the class of an AVClass context structure.
This structure describes decoded (raw) audio or video data.
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
This struct describes a set or pool of "hardware" frames (i.e.
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
VkMemoryPropertyFlagBits flags
VkAccessFlagBits access_dst[FF_VK_EXEC_MAX_FRAME_DEPS]
AVBufferRef * buf_deps[FF_VK_EXEC_MAX_BUF_DEPS]
uint8_t frame_update[FF_VK_EXEC_MAX_FRAME_DEPS]
VkSemaphoreSubmitInfo sem_wait[FF_VK_EXEC_MAX_SEM_OPS]
FFVkExecObjDep obj_deps[FF_VK_EXEC_MAX_BUF_DEPS]
AVFrame * sw_frame_deps[FF_VK_EXEC_MAX_SW_FRAME_DEPS]
uint32_t queue_family_dst[FF_VK_EXEC_MAX_FRAME_DEPS]
uint64_t * sem_sig_val_dst[FF_VK_EXEC_MAX_SEM_OPS]
VkSemaphoreSubmitInfo sem_sig[FF_VK_EXEC_MAX_SEM_OPS]
const struct FFVkExecPool * parent
uint8_t frame_locked[FF_VK_EXEC_MAX_FRAME_DEPS]
void * refstruct_deps[FF_VK_EXEC_MAX_BUF_DEPS]
VkImageLayout layout_dst[FF_VK_EXEC_MAX_FRAME_DEPS]
AVFrame * frame_deps[FF_VK_EXEC_MAX_FRAME_DEPS]
FFVulkanShaderData reg_shd[FF_VK_MAX_SHADERS]
atomic_uint_least64_t idx
FFVkExecContext * contexts
VkCommandBuffer * cmd_bufs
VkCommandPool * cmd_buf_pools
PFN_vkDestroyImageView destroy_image_view
const VkAllocationCallbacks * alloc
VkImageView views[AV_NUM_DATA_POINTERS]
AVHWFramesContext * frames
VkPhysicalDeviceMemoryProperties mprops
VkPhysicalDeviceVulkan12Features feats_12
FFVulkanExtensions extensions
VkPhysicalDeviceOpticalFlowPropertiesNV optical_flow_props
VkImageLayout * host_image_copy_layouts
VkQueueFamilyVideoPropertiesKHR * video_props
AVVulkanDeviceContext * hwctx
VkPhysicalDeviceHostImageCopyPropertiesEXT host_image_props
VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props
VkMemoryPropertyFlagBits host_cached_flag
AVBufferRef * input_frames_ref
VkCooperativeMatrixPropertiesKHR * coop_mat_props
VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats
enum AVPixelFormat input_format
AVRefStructPool * imageviews_pool
VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops
VkPhysicalDevicePushDescriptorPropertiesKHR push_desc_props
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props
uint32_t coop_mat_props_nb
VkPhysicalDeviceVulkan11Properties props_11
VkPhysicalDeviceDriverProperties driver_props
AVHWDeviceContext * device
VkPhysicalDeviceProperties2 props
VkQueueFamilyProperties2 * qf_props
VkPhysicalDeviceFeatures2 feats
enum AVPixelFormat output_format
VkPhysicalDeviceDescriptorBufferPropertiesEXT desc_buf_props
AVVulkanFramesContext * hwfc
VkQueueFamilyQueryResultStatusPropertiesKHR * query_props
VkShaderStageFlags stages
VkDeviceSize aligned_size
VkDeviceSize binding_offset[FF_VK_MAX_DESCRIPTOR_BINDINGS]
VkDescriptorSetLayoutBinding binding[FF_VK_MAX_DESCRIPTOR_BINDINGS]
VkDescriptorSet * desc_sets
FFVulkanDescriptorSetData desc_set_buf[FF_VK_MAX_DESCRIPTOR_SETS]
VkDescriptorBufferBindingInfoEXT desc_bind[FF_VK_MAX_DESCRIPTOR_SETS]
VkDescriptorPool desc_pool
VkPipelineLayout pipeline_layout
FFVulkanDescriptorSet desc_set[FF_VK_MAX_DESCRIPTOR_SETS]
VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info
VkPipelineStageFlags stage
VkSpecializationInfo * specialization_info
VkPushConstantRange push_consts[FF_VK_MAX_PUSH_CONSTS]
VkDescriptorSetLayout desc_layout[FF_VK_MAX_DESCRIPTOR_SETS]
VkPipelineBindPoint bind_point
VkDescriptorPoolSize desc_pool_size[FF_VK_MAX_DESCRIPTOR_TYPES]
static AVFormatContext * ctx
static void set(uint8_t *a[], int ch, int index, int ch_count, enum AVSampleFormat f, double v)
void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
Since storage images may not be swizzled, we have to do this in the shader itself.
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.
int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size)
Initialize a shader object.
void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular)
Add descriptor to a shader.
void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
FFVkShaderRepFormat
Returns the format to use for images in shaders.
const char * ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt, enum FFVkShaderRepFormat rep_fmt)
int ff_vk_unmap_buffers(FFVulkanContext *s, FFVkBuffer **buf, int nb_buffers, int flush)
VkImageAspectFlags ff_vk_aspect_flag(AVFrame *f, int p)
Get the aspect flag for a plane from an image.
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *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.
void ff_vk_image_free(FFVulkanContext *s, VkImage *img, VkDeviceMemory *mem)
Free an image created by ff_vk_image_create(); all GPU use must have completed.
void ff_vk_exec_wait(FFVulkanContext *s, FFVkExecContext *e)
int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req, VkMemoryPropertyFlagBits req_flags, void *alloc_extension, VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
int ff_vk_image_create(FFVulkanContext *s, VkImage *img, VkDeviceMemory *mem, int width, int height, VkFormat format, int nb_layers, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, void *create_pnext)
Memory/buffer/image allocation helpers.
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
int ff_vk_shader_update_img(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int offs, VkImageView view, VkImageLayout layout, VkSampler sampler)
Sets an image descriptor for specified shader and binding.
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
int ff_vk_load_props(FFVulkanContext *s)
Loads props/mprops/driver_props.
int ff_vk_map_buffers(FFVulkanContext *s, FFVkBuffer **buf, uint8_t *mem[], int nb_buffers, int invalidate)
Buffer management code.
const char * ff_vk_ret2str(VkResult res)
Converts Vulkan return values to strings.
#define FF_VK_EXEC_MAX_SEM_OPS
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.
static const void * ff_vk_find_struct(const void *chain, VkStructureType stype)
int ff_vk_exec_add_dep_sw_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f)
void ff_vk_exec_add_dep_obj(FFVulkanContext *s, FFVkExecContext *e, VkObjectType type, uint64_t obj)
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags2 src_stage, VkPipelineStageFlags2 dst_stage, VkAccessFlagBits2 new_access, VkImageLayout new_layout, uint32_t new_qf)
VkFormatFeatureFlagBits2 ff_vk_map_usage_to_feats(VkImageUsageFlags usage)
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
Create an imageview and add it as a dependency to an execution.
#define FF_VK_MAX_SHADERS
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
FFVkImageViews * ff_vk_imageviews_alloc(FFVulkanContext *s, int nb_views)
Allocate a reference-counted set of image views, zero-initialized for the caller to create.
static int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
VkResult ff_vk_exec_get_query(FFVulkanContext *s, FFVkExecContext *e, void **data, VkQueryResultFlagBits flags)
Performs nb_queries queries and returns their results and statuses.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler, int unnorm_coords, VkFilter filt)
Create a sampler.
#define FF_VK_EXEC_MAX_FRAME_DEPS
static int ff_vk_count_images(AVVkFrame *f)
void ff_vk_exec_update_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt)
Returns 1 if pixfmt is a usable RGB format.
#define FF_VK_MAX_PUSH_CONSTS
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, const FFVulkanShader *shd)
Bind a shader.
#define FF_VK_MAX_DESCRIPTOR_BINDINGS
void ff_vk_exec_move_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
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.
#define FF_VK_EXEC_MAX_BUF_DEPS
VkImageUsageFlags ff_vk_map_feats_to_usage(VkFormatFeatureFlagBits2 feats)
Map between usage and features.
AVVulkanDeviceQueueFamily * ff_vk_qf_find(FFVulkanContext *s, VkQueueFlagBits dev_family, VkVideoCodecOperationFlagBitsKHR vid_ops)
Chooses an appropriate QF.
int ff_vk_host_map_buffer(FFVulkanContext *s, FFVkBuffer **dst, uint8_t *src_data, VkDeviceSize size, const AVBufferRef *src_buf, VkBufferUsageFlags usage)
Maps a system RAM buffer into a Vulkan buffer.
void ff_vk_exec_add_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
Execution dependency management.
int ff_vk_create_imageview(FFVulkanContext *s, VkImageView *img_view, VkImageAspectFlags *aspect, AVFrame *f, int plane, enum FFVkShaderRepFormat rep_fmt)
Create a single imageview for a given plane.
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVRefStructPool **buf_pool, FFVkBuffer **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
#define FF_VK_EXEC_MAX_SW_FRAME_DEPS
int ff_vk_flush_buffer(FFVulkanContext *s, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize mem_size, int flush)
Flush or invalidate a single buffer, with a given size and offset.
int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *dst, uint64_t *dst_val, AVFrame *f)
static void ff_vk_link_struct(void *chain, const void *in)
void ff_vk_exec_discard(FFVulkanContext *s, FFVkExecContext *e)
#define FF_VK_MAX_DESCRIPTOR_SETS
void ff_vk_exec_add_dep_bool_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *sem, int nb, VkPipelineStageFlagBits2 stage, int wait)
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, const char *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
#define FF_VK_MAX_DESCRIPTOR_TYPES
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.
void ff_vk_exec_add_dep_wait_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore sem, uint64_t val, VkPipelineStageFlagBits2 stage)
uint64_t FFVulkanExtensions