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]

Reply via email to