From patchwork Fri Feb 12 16:07:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Ser X-Patchwork-Id: 25598 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id CB2D744AC32 for ; Fri, 12 Feb 2021 18:08:01 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B827068A94D; Fri, 12 Feb 2021 18:08:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [217.70.183.200]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C8F9E689FD6 for ; Fri, 12 Feb 2021 18:07:48 +0200 (EET) X-Originating-IP: 86.247.11.12 Received: from haruko.lan (lfbn-idf2-1-654-12.w86-247.abo.wanadoo.fr [86.247.11.12]) (Authenticated sender: schroder@emersion.fr) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 9158220005; Fri, 12 Feb 2021 16:07:46 +0000 (UTC) From: Simon Ser To: ffmpeg-devel@ffmpeg.org Date: Fri, 12 Feb 2021 17:07:45 +0100 Message-Id: <20210212160745.388141-1-contact@emersion.fr> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] hwcontext_vaapi: introduce AV_HWFRAME_MAP_DRM_COMPOSED_LAYERS X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 , Mark Thompson , Fei Wang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This allows callers to ask for composed layers. From the libva docs: > If VA_EXPORT_SURFACE_SEPARATE_LAYERS is specified on export, each > layer will contain exactly one plane. For example, an NV12 > surface will be exported as two layers, one of DRM_FORMAT_R8 and > one of DRM_FORMAT_GR88. > If VA_EXPORT_SURFACE_COMPOSED_LAYERS is specified on export, > there will be exactly one layer. VA_EXPORT_SURFACE_COMPOSED_LAYERS is desirable in many scenarios, for instance when directly importing the DMA-BUFs into APIs such as GL (as a single EGLImage), KMS or Wayland. This patch was tested with the following Mesa MR: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9015 Signed-off-by: Simon Ser Cc: Mark Thompson Cc: Haihao Xiang Cc: Fei Wang --- libavutil/hwcontext.h | 6 ++++++ libavutil/hwcontext_vaapi.c | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h index 04d19d89c2b8..9ea27b285c20 100644 --- a/libavutil/hwcontext.h +++ b/libavutil/hwcontext.h @@ -538,6 +538,12 @@ enum { * be much lower than normal memory. */ AV_HWFRAME_MAP_DIRECT = 1 << 3, + /** + * The mapping must result in exactly one DRM layer, see + * AVDRMFrameDescriptor. For instance, an NV12 frame will have a single + * layer whose format is NV12. + */ + AV_HWFRAME_MAP_DRM_COMPOSED_LAYERS = 1 << 4, }; /** diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index 2227d6ed6981..0d94dc9f14de 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -1161,7 +1161,11 @@ static int vaapi_map_to_drm_esh(AVHWFramesContext *hwfc, AVFrame *dst, surface_id = (VASurfaceID)(uintptr_t)src->data[3]; - export_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS; + export_flags = 0; + if (flags & AV_HWFRAME_MAP_DRM_COMPOSED_LAYERS) + export_flags |= VA_EXPORT_SURFACE_COMPOSED_LAYERS; + else + export_flags |= VA_EXPORT_SURFACE_SEPARATE_LAYERS; if (flags & AV_HWFRAME_MAP_READ) export_flags |= VA_EXPORT_SURFACE_READ_ONLY; if (flags & AV_HWFRAME_MAP_WRITE)