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:
parent
6d7ddace52
commit
063c9969f5
2 changed files with 11 additions and 22 deletions
|
@ -195,23 +195,6 @@ int KMSSink::start()
|
||||||
return ret;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,10 +242,17 @@ bool KMSSink::processRequest(libcamera::Request *camRequest)
|
||||||
|
|
||||||
DRM::FrameBuffer *drmBuffer = iter->second.get();
|
DRM::FrameBuffer *drmBuffer = iter->second.get();
|
||||||
|
|
||||||
|
unsigned int flags = DRM::AtomicRequest::FlagAsync;
|
||||||
DRM::AtomicRequest *drmRequest = new DRM::AtomicRequest(&dev_);
|
DRM::AtomicRequest *drmRequest = new DRM::AtomicRequest(&dev_);
|
||||||
drmRequest->addProperty(plane_, "FB_ID", drmBuffer->id());
|
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_, "CRTC_ID", crtc_->id());
|
||||||
drmRequest->addProperty(plane_, "SRC_X", 0 << 16);
|
drmRequest->addProperty(plane_, "SRC_X", 0 << 16);
|
||||||
drmRequest->addProperty(plane_, "SRC_Y", 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_Y", 0);
|
||||||
drmRequest->addProperty(plane_, "CRTC_W", mode_->hdisplay);
|
drmRequest->addProperty(plane_, "CRTC_W", mode_->hdisplay);
|
||||||
drmRequest->addProperty(plane_, "CRTC_H", mode_->vdisplay);
|
drmRequest->addProperty(plane_, "CRTC_H", mode_->vdisplay);
|
||||||
planeInitialized_ = true;
|
|
||||||
|
flags |= DRM::AtomicRequest::FlagAllowModeset;
|
||||||
}
|
}
|
||||||
|
|
||||||
pending_ = std::make_unique<Request>(drmRequest, camRequest);
|
pending_ = std::make_unique<Request>(drmRequest, camRequest);
|
||||||
|
@ -280,7 +271,7 @@ bool KMSSink::processRequest(libcamera::Request *camRequest)
|
||||||
std::lock_guard<std::mutex> lock(lock_);
|
std::lock_guard<std::mutex> lock(lock_);
|
||||||
|
|
||||||
if (!queued_) {
|
if (!queued_) {
|
||||||
int ret = drmRequest->commit(DRM::AtomicRequest::FlagAsync);
|
int ret = drmRequest->commit(flags);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
std::cerr
|
std::cerr
|
||||||
<< "Failed to commit atomic request: "
|
<< "Failed to commit atomic request: "
|
||||||
|
|
|
@ -61,8 +61,6 @@ private:
|
||||||
libcamera::Size size_;
|
libcamera::Size size_;
|
||||||
unsigned int stride_;
|
unsigned int stride_;
|
||||||
|
|
||||||
bool planeInitialized_;
|
|
||||||
|
|
||||||
std::map<libcamera::FrameBuffer *, std::unique_ptr<DRM::FrameBuffer>> buffers_;
|
std::map<libcamera::FrameBuffer *, std::unique_ptr<DRM::FrameBuffer>> buffers_;
|
||||||
|
|
||||||
std::mutex lock_;
|
std::mutex lock_;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue