From 063c9969f502d133428639adbee9b864f22e2d6f Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 19 May 2020 04:44:56 +0300 Subject: cam: kms_sink: Enable display on first frame Not all display controllers support enabling the display without any active plane. Delay display enabling to the first frame. Signed-off-by: Laurent Pinchart Reviewed-by: Paul Elder Reviewed-by: Umang Jain Reviewed-by: Kieran Bingham --- src/cam/kms_sink.cpp | 31 +++++++++++-------------------- src/cam/kms_sink.h | 2 -- 2 files changed, 11 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp index 35d2a242..8c0b79c6 100644 --- a/src/cam/kms_sink.cpp +++ b/src/cam/kms_sink.cpp @@ -195,23 +195,6 @@ int KMSSink::start() return ret; } - /* Enable the display pipeline with no plane to start with. */ - request = std::make_unique(&dev_); - - request->addProperty(connector_, "CRTC_ID", crtc_->id()); - request->addProperty(crtc_, "ACTIVE", 1); - request->addProperty(crtc_, "MODE_ID", mode_->toBlob(&dev_)); - - ret = request->commit(DRM::AtomicRequest::FlagAllowModeset); - if (ret < 0) { - std::cerr - << "Failed to enable display pipeline: " - << strerror(-ret) << std::endl; - return ret; - } - - planeInitialized_ = false; - return 0; } @@ -259,10 +242,17 @@ bool KMSSink::processRequest(libcamera::Request *camRequest) DRM::FrameBuffer *drmBuffer = iter->second.get(); + unsigned int flags = DRM::AtomicRequest::FlagAsync; DRM::AtomicRequest *drmRequest = new DRM::AtomicRequest(&dev_); drmRequest->addProperty(plane_, "FB_ID", drmBuffer->id()); - if (!planeInitialized_) { + if (!active_ && !queued_) { + /* Enable the display pipeline on the first frame. */ + drmRequest->addProperty(connector_, "CRTC_ID", crtc_->id()); + + drmRequest->addProperty(crtc_, "ACTIVE", 1); + drmRequest->addProperty(crtc_, "MODE_ID", mode_->toBlob(&dev_)); + drmRequest->addProperty(plane_, "CRTC_ID", crtc_->id()); drmRequest->addProperty(plane_, "SRC_X", 0 << 16); drmRequest->addProperty(plane_, "SRC_Y", 0 << 16); @@ -272,7 +262,8 @@ bool KMSSink::processRequest(libcamera::Request *camRequest) drmRequest->addProperty(plane_, "CRTC_Y", 0); drmRequest->addProperty(plane_, "CRTC_W", mode_->hdisplay); drmRequest->addProperty(plane_, "CRTC_H", mode_->vdisplay); - planeInitialized_ = true; + + flags |= DRM::AtomicRequest::FlagAllowModeset; } pending_ = std::make_unique(drmRequest, camRequest); @@ -280,7 +271,7 @@ bool KMSSink::processRequest(libcamera::Request *camRequest) std::lock_guard lock(lock_); if (!queued_) { - int ret = drmRequest->commit(DRM::AtomicRequest::FlagAsync); + int ret = drmRequest->commit(flags); if (ret < 0) { std::cerr << "Failed to commit atomic request: " diff --git a/src/cam/kms_sink.h b/src/cam/kms_sink.h index 0c01df40..072ef1c9 100644 --- a/src/cam/kms_sink.h +++ b/src/cam/kms_sink.h @@ -61,8 +61,6 @@ private: libcamera::Size size_; unsigned int stride_; - bool planeInitialized_; - std::map> buffers_; std::mutex lock_; -- cgit v1.2.1