This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 4b6396a49bf873d804f7625c872086c6ffe98790 Author: Lynne <[email protected]> AuthorDate: Sat Feb 14 16:29:30 2026 +0100 Commit: Lynne <[email protected]> CommitDate: Thu Feb 19 19:42:34 2026 +0100 ffv1enc_vulkan: allocate all results memory upfront Suballocation is the Vulkan way. --- libavcodec/ffv1enc_vulkan.c | 57 +++++++++++++++++++++------------------------ libavutil/vulkan.c | 4 +++- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c index e1362524da..b779813caf 100644 --- a/libavcodec/ffv1enc_vulkan.c +++ b/libavcodec/ffv1enc_vulkan.c @@ -43,9 +43,6 @@ typedef struct VulkanEncodeFFv1FrameData { /* Output data */ AVBufferRef *out_data_ref; - /* Results data */ - AVBufferRef *results_data_ref; - /* Copied from the source */ int64_t pts; int64_t duration; @@ -53,6 +50,7 @@ typedef struct VulkanEncodeFFv1FrameData { AVBufferRef *frame_opaque_ref; int key_frame; + int idx; } VulkanEncodeFFv1FrameData; typedef struct VulkanEncodeFFv1Context { @@ -80,6 +78,9 @@ typedef struct VulkanEncodeFFv1Context { /* Constant read-only buffers */ FFVkBuffer consts_buf; + /* Results buffer */ + FFVkBuffer results_buf; + /* Slice data buffer pool */ AVBufferPool *slice_data_pool; AVBufferRef *keyframe_slice_data_ref; @@ -87,9 +88,6 @@ typedef struct VulkanEncodeFFv1Context { /* Output data buffer */ AVBufferPool *out_data_pool; - /* Slice results buffer */ - AVBufferPool *results_data_pool; - /* Intermediate frame pool */ AVBufferRef *intermediate_frames_ref; @@ -186,9 +184,6 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, size_t maxsize; FFVkBuffer *out_data_buf; - /* Results data */ - FFVkBuffer *results_data_buf; - int has_inter = avctx->gop_size > 1; uint32_t context_count = f->context_count[f->context_model]; @@ -237,15 +232,6 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, } slice_data_buf = (FFVkBuffer *)slice_data_ref->data; - /* Allocate results buffer */ - RET(ff_vk_get_pooled_buffer(&fv->s, &fv->results_data_pool, - &fd->results_data_ref, - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, - NULL, f->slice_count*sizeof(uint32_t), - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); - results_data_buf = (FFVkBuffer *)fd->results_data_ref->data; - /* Output buffer size */ maxsize = ff_ffv1_encode_buffer_size(avctx); maxsize = FFMIN(maxsize, fv->s.props_11.maxMemoryAllocationSize); @@ -314,12 +300,12 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, /* Start recording */ ff_vk_exec_start(&fv->s, exec); + fd->idx = exec->idx; RET(ff_vk_create_imageviews(&fv->s, exec, src_views, src, FF_VK_REP_NATIVE)); ff_vk_exec_add_dep_buf(&fv->s, exec, &slice_data_ref, 1, has_inter); - ff_vk_exec_add_dep_buf(&fv->s, exec, &fd->results_data_ref, 1, 1); ff_vk_exec_add_dep_buf(&fv->s, exec, &fd->out_data_ref, 1, 1); RET(ff_vk_exec_add_dep_frame(&fv->s, exec, src, @@ -483,8 +469,9 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, VK_FORMAT_UNDEFINED); ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->enc, 1, 1, 0, - results_data_buf, - 0, VK_WHOLE_SIZE, + &fv->results_buf, + fd->idx*f->max_slice_count*sizeof(uint32_t), + f->slice_count*sizeof(uint32_t), VK_FORMAT_UNDEFINED); ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->enc, 1, 2, 0, @@ -604,19 +591,19 @@ static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, VulkanEncodeFFv1FrameData *fd = exec->opaque; FFVkBuffer *out_data_buf = (FFVkBuffer *)fd->out_data_ref->data; - FFVkBuffer *results_data_buf = (FFVkBuffer *)fd->results_data_ref->data; uint32_t slice_size_max = out_data_buf->size / f->slice_count; /* Make sure encoding's done */ ff_vk_exec_wait(&fv->s, exec); /* Invalidate slice/output data if needed */ - if (!(results_data_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { + uint32_t rb_off = fd->idx*f->max_slice_count*sizeof(uint32_t); + if (!(fv->results_buf.flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { VkMappedMemoryRange invalidate_data = { .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, - .memory = results_data_buf->mem, - .offset = 0, - .size = VK_WHOLE_SIZE, + .memory = fv->results_buf.mem, + .offset = rb_off, + .size = f->slice_count*sizeof(uint32_t), }; vk->InvalidateMappedMemoryRanges(fv->s.hwctx->act_dev, 1, &invalidate_data); @@ -624,8 +611,9 @@ static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, /* Calculate final size */ pkt->size = 0; + uint8_t *rb = fv->results_buf.mapped_mem + rb_off; for (int i = 0; i < f->slice_count; i++) { - uint32_t sl_len = AV_RN32(results_data_buf->mapped_mem + i*4); + uint32_t sl_len = AV_RN32(rb + i*4); av_log(avctx, AV_LOG_DEBUG, "Slice %i size = %u\n", i, sl_len); fv->buf_regions[i] = (VkBufferCopy) { @@ -636,7 +624,6 @@ static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, pkt->size += sl_len; } av_log(avctx, AV_LOG_VERBOSE, "Encoded data: %iMiB\n", pkt->size / (1024*1024)); - av_buffer_unref(&fd->results_data_ref); /* No need for this buffer anymore */ /* Allocate packet */ if ((err = ff_get_encode_buffer(avctx, pkt, pkt->size, 0)) < 0) @@ -1240,6 +1227,15 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx) if (!fv->buf_regions) return AVERROR(ENOMEM); + /* Buffers */ + RET(ff_vk_create_buf(&fv->s, &fv->results_buf, + fv->async_depth*f->max_slice_count*sizeof(uint32_t), + NULL, NULL, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); + RET(ff_vk_map_buffer(&fv->s, &fv->results_buf, NULL, 0)); + fail: return err; } @@ -1260,7 +1256,6 @@ static av_cold int vulkan_encode_ffv1_close(AVCodecContext *avctx) for (int i = 0; i < fv->async_depth; i++) { VulkanEncodeFFv1FrameData *fd = &fv->exec_ctx_info[i]; av_buffer_unref(&fd->out_data_ref); - av_buffer_unref(&fd->results_data_ref); av_buffer_unref(&fd->frame_opaque_ref); } } @@ -1268,13 +1263,13 @@ static av_cold int vulkan_encode_ffv1_close(AVCodecContext *avctx) av_buffer_unref(&fv->intermediate_frames_ref); - av_buffer_pool_uninit(&fv->results_data_pool); - av_buffer_pool_uninit(&fv->out_data_pool); av_buffer_unref(&fv->keyframe_slice_data_ref); av_buffer_pool_uninit(&fv->slice_data_pool); + ff_vk_free_buf(&fv->s, &fv->results_buf); + ff_vk_free_buf(&fv->s, &fv->consts_buf); av_free(fv->buf_regions); diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 51242c250f..5264abd7ad 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -1126,7 +1126,9 @@ int ff_vk_map_buffers(FFVulkanContext *s, FFVkBuffer **buf, uint8_t *mem[], ff_vk_ret2str(ret)); return AVERROR_EXTERNAL; } - mem[i] = buf[i]->mapped_mem = dst; + buf[i]->mapped_mem = dst; + if (mem) + mem[i] = dst; } if (!invalidate) _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
