From patchwork Fri Nov 20 17:26:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 23920 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 0B7524497A5 for ; Fri, 20 Nov 2020 19:26:55 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DB1CC68B9C1; Fri, 20 Nov 2020 19:26:54 +0200 (EET) 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 DD21E68B9BC for ; Fri, 20 Nov 2020 19:26:47 +0200 (EET) Received: from w3.tutanota.de (unknown [192.168.1.164]) by w4.tutanota.de (Postfix) with ESMTP id 64E501060345 for ; Fri, 20 Nov 2020 17:26:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1605893207; 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=szl+IxMpi8cuTn4UxCuN/UjH1K6IsJ4j3whdja44XZE=; b=IlDSZ2z94fnaiizQxxnsdgZuYLhl1dSST762CsGwLFTrY/ra7aReye+LyQaCevmc jxuRIkexEdkhpyKn2uu9ceiteygXowKj6gCyznhutpG2TnjpNsZr9UrM48h2iXhCu82 dzedPF6eU7U+RCK8EzN7ZdDze+9NOnI6FFCKf9u1HM816HJZI40ew3QMU/Dgmw0CTxN M4GEySjmRiOPa45AWqw5/SwPlpPbFTwS+yv6TAotWZB9o5/tc8t+00w9jUd3B3wK+9C w29ULYRT+Lqwx4SUZMyHVz1DALkdka/urtO1JX0/OuvxqEUE1Eqk1Btkpl8+runT3p2 XxRQo0y3VA== Date: Fri, 20 Nov 2020 18:26:47 +0100 (CET) From: Lynne To: Ffmpeg Devel Message-ID: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] hwcontext_drm: issue DMA_BUF_IOCTL_SYNC when mapping FDs 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This improves performance and helps a little when given FDs without any synchronization fences. Patch attached. Subject: [PATCH] hwcontext_drm: issue DMA_BUF_IOCTL_SYNC when mapping FDs This improves performance and helps a little when given FDs without any synchronization fences. --- libavutil/hwcontext_drm.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/libavutil/hwcontext_drm.c b/libavutil/hwcontext_drm.c index 32cbde82eb..ceacf683a0 100644 --- a/libavutil/hwcontext_drm.c +++ b/libavutil/hwcontext_drm.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include @@ -85,6 +87,8 @@ static int drm_get_buffer(AVHWFramesContext *hwfc, AVFrame *frame) typedef struct DRMMapping { // Address and length of each mmap()ed region. int nb_regions; + int sync_flags; + int object[AV_DRM_MAX_PLANES]; void *address[AV_DRM_MAX_PLANES]; size_t length[AV_DRM_MAX_PLANES]; } DRMMapping; @@ -93,10 +97,16 @@ static void drm_unmap_frame(AVHWFramesContext *hwfc, HWMapDescriptor *hwmap) { DRMMapping *map = hwmap->priv; - int i; - - for (i = 0; i < map->nb_regions; i++) + struct dma_buf_sync sync = { .flags = DMA_BUF_SYNC_END | map->sync_flags }; + int i, ret; + + for (i = 0; i < map->nb_regions; i++) { + ret = ioctl(map->object[i], DMA_BUF_IOCTL_SYNC, &sync); + if (ret) + av_log(hwfc, AV_LOG_ERROR, "Failed to issue ioctl sync to DRM object " + "%d: %d.\n", map->object[i], errno); munmap(map->address[i], map->length[i]); + } av_free(map); } @@ -105,6 +115,7 @@ static int drm_map_frame(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src, int flags) { const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor*)src->data[0]; + struct dma_buf_sync sync_start = { 0 }; DRMMapping *map; int err, i, p, plane; int mmap_prot; @@ -115,10 +126,16 @@ static int drm_map_frame(AVHWFramesContext *hwfc, return AVERROR(ENOMEM); mmap_prot = 0; - if (flags & AV_HWFRAME_MAP_READ) + if (flags & AV_HWFRAME_MAP_READ) { mmap_prot |= PROT_READ; - if (flags & AV_HWFRAME_MAP_WRITE) + map->sync_flags |= DMA_BUF_SYNC_READ; + } + if (flags & AV_HWFRAME_MAP_WRITE) { mmap_prot |= PROT_WRITE; + map->sync_flags |= DMA_BUF_SYNC_WRITE; + } + + sync_start.flags = DMA_BUF_SYNC_START | map->sync_flags; av_assert0(desc->nb_objects <= AV_DRM_MAX_PLANES); for (i = 0; i < desc->nb_objects; i++) { @@ -133,6 +150,15 @@ static int drm_map_frame(AVHWFramesContext *hwfc, map->address[i] = addr; map->length[i] = desc->objects[i].size; + map->object[i] = desc->objects[i].fd; + + err = ioctl(desc->objects[i].fd, DMA_BUF_IOCTL_SYNC, &sync_start); + if (err) { + err = AVERROR(errno); + av_log(hwfc, AV_LOG_ERROR, "Failed to issue ioctl sync to DRM object " + "%d: %d.\n", desc->objects[i].fd, errno); + goto fail; + } } map->nb_regions = i;