36 .queue_flags = VK_QUEUE_COMPUTE_BIT,
75 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
117 VkImageMemoryBarrier2 img_bar[8];
127 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
128 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
139 for (
int i = 0;
i < 4;
i++) {
140 vkf->
layout[
i] = VK_IMAGE_LAYOUT_UNDEFINED;
141 vkf->
access[
i] = VK_ACCESS_2_NONE;
145 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
146 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
147 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
148 VK_IMAGE_LAYOUT_GENERAL,
149 VK_QUEUE_FAMILY_IGNORED);
151 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
152 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
153 .pImageMemoryBarriers = img_bar,
154 .imageMemoryBarrierCount = nb_img_bar,
162 VK_IMAGE_LAYOUT_GENERAL,
168 VK_FORMAT_UNDEFINED);
174 VK_FORMAT_UNDEFINED);
179 VK_FORMAT_UNDEFINED);
197 VK_SHADER_STAGE_COMPUTE_BIT,
200 vk->CmdDispatch(exec->
buf,
235 (uint32_t []) { 512, 1, 1 }, 0);
238 VK_SHADER_STAGE_COMPUTE_BIT);
242 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
243 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
247 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
248 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
251 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
252 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
255 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
256 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
336 .p.name =
"dpx_vulkan",
static AVFormatContext * ctx
#define i(width, name, range_min, range_max)
int(* init)(AVBSFContext *ctx)
static int unpack(const uint8_t *src, const uint8_t *src_end, uint8_t *dst, int width, int height)
Unpack buffer.
static const uint8_t bits[8]
#define AV_NUM_DATA_POINTERS
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
#define HWACCEL_CAP_THREAD_SAFE
const struct FFHWAccel ff_dpx_vulkan_hwaccel
static av_cold void uninit(AVBitStreamFilterContext *ctx)
Macro definitions for various function/variable attributes.
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.
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
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)
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.
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
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.
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.
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_discard(FFVulkanContext *s, FFVkExecContext *e)
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)
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.
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_GBRP10
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GBRAP10
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
A reference to a data buffer.
uint8_t * data
The data buffer.
main external API structure.
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
struct AVCodecInternal * internal
Private context used for internal data.
void * hwaccel_priv_data
hwaccel-specific private data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
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.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
VkImageLayout layout[AV_NUM_DATA_POINTERS]
VkAccessFlagBits2 access[AV_NUM_DATA_POINTERS]
Updated after every barrier.
void * hwaccel_picture_private
enum AVPixelFormat pix_fmt
AVRefStructPool * frame_data_pool
FFVulkanDecodeShared * shared_ctx
RefStruct is an API for creating reference-counted objects with minimal overhead.
#define SPEC_LIST_ADD(name, idx, val_bits, val)
#define SPEC_LIST_CREATE(name, max_length, max_size)
static int ff_vk_count_images(AVVkFrame *f)
int ff_vk_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
Synchronize the contexts between 2 threads.
int ff_vk_decode_init(AVCodecContext *avctx)
Initialize decoder.
int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Initialize hw_frames_ctx with the parameters needed to decode the stream using the parameters from av...
int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, const uint8_t *data, size_t size, int add_startcode, uint32_t *nb_slices, const uint32_t **offsets)
Add slice data to frame.
void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture *vp)
Free a frame and its state.
int ff_vk_decode_uninit(AVCodecContext *avctx)
Free decoder.
const unsigned char ff_dpx_unpack_comp_spv_data[]
static void vk_dpx_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
static int vk_dpx_end_frame(AVCodecContext *avctx)
const unsigned int ff_dpx_copy_comp_spv_len
const FFVulkanDecodeDescriptor ff_vk_dec_dpx_desc
const unsigned char ff_dpx_copy_comp_spv_data[]
const unsigned int ff_dpx_unpack_comp_spv_len
static int vk_dpx_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
static int init_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int bits)
static int vk_decode_dpx_init(AVCodecContext *avctx)
static void vk_decode_dpx_uninit(FFVulkanDecodeShared *ctx)
static int vk_dpx_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, const uint8_t *buffer, uint32_t size)
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY