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 <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2020-05-19 04:44:56 +03:00
parent 6d7ddace52
commit 063c9969f5
2 changed files with 11 additions and 22 deletions

View file

@ -195,23 +195,6 @@ int KMSSink::start()
return ret;
}
/* Enable the display pipeline with no plane to start with. */
request = std::make_unique<DRM::AtomicRequest>(&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<Request>(drmRequest, camRequest);
@ -280,7 +271,7 @@ bool KMSSink::processRequest(libcamera::Request *camRequest)
std::lock_guard<std::mutex> 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: "