From patchwork Fri Sep 15 00:26:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 43742 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4b2f:b0:149:dfde:5c0a with SMTP id fp47csp775542pzb; Thu, 14 Sep 2023 17:26:52 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGUfRAsZepalLt+37ef9TZZsDWMIaGLaPofJdsBggWpEZFhMKQ9CjybJXiuY8gHfDZTUde4 X-Received: by 2002:a5d:4578:0:b0:31d:d48f:12a3 with SMTP id a24-20020a5d4578000000b0031dd48f12a3mr129430wrc.43.1694737611476; Thu, 14 Sep 2023 17:26:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694737611; cv=none; d=google.com; s=arc-20160816; b=kjat1RKbEZuBt9JmiqvpXgULZkhLasHMtURdJNl0+nl/6Z40FWEr5CQyIGomG8MGLi sME6iUwARZVOM0/oIdwrOCebEE7CGyWIhqYTx/zT3ihNwWX9PIQxfPglf0pRegspRR3R BqRQHF+Lz0nz+zOPMrRKMICYfm/0xeUuYkSQGl8XU55j1RLj+cf51aKojRk5luoq8OuD Tw539RjZGM2WtAJx+wuTA/dCsNFfqydvh85qUkbIB/1RqysdNO22MCH9zc+k+ZeVFXBx MLJ5eAQGuFLUAsFiy6pW7jQe7ujbi5/dSXoaFvPLkA07I2d74vA+DRqt6AuXrbXTFmvy mmuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:message-id:to:from:date:dkim-signature:delivered-to; bh=kfemlZAxq1bcc1ALqfy5xQzx0GMJ8zsh0SQhx46AC1g=; fh=Q46kXK7oI5D1Jhi90JBr53c7NIaTxGaU4KPeRZyM/hI=; b=nVlfnTXGCkW9W5efrA+Gl0hlR2xma4NIld9mF3//e/k0fEWVIiS7LFlb3XR5u5hx7i 9Y/jKcq+JNhXtpCBl/spkCrHfMIdwlGgWP7d9z08+CV50s5KjADi1sEGQB2ZhutMwpp9 ppLosGrHWGkJ02yPI0jfUXNJbjntss2F93r4ZMTPdlQ4QAHUZJw7KXUwhATzDeNsH99q zFspc8pvRGGjKCSrmt1ibcnqDqub3SBnBMXmooXD9Pjdi+R4e4LYUMHQ2u7lWH7hV8QG R7gxxBWinr7Enwu9xjmKzCtnf86tsoADP5s/eGCZCNJ+DTEvqUihYsvCZuvHYKN4UA9y Uwiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@lynne.ee header.s=s1 header.b=icxjSFxr; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=lynne.ee Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b13-20020a056402138d00b0052f2d4d0f7esi2383029edv.397.2023.09.14.17.26.49; Thu, 14 Sep 2023 17:26:51 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@lynne.ee header.s=s1 header.b=icxjSFxr; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=lynne.ee Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2540768C824; Fri, 15 Sep 2023 03:26:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from w4.tutanota.de (w4.tutanota.de [81.3.6.165]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A72286809C6 for ; Fri, 15 Sep 2023 03:26:39 +0300 (EEST) Received: from tutadb.w10.tutanota.de (unknown [192.168.1.10]) by w4.tutanota.de (Postfix) with ESMTP id 180FE10601FD for ; Fri, 15 Sep 2023 00:26:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1694737599; s=s1; d=lynne.ee; h=From:From:To:To:Subject:Subject:Content-Description:Content-ID:Content-Type:Content-Type:Content-Transfer-Encoding:Cc:Date:Date:In-Reply-To:MIME-Version:MIME-Version:Message-ID:Message-ID:Reply-To:References:Sender; bh=bw9JlXYVaSomIrncuHYllpWJhz4qH4xeCDxbvMREZDY=; b=icxjSFxrnd7Yhm3QPbZtATFIPtnni9WXyrjzk9N6H8zmMCRcBMHqN/3tQALyWIoG 9Etp1F2OE+cBD8u1/UuxNf2ptsWvwdDNtBo/dqbzx0TtumuofYeO5yCEHHMKW2kQnDh 4cgrIkWeavDpYoADxQ1G58USbPMdBzOvDcuXQ5v+uywiKib8iJsnNkf8AZXjVw5mUMi fPjnZOoy1Xkr+f0mqX7ZXseJWV+ARTY0j4VBqrX5jt2clszIxB9hCdo5+4PsB/anjDm klAj0qbTuE8Ju4ITqzV/tYO4yzLU6/q4LNUwHdOWGSspAroUCaL84NhhFgmfyjHqtXr o1euYR7Ilw== Date: Fri, 15 Sep 2023 02:26:39 +0200 (CEST) From: Lynne To: Ffmpeg Devel Message-ID: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] vulkan_decode: don't call get_proc_addr on every frame's destruction X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0kv+69BP9r4s The issue is that we cannot rely on any context existing when we free frames, due to threading. The Vulkan functions are loaded in each context separately, so until now, we've just been loading them on every frame's destruction. Rather than do this, just save the function pointers we need in each frame. The function pointers are guaranteed to not change and exist. Patch attached. From dea92e37d06d6465df3cef645a0b8f63cf222c82 Mon Sep 17 00:00:00 2001 From: Lynne Date: Fri, 15 Sep 2023 02:22:00 +0200 Subject: [PATCH] vulkan_decode: don't call get_proc_addr on every frame's destruction The issue is that we cannot rely on any context existing when we free frames. The Vulkan functions are loaded in each context separately, so until now, we've just been loading them on every frame's destruction. Rather than do this, just save the function pointers we need in each frame. The function pointers are guaranteed to not change and exist. --- libavcodec/vulkan_decode.c | 18 +++++++----------- libavcodec/vulkan_decode.h | 4 ++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c index 21bebb1677..ef4a1c3809 100644 --- a/libavcodec/vulkan_decode.c +++ b/libavcodec/vulkan_decode.c @@ -176,6 +176,7 @@ int ff_vk_decode_prepare_frame(FFVulkanDecodeContext *dec, AVFrame *pic, { int err; FFVulkanDecodeShared *ctx = (FFVulkanDecodeShared *)dec->shared_ref->data; + FFVulkanFunctions *vk = &ctx->s.vkfn; vkpic->slices_size = 0; @@ -189,6 +190,9 @@ int ff_vk_decode_prepare_frame(FFVulkanDecodeContext *dec, AVFrame *pic, vkpic->img_view_out = NULL; vkpic->img_view_dest = NULL; + vkpic->destroy_image_view = vk->DestroyImageView; + vkpic->wait_semaphores = vk->WaitSemaphores; + if (dec->layered_dpb && alloc_dpb) { vkpic->img_view_ref = ctx->layered_view; vkpic->img_aspect_ref = ctx->layered_aspect; @@ -554,9 +558,6 @@ int ff_vk_decode_frame(AVCodecContext *avctx, void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture *vp) { AVVulkanDeviceContext *hwctx = dev_ctx->hwctx; - PFN_vkGetDeviceProcAddr device_proc_addr; - PFN_vkWaitSemaphores wait_semaphores; - PFN_vkDestroyImageView destroy_image_view; VkSemaphoreWaitInfo sem_wait = (VkSemaphoreWaitInfo) { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, @@ -565,27 +566,22 @@ void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture * .semaphoreCount = 1, }; - /* Guaranteed to exist */ - device_proc_addr = (PFN_vkGetDeviceProcAddr)hwctx->get_proc_addr(hwctx->inst, "vkGetDeviceProcAddr"); - destroy_image_view = (PFN_vkDestroyImageView)device_proc_addr(hwctx->act_dev, "vkDestroyImageView"); - wait_semaphores = (PFN_vkWaitSemaphores)device_proc_addr(hwctx->act_dev, "vkWaitSemaphores"); - /* We do not have to lock the frame here because we're not interested * in the actual current semaphore value, but only that it's later than * the time we submitted the image for decoding. */ if (vp->sem) - wait_semaphores(hwctx->act_dev, &sem_wait, UINT64_MAX); + vp->wait_semaphores(hwctx->act_dev, &sem_wait, UINT64_MAX); /* Free slices data */ av_buffer_unref(&vp->slices_buf); /* Destroy image view (out) */ if (vp->img_view_out && vp->img_view_out != vp->img_view_dest) - destroy_image_view(hwctx->act_dev, vp->img_view_out, hwctx->alloc); + vp->destroy_image_view(hwctx->act_dev, vp->img_view_out, hwctx->alloc); /* Destroy image view (ref, unlayered) */ if (vp->img_view_dest) - destroy_image_view(hwctx->act_dev, vp->img_view_dest, hwctx->alloc); + vp->destroy_image_view(hwctx->act_dev, vp->img_view_dest, hwctx->alloc); av_frame_free(&vp->dpb_frame); } diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h index 71ba3dbd84..4788619ada 100644 --- a/libavcodec/vulkan_decode.h +++ b/libavcodec/vulkan_decode.h @@ -97,6 +97,10 @@ typedef struct FFVulkanDecodePicture { /* Slice data */ AVBufferRef *slices_buf; size_t slices_size; + + /* Vulkan destruction functions, as no other context is guaranteed to exist */ + PFN_vkDestroyImageView destroy_image_view; + PFN_vkWaitSemaphores wait_semaphores; } FFVulkanDecodePicture; /** -- 2.40.1