This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 2dd3328240cc11a32c1acbae365558e3a1b0232e Author: Lynne <[email protected]> AuthorDate: Sun Jul 26 15:37:10 2026 +0800 Commit: Lynne <[email protected]> CommitDate: Sun Aug 2 22:11:28 2026 +0900 vulkan: give ff_vk_host_map_buffer an explicit import length The function sized every import from src_data to the end of the source buffer. For packets which are small views of a much larger allocation, this pinned and mapped every page of the underlying allocation, at around 1.6us per page, regardless of what the GPU ever touches. Take the import length as a VkDeviceSize, clamped to the end of the source buffer; the clamp doubles as the implementation of VK_WHOLE_SIZE. --- libavcodec/proresenc_kostya_vulkan.c | 4 ++-- libavcodec/vulkan_apv.c | 2 +- libavcodec/vulkan_dpx.c | 6 +++--- libavcodec/vulkan_ffv1.c | 2 +- libavcodec/vulkan_prores.c | 2 +- libavcodec/vulkan_prores_raw.c | 2 +- libavutil/hwcontext_vulkan.c | 6 +++--- libavutil/vulkan.c | 9 +++++---- libavutil/vulkan.h | 8 +++++--- 9 files changed, 22 insertions(+), 19 deletions(-) diff --git a/libavcodec/proresenc_kostya_vulkan.c b/libavcodec/proresenc_kostya_vulkan.c index e95302f928..2cbb039deb 100644 --- a/libavcodec/proresenc_kostya_vulkan.c +++ b/libavcodec/proresenc_kostya_vulkan.c @@ -674,8 +674,8 @@ static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pk /* Roll transfer execution context */ if (transfer_slices) { - RET(ff_vk_host_map_buffer(vkctx, &mapped_ref, pkt->data, pkt->buf, - VK_BUFFER_USAGE_TRANSFER_DST_BIT)); + RET(ff_vk_host_map_buffer(vkctx, &mapped_ref, pkt->data, pkt->size, + pkt->buf, VK_BUFFER_USAGE_TRANSFER_DST_BIT)); mapped_buf = (FFVkBuffer *)mapped_ref->data; transfer_exec = ff_vk_exec_get(vkctx, &pv->transfer_exec_pool); ff_vk_exec_start(vkctx, transfer_exec); diff --git a/libavcodec/vulkan_apv.c b/libavcodec/vulkan_apv.c index 9c077cafb4..39546b2c9c 100644 --- a/libavcodec/vulkan_apv.c +++ b/libavcodec/vulkan_apv.c @@ -80,7 +80,7 @@ static int vk_apv_start_frame(AVCodecContext *avctx, /* Host map the input tile data if supported */ if (ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data, - buffer_ref, + VK_WHOLE_SIZE, buffer_ref, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); diff --git a/libavcodec/vulkan_dpx.c b/libavcodec/vulkan_dpx.c index 103dd65694..706d34d299 100644 --- a/libavcodec/vulkan_dpx.c +++ b/libavcodec/vulkan_dpx.c @@ -57,8 +57,8 @@ typedef struct DecodePushData { static int vk_dpx_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, - av_unused const uint8_t *buffer, - av_unused uint32_t size) + const uint8_t *buffer, + uint32_t size) { FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; FFVulkanDecodeShared *ctx = dec->shared_ctx; @@ -71,7 +71,7 @@ static int vk_dpx_start_frame(AVCodecContext *avctx, if (!vp->slices_buf && ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, (uint8_t *)buffer, - buffer_ref, + size, buffer_ref, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); return 0; diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c index c331839e37..9dd96fc1a7 100644 --- a/libavcodec/vulkan_ffv1.c +++ b/libavcodec/vulkan_ffv1.c @@ -145,7 +145,7 @@ static int vk_ffv1_start_frame(AVCodecContext *avctx, /* Host map the input slices data if supported */ if (ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data, - buffer_ref, + VK_WHOLE_SIZE, buffer_ref, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); diff --git a/libavcodec/vulkan_prores.c b/libavcodec/vulkan_prores.c index ef3b5381a6..77bd99acc9 100644 --- a/libavcodec/vulkan_prores.c +++ b/libavcodec/vulkan_prores.c @@ -97,7 +97,7 @@ static int vk_prores_start_frame(AVCodecContext *avctx, /* Host map the input slices data if supported */ if (!vp->slices_buf && ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) RET(ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data, - buffer_ref, + VK_WHOLE_SIZE, buffer_ref, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)); diff --git a/libavcodec/vulkan_prores_raw.c b/libavcodec/vulkan_prores_raw.c index 3642f5aa77..398a1661cc 100644 --- a/libavcodec/vulkan_prores_raw.c +++ b/libavcodec/vulkan_prores_raw.c @@ -79,7 +79,7 @@ static int vk_prores_raw_start_frame(AVCodecContext *avctx, /* Host map the input tile data if supported */ if (ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data, - buffer_ref, + VK_WHOLE_SIZE, buffer_ref, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 40a53cbfaf..692ce931f0 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -4526,7 +4526,7 @@ static int host_map_frame(AVHWFramesContext *hwfc, AVBufferRef **dst, int *nb_bu /* Single buffer contains all planes */ if (nb_src_bufs == 1) { err = ff_vk_host_map_buffer(&p->vkctx, &dst[0], - swf->data[0], swf->buf[0], + swf->data[0], VK_WHOLE_SIZE, swf->buf[0], buf_usage); if (err < 0) return err; @@ -4538,8 +4538,8 @@ static int host_map_frame(AVHWFramesContext *hwfc, AVBufferRef **dst, int *nb_bu } else if (nb_src_bufs == planes) { /* One buffer per plane */ for (int i = 0; i < planes; i++) { err = ff_vk_host_map_buffer(&p->vkctx, &dst[i], - swf->data[i], swf->buf[i], - buf_usage); + swf->data[i], VK_WHOLE_SIZE, + swf->buf[i], buf_usage); if (err < 0) goto fail; (*nb_bufs)++; diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 3b2cc35bf9..dffb6724b8 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -1409,7 +1409,8 @@ static void destroy_avvkbuf(void *opaque, uint8_t *data) } int ff_vk_host_map_buffer(FFVulkanContext *s, AVBufferRef **dst, - uint8_t *src_data, const AVBufferRef *src_buf, + uint8_t *src_data, VkDeviceSize size, + const AVBufferRef *src_buf, VkBufferUsageFlags usage) { int err; @@ -1457,9 +1458,9 @@ int ff_vk_host_map_buffer(FFVulkanContext *s, AVBufferRef **dst, if (!ref) return AVERROR(ENOMEM); - /* Add the offset at the start, which gets ignored */ - const ptrdiff_t src_offset = src_data - src_buf->data; - buffer_size = offs + (src_buf->size - src_offset); + /* Add the offset at the start, which gets ignored. */ + const VkDeviceSize src_avail = src_buf->size - (src_data - src_buf->data); + buffer_size = offs + FFMIN(size, src_avail); buffer_size = FFALIGN(buffer_size, s->props.properties.limits.minMemoryMapAlignment); buffer_size = FFALIGN(buffer_size, s->hprops.minImportedHostPointerAlignment); diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index b37d998d37..c65435fcf2 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -587,10 +587,12 @@ int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVBufferPool **buf_pool, VkMemoryPropertyFlagBits mem_props); /** Maps a system RAM buffer into a Vulkan buffer. - * References the source buffer. - */ + * References the source buffer. Imports size bytes starting at src_data, + * rounded up to the host-pointer import alignment and clamped to the end + * of src_buf. */ int ff_vk_host_map_buffer(FFVulkanContext *s, AVBufferRef **dst, - uint8_t *src_data, const AVBufferRef *src_buf, + uint8_t *src_data, VkDeviceSize size, + const AVBufferRef *src_buf, VkBufferUsageFlags usage); /** _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
