This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 1d14f9f8c3e4efb32000cb463ebb635ad6f2adb0
Author:     Lynne <[email protected]>
AuthorDate: Sun Jul 19 16:16:18 2026 +0800
Commit:     Lynne <[email protected]>
CommitDate: Wed Aug 5 16:04:31 2026 +0900

    vulkan: decouple execution pool depths from queue and thread counts
    
    Pool depth sets how far the CPU records ahead of the GPU, and has no 
relation
    to the number of queues in a family.
    Scaling it by the queue count only multiplied command pools, fences and 
context state.
    Use a small fixed depth everywhere, and one context per thread only for 
threadsafe hwaccels,
    which submit from every frame thread concurrently.
---
 libavcodec/vulkan_decode.c          | 15 +++++++--------
 libavfilter/vf_avgblur_vulkan.c     |  2 +-
 libavfilter/vf_blackdetect_vulkan.c |  2 +-
 libavfilter/vf_blend_vulkan.c       |  2 +-
 libavfilter/vf_bwdif_vulkan.c       |  2 +-
 libavfilter/vf_chromaber_vulkan.c   |  2 +-
 libavfilter/vf_flip_vulkan.c        |  2 +-
 libavfilter/vf_gblur_vulkan.c       |  2 +-
 libavfilter/vf_interlace_vulkan.c   |  2 +-
 libavfilter/vf_overlay_vulkan.c     |  2 +-
 libavfilter/vf_scale_vulkan.c       |  4 ++--
 libavfilter/vf_scdet_vulkan.c       |  2 +-
 libavfilter/vf_transpose_vulkan.c   |  2 +-
 libavfilter/vf_xfade_vulkan.c       |  2 +-
 libavfilter/vsrc_testsrc_vulkan.c   |  2 +-
 libavutil/hwcontext_vulkan.c        |  6 +++---
 libavutil/vulkan.h                  |  3 +++
 17 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index 766435ea4d..fb49e60e4d 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -1317,14 +1317,13 @@ int ff_vk_decode_init(AVCodecContext *avctx)
         session_create.flags = 
VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR;
 #endif
 
-    /* Create decode exec context for this specific main thread.
-     * 2 async contexts per thread was experimentally determined to be optimal
-     * for a majority of streams. */
-    async_depth = 2*ctx->qf->num;
-    /* We don't need more than 2 per thread context */
-    async_depth = FFMIN(async_depth, 2*avctx->thread_count);
-    /* Make sure there are enough async contexts for each thread */
-    async_depth = FFMAX(async_depth, avctx->thread_count);
+    /* Create the decode exec context.
+     * A small fixed depth is enough to keep the GPU fed, as submissions are
+     * serialized for hardware decoding; thread-safe hwaccels submit from
+     * every frame thread concurrently, and need a context per thread. */
+    async_depth = FF_VK_DEFAULT_EXEC_CONTEXTS;
+    if (ffhwaccel(avctx->hwaccel)->caps_internal & HWACCEL_CAP_THREAD_SAFE)
+        async_depth = FFMAX(async_depth, avctx->thread_count);
 
     err = ff_vk_exec_pool_init(s, ctx->qf, &ctx->exec_pool,
                                async_depth, 0, 0, 0, profile);
diff --git a/libavfilter/vf_avgblur_vulkan.c b/libavfilter/vf_avgblur_vulkan.c
index da00e3579d..be11a76070 100644
--- a/libavfilter/vf_avgblur_vulkan.c
+++ b/libavfilter/vf_avgblur_vulkan.c
@@ -61,7 +61,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame 
*in)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT,
                       NULL, (uint32_t []) { 32, 1, planes }, 0);
diff --git a/libavfilter/vf_blackdetect_vulkan.c 
b/libavfilter/vf_blackdetect_vulkan.c
index 298b298a18..f296e62cc4 100644
--- a/libavfilter/vf_blackdetect_vulkan.c
+++ b/libavfilter/vf_blackdetect_vulkan.c
@@ -78,7 +78,7 @@ static av_cold int init_filter(AVFilterContext *ctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     SPEC_LIST_CREATE(sl, 2, 2*sizeof(uint32_t))
     SPEC_LIST_ADD(sl, 0, 32, plane);
diff --git a/libavfilter/vf_blend_vulkan.c b/libavfilter/vf_blend_vulkan.c
index 525381c04f..f5b54e50ce 100644
--- a/libavfilter/vf_blend_vulkan.c
+++ b/libavfilter/vf_blend_vulkan.c
@@ -103,7 +103,7 @@ static av_cold int init_filter(AVFilterContext *avctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     SPEC_LIST_CREATE(sl, 1, 1*sizeof(uint32_t))
     SPEC_LIST_ADD(sl, 0, 32, planes);
diff --git a/libavfilter/vf_bwdif_vulkan.c b/libavfilter/vf_bwdif_vulkan.c
index c8f6ad1fed..717b5a4ff7 100644
--- a/libavfilter/vf_bwdif_vulkan.c
+++ b/libavfilter/vf_bwdif_vulkan.c
@@ -59,7 +59,7 @@ static av_cold int init_filter(AVFilterContext *ctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL,
                       (uint32_t [3]) { 1, 64, planes }, 0);
diff --git a/libavfilter/vf_chromaber_vulkan.c 
b/libavfilter/vf_chromaber_vulkan.c
index 7a9bf77e09..934aab0ee3 100644
--- a/libavfilter/vf_chromaber_vulkan.c
+++ b/libavfilter/vf_chromaber_vulkan.c
@@ -63,7 +63,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame 
*in)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
     RET(ff_vk_init_sampler(vkctx, &s->sampler, 0, VK_FILTER_LINEAR));
 
     ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL,
diff --git a/libavfilter/vf_flip_vulkan.c b/libavfilter/vf_flip_vulkan.c
index b44c12c49d..94e5ac5ecb 100644
--- a/libavfilter/vf_flip_vulkan.c
+++ b/libavfilter/vf_flip_vulkan.c
@@ -58,7 +58,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame 
*in)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL,
                       (uint32_t []) { 32, 8, planes }, 0);
diff --git a/libavfilter/vf_gblur_vulkan.c b/libavfilter/vf_gblur_vulkan.c
index 021c94f5a5..ddf9c00c64 100644
--- a/libavfilter/vf_gblur_vulkan.c
+++ b/libavfilter/vf_gblur_vulkan.c
@@ -160,7 +160,7 @@ static av_cold int init_filter(AVFilterContext *ctx, 
AVFrame *in)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     const FFVulkanDescriptorSetBinding desc[] = {
         { /* input_img */
diff --git a/libavfilter/vf_interlace_vulkan.c 
b/libavfilter/vf_interlace_vulkan.c
index 3de16c51ed..8955dd8a3b 100644
--- a/libavfilter/vf_interlace_vulkan.c
+++ b/libavfilter/vf_interlace_vulkan.c
@@ -57,7 +57,7 @@ static av_cold int init_filter(AVFilterContext *ctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
     RET(ff_vk_init_sampler(vkctx, &s->sampler, 1,
                            s->lowpass == VLPF_OFF ? VK_FILTER_NEAREST
                                                   : VK_FILTER_LINEAR));
diff --git a/libavfilter/vf_overlay_vulkan.c b/libavfilter/vf_overlay_vulkan.c
index 561fd812bd..dee9d1c794 100644
--- a/libavfilter/vf_overlay_vulkan.c
+++ b/libavfilter/vf_overlay_vulkan.c
@@ -66,7 +66,7 @@ static av_cold int init_filter(AVFilterContext *ctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     SPEC_LIST_CREATE(sl, 2, 2*sizeof(uint32_t))
     SPEC_LIST_ADD(sl, 0, 32, planes);
diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c
index 2cb5e15587..770f831050 100644
--- a/libavfilter/vf_scale_vulkan.c
+++ b/libavfilter/vf_scale_vulkan.c
@@ -115,7 +115,7 @@ static av_cold int init_filter(AVFilterContext *ctx, 
AVFrame *in)
         }
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     RET(ff_vk_init_sampler(vkctx, &s->sampler, 0, sampler_mode));
 
@@ -189,7 +189,7 @@ static av_cold int init_debayer(AVFilterContext *ctx, 
AVFrame *in)
     FFVulkanContext *vkctx = &s->vkctx;
     FFVulkanShader *shd = &s->shd;
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*2, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     SPEC_LIST_CREATE(sl, 1, 1*sizeof(int32_t))
     SPEC_LIST_ADD(sl, 0, 32, s->debayer);
diff --git a/libavfilter/vf_scdet_vulkan.c b/libavfilter/vf_scdet_vulkan.c
index 97273cc750..6f5b0b30f2 100644
--- a/libavfilter/vf_scdet_vulkan.c
+++ b/libavfilter/vf_scdet_vulkan.c
@@ -69,7 +69,7 @@ static av_cold int init_filter(AVFilterContext *ctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     SPEC_LIST_CREATE(sl, 2, 2*sizeof(uint32_t))
     SPEC_LIST_ADD(sl, 0, 32, s->nb_planes);
diff --git a/libavfilter/vf_transpose_vulkan.c 
b/libavfilter/vf_transpose_vulkan.c
index 2eef40d061..3e6b39d464 100644
--- a/libavfilter/vf_transpose_vulkan.c
+++ b/libavfilter/vf_transpose_vulkan.c
@@ -55,7 +55,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame 
*in)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL,
                       (uint32_t []) { 32, 1, planes }, 0);
diff --git a/libavfilter/vf_xfade_vulkan.c b/libavfilter/vf_xfade_vulkan.c
index 82868d6933..c7e9051cc0 100644
--- a/libavfilter/vf_xfade_vulkan.c
+++ b/libavfilter/vf_xfade_vulkan.c
@@ -102,7 +102,7 @@ static av_cold int init_vulkan(AVFilterContext *avctx)
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
     RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST));
 
     SPEC_LIST_CREATE(sl, 2, 2*sizeof(int))
diff --git a/libavfilter/vsrc_testsrc_vulkan.c 
b/libavfilter/vsrc_testsrc_vulkan.c
index bad6c0372a..131651a2d8 100644
--- a/libavfilter/vsrc_testsrc_vulkan.c
+++ b/libavfilter/vsrc_testsrc_vulkan.c
@@ -79,7 +79,7 @@ static av_cold int init_filter(AVFilterContext *ctx, enum 
TestSrcVulkanMode mode
         goto fail;
     }
 
-    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, 
NULL));
+    RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 
0, 0, 0, NULL));
 
     ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL,
                       (uint32_t []) { 32, 32, 1 }, 0);
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index f2496fc70d..d32dc7997b 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -3103,17 +3103,17 @@ static int vulkan_frames_init(AVHWFramesContext *hwfc)
         hwctx->unlock_frame = unlock_frame;
 
     err = ff_vk_exec_pool_init(&p->vkctx, p->compute_qf, &fp->compute_exec,
-                               p->compute_qf->num, 0, 0, 0, NULL);
+                               2, 0, 0, 0, NULL);
     if (err)
         return err;
 
     err = ff_vk_exec_pool_init(&p->vkctx, p->transfer_qf, &fp->upload_exec,
-                               p->transfer_qf->num*2, 0, 0, 0, NULL);
+                               FF_VK_DEFAULT_EXEC_CONTEXTS, 0, 0, 0, NULL);
     if (err)
         return err;
 
     err = ff_vk_exec_pool_init(&p->vkctx, p->transfer_qf, &fp->download_exec,
-                               p->transfer_qf->num, 0, 0, 0, NULL);
+                               2, 0, 0, 0, NULL);
     if (err)
         return err;
 
diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h
index c65435fcf2..15351036c8 100644
--- a/libavutil/vulkan.h
+++ b/libavutil/vulkan.h
@@ -108,6 +108,9 @@ typedef struct FFVkBuffer {
     AVBufferRef *host_ref;
 } FFVkBuffer;
 
+/* Default number of in-flight execution contexts per pool */
+#define FF_VK_DEFAULT_EXEC_CONTEXTS 4
+
 typedef struct FFVkExecContext {
     uint32_t idx;
     const struct FFVkExecPool *parent;

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to