[libcamera-devel] [PATCH] cam: kms_sink: Once you have found a valid crtc break out of loops

Eric Curtin ecurtin at redhat.com
Thu Dec 2 11:23:55 CET 2021


Once we have found a suitable plane and CRTC to auto-select, break out
of all loops, not just the inner-most loop.

Fixes: 1de0f90dd432 ("cam: kms_sink: Print display pipelineconfiguration")
Signed-off-by: Eric Curtin <ecurtin at redhat.com>
---
 src/cam/kms_sink.cpp | 27 ++++++++++++++++-----------
 src/cam/kms_sink.h   |  1 +
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp
index d30fba78..44a0f07b 100644
--- a/src/cam/kms_sink.cpp
+++ b/src/cam/kms_sink.cpp
@@ -136,12 +136,12 @@ int KMSSink::configure(const libcamera::CameraConfiguration &config)
 	return 0;
 }
 
-int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
+const DRM::Crtc *KMSSink::findCrtc(const libcamera::PixelFormat &format)
 {
 	/*
-	 * If the requested format has an alpha channel, also consider the X
-	 * variant.
-	 */
+         * If the requested format has an alpha channel, also consider the X
+         * variant.
+         */
 	libcamera::PixelFormat xFormat;
 
 	switch (format) {
@@ -160,10 +160,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
 	}
 
 	/*
-	 * Find a CRTC and plane suitable for the request format and the
-	 * connector at the end of the pipeline. Restrict the search to primary
-	 * planes for now.
-	 */
+         * Find a CRTC and plane suitable for the request format and the
+         * connector at the end of the pipeline. Restrict the search to primary
+         * planes for now.
+         */
 	for (const DRM::Encoder *encoder : connector_->encoders()) {
 		for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {
 			for (const DRM::Plane *plane : crtc->planes()) {
@@ -174,20 +174,25 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
 					crtc_ = crtc;
 					plane_ = plane;
 					format_ = format;
-					break;
+					return crtc;
 				}
 
 				if (plane->supportsFormat(xFormat)) {
 					crtc_ = crtc;
 					plane_ = plane;
 					format_ = xFormat;
-					break;
+					return crtc;
 				}
 			}
 		}
 	}
 
-	if (!crtc_) {
+	return nullptr;
+}
+
+int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
+{
+	if (!findCrtc(format)) {
 		std::cerr
 			<< "Unable to find display pipeline for format "
 			<< format.toString() << std::endl;
diff --git a/src/cam/kms_sink.h b/src/cam/kms_sink.h
index 1e4290ad..a8a29399 100644
--- a/src/cam/kms_sink.h
+++ b/src/cam/kms_sink.h
@@ -47,6 +47,7 @@ private:
 		libcamera::Request *camRequest_;
 	};
 
+	const DRM::Crtc *findCrtc(const libcamera::PixelFormat &format);
 	int configurePipeline(const libcamera::PixelFormat &format);
 	void requestComplete(DRM::AtomicRequest *request);
 
-- 
2.33.1



More information about the libcamera-devel mailing list