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]
