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]

Reply via email to