From patchwork Fri Sep 18 09:42:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 9656 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 3AB88C3B5B for ; Fri, 18 Sep 2020 09:44:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 092E762FC4; Fri, 18 Sep 2020 11:44:09 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="MI43aiZL"; dkim-atps=neutral Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 10FBB62FAD for ; Fri, 18 Sep 2020 11:44:07 +0200 (CEST) Received: by mail-wr1-x441.google.com with SMTP id t10so4961873wrv.1 for ; Fri, 18 Sep 2020 02:44:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VeqvmYrPOcZHFidx2F0bdpH4CTa6e7IqqNLmBrr4td4=; b=MI43aiZL93zDzh+/ViAjdRerpI+1DL/L8hHpGbSNt7rrPccMv2A6f43JNbyIw9mBbz uKBTYNp7XT6iy64PGw7RBaU6O8PS1VsslzEo7tSD/9hHDuIi05FWbL/YeZeYfCyFXhLL 8xg25QLlY0TGRyGKbAMOnETFpa7kPQYu8XloOP9HevXzvnTqmLw7S9vtqYIP2LGNZqgo Acl7iHLVkvyYouoi/i5JUx0urWR9RrXa3zPJ80dVfW1OwJvnEqtxUJ5aiUykuz1owivo 5mjXxI8j5NRExU3Q2FTwiIG/+cHhEIjIpeGxkSnhbyMPTSyQPtNJHsbxli+VsdwOUjWY t00g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VeqvmYrPOcZHFidx2F0bdpH4CTa6e7IqqNLmBrr4td4=; b=Z4PrSTVcto3IL6S+Ol2AMQqJJhoUSwk+E7JCoYAIIFAKgPmGZDiBL55/sEJRnffTgL Ob2JfS2SEdHD4vbNSRIlntVWUK5kJw234K0SRHnZXgcDsKaHuGPnz3gTkmm30qqEsuO4 eBBfm6vGv3ZWaIJ26zuuAbUvgRtGcNmkt1K1aPH8xdhcYqD2dehYGqrx6Ji7pNnv7jNN GMt6ReWXuud3A8/lUWd+ZGJQWr9ujyhCkTDpVUqNA3r7XxK2TKGysNHkUN3RGJxLTMrM iIqV2p6G5wttnTuoewOln8TKp/YvzkhxTboTfSbOYw2psGdJB+PKFlaMuX9pZv1S8uE6 oGtQ== X-Gm-Message-State: AOAM532o2+LcfvcXbZ/XyMkCfgyslHIvPoYD2QlydkcF03oA174UkTMp TNNzUYscL7ckUJgfNrV0YCibWFwM/PSxBg== X-Google-Smtp-Source: ABdhPJwETLDlad2lov/ngClBjEcrSBvF5UMHYy51vR1Imp5SGah7ihGxn0RjaQ/yr/plzrAw3/+mEQ== X-Received: by 2002:a5d:50cd:: with SMTP id f13mr32695803wrt.211.1600422246215; Fri, 18 Sep 2020 02:44:06 -0700 (PDT) Received: from naushir-VirtualBox.pitowers.org ([2a00:1098:3142:14:a00:27ff:fe4d:f6a2]) by smtp.gmail.com with ESMTPSA id n2sm4792472wma.29.2020.09.18.02.44.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2020 02:44:05 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Sep 2020 10:42:32 +0100 Message-Id: <20200918094233.5273-12-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200918094233.5273-1-naush@raspberrypi.com> References: <20200918094233.5273-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v8 11/12] pipeline: raspberrypi: Use an unordered_set to store IPA buffer ids X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" By using a set container, we can easily insert/remove buffer ids that have been mmaped by the IPA. This will be required to track buffers allocated externally and passed to the pipeline handler through a Request. Move the IPA buffer mapping code into a function to remove duplicated code. Signed-off-by: Naushir Patuck Reviewed-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- .../pipeline/raspberrypi/raspberrypi.cpp | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 51544233..4e12c7d6 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -158,8 +159,8 @@ public: RPi::RPiDevice isp_; /* The vector below is just for convenience when iterating over all streams. */ std::vector streams_; - /* Buffers passed to the IPA. */ - std::vector ipaBuffers_; + /* Stores the ids of the buffers mapped in the IPA. */ + std::unordered_set ipaBuffers_; /* DMAHEAP allocation helper. */ RPi::DmaHeap dmaHeap_; @@ -230,6 +231,7 @@ private: int queueAllBuffers(Camera *camera); int prepareBuffers(Camera *camera); void freeBuffers(Camera *camera); + void mapBuffers(Camera *camera, const RPi::BufferMap &buffers, unsigned int mask); MediaDevice *unicam_; MediaDevice *isp_; @@ -910,36 +912,42 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera) } /* - * Link the FrameBuffers with the index of their position in the vector - * stored in the RPi stream object. + * Pass the stats and embedded data buffers to the IPA. No other + * buffers need to be passed. + */ + mapBuffers(camera, data->isp_[Isp::Stats].getBuffers(), RPiIpaMask::STATS); + mapBuffers(camera, data->unicam_[Unicam::Embedded].getBuffers(), RPiIpaMask::EMBEDDED_DATA); + + return 0; +} + +void PipelineHandlerRPi::mapBuffers(Camera *camera, const RPi::BufferMap &buffers, unsigned int mask) +{ + RPiCameraData *data = cameraData(camera); + std::vector ipaBuffers; + /* + * Link the FrameBuffers with the id (key value) in the map stored in + * the RPi stream object - along with an identifier mask. * * This will allow us to identify buffers passed between the pipeline * handler and the IPA. */ - for (auto const &b : data->isp_[Isp::Stats].getBuffers()) { - data->ipaBuffers_.push_back({ .id = RPiIpaMask::STATS | b.first, - .planes = b.second->planes() }); - } - - for (auto const &b : data->unicam_[Unicam::Embedded].getBuffers()) { - data->ipaBuffers_.push_back({ .id = RPiIpaMask::EMBEDDED_DATA | b.first, - .planes = b.second->planes() }); + for (auto const &it : buffers) { + ipaBuffers.push_back({ .id = mask | it.first, + .planes = it.second->planes() }); + data->ipaBuffers_.insert(mask | it.first); } - data->ipa_->mapBuffers(data->ipaBuffers_); - - return 0; + data->ipa_->mapBuffers(ipaBuffers); } void PipelineHandlerRPi::freeBuffers(Camera *camera) { RPiCameraData *data = cameraData(camera); - std::vector ids; - for (IPABuffer &ipabuf : data->ipaBuffers_) - ids.push_back(ipabuf.id); - - data->ipa_->unmapBuffers(ids); + /* Copy the buffer ids from the unordered_set to a vector to pass to the IPA. */ + std::vector ipaBuffers(data->ipaBuffers_.begin(), data->ipaBuffers_.end()); + data->ipa_->unmapBuffers(ipaBuffers); data->ipaBuffers_.clear(); for (auto const stream : data->streams_)