33 .queue_flags = VK_QUEUE_COMPUTE_BIT,
93 ctx->s.props.properties.limits.minStorageBufferOffsetAlignment);
95 ctx->s.props.properties.limits.minStorageBufferOffsetAlignment);
100 VK_WHOLE_SIZE, buffer_ref,
101 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
102 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT));
107 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
109 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
110 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
139 if (!slices_buf || !slices_buf->
host_ref) {
166 VkBufferMemoryBarrier2 buf_bar[2];
167 int nb_img_bar = 0, nb_buf_bar = 0, nb_imgs,
i, err;
181 .slice_data = slice_data->
address,
184 .width = avctx->
width,
207 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
208 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
218 vkf->
layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
219 vkf->
access[0] = VK_ACCESS_2_NONE;
226 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
227 VK_PIPELINE_STAGE_2_CLEAR_BIT,
228 VK_ACCESS_2_TRANSFER_WRITE_BIT,
229 VK_IMAGE_LAYOUT_GENERAL,
230 VK_QUEUE_FAMILY_IGNORED);
231 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
232 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
233 .pBufferMemoryBarriers = buf_bar,
234 .bufferMemoryBarrierCount = nb_buf_bar,
235 .pImageMemoryBarriers = img_bar,
236 .imageMemoryBarrierCount = nb_img_bar,
238 nb_img_bar = nb_buf_bar = 0;
241 for (
i = 0;
i <
FFMIN(nb_imgs, 3); ++
i) {
242 vk->CmdClearColorImage(exec->
buf, vkf->
img[
i],
243 VK_IMAGE_LAYOUT_GENERAL,
244 &((VkClearColorValue) { 0 }),
245 1, &((VkImageSubresourceRange) {
246 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
256 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
257 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
258 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
259 VK_IMAGE_LAYOUT_GENERAL,
260 VK_QUEUE_FAMILY_IGNORED);
262 ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR,
263 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
265 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
266 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
267 .pBufferMemoryBarriers = buf_bar,
268 .bufferMemoryBarrierCount = nb_buf_bar,
269 .pImageMemoryBarriers = img_bar,
270 .imageMemoryBarrierCount = nb_img_bar,
272 nb_img_bar = nb_buf_bar = 0;
280 VK_FORMAT_UNDEFINED);
286 VK_FORMAT_UNDEFINED);
290 VK_IMAGE_LAYOUT_GENERAL,
295 VK_SHADER_STAGE_COMPUTE_BIT,
304 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
305 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
306 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
307 VK_IMAGE_LAYOUT_GENERAL,
308 VK_QUEUE_FAMILY_IGNORED);
310 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
311 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
313 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
314 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
315 .pBufferMemoryBarriers = buf_bar,
316 .bufferMemoryBarrierCount = nb_buf_bar,
317 .pImageMemoryBarriers = img_bar,
318 .imageMemoryBarrierCount = nb_img_bar,
320 nb_img_bar = nb_buf_bar = 0;
328 VK_FORMAT_UNDEFINED);
334 VK_FORMAT_UNDEFINED);
338 VK_IMAGE_LAYOUT_GENERAL,
343 VK_SHADER_STAGE_COMPUTE_BIT,
366 VK_SHADER_STAGE_COMPUTE_BIT, sl,
367 (uint32_t []) { 8, 8, 1 }, 0);
370 VK_SHADER_STAGE_COMPUTE_BIT);
374 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
375 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
378 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
379 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
382 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
383 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
411 const double idct_8_scales[8] = {
412 cos(4.0*
M_PI/16.0) / 2.0, cos(1.0*
M_PI/16.0) / 2.0,
413 cos(2.0*
M_PI/16.0) / 2.0, cos(3.0*
M_PI/16.0) / 2.0,
414 cos(4.0*
M_PI/16.0) / 2.0, cos(5.0*
M_PI/16.0) / 2.0,
415 cos(6.0*
M_PI/16.0) / 2.0, cos(7.0*
M_PI/16.0) / 2.0,
417 for (
int i = 0;
i < 64;
i++)
422 VK_SHADER_STAGE_COMPUTE_BIT, sl,
423 (uint32_t []) { 32, 2, 1 }, 0);
426 VK_SHADER_STAGE_COMPUTE_BIT);
430 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
431 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
434 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
435 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
438 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
439 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
474 int max_num_mbs, err;
511 .p.name =
"prores_vulkan",
static int FUNC metadata(CodedBitstreamContext *ctx, RWContext *rw, APVRawMetadata *current)
#define i(width, name, range_min, range_max)
#define AV_CEIL_RSHIFT(a, b)
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_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.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
@ 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.
int width
picture width / height.
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
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.
int coded_width
Bitstream width / height, may be different from width/height e.g.
struct AVCodecInternal * internal
Private context used for internal data.
void * hwaccel_priv_data
hwaccel-specific private data
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.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
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
unsigned mb_height
height of the current picture in mb
int slice_count
number of slices in the current picture
unsigned slice_mb_width
maximum width of a slice in mb
int frame_type
0 = progressive, 1 = tff, 2 = bff
unsigned mb_width
width of the current picture in mb
void * hwaccel_picture_private
VkDeviceAddress slice_data
AVRefStructPool * metadata_pool
FFVkBuffer * metadata_buf
uint32_t slice_offsets_off
uint32_t slice_offsets_sz
static AVFormatContext * ctx
RefStruct is an API for creating reference-counted objects with minimal overhead.
#define ff_vk_buf_barrier(dst, vkb, s_stage, s_access, s_access2, d_stage, d_access, d_access2, offs, bsz)
#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.
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
static void vk_prores_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
static int vk_prores_end_frame(AVCodecContext *avctx)
static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int max_num_mbs, int interlaced)
static int vk_decode_prores_init(AVCodecContext *avctx)
const unsigned char ff_prores_vld_comp_spv_data[]
static int vk_prores_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int max_num_mbs, int interlaced)
const unsigned int ff_prores_vld_comp_spv_len
static int vk_prores_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
const unsigned int ff_prores_idct_comp_spv_len
static void vk_decode_prores_uninit(FFVulkanDecodeShared *ctx)
const FFVulkanDecodeDescriptor ff_vk_dec_prores_desc
const unsigned char ff_prores_idct_comp_spv_data[]