From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 76EC54D940 for ; Mon, 2 Jun 2025 18:56:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 3E67F68DF09; Mon, 2 Jun 2025 21:55:58 +0300 (EEST) Received: from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 2423F68DEA6 for ; Mon, 2 Jun 2025 21:55:51 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID: Subject:To:From:Date:Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=61x58vg3OE2mh6WkOBleX+Sl+1dXh2taFST/uKOgOxQ=; b=Vs2g6yeU/f3YYVOnJzPjnQDBwb apfNnwXyMe2VQdiOCGrKXDoIoV0UskymfBbhVfPBwd21uaDHUucPHT53q3ZsI300AZqvHZMl4XyJA pxt6U1XruUPSHoiASrQNcCYGF9AkPVppf4OeL3rGu5Kng9Ir6EwVvJm+X+QAZK+Iy7OP+n4tZXNwv M3GBsm580tDtdc0R1D0GgH6k9OpkN2s4fh6kRadtPzEAffJ2Fdjfc24guKSHeTpDUcL/1JQuRQj/r ubKzKw5LSNzPEuqeBILEELG4jbcl4FJFf9W1EoGnayk3N2ccQqIJtGuq2U2sjRdK9Cf2sz30Afcup h0dhgkLQ==; Received: from din-49-196-231-77.ipcom.comunitel.net ([77.231.196.49] helo=octavia) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1uMAK6-00GO6t-6A for ; Mon, 02 Jun 2025 20:55:50 +0200 Received: from vjaquez by octavia with local (Exim 4.98.2) (envelope-from ) id 1uMAK5-00000001PkH-2WgS for ffmpeg-devel@ffmpeg.org; Mon, 02 Jun 2025 20:55:49 +0200 Date: Mon, 2 Jun 2025 20:55:49 +0200 From: Victor Jaquez To: ffmpeg-devel@ffmpeg.org Message-ID: References: <20250602165831.1462152-1-dev@lynne.ee> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20250602165831.1462152-1-dev@lynne.ee> Subject: Re: [FFmpeg-devel] [PATCH] hwcontext_vulkan: use host image copy 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On Tue, 03 Jun 2025 at 01:58, Lynne wrote: > --- > libavutil/hwcontext_vulkan.c | 84 +++++++++++++++++++++++++++++++++++- > libavutil/vulkan_functions.h | 6 +++ > libavutil/vulkan_loader.h | 1 + > 3 files changed, 89 insertions(+), 2 deletions(-) > > diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c > index ce485a85a2..b22e4e375a 100644 > --- a/libavutil/hwcontext_vulkan.c > +++ b/libavutil/hwcontext_vulkan.c > @@ -80,6 +80,7 @@ typedef struct VulkanDeviceFeatures { > VkPhysicalDeviceVulkan13Features vulkan_1_3; > VkPhysicalDeviceTimelineSemaphoreFeatures timeline_semaphore; > VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR subgroup_rotate; > + VkPhysicalDeviceHostImageCopyFeaturesEXT host_image_copy; > > #ifdef VK_KHR_shader_expect_assume > VkPhysicalDeviceShaderExpectAssumeFeaturesKHR expect_assume; > @@ -208,6 +209,8 @@ static void device_features_init(AVHWDeviceContext *ctx, VulkanDeviceFeatures *f > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES); > FF_VK_STRUCT_EXT(s, &feats->device, &feats->subgroup_rotate, FF_VK_EXT_SUBGROUP_ROTATE, > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR); > + FF_VK_STRUCT_EXT(s, &feats->device, &feats->host_image_copy, FF_VK_EXT_HOST_IMAGE_COPY, > + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT); > > #ifdef VK_KHR_shader_expect_assume > FF_VK_STRUCT_EXT(s, &feats->device, &feats->expect_assume, FF_VK_EXT_EXPECT_ASSUME, > @@ -287,6 +290,7 @@ static void device_features_copy_needed(VulkanDeviceFeatures *dst, VulkanDeviceF > > COPY_VAL(timeline_semaphore.timelineSemaphore); > COPY_VAL(subgroup_rotate.shaderSubgroupRotate); > + COPY_VAL(host_image_copy.hostImageCopy); > > COPY_VAL(video_maintenance_1.videoMaintenance1); > #ifdef VK_KHR_video_maintenance2 > @@ -610,6 +614,7 @@ static const VulkanOptExtension optional_device_exts[] = { > { VK_NV_OPTICAL_FLOW_EXTENSION_NAME, FF_VK_EXT_OPTICAL_FLOW }, > { VK_EXT_SHADER_OBJECT_EXTENSION_NAME, FF_VK_EXT_SHADER_OBJECT }, > { VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, FF_VK_EXT_SUBGROUP_ROTATE }, > + { VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, FF_VK_EXT_HOST_IMAGE_COPY }, > #ifdef VK_KHR_shader_expect_assume > { VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, FF_VK_EXT_EXPECT_ASSUME }, > #endif > @@ -2802,11 +2807,15 @@ static int vulkan_frames_init(AVHWFramesContext *hwfc) > > /* Image usage flags */ > if (!hwctx->usage) { > - hwctx->usage = supported_usage & (VK_IMAGE_USAGE_TRANSFER_DST_BIT | > - VK_IMAGE_USAGE_TRANSFER_SRC_BIT | > + hwctx->usage = supported_usage & (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | > VK_IMAGE_USAGE_STORAGE_BIT | > VK_IMAGE_USAGE_SAMPLED_BIT); > > + if (p->vkctx.extensions & FF_VK_EXT_HOST_IMAGE_COPY) > + hwctx->usage |= VK_IMAGE_USAGE_HOST_TRANSFER_BIT; > + else > + hwctx->usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; > + > /* Enables encoding of images, if supported by format and extensions */ > if ((supported_usage & VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR) && > (p->vkctx.extensions & (FF_VK_EXT_VIDEO_ENCODE_QUEUE | > @@ -4125,6 +4134,74 @@ fail: > return err; > } > > +static int vulkan_transfer_host(AVHWFramesContext *hwfc, AVFrame *hwf, > + AVFrame *swf, int upload) > +{ > + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; > + AVVulkanDeviceContext *hwctx = &p->p; > + FFVulkanFunctions *vk = &p->vkctx.vkfn; > + > + AVVkFrame *hwf_vk = (AVVkFrame *)hwf->data[0]; > + const int planes = av_pix_fmt_count_planes(swf->format); > + const int nb_images = ff_vk_count_images(hwf_vk); > + > + if (upload) { > + VkMemoryToImageCopy region_info = { > + .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY, > + .imageSubresource = { > + .layerCount = 1, > + }, > + }; > + VkCopyMemoryToImageInfo copy_info = { > + .sType = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO, > + .flags = VK_HOST_IMAGE_COPY_MEMCPY, > + .regionCount = 1, > + .pRegions = ®ion_info, > + }; > + for (int i = 0; i < planes; i++) { > + int img_idx = FFMIN(i, (nb_images - 1)); > + uint32_t p_w, p_h; > + get_plane_wh(&p_w, &p_h, swf->format, swf->width, swf->height, i); > + > + region_info.pHostPointer = swf->data[i]; > + region_info.imageSubresource.aspectMask = ff_vk_aspect_flag(hwf, i); > + region_info.imageExtent = (VkExtent3D){ p_w, p_h, 1 }; > + copy_info.dstImage = hwf_vk->img[img_idx]; > + copy_info.dstImageLayout = hwf_vk->layout[img_idx]; > + > + vk->CopyMemoryToImageEXT(hwctx->act_dev, ©_info); > + } > + } else { > + VkImageToMemoryCopy region_info = { > + .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY, > + .imageSubresource = { > + .layerCount = 1, > + }, > + }; > + VkCopyImageToMemoryInfo copy_info = { > + .sType = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO, > + .flags = VK_HOST_IMAGE_COPY_MEMCPY, > + .regionCount = 1, > + .pRegions = ®ion_info, > + }; > + for (int i = 0; i < planes; i++) { > + int img_idx = FFMIN(i, (nb_images - 1)); > + uint32_t p_w, p_h; > + get_plane_wh(&p_w, &p_h, swf->format, swf->width, swf->height, i); > + > + region_info.pHostPointer = swf->data[i]; > + region_info.imageSubresource.aspectMask = ff_vk_aspect_flag(hwf, i); > + region_info.imageExtent = (VkExtent3D){ p_w, p_h, 1 }; > + copy_info.srcImage = hwf_vk->img[img_idx]; > + copy_info.srcImageLayout = hwf_vk->layout[img_idx]; > + > + vk->CopyImageToMemoryEXT(hwctx->act_dev, ©_info); > + } > + } > + > + return 0; > +} > + > static int vulkan_transfer_frame(AVHWFramesContext *hwfc, > AVFrame *swf, AVFrame *hwf, > int upload) > @@ -4161,6 +4238,9 @@ static int vulkan_transfer_frame(AVHWFramesContext *hwfc, > if (swf->width > hwfc->width || swf->height > hwfc->height) > return AVERROR(EINVAL); > > + if (p->vkctx.extensions & FF_VK_EXT_HOST_IMAGE_COPY) > + return vulkan_transfer_host(hwfc, hwf, swf, upload); > + > for (int i = 0; i < av_pix_fmt_count_planes(swf->format); i++) { > uint32_t p_w, p_h; > get_plane_wh(&p_w, &p_h, swf->format, swf->width, swf->height, i); > diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h > index 8b413013e6..ea0f978bb9 100644 > --- a/libavutil/vulkan_functions.h > +++ b/libavutil/vulkan_functions.h > @@ -49,6 +49,7 @@ typedef uint64_t FFVulkanExtensions; > #define FF_VK_EXT_RELAXED_EXTENDED_INSTR (1ULL << 15) /* VK_KHR_shader_relaxed_extended_instruction */ > #define FF_VK_EXT_EXPECT_ASSUME (1ULL << 16) /* VK_KHR_shader_expect_assume */ > #define FF_VK_EXT_SUBGROUP_ROTATE (1ULL << 17) /* VK_KHR_shader_subgroup_rotate */ > +#define FF_VK_EXT_HOST_IMAGE_COPY (1ULL << 18) /* VK_EXT_image_copy */ VK_EXT_host_image_copy > > /* Video extensions */ > #define FF_VK_EXT_VIDEO_QUEUE (1ULL << 36) /* VK_KHR_video_queue */ > @@ -207,6 +208,11 @@ typedef uint64_t FFVulkanExtensions; > /* sync2 */ \ > MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier2) \ > \ > + /* Host image copy */ \ > + MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, TransitionImageLayoutEXT) \ > + MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, CopyMemoryToImageEXT) \ > + MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, CopyImageToMemoryEXT) \ > + \ > /* Video queue */ \ > MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionKHR) \ > MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionParametersKHR) \ > diff --git a/libavutil/vulkan_loader.h b/libavutil/vulkan_loader.h > index a7976fe560..7e805fdd4c 100644 > --- a/libavutil/vulkan_loader.h > +++ b/libavutil/vulkan_loader.h > @@ -59,6 +59,7 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions, > { VK_NV_OPTICAL_FLOW_EXTENSION_NAME, FF_VK_EXT_OPTICAL_FLOW }, > { VK_EXT_SHADER_OBJECT_EXTENSION_NAME, FF_VK_EXT_SHADER_OBJECT }, > { VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, FF_VK_EXT_SUBGROUP_ROTATE }, > + { VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, FF_VK_EXT_HOST_IMAGE_COPY }, > { VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME, FF_VK_EXT_VIDEO_MAINTENANCE_1 }, > #ifdef VK_KHR_video_maintenance2 > { VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME, FF_VK_EXT_VIDEO_MAINTENANCE_2 }, > -- > 2.49.0.395.g12beb8f557c > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".