PR #22439 opened by Lynne
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22439
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22439.patch

The idea is to switch to GENERAL layout everywhere.


>From 2782dd9593444abe3830c1e1fd86c2a18312ff8b Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Sat, 7 Mar 2026 14:56:01 +0100
Subject: [PATCH 1/2] hwcontext_vulkan: use internal queue synchronization

Thanks to VK_KHR_internally_synchronized_queues, we no longer need global 
queues.
Once the API is removed, we will hard-require internally synchronized queues.
---
 doc/APIchanges               |  4 +++
 fftools/ffplay_renderer.c    | 16 +++++++++
 libavfilter/vf_libplacebo.c  |  6 ++++
 libavutil/hwcontext_vulkan.c | 68 +++++++++++++++++++++++++-----------
 libavutil/hwcontext_vulkan.h |  8 +++++
 libavutil/version.h          |  1 +
 libavutil/vulkan.c           |  6 ++++
 libavutil/vulkan_functions.h |  1 +
 libavutil/vulkan_loader.h    |  3 ++
 9 files changed, 92 insertions(+), 21 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 88005bb28e..48f263d9da 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,10 @@ The last version increases of all libraries were on 2025-03-28
 
 API changes, most recent first:
 
+2026-03-xx - xxxxxxxxxx - lavu 60.25.100 - hwcontext_vulkan.h
+  Deprecate AVVulkanDeviceContext.lock_queue and
+  AVVulkanDeviceContext.unlock_queue without replacement.
+
 2026-02-xx - xxxxxxxxxx - lsws 9.4.100 - swscale.h
   Add sws_test_hw_format().
 
diff --git a/fftools/ffplay_renderer.c b/fftools/ffplay_renderer.c
index 335c286c65..a0048bb9af 100644
--- a/fftools/ffplay_renderer.c
+++ b/fftools/ffplay_renderer.c
@@ -43,6 +43,7 @@
 
 #include "libavutil/bprint.h"
 #include "libavutil/mem.h"
+#include "libavutil/internal.h"
 
 #endif
 
@@ -115,14 +116,20 @@ static void hwctx_lock_queue(void *priv, uint32_t qf, 
uint32_t qidx)
 {
     AVHWDeviceContext *avhwctx = priv;
     const AVVulkanDeviceContext *hwctx = avhwctx->hwctx;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     hwctx->lock_queue(avhwctx, qf, qidx);
+#endif
 }
 
 static void hwctx_unlock_queue(void *priv, uint32_t qf, uint32_t qidx)
 {
     AVHWDeviceContext *avhwctx = priv;
     const AVVulkanDeviceContext *hwctx = avhwctx->hwctx;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     hwctx->unlock_queue(avhwctx, qf, qidx);
+#endif
 }
 
 static int add_instance_extension(const char **ext, unsigned num_ext,
@@ -283,7 +290,10 @@ static void placebo_lock_queue(struct AVHWDeviceContext 
*dev_ctx,
 {
     RendererContext *ctx = dev_ctx->user_opaque;
     pl_vulkan vk = ctx->placebo_vulkan;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     vk->lock_queue(vk, queue_family, index);
+#endif
 }
 
 static void placebo_unlock_queue(struct AVHWDeviceContext *dev_ctx,
@@ -292,7 +302,10 @@ static void placebo_unlock_queue(struct AVHWDeviceContext 
*dev_ctx,
 {
     RendererContext *ctx = dev_ctx->user_opaque;
     pl_vulkan vk = ctx->placebo_vulkan;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     vk->unlock_queue(vk, queue_family, index);
+#endif
 }
 
 static int get_decode_queue(VkRenderer *renderer, int *index, int *count)
@@ -386,8 +399,11 @@ static int create_vk_by_placebo(VkRenderer *renderer,
     device_ctx->user_opaque = ctx;
 
     vk_dev_ctx = device_ctx->hwctx;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     vk_dev_ctx->lock_queue = placebo_lock_queue;
     vk_dev_ctx->unlock_queue = placebo_unlock_queue;
+#endif
 
     vk_dev_ctx->get_proc_addr = ctx->placebo_instance->get_proc_addr;
 
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index 48bf37fb2e..2c65cd68ec 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -667,14 +667,20 @@ static void lock_queue(void *priv, uint32_t qf, uint32_t 
qidx)
 {
     AVHWDeviceContext *avhwctx = priv;
     const AVVulkanDeviceContext *hwctx = avhwctx->hwctx;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     hwctx->lock_queue(avhwctx, qf, qidx);
+#endif
 }
 
 static void unlock_queue(void *priv, uint32_t qf, uint32_t qidx)
 {
     AVHWDeviceContext *avhwctx = priv;
     const AVVulkanDeviceContext *hwctx = avhwctx->hwctx;
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     hwctx->unlock_queue(avhwctx, qf, qidx);
+#endif
 }
 #endif
 
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 6c104b7204..93eb772d68 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -117,6 +117,10 @@ typedef struct VulkanDeviceFeatures {
 #ifdef VK_KHR_shader_relaxed_extended_instruction
     VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR 
relaxed_extended_instruction;
 #endif
+
+#ifdef VK_KHR_internally_synchronized_queues
+    VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR 
internal_queue_sync;
+#endif
 } VulkanDeviceFeatures;
 
 typedef struct VulkanDevicePriv {
@@ -282,6 +286,11 @@ static void device_features_init(AVHWDeviceContext *ctx, 
VulkanDeviceFeatures *f
     FF_VK_STRUCT_EXT(s, &feats->device, &feats->relaxed_extended_instruction, 
FF_VK_EXT_RELAXED_EXTENDED_INSTR,
                      
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR);
 #endif
+
+#ifdef VK_KHR_internally_synchronized_queues
+    FF_VK_STRUCT_EXT(s, &feats->device, &feats->internal_queue_sync, 
FF_VK_EXT_INTERNAL_QUEUE_SYNC,
+                     
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR);
+#endif
 }
 
 /* Copy all needed device features */
@@ -387,6 +396,10 @@ static void 
device_features_copy_needed(VulkanDeviceFeatures *dst, VulkanDeviceF
     COPY_VAL(expect_assume.shaderExpectAssume);
 #endif
 
+#ifdef VK_KHR_internally_synchronized_queues
+    COPY_VAL(internal_queue_sync.internallySynchronizedQueues);
+#endif
+
 #undef COPY_VAL
 }
 
@@ -707,6 +720,9 @@ static const VulkanOptExtension optional_device_exts[] = {
 #ifdef VK_KHR_video_maintenance2
     { VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME,              
FF_VK_EXT_VIDEO_MAINTENANCE_2    },
 #endif
+#ifdef VK_KHR_internally_synchronized_queues
+    { VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME,   
FF_VK_EXT_INTERNAL_QUEUE_SYNC    },
+#endif
 
     /* Imports/exports */
     { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,               
FF_VK_EXT_EXTERNAL_FD_MEMORY     },
@@ -1776,11 +1792,13 @@ static void vulkan_device_uninit(AVHWDeviceContext *ctx)
 {
     VulkanDevicePriv *p = ctx->hwctx;
 
-    for (uint32_t i = 0; i < p->nb_tot_qfs; i++) {
-        pthread_mutex_destroy(p->qf_mutex[i]);
-        av_freep(&p->qf_mutex[i]);
+    if (p->qf_mutex) {
+        for (uint32_t i = 0; i < p->nb_tot_qfs; i++) {
+            pthread_mutex_destroy(p->qf_mutex[i]);
+            av_freep(&p->qf_mutex[i]);
+        }
+        av_freep(&p->qf_mutex);
     }
-    av_freep(&p->qf_mutex);
 
     ff_vk_uninit(&p->vkctx);
 }
@@ -1895,13 +1913,15 @@ end:
 static void lock_queue(AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t 
index)
 {
     VulkanDevicePriv *p = ctx->hwctx;
-    pthread_mutex_lock(&p->qf_mutex[queue_family][index]);
+    if (p->qf_mutex)
+        pthread_mutex_lock(&p->qf_mutex[queue_family][index]);
 }
 
 static void unlock_queue(AVHWDeviceContext *ctx, uint32_t queue_family, 
uint32_t index)
 {
     VulkanDevicePriv *p = ctx->hwctx;
-    pthread_mutex_unlock(&p->qf_mutex[queue_family][index]);
+    if (p->qf_mutex)
+        pthread_mutex_unlock(&p->qf_mutex[queue_family][index]);
 }
 
 static int vulkan_device_init(AVHWDeviceContext *ctx)
@@ -1999,28 +2019,31 @@ static int vulkan_device_init(AVHWDeviceContext *ctx)
 
     vk->GetPhysicalDeviceQueueFamilyProperties2(hwctx->phys_dev, &qf_num, qf);
 
-    p->qf_mutex = av_calloc(qf_num, sizeof(*p->qf_mutex));
-    if (!p->qf_mutex) {
-        err = AVERROR(ENOMEM);
-        goto end;
-    }
     p->nb_tot_qfs = qf_num;
 
-    for (uint32_t i = 0; i < qf_num; i++) {
-        p->qf_mutex[i] = av_calloc(qf[i].queueFamilyProperties.queueCount,
-                                   sizeof(**p->qf_mutex));
-        if (!p->qf_mutex[i]) {
+    if (!(p->vkctx.extensions & FF_VK_EXT_INTERNAL_QUEUE_SYNC)) {
+        p->qf_mutex = av_calloc(qf_num, sizeof(*p->qf_mutex));
+        if (!p->qf_mutex) {
             err = AVERROR(ENOMEM);
             goto end;
         }
-        for (uint32_t j = 0; j < qf[i].queueFamilyProperties.queueCount; j++) {
-            err = pthread_mutex_init(&p->qf_mutex[i][j], NULL);
-            if (err != 0) {
-                av_log(ctx, AV_LOG_ERROR, "pthread_mutex_init failed : %s\n",
-                       av_err2str(err));
-                err = AVERROR(err);
+
+        for (uint32_t i = 0; i < qf_num; i++) {
+            p->qf_mutex[i] = av_calloc(qf[i].queueFamilyProperties.queueCount,
+                                       sizeof(**p->qf_mutex));
+            if (!p->qf_mutex[i]) {
+                err = AVERROR(ENOMEM);
                 goto end;
             }
+            for (uint32_t j = 0; j < qf[i].queueFamilyProperties.queueCount; 
j++) {
+                err = pthread_mutex_init(&p->qf_mutex[i][j], NULL);
+                if (err != 0) {
+                    av_log(ctx, AV_LOG_ERROR, "pthread_mutex_init failed : 
%s\n",
+                           av_err2str(err));
+                    err = AVERROR(err);
+                    goto end;
+                }
+            }
         }
     }
 
@@ -2119,10 +2142,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
             p->img_qfs[p->nb_img_qfs++] = hwctx->qf[i].idx;
     }
 
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     if (!hwctx->lock_queue)
         hwctx->lock_queue = lock_queue;
     if (!hwctx->unlock_queue)
         hwctx->unlock_queue = unlock_queue;
+#endif
 
     /* Re-query device capabilities, in case the device was created externally 
*/
     vk->GetPhysicalDeviceMemoryProperties(hwctx->phys_dev, &p->mprops);
diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
index 77d53289b4..b9a841a197 100644
--- a/libavutil/hwcontext_vulkan.h
+++ b/libavutil/hwcontext_vulkan.h
@@ -168,18 +168,26 @@ typedef struct AVVulkanDeviceContext {
     int nb_decode_queues;
 #endif
 
+#if FF_API_VULKAN_SYNC_QUEUES
     /**
      * Locks a queue, preventing other threads from submitting any command
      * buffers to this queue.
      * If set to NULL, will be set to lavu-internal functions that utilize a
      * mutex.
+     *
+     * Deprecated: use VK_KHR_internally_synchronized_queues.
      */
+    attribute_deprecated
     void (*lock_queue)(struct AVHWDeviceContext *ctx, uint32_t queue_family, 
uint32_t index);
 
     /**
      * Similar to lock_queue(), unlocks a queue. Must only be called after 
locking.
+     *
+     * Deprecated: use VK_KHR_internally_synchronized_queues.
      */
+    attribute_deprecated
     void (*unlock_queue)(struct AVHWDeviceContext *ctx, uint32_t queue_family, 
uint32_t index);
+#endif
 
     /**
      * Queue families used. Must be preferentially ordered. List may contain
diff --git a/libavutil/version.h b/libavutil/version.h
index a42ae73884..06b730276a 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -113,6 +113,7 @@
 #define FF_API_CPU_FLAG_FORCE           (LIBAVUTIL_VERSION_MAJOR < 61)
 #define FF_API_DOVI_L11_INVALID_PROPS   (LIBAVUTIL_VERSION_MAJOR < 61)
 #define FF_API_ASSERT_FPU               (LIBAVUTIL_VERSION_MAJOR < 61)
+#define FF_API_VULKAN_SYNC_QUEUES       (LIBAVUTIL_VERSION_MAJOR < 62)
 
 /**
  * @}
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index b6cbdf73a7..9bf607e5f9 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -928,9 +928,15 @@ int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext 
*e)
         return AVERROR_EXTERNAL;
     }
 
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     s->hwctx->lock_queue(s->device, e->qf, e->qi);
+#endif
     ret = vk->QueueSubmit2(e->queue, 1, &submit_info, e->fence);
+#if FF_API_VULKAN_SYNC_QUEUES
+FF_DISABLE_DEPRECATION_WARNINGS
     s->hwctx->unlock_queue(s->device, e->qf, e->qi);
+#endif
 
     if (ret != VK_SUCCESS) {
         av_log(s, AV_LOG_ERROR, "Unable to submit command buffer: %s\n",
diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h
index d4be2ca4e0..3c4deef0a2 100644
--- a/libavutil/vulkan_functions.h
+++ b/libavutil/vulkan_functions.h
@@ -53,6 +53,7 @@ typedef uint64_t FFVulkanExtensions;
 #define FF_VK_EXT_EXPLICIT_MEM_LAYOUT    (1ULL << 20) /* 
VK_KHR_workgroup_memory_explicit_layout */
 #define FF_VK_EXT_REPLICATED_COMPOSITES  (1ULL << 21) /* 
VK_EXT_shader_replicated_composites */
 #define FF_VK_EXT_LONG_VECTOR            (1ULL << 22) /* 
VK_EXT_shader_long_vector */
+#define FF_VK_EXT_INTERNAL_QUEUE_SYNC    (1ULL << 23) /* 
VK_KHR_internally_synchronized_queues */
 
 /* Video extensions */
 #define FF_VK_EXT_VIDEO_QUEUE            (1ULL << 36) /* VK_KHR_video_queue */
diff --git a/libavutil/vulkan_loader.h b/libavutil/vulkan_loader.h
index 45a296e2fa..7ea359b6cd 100644
--- a/libavutil/vulkan_loader.h
+++ b/libavutil/vulkan_loader.h
@@ -95,6 +95,9 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * 
const *extensions,
 #endif
 #ifdef VK_KHR_video_encode_av1
         { VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME,          
FF_VK_EXT_VIDEO_ENCODE_AV1       },
+#endif
+#ifdef VK_KHR_internally_synchronized_queues
+        { VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME, 
FF_VK_EXT_INTERNAL_QUEUE_SYNC   },
 #endif
     };
 
-- 
2.52.0


>From 5f89682932e6ada7704299e53109c0baffbcfd45 Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Sat, 7 Mar 2026 15:37:53 +0100
Subject: [PATCH 2/2] hwcontext_vulkan: deprecate redundant AVVkFrame fields

We don't need to lock frames at all if they're all using the general
layout. That's the plan.
---
 libavcodec/ffv1enc_vulkan.c    |  3 +++
 libavcodec/vulkan_decode.c     | 14 ++++++++++++++
 libavcodec/vulkan_dpx.c        |  3 +++
 libavcodec/vulkan_encode.c     | 12 ++++++++++--
 libavcodec/vulkan_ffv1.c       |  6 ++++++
 libavcodec/vulkan_prores.c     |  3 +++
 libavcodec/vulkan_prores_raw.c |  3 +++
 libavutil/hwcontext_vulkan.h   |  7 +++++++
 libavutil/version.h            |  1 +
 libavutil/vulkan.c             |  8 ++++++++
 10 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c
index b836bbf0fa..24e0992d55 100644
--- a/libavcodec/ffv1enc_vulkan.c
+++ b/libavcodec/ffv1enc_vulkan.c
@@ -374,8 +374,11 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext 
*avctx,
     /* Clean up temporary image if needed */
     if (fv->is_rgb) {
         AVVkFrame *vkf = (AVVkFrame *)tmp->data[0];
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
         vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
         vkf->access[0] = VK_ACCESS_2_NONE;
+#endif
 
         RET(ff_vk_create_imageviews(&fv->s, exec, tmp_views,
                                     tmp,
diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index 9ab8d45aa9..67446d43df 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -573,11 +573,18 @@ int ff_vk_decode_frame(AVCodecContext *avctx,
         .dstStageMask = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
         .srcAccessMask = VK_ACCESS_2_NONE,
         .dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
         .oldLayout = vkf->layout[0],
         .newLayout = (layered_dpb || vp->dpb_frame) ?
                      VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR :
                      VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR, /* Spec, 07252 
utter madness */
         .srcQueueFamilyIndex = vkf->queue_family[0],
+#else
+        .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
+        .newLayout = VK_IMAGE_LAYOUT_GENERAL,
+        .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+#endif
         .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
         .image = vkf->img[0],
         .subresourceRange = (VkImageSubresourceRange) {
@@ -631,9 +638,16 @@ int ff_vk_decode_frame(AVCodecContext *avctx,
                     .srcAccessMask = VK_ACCESS_2_NONE,
                     .dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR |
                                      VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
                     .oldLayout = rvkf->layout[0],
                     .newLayout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,
                     .srcQueueFamilyIndex = rvkf->queue_family[0],
+#else
+                    .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
+                    .newLayout = VK_IMAGE_LAYOUT_GENERAL,
+                    .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+#endif
                     .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
                     .image = rvkf->img[0],
                     .subresourceRange = (VkImageSubresourceRange) {
diff --git a/libavcodec/vulkan_dpx.c b/libavcodec/vulkan_dpx.c
index 726ae09af9..1c283c81f6 100644
--- a/libavcodec/vulkan_dpx.c
+++ b/libavcodec/vulkan_dpx.c
@@ -140,10 +140,13 @@ static int vk_dpx_end_frame(AVCodecContext *avctx)
     vp->slices_buf = NULL;
 
     AVVkFrame *vkf = (AVVkFrame *)dpx->frame->data[0];
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
     for (int i = 0; i < 4; i++) {
         vkf->layout[i] = VK_IMAGE_LAYOUT_UNDEFINED;
         vkf->access[i] = VK_ACCESS_2_NONE;
     }
+#endif
 
     ff_vk_frame_barrier(&ctx->s, exec, dpx->frame, img_bar, &nb_img_bar,
                         VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
diff --git a/libavcodec/vulkan_encode.c b/libavcodec/vulkan_encode.c
index a440646e4f..eba7ce16d1 100644
--- a/libavcodec/vulkan_encode.c
+++ b/libavcodec/vulkan_encode.c
@@ -359,12 +359,20 @@ static int vulkan_encode_issue(AVCodecContext *avctx,
         .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
         .pNext = NULL,
         .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
         .srcAccessMask = vkf->access[0],
-        .dstStageMask = VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,
-        .dstAccessMask = VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,
         .oldLayout = vkf->layout[0],
         .newLayout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR,
         .srcQueueFamilyIndex = vkf->queue_family[0],
+#else
+        .srcAccessMask = VK_ACCESS_2_NONE,
+        .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
+        .newLayout = VK_IMAGE_LAYOUT_GENERAL,
+        .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+#endif
+        .dstStageMask = VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,
+        .dstAccessMask = VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,
         .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
         .image = vkf->img[0],
         .subresourceRange = (VkImageSubresourceRange) {
diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c
index 1ea927ccd3..d2274ae18b 100644
--- a/libavcodec/vulkan_ffv1.c
+++ b/libavcodec/vulkan_ffv1.c
@@ -278,10 +278,13 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
     vp->slices_buf = NULL;
 
     AVVkFrame *vkf = (AVVkFrame *)f->picture.f->data[0];
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
     for (int i = 0; i < ff_vk_count_images(vkf); i++) {
         vkf->layout[i] = VK_IMAGE_LAYOUT_UNDEFINED;
         vkf->access[i] = VK_ACCESS_2_NONE;
     }
+#endif
 
     /* Setup shader */
     ff_vk_shader_update_desc_buffer(&ctx->s, exec, &fv->setup,
@@ -336,10 +339,13 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
 
     if (is_rgb) {
         vkf = (AVVkFrame *)vp->dpb_frame->data[0];
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
         for (int i = 0; i < 4; i++) {
             vkf->layout[i] = VK_IMAGE_LAYOUT_UNDEFINED;
             vkf->access[i] = VK_ACCESS_2_NONE;
         }
+#endif
 
         ff_vk_frame_barrier(&ctx->s, exec, vp->dpb_frame, img_bar, &nb_img_bar,
                             VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
diff --git a/libavcodec/vulkan_prores.c b/libavcodec/vulkan_prores.c
index 69a9a080b9..5ecdb02797 100644
--- a/libavcodec/vulkan_prores.c
+++ b/libavcodec/vulkan_prores.c
@@ -219,8 +219,11 @@ static int vk_prores_end_frame(AVCodecContext *avctx)
     RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &pp->metadata_buf, 1, 0));
     pp->metadata_buf = NULL;
 
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
     vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
     vkf->access[0] = VK_ACCESS_2_NONE;
+#endif
 
     nb_imgs = ff_vk_count_images(vkf);
 
diff --git a/libavcodec/vulkan_prores_raw.c b/libavcodec/vulkan_prores_raw.c
index 392b74a863..bbaa8d99de 100644
--- a/libavcodec/vulkan_prores_raw.c
+++ b/libavcodec/vulkan_prores_raw.c
@@ -172,8 +172,11 @@ static int vk_prores_raw_end_frame(AVCodecContext *avctx)
     vp->slices_buf = NULL;
 
     AVVkFrame *vkf = (AVVkFrame *)prr->frame->data[0];
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
     vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
     vkf->access[0] = VK_ACCESS_2_NONE;
+#endif
 
     ff_vk_frame_barrier(&ctx->s, exec, prr->frame, img_bar, &nb_img_bar,
                         VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
index b9a841a197..d831c66e47 100644
--- a/libavutil/hwcontext_vulkan.h
+++ b/libavutil/hwcontext_vulkan.h
@@ -333,11 +333,15 @@ struct AVVkFrame {
      */
     VkMemoryPropertyFlagBits flags;
 
+#if FF_API_VULKAN_FRAME_LAYOUT
     /**
      * Updated after every barrier. One per VkImage.
      */
+    attribute_deprecated
     VkAccessFlagBits access[AV_NUM_DATA_POINTERS];
+    attribute_deprecated
     VkImageLayout layout[AV_NUM_DATA_POINTERS];
+#endif
 
     /**
      * Synchronization timeline semaphores, one for each VkImage.
@@ -366,12 +370,15 @@ struct AVVkFrame {
      */
     ptrdiff_t offset[AV_NUM_DATA_POINTERS];
 
+#if FF_API_VULKAN_FRAME_LAYOUT
     /**
      * Queue family of the images. Must be VK_QUEUE_FAMILY_IGNORED if
      * the image was allocated with the CONCURRENT concurrency option.
      * One per VkImage.
      */
+    attribute_deprecated
     uint32_t queue_family[AV_NUM_DATA_POINTERS];
+#endif
 };
 
 /**
diff --git a/libavutil/version.h b/libavutil/version.h
index 06b730276a..5d590abb2c 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -114,6 +114,7 @@
 #define FF_API_DOVI_L11_INVALID_PROPS   (LIBAVUTIL_VERSION_MAJOR < 61)
 #define FF_API_ASSERT_FPU               (LIBAVUTIL_VERSION_MAJOR < 61)
 #define FF_API_VULKAN_SYNC_QUEUES       (LIBAVUTIL_VERSION_MAJOR < 62)
+#define FF_API_VULKAN_FRAME_LAYOUT      (LIBAVUTIL_VERSION_MAJOR < 62)
 
 /**
  * @}
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 9bf607e5f9..b834b3d0d5 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -959,9 +959,12 @@ FF_DISABLE_DEPRECATION_WARNINGS
             if (e->frame_update[j]) {
                 int nb_images = ff_vk_count_images(vkf);
                 for (int i = 0; i < nb_images; i++) {
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
                     vkf->layout[i] = e->layout_dst[j];
                     vkf->access[i] = e->access_dst[j];
                     vkf->queue_family[i] = e->queue_family_dst[j];
+#endif
                 }
             }
             vkfc->unlock_frame(hwfc, vkf);
@@ -2062,7 +2065,12 @@ void ff_vk_frame_barrier(FFVulkanContext *s, 
FFVkExecContext *e,
             .dstAccessMask = new_access,
             .oldLayout = found >= 0 ? e->layout_dst[found] : vkf->layout[0],
             .newLayout = new_layout,
+#if FF_API_VULKAN_FRAME_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
             .srcQueueFamilyIndex = found >= 0 ? e->queue_family_dst[found] : 
vkf->queue_family[0],
+#else
+            .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+#endif
             .dstQueueFamilyIndex = new_qf,
             .image = vkf->img[i],
             .subresourceRange = (VkImageSubresourceRange) {
-- 
2.52.0

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

Reply via email to