PR #23261 opened by Niklas Haas (haasn) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23261 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23261.patch
>From f325394911faae9b38d68b41d0eb3b99712d8f82 Mon Sep 17 00:00:00 2001 From: Niklas Haas <[email protected]> Date: Thu, 28 May 2026 11:38:15 +0200 Subject: [PATCH 1/3] avfilter/vf_libplacebo: don't unnecessarily set fields to 0 (cosmetic) Sponsored-by: nxtedition AB Signed-off-by: Niklas Haas <[email protected]> --- libavfilter/vf_libplacebo.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 31c6120965..117bfd21b4 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -727,18 +727,9 @@ static int init_vulkan(AVFilterContext *avctx, const AVVulkanDeviceContext *hwct .lock_queue = lock_queue, .unlock_queue = unlock_queue, .queue_ctx = avctx->hw_device_ctx->data, - .queue_graphics = { - .index = VK_QUEUE_FAMILY_IGNORED, - .count = 0, - }, - .queue_compute = { - .index = VK_QUEUE_FAMILY_IGNORED, - .count = 0, - }, - .queue_transfer = { - .index = VK_QUEUE_FAMILY_IGNORED, - .count = 0, - }, + .queue_graphics = { VK_QUEUE_FAMILY_IGNORED }, + .queue_compute = { VK_QUEUE_FAMILY_IGNORED }, + .queue_transfer = { VK_QUEUE_FAMILY_IGNORED }, /* This is the highest version created by hwcontext_vulkan.c */ .max_api_version = VK_API_VERSION_1_3, }; -- 2.52.0 >From b7083aac34c214e68aa7ac5e68afb2cf5922a47d Mon Sep 17 00:00:00 2001 From: Niklas Haas <[email protected]> Date: Thu, 28 May 2026 11:40:25 +0200 Subject: [PATCH 2/3] avfilter/vf_libplacebo: setup pl_vulkan_queue.flags on import params libplacebo versions before v365 passed .flags = 0 when retrieving the queues from imported Vulkan devices, so we have to error out in the case of a mismatch to avoid undefined behavior (Vulkan spec). See-Also: https://code.videolan.org/videolan/libplacebo/-/merge_requests/856 Sponsored-by: nxtedition AB Signed-off-by: Niklas Haas <[email protected]> --- libavfilter/vf_libplacebo.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 117bfd21b4..271bfb0e60 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -707,6 +707,20 @@ static void input_uninit(LibplaceboInput *input) av_fifo_freep2(&input->out_pts); } +static int copy_pl_queue(struct pl_vulkan_queue *dst, const AVVulkanDeviceQueueFamily *src, + VkDeviceQueueCreateFlags flags) +{ + dst->index = src->idx; + dst->count = src->num; +#if PL_API_VER >= 365 + dst->flags = flags; +#else + if (flags != 0) + return AVERROR(EINVAL); // prevent undefined behavior +#endif + return 0; +} + static int init_vulkan(AVFilterContext *avctx, const AVVulkanDeviceContext *hwctx) { int err = 0; @@ -716,6 +730,7 @@ static int init_vulkan(AVFilterContext *avctx, const AVVulkanDeviceContext *hwct if (hwctx) { #if PL_API_VER >= 278 + VkDeviceQueueCreateFlags qflags = 0; struct pl_vulkan_import_params import_params = { .instance = hwctx->inst, .get_proc_addr = hwctx->get_proc_addr, @@ -735,19 +750,12 @@ static int init_vulkan(AVFilterContext *avctx, const AVVulkanDeviceContext *hwct }; for (int i = 0; i < hwctx->nb_qf; i++) { const AVVulkanDeviceQueueFamily *qf = &hwctx->qf[i]; - - if (qf->flags & VK_QUEUE_GRAPHICS_BIT) { - import_params.queue_graphics.index = qf->idx; - import_params.queue_graphics.count = qf->num; - } - if (qf->flags & VK_QUEUE_COMPUTE_BIT) { - import_params.queue_compute.index = qf->idx; - import_params.queue_compute.count = qf->num; - } - if (qf->flags & VK_QUEUE_TRANSFER_BIT) { - import_params.queue_transfer.index = qf->idx; - import_params.queue_transfer.count = qf->num; - } + if (qf->flags & VK_QUEUE_GRAPHICS_BIT) + RET(copy_pl_queue(&import_params.queue_graphics, qf, qflags)); + if (qf->flags & VK_QUEUE_COMPUTE_BIT) + RET(copy_pl_queue(&import_params.queue_compute, qf, qflags)); + if (qf->flags & VK_QUEUE_TRANSFER_BIT) + RET(copy_pl_queue(&import_params.queue_transfer, qf, qflags)); } /* Import libavfilter vulkan context into libplacebo */ -- 2.52.0 >From 38d3c51c1de3742e08aba59a2739d635c17ec981 Mon Sep 17 00:00:00 2001 From: Niklas Haas <[email protected]> Date: Thu, 28 May 2026 11:43:43 +0200 Subject: [PATCH 3/3] avfilter/vf_libplacebo: pass internally synced queue flag bits to libplacebo This mirrors the logic from libavutil/vulkan.c exactly. It would be nice if the Vulkan hwcontext itself could expose the queue flags directly, but that will require adding new public API, so this is a stopgap solution until then. Sponsored-by: nxtedition AB Signed-off-by: Niklas Haas <[email protected]> --- libavfilter/vf_libplacebo.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 271bfb0e60..0063988ad5 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -731,6 +731,16 @@ static int init_vulkan(AVFilterContext *avctx, const AVVulkanDeviceContext *hwct if (hwctx) { #if PL_API_VER >= 278 VkDeviceQueueCreateFlags qflags = 0; + #ifdef VK_KHR_internally_synchronized_queues + if (s->vkctx.extensions & FF_VK_EXT_INTERNAL_QUEUE_SYNC) { + const VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *iqs; + iqs = ff_vk_find_struct(hwctx->device_features.pNext, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR); + if (iqs && iqs->internallySynchronizedQueues) + qflags |= VK_DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR; + } + #endif + struct pl_vulkan_import_params import_params = { .instance = hwctx->inst, .get_proc_addr = hwctx->get_proc_addr, -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
