35 .queue_flags = VK_QUEUE_COMPUTE_BIT,
82 VK_WHOLE_SIZE, buffer_ref,
83 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
84 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
89 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
91 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
92 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
148 VkImageMemoryBarrier2 img_bar[8];
156 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
157 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
169 vkf->
layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
170 vkf->
access[0] = VK_ACCESS_2_NONE;
173 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
174 VK_PIPELINE_STAGE_2_CLEAR_BIT,
175 VK_ACCESS_2_TRANSFER_WRITE_BIT,
176 VK_IMAGE_LAYOUT_GENERAL,
177 VK_QUEUE_FAMILY_IGNORED);
179 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
180 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
181 .pImageMemoryBarriers = img_bar,
182 .imageMemoryBarrierCount = nb_img_bar,
186 vk->CmdClearColorImage(exec->
buf, vkf->
img[0],
187 VK_IMAGE_LAYOUT_GENERAL,
188 &((VkClearColorValue) { 0 }),
189 1, &((VkImageSubresourceRange) {
190 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
196 VK_PIPELINE_STAGE_2_CLEAR_BIT,
197 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
198 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
199 VK_IMAGE_LAYOUT_GENERAL,
200 VK_QUEUE_FAMILY_IGNORED);
202 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
203 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
204 .pImageMemoryBarriers = img_bar,
205 .imageMemoryBarrierCount = nb_img_bar,
213 VK_IMAGE_LAYOUT_GENERAL,
219 VK_FORMAT_UNDEFINED);
225 .pkt_data = slices_buf->
address,
227 memcpy(pd_decode.
qmat, prr->
qmat, 64);
230 VK_SHADER_STAGE_COMPUTE_BIT,
236 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
237 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
238 VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
239 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
240 VK_IMAGE_LAYOUT_GENERAL,
241 VK_QUEUE_FAMILY_IGNORED);
247 VK_IMAGE_LAYOUT_GENERAL,
253 VK_FORMAT_UNDEFINED);
256 VK_SHADER_STAGE_COMPUTE_BIT,
257 0,
sizeof(pd_decode), &pd_decode);
259 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
260 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
261 .pImageMemoryBarriers = img_bar,
262 .imageMemoryBarrierCount = nb_img_bar,
281 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
282 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
285 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
286 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
302 VK_SHADER_STAGE_COMPUTE_BIT);
304 (uint32_t []) { 1, 4, 1 }, 0);
325 int nb_blocks =
version == 0 ? 8 : 16;
329 const double idct_8_scales[8] = {
330 cos(4.0*
M_PI/16.0) / 2.0, cos(1.0*
M_PI/16.0) / 2.0,
331 cos(2.0*
M_PI/16.0) / 2.0, cos(3.0*
M_PI/16.0) / 2.0,
332 cos(4.0*
M_PI/16.0) / 2.0, cos(5.0*
M_PI/16.0) / 2.0,
333 cos(6.0*
M_PI/16.0) / 2.0, cos(7.0*
M_PI/16.0) / 2.0,
335 for (
int i = 0;
i < 64;
i++)
340 (uint32_t []) { 8, nb_blocks, 4 }, 0);
343 VK_SHADER_STAGE_COMPUTE_BIT);
410 .p.name =
"prores_raw_vulkan",
#define i(width, name, range_min, range_max)
int(* init)(AVBSFContext *ctx)
#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_prores_raw_vulkan_hwaccel
static av_always_inline uint32_t av_float2int(float f)
Reinterpret a float as a 32-bit integer.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
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.
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.
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.
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
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.
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.
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.
VkImage img[AV_NUM_DATA_POINTERS]
Vulkan images to which the memory is bound to.
FFVulkanDecodeShared * shared_ctx
void * hwaccel_picture_private
AVRefStructPool * frame_data_pool
FFVkBuffer * frame_data_buf
static AVFormatContext * 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)
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.
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
const unsigned char ff_prores_raw_decode_comp_spv_data[]
const unsigned char ff_prores_raw_idct_comp_spv_data[]
static int vk_prores_raw_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
static void vk_decode_prores_raw_uninit(FFVulkanDecodeShared *ctx)
static int vk_prores_raw_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
static int vk_decode_prores_raw_init(AVCodecContext *avctx)
static int add_desc(AVCodecContext *avctx, FFVulkanContext *s, FFVulkanShader *shd)
static void vk_prores_raw_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
const FFVulkanDecodeDescriptor ff_vk_dec_prores_raw_desc
const unsigned int ff_prores_raw_decode_comp_spv_len
const unsigned int ff_prores_raw_idct_comp_spv_len
static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int version)
static int vk_prores_raw_end_frame(AVCodecContext *avctx)
static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int version)