From patchwork Tue Jun 11 04:55:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 49787 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:613:0:b0:460:55fa:d5ed with SMTP id 19csp161724vqg; Mon, 10 Jun 2024 21:56:14 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUKNUVIrqlIbQH+bbpBsgeYK3IWeIgaUotglpDcI4uvDSeq5mK86RRdHbFY8ou7JQQKs5+OzdjJrQh8bhr+KLhiS+jl8D2LRvA92Q== X-Google-Smtp-Source: AGHT+IHJAWR8WFMz+TrjgEEdyvvqB/dLbLZhytzWXLZgIB0dOsHw/DjgBEAeFyg8n8iAIx8Eed2F X-Received: by 2002:ac2:5972:0:b0:52c:851a:a0f2 with SMTP id 2adb3069b0e04-52c851aa1f6mr3110533e87.50.1718081774014; Mon, 10 Jun 2024 21:56:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718081774; cv=none; d=google.com; s=arc-20160816; b=ZHFBQS8A6U4IbuWSl4KH2kWVaxwylvfyXHh7axxMj457mbX9UBt9A7/9hMb7QLAYhy klvfVACG5xMpQZehmaxLCH+JrtV5XO1KCdNqRdYzL5Ualgi9VNIioUlwCYkRX/QDuGQl diuMgsSVsqgoR2OCKMsUr1yh4Wa8qfpIkrJl/mZkt/DQ+lTZmEe68korxC4vynJm55cz usEDBMidLli3K8+wTyd8U9uxhG+y2NDD6TP/iCvKflYKye78HCVafc1b1vB4ovu3Bizn lEExg16VdC9I3CwGJUk1M1cuKstUSedJ3hGMSIUQWGKwOQqgYA9hrns9mtipj8wlHxU6 r9Sg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=r5ieYXUohlzpP9KsYaB2x9MCV+ye+L2pfWUKJIQkD5c=; fh=1kpmTRI1sW42eNCnNMby7VLIISQBX6KJuVYxOEG0t2A=; b=VaBIppkCGBe9LAWbyh1FLqHO3X6Fn7YXitIkVlu+Jj4uFpqmd6/l9ZTKGFJ3VMPX9a flUefcMwkZUHNxFPmUzl0eCAzHiRHzZ8VDdjxeu6Q++reKanDwY0lFi33kZRxW3o5mga LlXaiJUSlI28KxOwEtqH2IAPie+N5Wc5zhjLnDZ1dWoh/qmtKInOtG/iQHi8EJjzdLtp aYXKEUUvpXfZn8LzUmQdf5UBdjCAsyNS08I7Q5bGbFQ7jmwC9yfZHZYCDGul9VijLY5J 9+vBPzd5u6ZDsfLvRhv59GJGGJiqgFSTqe/G4A3e1okzADh+IU66Qn6OzKcow3YvwQiS 7hgA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=gSKf+nii; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52c3373f230si1947417e87.445.2024.06.10.21.56.13; Mon, 10 Jun 2024 21:56:13 -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=@intel.com header.s=Intel header.b=gSKf+nii; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8499668D795; Tue, 11 Jun 2024 07:56:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 46AEC68D6B9 for ; Tue, 11 Jun 2024 07:56:00 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1718081765; x=1749617765; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=FZIfqpXUdG4f2aqFVEzaXA+x+rMW8p4YunLao437iWk=; b=gSKf+niifG5ZukUKVQ7mX+4WBBNkZVsVzUPh8uLyBQgMr+hNGMm9scso 2fqxGSlHI7cY9zbf5LaVp++lnYSjJumQ9jaRuW0ZJDhjd8JLis7Qmn37r WIMw9YWjrWdpTLbbdE2g7iJ9OYPqutcD/tLyvw5ID6vIKjC/OSxLxk4bY MF2ZRXIs8tQkONCOnib6MAeUglJDRGaLUv+4xAiUSVIi/5xurpkT83Kah uKwMCtICKey53KKjH0g9zc33zXDNI08TRLwTMfBWY38OnLj08r90uZG1u wchzzVOMQCrVYe+3mAOKSglePmZdNfTujihO0kdRXtut8o2UBUp5beC0L A==; X-CSE-ConnectionGUID: vFT062tDSDyDUd77V236Dg== X-CSE-MsgGUID: OLk/041AQ1KsiHKnZidk8Q== X-IronPort-AV: E=McAfee;i="6600,9927,11099"; a="32306633" X-IronPort-AV: E=Sophos;i="6.08,229,1712646000"; d="scan'208";a="32306633" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jun 2024 21:55:57 -0700 X-CSE-ConnectionGUID: Qbz87vwATXCJYk9GBA0Umw== X-CSE-MsgGUID: Bo4dZb3IQNSs3zVMFrWCXQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,229,1712646000"; d="scan'208";a="70094076" Received: from unknown (HELO xhh-dg264.sh.intel.com) ([10.238.2.76]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jun 2024 21:55:57 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Tue, 11 Jun 2024 12:55:47 +0800 Message-ID: <20240611045547.334627-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavu/hwcontext_vulkan: Support write on drm frame 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 Cc: Haihao Xiang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: htpW33OJWi0a From: Haihao Xiang Otherwise nothing is written into the destination when a write mapping is requested. For example, a vulkan frame mapped from a drm frame (which is wrapped as a vaapi frame in the example) is used as the output of scale_vulkan filter, it always gets a green screen without this patch. ffmpeg -init_hw_device vaapi=va -init_hw_device vulkan=vulkan@va -filter_hw_device vulkan -f lavfi -i testsrc=size=352x288,format=nv12 -vf "hwupload,scale_vulkan,hwmap=derive_device=vaapi:reverse=1,format=vaapi,hwdownload,format=nv12" -f nut - | ffplay - Signed-off-by: Haihao Xiang --- libavutil/hwcontext_vulkan.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index e2f92af227..675ead0ba6 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -2511,7 +2511,7 @@ static inline VkFormat drm_to_vulkan_fmt(uint32_t drm_fourcc) } static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **frame, - const AVFrame *src) + const AVFrame *src, int flags) { int err = 0; VkResult ret; @@ -2569,6 +2569,14 @@ static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **f .pNext = &ext_img_mod_spec, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, }; + int usage = (((flags & (AV_HWFRAME_MAP_READ | AV_HWFRAME_MAP_WRITE)) == (AV_HWFRAME_MAP_READ | AV_HWFRAME_MAP_WRITE)) ? + (VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | + VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_STORAGE_BIT) : + ((flags & AV_HWFRAME_MAP_WRITE) ? + (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT) : + (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT))); VkImageCreateInfo create_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = &ext_img_spec, @@ -2580,8 +2588,7 @@ static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **f .flags = 0x0, .tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, /* specs say so */ - .usage = VK_IMAGE_USAGE_SAMPLED_BIT | - VK_IMAGE_USAGE_TRANSFER_SRC_BIT, + .usage = usage, .samples = VK_SAMPLE_COUNT_1_BIT, .pQueueFamilyIndices = p->img_qfs, .queueFamilyIndexCount = p->nb_img_qfs, @@ -2788,7 +2795,7 @@ static int vulkan_map_from_drm(AVHWFramesContext *hwfc, AVFrame *dst, int err = 0; AVVkFrame *f; - if ((err = vulkan_map_from_drm_frame_desc(hwfc, &f, src))) + if ((err = vulkan_map_from_drm_frame_desc(hwfc, &f, src, flags))) return err; /* The unmapping function will free this */