From patchwork Sun Apr 3 15:49:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 35151 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp1572048pzb; Sun, 3 Apr 2022 08:50:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyurnwXKPwvxnOiYorhdW9kbe4isIsm03Gd6qyeZXeaH4U+xlnqjQTKnbslYs4Wr2FUK1+6 X-Received: by 2002:a17:907:6e2a:b0:6db:c440:532b with SMTP id sd42-20020a1709076e2a00b006dbc440532bmr7549194ejc.95.1649001002334; Sun, 03 Apr 2022 08:50:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649001002; cv=none; d=google.com; s=arc-20160816; b=mzSyyQDLD3NHseCflx8iVjEuaijgpuUetqbSstaGwiNyfUt8DEpmVVt4Qn4ZN6HN22 qD2hrPRdLaXwfVnDwZO9Tb/R4K/k4Q52ZJup1V8NCjBeTJIb4PaKrGJgXx6uiGpIYG7u KSXpPV2FBdMIpRCotz/RNJ2aXC+ikw/Mk80coP7kZWFu4R3DxF1F0MaBRxm4GSUfcFmR U2vCDIE40QfiykUCrSYrHme9s4LrWRvRfqLb5l50js/m3/CHZnMJqTpq264OjCToYa0B t+4iuS2c3vXN/7/Yfucfmn6VYSx/tV4jwlMsx1FhlGtCFTe7KstydYl4WgC9fUPEJ3QJ J3Ag== 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:references:in-reply-to:message-id:to:from:date :dkim-signature:delivered-to; bh=qoFK+fUZFCXfpJ4C7wYuXk+dd6RjkmD8YQx36APzyyo=; b=Y5uYIDT2/qzJZrBcPsCJC7BRwEcBkXF9l8Mv2b/WRBF1qQhvW75dP5dcmX6i9rKMe1 XUXMNmWXFSwf+YmBx94Z7vOoNKKttf6LcRtBOVT7//3bp7PS2B/k3UfeTo+Bws0QaqKA fWn0e5gJIC056BIpzrEu2SheWUzhKFXoPBkJWj3Q/boW39U7bP0sctl0sxXGO3NEHygx LqBopTk5MlCCXh2dE9X0Yftb0wuGoubvo+VouC24pEh6VokHWl30fSY8l6JVDTai61Vd lg13RCsjS47cvDBo13ri/rr1kI+vtVzHFGdRkZsA4YGI2afRcIxrd9e+USXkqLz0SEHx Uazg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@lynne.ee header.s=s1 header.b=w7tnhW7h; 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 x11-20020a170906148b00b006e7f1c6d99fsi399577ejc.414.2022.04.03.08.50.01; Sun, 03 Apr 2022 08:50:02 -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=w7tnhW7h; 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 B940268AFD0; Sun, 3 Apr 2022 18:49:57 +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 7B31268AFD0 for ; Sun, 3 Apr 2022 18:49:50 +0300 (EEST) Received: from w3.tutanota.de (unknown [192.168.1.164]) by w4.tutanota.de (Postfix) with ESMTP id 1DF131060122 for ; Sun, 3 Apr 2022 15:49:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1649000990; 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:In-Reply-To:MIME-Version:MIME-Version:Message-ID:Message-ID:Reply-To:References:References:Sender; bh=eyeN5vIuvqfnBQL2BzXhp1LK9ShHqMc097sZBimPAvg=; b=w7tnhW7hRdhhITKKWvc+m9QTdl3NHOCiYIbXLwiFYYC2Fhb4clZEOOmZgQp6Lc+J +CWHjHUuB4vhnELASeGGK983qpd0Hw9uvO17Nz6gcRDsRuE0HsQdpu92WjI3ryKyJf7 1k79Fg0BC3uHABLdzgiRzjtdtFGegSI0cW1gJms/3waNmm+2dLhhVpBVRHMtaqAxG6v mdffMXDMrdzGUPhfTxJ9aK9hx4vcbyJBcpEYhMfSVIEPQ64cAka6G6fweeoYH+OrCHm kXDTvvc3DJUoxjjqEyJRpGso0jTew/WikjQ8cScF/zPrlfu85X8jNBctTz7zhTAaMae 9BQoMji6LA== Date: Sun, 3 Apr 2022 17:49:50 +0200 (CEST) From: Lynne To: FFmpeg development discussions and patches Message-ID: In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] hwcontext_vulkan: properly enable sync2 and make prepare_frame compatible 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: IUNgvvJKy6Z2 This was meant to be present before the first patch. I'll move the fixes to the first patch when I apply/resubmit. Patch attached. From e09d026eedbd4c30f4bf3cfa9ffe547906781d3b Mon Sep 17 00:00:00 2001 From: Lynne Date: Sun, 3 Apr 2022 17:47:58 +0200 Subject: [PATCH] hwcontext_vulkan: properly enable sync2 and make prepare_frame compatible --- libavutil/hwcontext_vulkan.c | 52 +++++++++++++++++++++++++++--------- libavutil/vulkan_functions.h | 4 +++ 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 5bd0cab7ef..c8de358fa3 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -347,7 +347,7 @@ static const VulkanOptExtension optional_device_exts[] = { /* Misc or required by other extensions */ { VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, { VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, - { VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, FF_VK_EXT_NO_FLAG }, + { VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, FF_VK_EXT_SYNC2 }, /* Imports/exports */ { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_FD_MEMORY }, @@ -1340,9 +1340,13 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, }; + VkPhysicalDeviceSynchronization2Features sync2_features = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, + .pNext = &timeline_features, + }; VkPhysicalDeviceVulkan12Features dev_features_1_2 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - .pNext = &timeline_features, + .pNext = &sync2_features, }; VkPhysicalDeviceVulkan11Features dev_features_1_1 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, @@ -1352,10 +1356,8 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, .pNext = &dev_features_1_1, }; - VkDeviceCreateInfo dev_info = { - .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, - .pNext = &hwctx->device_features, + .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, }; hwctx->device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; @@ -1393,6 +1395,9 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, } p->device_features_1_2.timelineSemaphore = 1; + dev_info.pNext = &sync2_features; + sync2_features.pNext = &hwctx->device_features; + /* Setup queue family */ if ((err = setup_queue_families(ctx, &dev_info))) goto end; @@ -2054,14 +2059,37 @@ static int prepare_frame(AVHWFramesContext *hwfc, VulkanExecCtx *ectx, frame->access[i] = img_bar[i].dstAccessMask; } - dep_info = (VkDependencyInfo) { - .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, - .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT, - .pImageMemoryBarriers = img_bar, - .imageMemoryBarrierCount = planes, - }; + if (p->extensions & FF_VK_EXT_SYNC2) { + dep_info = (VkDependencyInfo) { + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT, + .pImageMemoryBarriers = img_bar, + .imageMemoryBarrierCount = planes, + }; - vk->CmdPipelineBarrier2KHR(get_buf_exec_ctx(hwfc, ectx), &dep_info); + vk->CmdPipelineBarrier2KHR(get_buf_exec_ctx(hwfc, ectx), &dep_info); + } else { + VkImageMemoryBarrier img_bar_old[AV_NUM_DATA_POINTERS] = { 0 }; + + for (int i = 0; i < planes; i++) { + img_bar_old[i] = (VkImageMemoryBarrier) { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcAccessMask = img_bar[i].srcAccessMask, + .dstAccessMask = img_bar[i].dstAccessMask, + .oldLayout = img_bar[i].oldLayout, + .newLayout = img_bar[i].newLayout, + .srcQueueFamilyIndex = img_bar[i].srcQueueFamilyIndex, + .dstQueueFamilyIndex = img_bar[i].dstQueueFamilyIndex, + .image = img_bar[i].image, + .subresourceRange = img_bar[i].subresourceRange, + }; + } + + vk->CmdPipelineBarrier(get_buf_exec_ctx(hwfc, ectx), + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, 0, NULL, 0, NULL, planes, img_bar_old); + } err = submit_exec_ctx(hwfc, ectx, &s_info, frame, 0); vkfc->unlock_frame(hwfc, &tmp); diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h index d15a5d9a42..72d242b9a6 100644 --- a/libavutil/vulkan_functions.h +++ b/libavutil/vulkan_functions.h @@ -37,6 +37,7 @@ typedef enum FFVulkanExtensions { FF_VK_EXT_EXTERNAL_WIN32_MEMORY = 1ULL << 6, /* VK_KHR_external_memory_win32 */ FF_VK_EXT_EXTERNAL_WIN32_SEM = 1ULL << 7, /* VK_KHR_external_semaphore_win32 */ #endif + FF_VK_EXT_SYNC2 = 1ULL << 8, /* VK_KHR_synchronization2 */ FF_VK_EXT_NO_FLAG = 1ULL << 31, } FFVulkanExtensions; @@ -145,6 +146,9 @@ typedef enum FFVulkanExtensions { MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSetWithTemplate) \ MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorUpdateTemplate) \ MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorUpdateTemplate) \ + \ + /* sync2 */ \ + MACRO(1, 1, FF_VK_EXT_SYNC2, CmdPipelineBarrier2KHR) \ \ /* Pipeline */ \ MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreatePipelineLayout) \ -- 2.35.1