[{"id":21533,"web_url":"https://patchwork.libcamera.org/comment/21533/","msgid":"<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>","date":"2021-12-01T17:13:33","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Eric,\n\nThank you for the patch, and welcome to libcamera.\n\nOn Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> When looping through possibleCrtcs on my machine, the only valid crtc is\n> actually the first one. This can be identified by checking if the clock\n> variable is non-zero.\n> \n> Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> ---\n>  src/cam/drm.cpp      | 2 +-\n>  src/cam/drm.h        | 2 ++\n>  src/cam/kms_sink.cpp | 4 ++++\n>  3 files changed, 7 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> index f2530091..808e5a87 100644\n> --- a/src/cam/drm.cpp\n> +++ b/src/cam/drm.cpp\n> @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n>  }\n>  \n>  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> -\t: Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> +\t: Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n>  {\n>  }\n>  \n> diff --git a/src/cam/drm.h b/src/cam/drm.h\n> index de57e445..d05e6d13 100644\n> --- a/src/cam/drm.h\n> +++ b/src/cam/drm.h\n> @@ -149,12 +149,14 @@ public:\n>  \tCrtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n>  \n>  \tunsigned int index() const { return index_; }\n> +\tuint32_t clock() const { return crtc_->mode.clock; }\n>  \tconst std::vector<const Plane *> &planes() const { return planes_; }\n>  \n>  private:\n>  \tfriend Device;\n>  \n>  \tunsigned int index_;\n> +\tconst drmModeCrtc *crtc_;\n>  \tstd::vector<const Plane *> planes_;\n>  };\n>  \n> diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> index d30fba78..aa0b7a3c 100644\n> --- a/src/cam/kms_sink.cpp\n> +++ b/src/cam/kms_sink.cpp\n> @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n>  \t */\n>  \tfor (const DRM::Encoder *encoder : connector_->encoders()) {\n>  \t\tfor (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> +\t\t\tif (!crtc->clock()) {\n> +\t\t\t\tcontinue;\n> +\t\t\t}\n\nI don't think this is quite right. When the Crtc instance is created,\ndrmModeCrtc.mode contains the currently configured mode. Any CRTC that\nis not enabled when the cam application is started will thus be skipped,\neven if it can be used.\n\nOn a side note, no need for curly braces.\n\n> +\n>  \t\t\tfor (const DRM::Plane *plane : crtc->planes()) {\n>  \t\t\t\tif (plane->type() != DRM::Plane::TypePrimary)\n>  \t\t\t\t\tcontinue;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 2C940BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 17:14:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 74EA860822;\n\tWed,  1 Dec 2021 18:14:00 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 18957607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 18:13:59 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 84D51DEE;\n\tWed,  1 Dec 2021 18:13:58 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"LzVQsigc\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638378838;\n\tbh=dS8oGHIY2NrWpJtlihIMHaD5B6wMeoUsbMcW9ed8/e0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=LzVQsigcE8dhQdSmV5zfCyMvPuqsjxMgPCetZv/MGe0Fd/catvAS+RMH48Mr09Bbc\n\tjiZEoiUV9KiBSSMmzBCWgMfTWJ+pHRor3vNRVt4Jm4qNVygzf9NWYyE2b0L47Nm/eo\n\tjm+p0i5tQqUsMLtaDGOp+MQMoXkWtWOUKAOOaWHg=","Date":"Wed, 1 Dec 2021 19:13:33 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Eric Curtin <ecurtin@redhat.com>","Message-ID":"<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>","References":"<20211201164413.95396-1-ecurtin@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211201164413.95396-1-ecurtin@redhat.com>","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21534,"web_url":"https://patchwork.libcamera.org/comment/21534/","msgid":"<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>","date":"2021-12-01T18:03:43","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"Hi Laurent,\n\nThanks for welcoming me.\n\nAnother suggested solution would be welcome, let me describe\nwhat happens, it's been reproduced on multiple machines.\n\nSo here the the CRTCs output of modetest on my machine:\n\nCRTCs:\nid      fb      pos     size\n98      256     (0,0)   (1920x1080)\n  #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\nflags: nhsync, nvsync; type: preferred, driver\n...\n167     0       (0,0)   (0x0)\n  #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n...\n236     0       (0,0)   (0x0)\n  #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n\nSo these lines are executed 3 times:\n\nif (plane->supportsFormat(format)) {\n    crtc_ = crtc;\n\ncrtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n236, break out of loop.\n\nSo crtc_ is set in the end to be the one with an id of 236, which doesn't\ndisplay anything on my machine but 98 does.\n\nA alternative to fix this would be apprecitaion!\n\nI run like this:\n\nbuild/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n\nIs mise le meas/Regards,\n\nEric Curtin\n\n\n\nOn Wed, 1 Dec 2021 at 17:14, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi Eric,\n>\n> Thank you for the patch, and welcome to libcamera.\n>\n> On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > actually the first one. This can be identified by checking if the clock\n> > variable is non-zero.\n> >\n> > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > ---\n> >  src/cam/drm.cpp      | 2 +-\n> >  src/cam/drm.h        | 2 ++\n> >  src/cam/kms_sink.cpp | 4 ++++\n> >  3 files changed, 7 insertions(+), 1 deletion(-)\n> >\n> > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > index f2530091..808e5a87 100644\n> > --- a/src/cam/drm.cpp\n> > +++ b/src/cam/drm.cpp\n> > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> >  }\n> >\n> >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> >  {\n> >  }\n> >\n> > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > index de57e445..d05e6d13 100644\n> > --- a/src/cam/drm.h\n> > +++ b/src/cam/drm.h\n> > @@ -149,12 +149,14 @@ public:\n> >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> >\n> >       unsigned int index() const { return index_; }\n> > +     uint32_t clock() const { return crtc_->mode.clock; }\n> >       const std::vector<const Plane *> &planes() const { return planes_; }\n> >\n> >  private:\n> >       friend Device;\n> >\n> >       unsigned int index_;\n> > +     const drmModeCrtc *crtc_;\n> >       std::vector<const Plane *> planes_;\n> >  };\n> >\n> > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > index d30fba78..aa0b7a3c 100644\n> > --- a/src/cam/kms_sink.cpp\n> > +++ b/src/cam/kms_sink.cpp\n> > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> >        */\n> >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > +                     if (!crtc->clock()) {\n> > +                             continue;\n> > +                     }\n>\n> I don't think this is quite right. When the Crtc instance is created,\n> drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> is not enabled when the cam application is started will thus be skipped,\n> even if it can be used.\n>\n> On a side note, no need for curly braces.\n>\n> > +\n> >                       for (const DRM::Plane *plane : crtc->planes()) {\n> >                               if (plane->type() != DRM::Plane::TypePrimary)\n> >                                       continue;\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 4591CBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 18:04:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8CCCE60830;\n\tWed,  1 Dec 2021 19:03:59 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3D99E607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 19:03:58 +0100 (CET)","from mail-oi1-f198.google.com (mail-oi1-f198.google.com\n\t[209.85.167.198]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\tus-mta-27-M35pYn2SOK6wtUWonJDeIA-1; Wed, 01 Dec 2021 13:03:56 -0500","by mail-oi1-f198.google.com with SMTP id\n\tbi9-20020a056808188900b002bc4f64083aso16729472oib.7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 01 Dec 2021 10:03:55 -0800 (PST)"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"hB3gCbMs\"; dkim-atps=neutral","relay.mimecast.com;\n\tauth=pass smtp.auth=CUSA124A263 smtp.mailfrom=ecurtin@redhat.com"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1638381837;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=twYGyM8ZKLXn7jaIAms//dKGNK9ryeqEWrsDAOrIRas=;\n\tb=hB3gCbMsau+cQQhYLJnyPKdjSftEMtTQK/FYo2TguYQ/95DUI6c40rtVglreXa49gnROHw\n\t5zTd5CKunizB0opPSGq1jr2qOjSWBP9U2+e/fWRWnY33o/rgL21sGvU5gGppqog/LXdGid\n\tAMk7eEJ3Z1KkKqvW5mMOiql7x4C4bDc=","X-MC-Unique":"M35pYn2SOK6wtUWonJDeIA-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=twYGyM8ZKLXn7jaIAms//dKGNK9ryeqEWrsDAOrIRas=;\n\tb=X3jCjhRd9KAH6DAaj0io8gFdqKdJKhKbij7aOwY2j9nqwq4fyY1yIGOKKsbtnbFNyw\n\tqplcNoYpzd7doGtEflVEHh3oA1o3HmhQ3VPDYrePKg7kMDIvOHkxulFeZgBCQzD9xUDa\n\trsOT8yMThqtxCPWWOxbg7T70jsQRjox++5PDMbzDINMIXPkGFQ/9sz6KSt4gL5dMPDhS\n\tUfPn6tDeafgmoY+VQJn47M6XZPiKDceOWedvLD0zixRAKcw+ILpCzAdgfasNPWYHIwt+\n\tQigE6BCInoIPqKeTJQJ2vGCWQHDmMOK3j6ErPbT3dk6F6kqdYJpEfbzzgk+VKT/fXWtg\n\tidBA==","X-Gm-Message-State":"AOAM532TA3ifb4qXuJnlKjgNJ4JSz4xOzO7qcXx8+Wb0Qn//ULQE9lYv\n\tHjNdCpMNCAaYpRc20DlakcITjTpDoIzvLSB0PIM1kLMj2y2G2Q/WrWuhD0F96Wu7gaI/WxgF9Dz\n\tIKubAbLtJJAbfHDkTNm8J8JFNMViuUaPDTqYpfyciDaB7uxeJcQ==","X-Received":["by 2002:a05:6830:22f1:: with SMTP id\n\tt17mr7126869otc.39.1638381835125; \n\tWed, 01 Dec 2021 10:03:55 -0800 (PST)","by 2002:a05:6830:22f1:: with SMTP id\n\tt17mr7126806otc.39.1638381834514; \n\tWed, 01 Dec 2021 10:03:54 -0800 (PST)"],"X-Google-Smtp-Source":"ABdhPJw0UqOpp1LhKGDa7WnL34skuF9BdvR4ODySBUf6jVB8Ol4BQPYewbSL6OJDw8adarThViIxIbihQOCX0lUniYo=","MIME-Version":"1.0","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>","In-Reply-To":"<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>","From":"Eric Curtin <ecurtin@redhat.com>","Date":"Wed, 1 Dec 2021 18:03:43 +0000","Message-ID":"<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21535,"web_url":"https://patchwork.libcamera.org/comment/21535/","msgid":"<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>","date":"2021-12-01T18:31:26","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Eric,\n\nOn Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> Hi Laurent,\n> \n> Thanks for welcoming me.\n> \n> Another suggested solution would be welcome, let me describe\n> what happens, it's been reproduced on multiple machines.\n> \n> So here the the CRTCs output of modetest on my machine:\n> \n> CRTCs:\n> id      fb      pos     size\n> 98      256     (0,0)   (1920x1080)\n>   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> flags: nhsync, nvsync; type: preferred, driver\n> ...\n> 167     0       (0,0)   (0x0)\n>   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> ...\n> 236     0       (0,0)   (0x0)\n>   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> \n> So these lines are executed 3 times:\n> \n> if (plane->supportsFormat(format)) {\n>     crtc_ = crtc;\n> \n> crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> 236, break out of loop.\n> \n> So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> display anything on my machine but 98 does.\n\nThe issue isn't so much the selected CRTC I believe, but the selected\nconnector (of course the CRTC plays a role there). Could you share the\nfull DRM device topology (CRTCs, encoders, connectors) ?\n\n> A alternative to fix this would be apprecitaion!\n> \n> I run like this:\n> \n> build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> \n> On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> >\n> > Hi Eric,\n> >\n> > Thank you for the patch, and welcome to libcamera.\n> >\n> > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > actually the first one. This can be identified by checking if the clock\n> > > variable is non-zero.\n> > >\n> > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > ---\n> > >  src/cam/drm.cpp      | 2 +-\n> > >  src/cam/drm.h        | 2 ++\n> > >  src/cam/kms_sink.cpp | 4 ++++\n> > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > >\n> > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > index f2530091..808e5a87 100644\n> > > --- a/src/cam/drm.cpp\n> > > +++ b/src/cam/drm.cpp\n> > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > >  }\n> > >\n> > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > >  {\n> > >  }\n> > >\n> > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > index de57e445..d05e6d13 100644\n> > > --- a/src/cam/drm.h\n> > > +++ b/src/cam/drm.h\n> > > @@ -149,12 +149,14 @@ public:\n> > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > >\n> > >       unsigned int index() const { return index_; }\n> > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > >\n> > >  private:\n> > >       friend Device;\n> > >\n> > >       unsigned int index_;\n> > > +     const drmModeCrtc *crtc_;\n> > >       std::vector<const Plane *> planes_;\n> > >  };\n> > >\n> > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > index d30fba78..aa0b7a3c 100644\n> > > --- a/src/cam/kms_sink.cpp\n> > > +++ b/src/cam/kms_sink.cpp\n> > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > >        */\n> > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > +                     if (!crtc->clock()) {\n> > > +                             continue;\n> > > +                     }\n> >\n> > I don't think this is quite right. When the Crtc instance is created,\n> > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > is not enabled when the cam application is started will thus be skipped,\n> > even if it can be used.\n> >\n> > On a side note, no need for curly braces.\n> >\n> > > +\n> > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > >                                       continue;\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E7ACABF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 18:31:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5B4B46082A;\n\tWed,  1 Dec 2021 19:31:53 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 64D50607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 19:31:52 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CFD13A15;\n\tWed,  1 Dec 2021 19:31:51 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"c1b7hlw1\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638383512;\n\tbh=DNLVc3iKSt9eb1z8kyKKK8DtJ25KqGyGy1iF+aDly4s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=c1b7hlw14KWFBW+4krnyxFD0jFe+v2YTUAgn2RTGv0DVF6L4Am64ccexoqT2ZiTtz\n\tR9EuXE8QscugmK3OrLtk1XaLYc9Jph9RcaddHSjrZES52XEuY20+IpC5GoTLFYFcT7\n\tQsxjRZcBb0bPk6d4peiQVpWIiRIr3mQUiCZMQgec=","Date":"Wed, 1 Dec 2021 20:31:26 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Eric Curtin <ecurtin@redhat.com>","Message-ID":"<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21536,"web_url":"https://patchwork.libcamera.org/comment/21536/","msgid":"<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>","date":"2021-12-01T18:43:02","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"$ sudo modetest\ntrying to open device 'i915'...done\nEncoders:\nid crtc type possible crtcs possible clones\n238 98 TMDS 0x00000007 0x00000001\n246 0 TMDS 0x00000007 0x00000002\n\nConnectors:\nid encoder status name size (mm) modes encoders\n239 238 connected eDP-1          340x190 1 238\n  modes:\nindex name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n  #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\nflags: nhsync, nvsync; type: preferred, driver\n  props:\n1 EDID:\nflags: immutable blob\nblobs:\n\nvalue:\n00ffffffffffff0030e45a0600000000\n001d0104a5221378e238d5975e598e27\n1c505400000001010101010101010101\n010101010101243680a070381f403020\n350058c2100000190000000000000000\n00000000000000000000000000fe004c\n4720446973706c61790a2020000000fe\n004c503135365746432d5350443500e3\n2 DPMS:\nflags: enum\nenums: On=0 Standby=1 Suspend=2 Off=3\nvalue: 0\n5 link-status:\nflags: enum\nenums: Good=0 Bad=1\nvalue: 0\n6 non-desktop:\nflags: immutable range\nvalues: 0 1\nvalue: 0\n4 TILE:\nflags: immutable blob\nblobs:\n\nvalue:\n240 panel orientation:\nflags: immutable enum\nenums: Normal=0 Upside Down=1 Left Side Up=2 Right Side Up=3\nvalue: 0\n242 Broadcast RGB:\nflags: enum\nenums: Automatic=0 Full=1 Limited 16:235=2\nvalue: 0\n243 max bpc:\nflags: range\nvalues: 6 12\nvalue: 12\n244 Colorspace:\nflags: enum\nenums: Default=0 RGB_Wide_Gamut_Fixed_Point=13\nRGB_Wide_Gamut_Floating_Point=14 opRGB=7 DCI-P3_RGB_D65=11\nBT2020_RGB=9 BT601_YCC=15 BT709_YCC=2 XVYCC_601=3 XVYCC_709=4\nSYCC_601=5 opYCC_601=6 BT2020_CYCC=8 BT2020_YCC=10\nvalue: 0\n7 HDR_OUTPUT_METADATA:\nflags: blob\nblobs:\n\nvalue:\n245 scaling mode:\nflags: enum\nenums: Full=1 Center=2 Full aspect=3\nvalue: 3\n247 0 disconnected HDMI-A-1        0x0 0 246\n  props:\n1 EDID:\nflags: immutable blob\nblobs:\n\nvalue:\n2 DPMS:\nflags: enum\nenums: On=0 Standby=1 Suspend=2 Off=3\nvalue: 3\n5 link-status:\nflags: enum\nenums: Good=0 Bad=1\nvalue: 0\n6 non-desktop:\nflags: immutable range\nvalues: 0 1\nvalue: 0\n4 TILE:\nflags: immutable blob\nblobs:\n\nvalue:\n248 audio:\nflags: enum\nenums: force-dvi=18446744073709551614 off=18446744073709551615 auto=0 on=1\nvalue: 0\n242 Broadcast RGB:\nflags: enum\nenums: Automatic=0 Full=1 Limited 16:235=2\nvalue: 0\n249 aspect ratio:\nflags: enum\nenums: Automatic=0 4:3=1 16:9=2\nvalue: 0\n250 Colorspace:\nflags: enum\nenums: Default=0 SMPTE_170M_YCC=1 BT709_YCC=2 XVYCC_601=3 XVYCC_709=4\nSYCC_601=5 opYCC_601=6 opRGB=7 BT2020_CYCC=8 BT2020_RGB=9\nBT2020_YCC=10 DCI-P3_RGB_D65=11 DCI-P3_RGB_Theater=12\nvalue: 0\n251 content type:\nflags: enum\nenums: No Data=0 Graphics=1 Photo=2 Cinema=3 Game=4\nvalue: 0\n7 HDR_OUTPUT_METADATA:\nflags: blob\nblobs:\n\nvalue:\n252 max bpc:\nflags: range\nvalues: 8 12\nvalue: 12\n253 Content Protection:\nflags: enum\nenums: Undesired=0 Desired=1 Enabled=2\nvalue: 0\n254 HDCP Content Type:\nflags: enum\nenums: HDCP Type0=0 HDCP Type1=1\nvalue: 0\n\nCRTCs:\nid fb pos size\n98 259 (0,0) (1920x1080)\n  #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\nflags: nhsync, nvsync; type: preferred, driver\n  props:\n24 VRR_ENABLED:\nflags: range\nvalues: 0 1\nvalue: 0\n99 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n25 DEGAMMA_LUT:\nflags: blob\nblobs:\n\nvalue:\n26 DEGAMMA_LUT_SIZE:\nflags: immutable range\nvalues: 0 4294967295\nvalue: 33\n27 CTM:\nflags: blob\nblobs:\n\nvalue:\n28 GAMMA_LUT:\nflags: blob\nblobs:\n\nvalue:\n29 GAMMA_LUT_SIZE:\nflags: immutable range\nvalues: 0 4294967295\nvalue: 262145\n167 0 (0,0) (0x0)\n  #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n  props:\n24 VRR_ENABLED:\nflags: range\nvalues: 0 1\nvalue: 0\n168 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n25 DEGAMMA_LUT:\nflags: blob\nblobs:\n\nvalue:\n26 DEGAMMA_LUT_SIZE:\nflags: immutable range\nvalues: 0 4294967295\nvalue: 33\n27 CTM:\nflags: blob\nblobs:\n\nvalue:\n28 GAMMA_LUT:\nflags: blob\nblobs:\n\nvalue:\n29 GAMMA_LUT_SIZE:\nflags: immutable range\nvalues: 0 4294967295\nvalue: 262145\n236 0 (0,0) (0x0)\n  #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n  props:\n24 VRR_ENABLED:\nflags: range\nvalues: 0 1\nvalue: 0\n237 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n25 DEGAMMA_LUT:\nflags: blob\nblobs:\n\nvalue:\n26 DEGAMMA_LUT_SIZE:\nflags: immutable range\nvalues: 0 4294967295\nvalue: 33\n27 CTM:\nflags: blob\nblobs:\n\nvalue:\n28 GAMMA_LUT:\nflags: blob\nblobs:\n\nvalue:\n29 GAMMA_LUT_SIZE:\nflags: immutable range\nvalues: 0 4294967295\nvalue: 262145\n\nPlanes:\nid crtc fb CRTC x,y x,y gamma size possible crtcs\n31 98 259 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 1\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n33 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n34 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n35 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n36 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n37 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n38 zpos:\nflags: immutable range\nvalues: 0 0\nvalue: 0\n39 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n40 0 0 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n42 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n43 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n44 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n45 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n46 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n47 zpos:\nflags: immutable range\nvalues: 1 1\nvalue: 1\n48 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n49 0 0 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n51 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n52 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n53 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n54 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n55 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n56 zpos:\nflags: immutable range\nvalues: 2 2\nvalue: 2\n57 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n58 0 0 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001900000018000000\n06000000800000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfeff6300000000000000000000000000\n0300000000000001ffffff0100000000\n00000000000000000200000000000001\nffffff01000000000000000000000000\n0100000000000001ffffff0100000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n60 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n61 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n62 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n63 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n64 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n65 zpos:\nflags: immutable range\nvalues: 3 3\nvalue: 3\n66 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n67 0 0 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001900000018000000\n06000000800000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfeff6300000000000000000000000000\n0300000000000001ffffff0100000000\n00000000000000000200000000000001\nffffff01000000000000000000000000\n0100000000000001ffffff0100000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n69 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n70 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n71 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n72 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n73 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n74 zpos:\nflags: immutable range\nvalues: 4 4\nvalue: 4\n75 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n76 0 0 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001500000018000000\n06000000700000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfe3f0600000000000000000000000000\n0300000000000001ffff1f0000000000\n00000000000000000200000000000001\nffff1f00000000000000000000000000\n0100000000000001ffff1f0000000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n78 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n79 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n80 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n81 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n82 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n83 zpos:\nflags: immutable range\nvalues: 5 5\nvalue: 5\n84 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n85 0 0 0,0 0,0 0        0x00000001\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001500000018000000\n06000000700000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfe3f0600000000000000000000000000\n0300000000000001ffff1f0000000000\n00000000000000000200000000000001\nffff1f00000000000000000000000000\n0100000000000001ffff1f0000000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n87 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n88 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n89 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n90 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n91 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n92 zpos:\nflags: immutable range\nvalues: 6 6\nvalue: 6\n93 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n94 0 0 0,0 0,0 0        0x00000001\n  formats: AR24\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 2\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000000100000018000000\n01000000200000004152323400000000\n01000000000000000000000000000000\n0000000000000000\nin_formats blob decoded:\nAR24:  LINEAR\n96 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-180=0x4\nvalue: 1\n97 zpos:\nflags: immutable range\nvalues: 7 7\nvalue: 7\n100 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 1\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n102 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n103 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n104 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n105 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n106 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n107 zpos:\nflags: immutable range\nvalues: 0 0\nvalue: 0\n108 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n109 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n111 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n112 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n113 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n114 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n115 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n116 zpos:\nflags: immutable range\nvalues: 1 1\nvalue: 1\n117 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n118 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n120 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n121 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n122 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n123 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n124 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n125 zpos:\nflags: immutable range\nvalues: 2 2\nvalue: 2\n126 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n127 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001900000018000000\n06000000800000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfeff6300000000000000000000000000\n0300000000000001ffffff0100000000\n00000000000000000200000000000001\nffffff01000000000000000000000000\n0100000000000001ffffff0100000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n129 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n130 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n131 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n132 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n133 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n134 zpos:\nflags: immutable range\nvalues: 3 3\nvalue: 3\n135 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n136 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001900000018000000\n06000000800000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfeff6300000000000000000000000000\n0300000000000001ffffff0100000000\n00000000000000000200000000000001\nffffff01000000000000000000000000\n0100000000000001ffffff0100000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n138 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n139 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n140 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n141 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n142 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n143 zpos:\nflags: immutable range\nvalues: 4 4\nvalue: 4\n144 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n145 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001500000018000000\n06000000700000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfe3f0600000000000000000000000000\n0300000000000001ffff1f0000000000\n00000000000000000200000000000001\nffff1f00000000000000000000000000\n0100000000000001ffff1f0000000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n147 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n148 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n149 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n150 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n151 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n152 zpos:\nflags: immutable range\nvalues: 5 5\nvalue: 5\n153 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n154 0 0 0,0 0,0 0        0x00000002\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001500000018000000\n06000000700000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfe3f0600000000000000000000000000\n0300000000000001ffff1f0000000000\n00000000000000000200000000000001\nffff1f00000000000000000000000000\n0100000000000001ffff1f0000000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n156 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n157 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n158 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n159 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n160 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n161 zpos:\nflags: immutable range\nvalues: 6 6\nvalue: 6\n162 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n163 0 0 0,0 0,0 0        0x00000002\n  formats: AR24\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 2\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000000100000018000000\n01000000200000004152323400000000\n01000000000000000000000000000000\n0000000000000000\nin_formats blob decoded:\nAR24:  LINEAR\n165 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-180=0x4\nvalue: 1\n166 zpos:\nflags: immutable range\nvalues: 7 7\nvalue: 7\n169 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 1\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n171 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n172 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n173 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n174 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n175 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n176 zpos:\nflags: immutable range\nvalues: 0 0\nvalue: 0\n177 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n178 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n180 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n181 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n182 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n183 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n184 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n185 zpos:\nflags: immutable range\nvalues: 1 1\nvalue: 1\n186 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n187 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 XR4H XB4H\nAR4H AB4H YUYV YVYU UYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV\nXV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001d00000018000000\n06000000900000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n58523448584234484152344841423448\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfec33f06000000000000000000000000\n0300000000000001ffffff1f00000000\n00000000000000000200000000000001\nffffff1f000000000000000000000000\n0100000000000001ffffff1f00000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB4H:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n189 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n190 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n191 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n192 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n193 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n194 zpos:\nflags: immutable range\nvalues: 2 2\nvalue: 2\n195 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n196 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001900000018000000\n06000000800000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfeff6300000000000000000000000000\n0300000000000001ffffff0100000000\n00000000000000000200000000000001\nffffff01000000000000000000000000\n0100000000000001ffffff0100000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n198 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n199 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n200 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n201 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n202 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n203 zpos:\nflags: immutable range\nvalues: 3 3\nvalue: 3\n204 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n205 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY NV12 P010 P012 P016 Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001900000018000000\n06000000800000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n4e563132503031305030313250303136\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfeff6300000000000000000000000000\n0300000000000001ffffff0100000000\n00000000000000000200000000000001\nffffff01000000000000000000000000\n0100000000000001ffffff0100000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nNV12:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP010:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP012:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nP016:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n207 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n208 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n209 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n210 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n211 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n212 zpos:\nflags: immutable range\nvalues: 4 4\nvalue: 4\n213 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n214 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001500000018000000\n06000000700000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfe3f0600000000000000000000000000\n0300000000000001ffff1f0000000000\n00000000000000000200000000000001\nffff1f00000000000000000000000000\n0100000000000001ffff1f0000000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n216 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n217 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n218 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n219 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n220 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n221 zpos:\nflags: immutable range\nvalues: 5 5\nvalue: 5\n222 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n223 0 0 0,0 0,0 0        0x00000004\n  formats: C8   RG16 XR24 XB24 AR24 AB24 XR30 XB30 AR30 AB30 YUYV YVYU\nUYVY VYUY Y210 Y212 Y216 XYUV XV30 XV36 XV48\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 0\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000001500000018000000\n06000000700000004338202052473136\n58523234584232344152323441423234\n58523330584233304152333041423330\n59555956595659555559565956595559\n59323130593231325932313658595556\n58563330585633365856343800000000\n3c000000000000000000000000000000\n05000000000000013c00000000000000\n00000000000000000400000000000001\nfe3f0600000000000000000000000000\n0300000000000001ffff1f0000000000\n00000000000000000200000000000001\nffff1f00000000000000000000000000\n0100000000000001ffff1f0000000000\n00000000000000000000000000000000\nin_formats blob decoded:\nC8  :  INTEL_Y_TILED INTEL_X_TILED LINEAR\nRG16:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAR24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nAB24:  INTEL_Yf_TILED_CCS INTEL_Y_TILED_CCS INTEL_Yf_TILED\nINTEL_Y_TILED INTEL_X_TILED LINEAR\nXR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAR30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nAB30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYUYV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nYVYU:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nUYVY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nVYUY:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nY210:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY212:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nY216:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXYUV:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV30:  INTEL_Yf_TILED INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV36:  INTEL_Y_TILED INTEL_X_TILED LINEAR\nXV48:  INTEL_Y_TILED INTEL_X_TILED LINEAR\n225 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-90=0x2 rotate-180=0x4 rotate-270=0x8 reflect-x=0x10\nvalue: 1\n226 COLOR_ENCODING:\nflags: enum\nenums: ITU-R BT.601 YCbCr=0 ITU-R BT.709 YCbCr=1 ITU-R BT.2020 YCbCr=2\nvalue: 1\n227 COLOR_RANGE:\nflags: enum\nenums: YCbCr limited range=0 YCbCr full range=1\nvalue: 0\n228 alpha:\nflags: range\nvalues: 0 65535\nvalue: 65535\n229 pixel blend mode:\nflags: enum\nenums: None=2 Pre-multiplied=0 Coverage=1\nvalue: 0\n230 zpos:\nflags: immutable range\nvalues: 6 6\nvalue: 6\n231 SCALING_FILTER:\nflags: enum\nenums: Default=0 Nearest Neighbor=1\nvalue: 0\n232 0 0 0,0 0,0 0        0x00000004\n  formats: AR24\n  props:\n8 type:\nflags: immutable enum\nenums: Overlay=0 Primary=1 Cursor=2\nvalue: 2\n30 IN_FORMATS:\nflags: immutable blob\nblobs:\n\nvalue:\n01000000000000000100000018000000\n01000000200000004152323400000000\n01000000000000000000000000000000\n0000000000000000\nin_formats blob decoded:\nAR24:  LINEAR\n234 rotation:\nflags: bitmask\nvalues: rotate-0=0x1 rotate-180=0x4\nvalue: 1\n235 zpos:\nflags: immutable range\nvalues: 7 7\nvalue: 7\n\nFrame buffers:\nid size pitch\n\nIs mise le meas/Regards,\n\nEric Curtin\n\n\n\nOn Wed, 1 Dec 2021 at 18:31, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi Eric,\n>\n> On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > Hi Laurent,\n> >\n> > Thanks for welcoming me.\n> >\n> > Another suggested solution would be welcome, let me describe\n> > what happens, it's been reproduced on multiple machines.\n> >\n> > So here the the CRTCs output of modetest on my machine:\n> >\n> > CRTCs:\n> > id      fb      pos     size\n> > 98      256     (0,0)   (1920x1080)\n> >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > flags: nhsync, nvsync; type: preferred, driver\n> > ...\n> > 167     0       (0,0)   (0x0)\n> >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > ...\n> > 236     0       (0,0)   (0x0)\n> >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> >\n> > So these lines are executed 3 times:\n> >\n> > if (plane->supportsFormat(format)) {\n> >     crtc_ = crtc;\n> >\n> > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > 236, break out of loop.\n> >\n> > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > display anything on my machine but 98 does.\n>\n> The issue isn't so much the selected CRTC I believe, but the selected\n> connector (of course the CRTC plays a role there). Could you share the\n> full DRM device topology (CRTCs, encoders, connectors) ?\n>\n> > A alternative to fix this would be apprecitaion!\n> >\n> > I run like this:\n> >\n> > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> >\n> > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > >\n> > > Hi Eric,\n> > >\n> > > Thank you for the patch, and welcome to libcamera.\n> > >\n> > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > actually the first one. This can be identified by checking if the clock\n> > > > variable is non-zero.\n> > > >\n> > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > ---\n> > > >  src/cam/drm.cpp      | 2 +-\n> > > >  src/cam/drm.h        | 2 ++\n> > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > >\n> > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > index f2530091..808e5a87 100644\n> > > > --- a/src/cam/drm.cpp\n> > > > +++ b/src/cam/drm.cpp\n> > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > >  }\n> > > >\n> > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > >  {\n> > > >  }\n> > > >\n> > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > index de57e445..d05e6d13 100644\n> > > > --- a/src/cam/drm.h\n> > > > +++ b/src/cam/drm.h\n> > > > @@ -149,12 +149,14 @@ public:\n> > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > >\n> > > >       unsigned int index() const { return index_; }\n> > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > >\n> > > >  private:\n> > > >       friend Device;\n> > > >\n> > > >       unsigned int index_;\n> > > > +     const drmModeCrtc *crtc_;\n> > > >       std::vector<const Plane *> planes_;\n> > > >  };\n> > > >\n> > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > index d30fba78..aa0b7a3c 100644\n> > > > --- a/src/cam/kms_sink.cpp\n> > > > +++ b/src/cam/kms_sink.cpp\n> > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > >        */\n> > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > +                     if (!crtc->clock()) {\n> > > > +                             continue;\n> > > > +                     }\n> > >\n> > > I don't think this is quite right. When the Crtc instance is created,\n> > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > is not enabled when the cam application is started will thus be skipped,\n> > > even if it can be used.\n> > >\n> > > On a side note, no need for curly braces.\n> > >\n> > > > +\n> > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > >                                       continue;\n> > >\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5D873BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 18:43:20 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 91DC860830;\n\tWed,  1 Dec 2021 19:43:19 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 67DA5607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 19:43:18 +0100 (CET)","from mail-oi1-f197.google.com (mail-oi1-f197.google.com\n\t[209.85.167.197]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\tus-mta-239-_0dEuvDCPF-9f3KUZfvXuQ-1; Wed, 01 Dec 2021 13:43:15 -0500","by mail-oi1-f197.google.com with SMTP id\n\tr15-20020acaa80f000000b002bcc50ca40dso16860461oie.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 01 Dec 2021 10:43:15 -0800 (PST)"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"CKvnEB4T\"; dkim-atps=neutral","relay.mimecast.com;\n\tauth=pass smtp.auth=CUSA124A263 smtp.mailfrom=ecurtin@redhat.com"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1638384197;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=NFPEOCozLT9ZzD5ivw1OVis21miZsFWdj/vwJTKkivo=;\n\tb=CKvnEB4Ta3VZfbH/iQtDF4cbA9gAs1uCycmx5MdCueyf0Q8tRiJsSq7w7ifIIMx3KiOxTW\n\t2pdjrHyKo9PAy08kLno5qyAnQypqz0oq2K0Xz/iPFr5Xeck3ocH/Ex/cUVvN7l9HG2oNMG\n\tzKLHWpikk8Z80kBtzS0D02/61qNODYM=","X-MC-Unique":"_0dEuvDCPF-9f3KUZfvXuQ-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=NFPEOCozLT9ZzD5ivw1OVis21miZsFWdj/vwJTKkivo=;\n\tb=QCuPdqJBMaVTOKmPibce21Grrj4eZ16cnGCU100qUecs6RIZusnKhlV7q+LsBlfpcW\n\tQasdsRrZ5pdgWH++sZyU55tzfS4bXD4HM5V43aib3cGcgmhTLnrPWT3sFrhU9qR4QLGF\n\tgEg7e60pL8DSoh1WeDsgCK82SmHmTkhT+KS3e6ERFbvxHDvYG10hq2Ayik8gntzT4d0S\n\tSlsxtPmnaAieiDbF7aNfIe/WMOVwyetbKe3flHnNSZkr3lcIHasoWqbb1r9iyaYeHg7c\n\tAd4pEWk2gWlFAobE/utsfOFi7Sz8pl3Y2nzW+XBKKF5+/kSnP8DarSXd6s1Znmxuj0lt\n\tTjjg==","X-Gm-Message-State":"AOAM533P9EcdYea6fw2NtPWcbZJO8uYC6y94ESljhhWdQi7ujQRmvwcX\n\tpi3HajWpgN/dp7sJUWluNUYopG4AeOHqEPgq3EKI86/jE2U+FC1qsxzXNjmzptQTVxTAgSsXWoP\n\tVi5VLHTMtnUBu37zyd0d5qGUgPx3tUK/afGdg1rU5H044p5Fz5w==","X-Received":["by 2002:a54:4381:: with SMTP id u1mr7870281oiv.70.1638384194174; \n\tWed, 01 Dec 2021 10:43:14 -0800 (PST)","by 2002:a54:4381:: with SMTP id u1mr7870217oiv.70.1638384193523; \n\tWed, 01 Dec 2021 10:43:13 -0800 (PST)"],"X-Google-Smtp-Source":"ABdhPJyX9Pt7L+VSsLG2/BLATHq/LYowekUl8noLbueiXwkVKryC/UiWnZNhe+oXiuzUzOjAGDhLi3ySXkGNs+e55dY=","MIME-Version":"1.0","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>","In-Reply-To":"<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>","From":"Eric Curtin <ecurtin@redhat.com>","Date":"Wed, 1 Dec 2021 18:43:02 +0000","Message-ID":"<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21537,"web_url":"https://patchwork.libcamera.org/comment/21537/","msgid":"<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>","date":"2021-12-01T18:55:10","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Eric,\n\nOn Wed, Dec 01, 2021 at 06:43:02PM +0000, Eric Curtin wrote:\n> $ sudo modetest\n> trying to open device 'i915'...done\n> Encoders:\n> id crtc type possible crtcs possible clones\n> 238 98 TMDS 0x00000007 0x00000001\n> 246 0 TMDS 0x00000007 0x00000002\n> \n> Connectors:\n> id encoder status name size (mm) modes encoders\n> 239 238 connected eDP-1          340x190 1 238\n>   modes:\n> index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n>   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> flags: nhsync, nvsync; type: preferred, driver\n\n[snip] (no other connector)\n\n> CRTCs:\n> id fb pos size\n> 98 259 (0,0) (1920x1080)\n>   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> flags: nhsync, nvsync; type: preferred, driver\n\n[snip]\n\n> 167 0 (0,0) (0x0)\n>   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n\n[snip]\n\n> 236 0 (0,0) (0x0)\n>   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n\n[snip]\n\nAccording to this, it should be possible to configure a pipeline using\nany CRTC to encoder 238 and connector 239 (eDP-1). I assume that's what\ncam is doing, picking CRTC 236.\n\nLet's first validate that this can actually work, can you get something\non the display when running\n\nmodetest -s 239@236:1920x1080\n\n(if I remember the syntax correctly)\n\n> On Wed, 1 Dec 2021 at 18:31, Laurent Pinchart wrote:\n> > On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > > Hi Laurent,\n> > >\n> > > Thanks for welcoming me.\n> > >\n> > > Another suggested solution would be welcome, let me describe\n> > > what happens, it's been reproduced on multiple machines.\n> > >\n> > > So here the the CRTCs output of modetest on my machine:\n> > >\n> > > CRTCs:\n> > > id      fb      pos     size\n> > > 98      256     (0,0)   (1920x1080)\n> > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > flags: nhsync, nvsync; type: preferred, driver\n> > > ...\n> > > 167     0       (0,0)   (0x0)\n> > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > ...\n> > > 236     0       (0,0)   (0x0)\n> > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > >\n> > > So these lines are executed 3 times:\n> > >\n> > > if (plane->supportsFormat(format)) {\n> > >     crtc_ = crtc;\n> > >\n> > > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > > 236, break out of loop.\n> > >\n> > > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > > display anything on my machine but 98 does.\n> >\n> > The issue isn't so much the selected CRTC I believe, but the selected\n> > connector (of course the CRTC plays a role there). Could you share the\n> > full DRM device topology (CRTCs, encoders, connectors) ?\n> >\n> > > A alternative to fix this would be apprecitaion!\n> > >\n> > > I run like this:\n> > >\n> > > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> > >\n> > > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > > >\n> > > > Hi Eric,\n> > > >\n> > > > Thank you for the patch, and welcome to libcamera.\n> > > >\n> > > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > > actually the first one. This can be identified by checking if the clock\n> > > > > variable is non-zero.\n> > > > >\n> > > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > > ---\n> > > > >  src/cam/drm.cpp      | 2 +-\n> > > > >  src/cam/drm.h        | 2 ++\n> > > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > > >\n> > > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > > index f2530091..808e5a87 100644\n> > > > > --- a/src/cam/drm.cpp\n> > > > > +++ b/src/cam/drm.cpp\n> > > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > > >  }\n> > > > >\n> > > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > > >  {\n> > > > >  }\n> > > > >\n> > > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > > index de57e445..d05e6d13 100644\n> > > > > --- a/src/cam/drm.h\n> > > > > +++ b/src/cam/drm.h\n> > > > > @@ -149,12 +149,14 @@ public:\n> > > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > > >\n> > > > >       unsigned int index() const { return index_; }\n> > > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > > >\n> > > > >  private:\n> > > > >       friend Device;\n> > > > >\n> > > > >       unsigned int index_;\n> > > > > +     const drmModeCrtc *crtc_;\n> > > > >       std::vector<const Plane *> planes_;\n> > > > >  };\n> > > > >\n> > > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > > index d30fba78..aa0b7a3c 100644\n> > > > > --- a/src/cam/kms_sink.cpp\n> > > > > +++ b/src/cam/kms_sink.cpp\n> > > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > > >        */\n> > > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > > +                     if (!crtc->clock()) {\n> > > > > +                             continue;\n> > > > > +                     }\n> > > >\n> > > > I don't think this is quite right. When the Crtc instance is created,\n> > > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > > is not enabled when the cam application is started will thus be skipped,\n> > > > even if it can be used.\n> > > >\n> > > > On a side note, no need for curly braces.\n> > > >\n> > > > > +\n> > > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > > >                                       continue;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 2114EBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 18:55:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7CC4160822;\n\tWed,  1 Dec 2021 19:55:37 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2572A607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 19:55:36 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8F88CA15;\n\tWed,  1 Dec 2021 19:55:35 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"df6vGV2s\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638384935;\n\tbh=1eNVRCepgp1dk8DsapAkRXlsHh1GUIF+UUFE4zsH0FA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=df6vGV2swpdegIiN9d3eE/CvbiY0ObRuE7bx9xipywJq8e/IpFWJ6d/pnqlK2gDpl\n\t9e6dGSbPxprmxFtWx5IxHYDkfls9Vhc0m7/xKLd6SVV/nBLkk0LNvXY0cPj3OZZY+Q\n\tZJBpKrDQIe+s91rlKG8RlcQ34qkvT6EoCUlEm/uU=","Date":"Wed, 1 Dec 2021 20:55:10 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Eric Curtin <ecurtin@redhat.com>","Message-ID":"<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>\n\t<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21538,"web_url":"https://patchwork.libcamera.org/comment/21538/","msgid":"<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>","date":"2021-12-01T19:05:15","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"Is mise le meas/Regards,\n\nEric Curtin\n\n\nOn Wed, 1 Dec 2021 at 18:55, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi Eric,\n>\n> On Wed, Dec 01, 2021 at 06:43:02PM +0000, Eric Curtin wrote:\n> > $ sudo modetest\n> > trying to open device 'i915'...done\n> > Encoders:\n> > id crtc type possible crtcs possible clones\n> > 238 98 TMDS 0x00000007 0x00000001\n> > 246 0 TMDS 0x00000007 0x00000002\n> >\n> > Connectors:\n> > id encoder status name size (mm) modes encoders\n> > 239 238 connected eDP-1          340x190 1 238\n> >   modes:\n> > index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n> >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > flags: nhsync, nvsync; type: preferred, driver\n>\n> [snip] (no other connector)\n>\n> > CRTCs:\n> > id fb pos size\n> > 98 259 (0,0) (1920x1080)\n> >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > flags: nhsync, nvsync; type: preferred, driver\n>\n> [snip]\n>\n> > 167 0 (0,0) (0x0)\n> >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n>\n> [snip]\n>\n> > 236 0 (0,0) (0x0)\n> >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n>\n> [snip]\n>\n> According to this, it should be possible to configure a pipeline using\n> any CRTC to encoder 238 and connector 239 (eDP-1). I assume that's what\n> cam is doing, picking CRTC 236.\n>\n> Let's first validate that this can actually work, can you get something\n> on the display when running\n>\n> modetest -s 239@236:1920x1080\n\nYup sure. This seems to work fine,\n\n$ sudo modetest -s 239@236:1920x1080\ntrying to open device 'i915'...done\nsetting mode 1920x1080-59.98Hz on connectors 239, crtc 23\n\n>\n> (if I remember the syntax correctly)\n>\n> > On Wed, 1 Dec 2021 at 18:31, Laurent Pinchart wrote:\n> > > On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > > > Hi Laurent,\n> > > >\n> > > > Thanks for welcoming me.\n> > > >\n> > > > Another suggested solution would be welcome, let me describe\n> > > > what happens, it's been reproduced on multiple machines.\n> > > >\n> > > > So here the the CRTCs output of modetest on my machine:\n> > > >\n> > > > CRTCs:\n> > > > id      fb      pos     size\n> > > > 98      256     (0,0)   (1920x1080)\n> > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > ...\n> > > > 167     0       (0,0)   (0x0)\n> > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > ...\n> > > > 236     0       (0,0)   (0x0)\n> > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > >\n> > > > So these lines are executed 3 times:\n> > > >\n> > > > if (plane->supportsFormat(format)) {\n> > > >     crtc_ = crtc;\n> > > >\n> > > > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > > > 236, break out of loop.\n> > > >\n> > > > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > > > display anything on my machine but 98 does.\n> > >\n> > > The issue isn't so much the selected CRTC I believe, but the selected\n> > > connector (of course the CRTC plays a role there). Could you share the\n> > > full DRM device topology (CRTCs, encoders, connectors) ?\n> > >\n> > > > A alternative to fix this would be apprecitaion!\n> > > >\n> > > > I run like this:\n> > > >\n> > > > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> > > >\n> > > > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > > > >\n> > > > > Hi Eric,\n> > > > >\n> > > > > Thank you for the patch, and welcome to libcamera.\n> > > > >\n> > > > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > > > actually the first one. This can be identified by checking if the clock\n> > > > > > variable is non-zero.\n> > > > > >\n> > > > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > > > ---\n> > > > > >  src/cam/drm.cpp      | 2 +-\n> > > > > >  src/cam/drm.h        | 2 ++\n> > > > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > > > >\n> > > > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > > > index f2530091..808e5a87 100644\n> > > > > > --- a/src/cam/drm.cpp\n> > > > > > +++ b/src/cam/drm.cpp\n> > > > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > > > >  }\n> > > > > >\n> > > > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > > > >  {\n> > > > > >  }\n> > > > > >\n> > > > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > > > index de57e445..d05e6d13 100644\n> > > > > > --- a/src/cam/drm.h\n> > > > > > +++ b/src/cam/drm.h\n> > > > > > @@ -149,12 +149,14 @@ public:\n> > > > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > > > >\n> > > > > >       unsigned int index() const { return index_; }\n> > > > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > > > >\n> > > > > >  private:\n> > > > > >       friend Device;\n> > > > > >\n> > > > > >       unsigned int index_;\n> > > > > > +     const drmModeCrtc *crtc_;\n> > > > > >       std::vector<const Plane *> planes_;\n> > > > > >  };\n> > > > > >\n> > > > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > > > index d30fba78..aa0b7a3c 100644\n> > > > > > --- a/src/cam/kms_sink.cpp\n> > > > > > +++ b/src/cam/kms_sink.cpp\n> > > > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > > > >        */\n> > > > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > > > +                     if (!crtc->clock()) {\n> > > > > > +                             continue;\n> > > > > > +                     }\n> > > > >\n> > > > > I don't think this is quite right. When the Crtc instance is created,\n> > > > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > > > is not enabled when the cam application is started will thus be skipped,\n> > > > > even if it can be used.\n> > > > >\n> > > > > On a side note, no need for curly braces.\n> > > > >\n> > > > > > +\n> > > > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > > > >                                       continue;\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 46BF6BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 19:05:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8A74360822;\n\tWed,  1 Dec 2021 20:05:31 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CDFED607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 20:05:29 +0100 (CET)","from mail-ot1-f72.google.com (mail-ot1-f72.google.com\n\t[209.85.210.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\tus-mta-149-Ve_SNrAUOfCM_AY1tm37QA-1; Wed, 01 Dec 2021 14:05:27 -0500","by mail-ot1-f72.google.com with SMTP id\n\tv13-20020a9d69cd000000b00563c36fd48cso13809760oto.4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 01 Dec 2021 11:05:27 -0800 (PST)"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"aSAfr9Y4\"; dkim-atps=neutral","relay.mimecast.com;\n\tauth=pass smtp.auth=CUSA124A263 smtp.mailfrom=ecurtin@redhat.com"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1638385528;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=lD4VWzIy90J1EvG6yM50oVYVfWLpunDwAH8aqQPzf74=;\n\tb=aSAfr9Y4P5cf3Vo34Stx+V0/LCpldjydvgU57Qlg3bpNQ2Obqu0fD0apTalExC9t3JuQY9\n\t1SH1vhQXtN7YjpPojNUm6DiOFggjlntqJJFwKWZlGTQL3StftPHhXTJWV3fz8UiRQ8QOYS\n\ttyCvqQFJJq7eXzm07scDXkT5OSOQelU=","X-MC-Unique":"Ve_SNrAUOfCM_AY1tm37QA-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=lD4VWzIy90J1EvG6yM50oVYVfWLpunDwAH8aqQPzf74=;\n\tb=15K1Po8iDPRGSd8Vb/24sQ/5wkslQLdiQX9I0X+0bCSwqa3OY+9rvGH5exjGUDVLqs\n\trJ+rHuUJsKvnV7U/ZeZn5VWlShH92jXeVUJrNC9XTL5ddT8oAHfZxW1HkU+9ISYIrEYF\n\tZXBSEu/6wOtC+UjymMPc2yODpnB+P1G9wVjNVlHYYsQoXR8gKYJEdb1hEjX30VJ9nZft\n\tKPbD1tabMzMXPc47FPaRJNKccPP8rdCGRlweve1oZwaBh7xcGIy+tRSlj52x7lEKJa1C\n\t4EthLBDtAVqSP4qko0iaxhzOzUkeXl/2gMsPbEakexALr5vW/hYxOaP3/PWz/z2FUS05\n\t8GIg==","X-Gm-Message-State":"AOAM531TsiQ5uJI3DYvv8XM6a5SSetu7QJV4pmToPnnvT5/A8+NNs7YF\n\tFTNl9n328eU9y2EUnImLHMN840QO1+8GzhRwKkrlmjWjhQ4Y8ixsTTYgcDGBQC0nqb+8pAgAMuW\n\t2dDkIyinA0LOZXA3DZSSyY5JXUp+L6o+w+rqrAdWL8ImosAfawg==","X-Received":["by 2002:a05:6808:221c:: with SMTP id\n\tbd28mr125783oib.56.1638385526343; \n\tWed, 01 Dec 2021 11:05:26 -0800 (PST)","by 2002:a05:6808:221c:: with SMTP id\n\tbd28mr125760oib.56.1638385526116; \n\tWed, 01 Dec 2021 11:05:26 -0800 (PST)"],"X-Google-Smtp-Source":"ABdhPJz69bVzDytzg2C9ypvzBTRcHoqPPnJ83xMreP9/IIwQ+RJtdDnA+LvJiT7eAXvRJb2fs9bzU56pyVyDFQRKYAo=","MIME-Version":"1.0","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>\n\t<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>\n\t<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>","In-Reply-To":"<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>","From":"Eric Curtin <ecurtin@redhat.com>","Date":"Wed, 1 Dec 2021 19:05:15 +0000","Message-ID":"<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21539,"web_url":"https://patchwork.libcamera.org/comment/21539/","msgid":"<YafN+cmGty+UdZC9@pendragon.ideasonboard.com>","date":"2021-12-01T19:33:13","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Eric,\n\nOn Wed, Dec 01, 2021 at 07:05:15PM +0000, Eric Curtin wrote:\n> On Wed, 1 Dec 2021 at 18:55, Laurent Pinchart wrote:\n> > On Wed, Dec 01, 2021 at 06:43:02PM +0000, Eric Curtin wrote:\n> > > $ sudo modetest\n> > > trying to open device 'i915'...done\n> > > Encoders:\n> > > id crtc type possible crtcs possible clones\n> > > 238 98 TMDS 0x00000007 0x00000001\n> > > 246 0 TMDS 0x00000007 0x00000002\n> > >\n> > > Connectors:\n> > > id encoder status name size (mm) modes encoders\n> > > 239 238 connected eDP-1          340x190 1 238\n> > >   modes:\n> > > index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n> > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > flags: nhsync, nvsync; type: preferred, driver\n> >\n> > [snip] (no other connector)\n> >\n> > > CRTCs:\n> > > id fb pos size\n> > > 98 259 (0,0) (1920x1080)\n> > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > flags: nhsync, nvsync; type: preferred, driver\n> >\n> > [snip]\n> >\n> > > 167 0 (0,0) (0x0)\n> > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> >\n> > [snip]\n> >\n> > > 236 0 (0,0) (0x0)\n> > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> >\n> > [snip]\n> >\n> > According to this, it should be possible to configure a pipeline using\n> > any CRTC to encoder 238 and connector 239 (eDP-1). I assume that's what\n> > cam is doing, picking CRTC 236.\n> >\n> > Let's first validate that this can actually work, can you get something\n> > on the display when running\n> >\n> > modetest -s 239@236:1920x1080\n> \n> Yup sure. This seems to work fine,\n> \n> $ sudo modetest -s 239@236:1920x1080\n> trying to open device 'i915'...done\n> setting mode 1920x1080-59.98Hz on connectors 239, crtc 23\n\nSo that configuration can work. The question now is why it doesn't work\nwith cam. It's a bit hard for me to debug that remotely. It may be a\nmatter of having to disable the CRTC that is already connected to the\nconnector.\n\nThis being said, we can also optimize the KMS sink in cam to pick a CRTC\nthat would reuse an existing CRTC -> encoder -> connector route when one\nis available. I think it would also solve (or work around) your problem.\n\nWould you like to give either option a try ?\n\n> > (if I remember the syntax correctly)\n> >\n> > > On Wed, 1 Dec 2021 at 18:31, Laurent Pinchart wrote:\n> > > > On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > > > > Hi Laurent,\n> > > > >\n> > > > > Thanks for welcoming me.\n> > > > >\n> > > > > Another suggested solution would be welcome, let me describe\n> > > > > what happens, it's been reproduced on multiple machines.\n> > > > >\n> > > > > So here the the CRTCs output of modetest on my machine:\n> > > > >\n> > > > > CRTCs:\n> > > > > id      fb      pos     size\n> > > > > 98      256     (0,0)   (1920x1080)\n> > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > > ...\n> > > > > 167     0       (0,0)   (0x0)\n> > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > ...\n> > > > > 236     0       (0,0)   (0x0)\n> > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > >\n> > > > > So these lines are executed 3 times:\n> > > > >\n> > > > > if (plane->supportsFormat(format)) {\n> > > > >     crtc_ = crtc;\n> > > > >\n> > > > > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > > > > 236, break out of loop.\n> > > > >\n> > > > > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > > > > display anything on my machine but 98 does.\n> > > >\n> > > > The issue isn't so much the selected CRTC I believe, but the selected\n> > > > connector (of course the CRTC plays a role there). Could you share the\n> > > > full DRM device topology (CRTCs, encoders, connectors) ?\n> > > >\n> > > > > A alternative to fix this would be apprecitaion!\n> > > > >\n> > > > > I run like this:\n> > > > >\n> > > > > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> > > > >\n> > > > > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > > > > >\n> > > > > > Hi Eric,\n> > > > > >\n> > > > > > Thank you for the patch, and welcome to libcamera.\n> > > > > >\n> > > > > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > > > > actually the first one. This can be identified by checking if the clock\n> > > > > > > variable is non-zero.\n> > > > > > >\n> > > > > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > > > > ---\n> > > > > > >  src/cam/drm.cpp      | 2 +-\n> > > > > > >  src/cam/drm.h        | 2 ++\n> > > > > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > > > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > > > > >\n> > > > > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > > > > index f2530091..808e5a87 100644\n> > > > > > > --- a/src/cam/drm.cpp\n> > > > > > > +++ b/src/cam/drm.cpp\n> > > > > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > > > > >  }\n> > > > > > >\n> > > > > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > > > > >  {\n> > > > > > >  }\n> > > > > > >\n> > > > > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > > > > index de57e445..d05e6d13 100644\n> > > > > > > --- a/src/cam/drm.h\n> > > > > > > +++ b/src/cam/drm.h\n> > > > > > > @@ -149,12 +149,14 @@ public:\n> > > > > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > > > > >\n> > > > > > >       unsigned int index() const { return index_; }\n> > > > > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > > > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > > > > >\n> > > > > > >  private:\n> > > > > > >       friend Device;\n> > > > > > >\n> > > > > > >       unsigned int index_;\n> > > > > > > +     const drmModeCrtc *crtc_;\n> > > > > > >       std::vector<const Plane *> planes_;\n> > > > > > >  };\n> > > > > > >\n> > > > > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > > > > index d30fba78..aa0b7a3c 100644\n> > > > > > > --- a/src/cam/kms_sink.cpp\n> > > > > > > +++ b/src/cam/kms_sink.cpp\n> > > > > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > > > > >        */\n> > > > > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > > > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > > > > +                     if (!crtc->clock()) {\n> > > > > > > +                             continue;\n> > > > > > > +                     }\n> > > > > >\n> > > > > > I don't think this is quite right. When the Crtc instance is created,\n> > > > > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > > > > is not enabled when the cam application is started will thus be skipped,\n> > > > > > even if it can be used.\n> > > > > >\n> > > > > > On a side note, no need for curly braces.\n> > > > > >\n> > > > > > > +\n> > > > > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > > > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > > > > >                                       continue;\n> >\n> > --\n> > Regards,\n> >\n> > Laurent Pinchart\n> >\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id ADAC3BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 19:33:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EC09D6082A;\n\tWed,  1 Dec 2021 20:33:40 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 938E4607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 20:33:39 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 134D68AE;\n\tWed,  1 Dec 2021 20:33:39 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ACGHxJA0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638387219;\n\tbh=bMpkxo6wEz987UaGID/4+GgiXT56bxD4V/6d/huLOx0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ACGHxJA0Ck383PHD8lLhMC2Eny/TBoZz7eZxCowihZy2LntOUTiPODg3hiVjDNpvi\n\tyk1NiPk5/mVot7/DxAQp/8PeEjxEH+/dA+jxqIFt80gyh6M/4mx5x+qhNG2dtwmPN2\n\twJdVTRmZt2n2OFb/6zZQaDcCUStAr5eXnrdN5+/o=","Date":"Wed, 1 Dec 2021 21:33:13 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Eric Curtin <ecurtin@redhat.com>","Message-ID":"<YafN+cmGty+UdZC9@pendragon.ideasonboard.com>","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>\n\t<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>\n\t<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>\n\t<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21540,"web_url":"https://patchwork.libcamera.org/comment/21540/","msgid":"<CAOgh=FzNM26pkdLgbZ+a84PQucXRQnNNMvj2uVCktMOALwyj+A@mail.gmail.com>","date":"2021-12-01T19:40:14","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"I can try tomorrow, it's getting closer to bedtime in Ireland.\n\nOne thing I don't understand about that for loop logic, is that it breaks\nout of the inner-most loop on a valid entry but keeps looping because\nof the outer loops. I don't understand why we keep looping.\n\nBehaving like this basically instead, would actually fix it for me even\nthough it may not be the best fix, it's also faster of course:\n\n  /*\n   * Find a CRTC and plane suitable for the request format and the\n   * connector at the end of the pipeline. Restrict the search to primary\n   * planes for now.\n   */\n  for (const DRM::Encoder* encoder : connector_->encoders()) {\n    for (const DRM::Crtc* crtc : encoder->possibleCrtcs()) {\n      for (const DRM::Plane* plane : crtc->planes()) {\n        if (plane->type() != DRM::Plane::TypePrimary)\n          continue;\n\n        if (plane->supportsFormat(format)) {\n          crtc_ = crtc;\n          plane_ = plane;\n          format_ = format;\n          goto break_all;\n        }\n\n        if (plane->supportsFormat(xFormat)) {\n          crtc_ = crtc;\n          plane_ = plane;\n          format_ = xFormat;\n          goto break_all;\n        }\n      }\n    }\n  }\n\nbreak_all:\n\nIs mise le meas/Regards,\n\nEric Curtin\n\nOn Wed, 1 Dec 2021 at 19:33, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi Eric,\n>\n> On Wed, Dec 01, 2021 at 07:05:15PM +0000, Eric Curtin wrote:\n> > On Wed, 1 Dec 2021 at 18:55, Laurent Pinchart wrote:\n> > > On Wed, Dec 01, 2021 at 06:43:02PM +0000, Eric Curtin wrote:\n> > > > $ sudo modetest\n> > > > trying to open device 'i915'...done\n> > > > Encoders:\n> > > > id crtc type possible crtcs possible clones\n> > > > 238 98 TMDS 0x00000007 0x00000001\n> > > > 246 0 TMDS 0x00000007 0x00000002\n> > > >\n> > > > Connectors:\n> > > > id encoder status name size (mm) modes encoders\n> > > > 239 238 connected eDP-1          340x190 1 238\n> > > >   modes:\n> > > > index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n> > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > flags: nhsync, nvsync; type: preferred, driver\n> > >\n> > > [snip] (no other connector)\n> > >\n> > > > CRTCs:\n> > > > id fb pos size\n> > > > 98 259 (0,0) (1920x1080)\n> > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > flags: nhsync, nvsync; type: preferred, driver\n> > >\n> > > [snip]\n> > >\n> > > > 167 0 (0,0) (0x0)\n> > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > >\n> > > [snip]\n> > >\n> > > > 236 0 (0,0) (0x0)\n> > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > >\n> > > [snip]\n> > >\n> > > According to this, it should be possible to configure a pipeline using\n> > > any CRTC to encoder 238 and connector 239 (eDP-1). I assume that's what\n> > > cam is doing, picking CRTC 236.\n> > >\n> > > Let's first validate that this can actually work, can you get something\n> > > on the display when running\n> > >\n> > > modetest -s 239@236:1920x1080\n> >\n> > Yup sure. This seems to work fine,\n> >\n> > $ sudo modetest -s 239@236:1920x1080\n> > trying to open device 'i915'...done\n> > setting mode 1920x1080-59.98Hz on connectors 239, crtc 23\n>\n> So that configuration can work. The question now is why it doesn't work\n> with cam. It's a bit hard for me to debug that remotely. It may be a\n> matter of having to disable the CRTC that is already connected to the\n> connector.\n>\n> This being said, we can also optimize the KMS sink in cam to pick a CRTC\n> that would reuse an existing CRTC -> encoder -> connector route when one\n> is available. I think it would also solve (or work around) your problem.\n>\n> Would you like to give either option a try ?\n>\n> > > (if I remember the syntax correctly)\n> > >\n> > > > On Wed, 1 Dec 2021 at 18:31, Laurent Pinchart wrote:\n> > > > > On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > > > > > Hi Laurent,\n> > > > > >\n> > > > > > Thanks for welcoming me.\n> > > > > >\n> > > > > > Another suggested solution would be welcome, let me describe\n> > > > > > what happens, it's been reproduced on multiple machines.\n> > > > > >\n> > > > > > So here the the CRTCs output of modetest on my machine:\n> > > > > >\n> > > > > > CRTCs:\n> > > > > > id      fb      pos     size\n> > > > > > 98      256     (0,0)   (1920x1080)\n> > > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > > > ...\n> > > > > > 167     0       (0,0)   (0x0)\n> > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > > ...\n> > > > > > 236     0       (0,0)   (0x0)\n> > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > >\n> > > > > > So these lines are executed 3 times:\n> > > > > >\n> > > > > > if (plane->supportsFormat(format)) {\n> > > > > >     crtc_ = crtc;\n> > > > > >\n> > > > > > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > > > > > 236, break out of loop.\n> > > > > >\n> > > > > > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > > > > > display anything on my machine but 98 does.\n> > > > >\n> > > > > The issue isn't so much the selected CRTC I believe, but the selected\n> > > > > connector (of course the CRTC plays a role there). Could you share the\n> > > > > full DRM device topology (CRTCs, encoders, connectors) ?\n> > > > >\n> > > > > > A alternative to fix this would be apprecitaion!\n> > > > > >\n> > > > > > I run like this:\n> > > > > >\n> > > > > > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> > > > > >\n> > > > > > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > > > > > >\n> > > > > > > Hi Eric,\n> > > > > > >\n> > > > > > > Thank you for the patch, and welcome to libcamera.\n> > > > > > >\n> > > > > > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > > > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > > > > > actually the first one. This can be identified by checking if the clock\n> > > > > > > > variable is non-zero.\n> > > > > > > >\n> > > > > > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > > > > > ---\n> > > > > > > >  src/cam/drm.cpp      | 2 +-\n> > > > > > > >  src/cam/drm.h        | 2 ++\n> > > > > > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > > > > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > > > > > >\n> > > > > > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > > > > > index f2530091..808e5a87 100644\n> > > > > > > > --- a/src/cam/drm.cpp\n> > > > > > > > +++ b/src/cam/drm.cpp\n> > > > > > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > > > > > >  }\n> > > > > > > >\n> > > > > > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > > > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > > > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > > > > > >  {\n> > > > > > > >  }\n> > > > > > > >\n> > > > > > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > > > > > index de57e445..d05e6d13 100644\n> > > > > > > > --- a/src/cam/drm.h\n> > > > > > > > +++ b/src/cam/drm.h\n> > > > > > > > @@ -149,12 +149,14 @@ public:\n> > > > > > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > > > > > >\n> > > > > > > >       unsigned int index() const { return index_; }\n> > > > > > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > > > > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > > > > > >\n> > > > > > > >  private:\n> > > > > > > >       friend Device;\n> > > > > > > >\n> > > > > > > >       unsigned int index_;\n> > > > > > > > +     const drmModeCrtc *crtc_;\n> > > > > > > >       std::vector<const Plane *> planes_;\n> > > > > > > >  };\n> > > > > > > >\n> > > > > > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > > > > > index d30fba78..aa0b7a3c 100644\n> > > > > > > > --- a/src/cam/kms_sink.cpp\n> > > > > > > > +++ b/src/cam/kms_sink.cpp\n> > > > > > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > > > > > >        */\n> > > > > > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > > > > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > > > > > +                     if (!crtc->clock()) {\n> > > > > > > > +                             continue;\n> > > > > > > > +                     }\n> > > > > > >\n> > > > > > > I don't think this is quite right. When the Crtc instance is created,\n> > > > > > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > > > > > is not enabled when the cam application is started will thus be skipped,\n> > > > > > > even if it can be used.\n> > > > > > >\n> > > > > > > On a side note, no need for curly braces.\n> > > > > > >\n> > > > > > > > +\n> > > > > > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > > > > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > > > > > >                                       continue;\n> > >\n> > > --\n> > > Regards,\n> > >\n> > > Laurent Pinchart\n> > >\n> >\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id A4309BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 19:40:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EDC5960830;\n\tWed,  1 Dec 2021 20:40:30 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 443B4607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 20:40:29 +0100 (CET)","from mail-ot1-f71.google.com (mail-ot1-f71.google.com\n\t[209.85.210.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\tus-mta-456-JqR4SbB6NYOiB5cN3ufDMw-1; Wed, 01 Dec 2021 14:40:26 -0500","by mail-ot1-f71.google.com with SMTP id\n\th34-20020a9d2f25000000b00579e86a64dfso12996592otb.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 01 Dec 2021 11:40:26 -0800 (PST)"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"ShJzlk8e\"; dkim-atps=neutral","relay.mimecast.com;\n\tauth=pass smtp.auth=CUSA124A263 smtp.mailfrom=ecurtin@redhat.com"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1638387627;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=YEiqmwU8svYoEP0JIdpYJ+42YDk6ILbsuU24yYdb2hQ=;\n\tb=ShJzlk8eVZ/LNMiWsYhIuNHJjzjuzfCyKDEr34X+o5Hl+4gFoAVr5dw01lGDmqs2TnoVHM\n\tgdj6aVPYbnDg2leDY2R6aRKj0RFxgL/rLX9fa0FxtbK+qlieWqAam9EoMsvFJr3qRnYpId\n\tYMb4sBYWhx0F/t9cEJfSiNT+4k24K9k=","X-MC-Unique":"JqR4SbB6NYOiB5cN3ufDMw-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=YEiqmwU8svYoEP0JIdpYJ+42YDk6ILbsuU24yYdb2hQ=;\n\tb=tTy9IYNQaXRJHgppylcvNTSE/xSqB3IF3bs/khQIyBZ+8nUiInlcSptFDItdh+xnK5\n\tZn93JJ/FTeJWfme1N2TmvCwMR0P6Pp+kahxM8cfPhfvgQPjhZZX014/rgj7XJxE9ZCWP\n\tWwbT2PeRFmvrbrvP9Sz7kthvIrBifjCvfd1ExFL3NKWPRmg1AedFdD0ViEQ+5VpNwIvG\n\tPzoW/6oUXpAUmvvsqIMvuSSn5tRrii/XkBxKZFOVEHO5ZFtQ5DB+yvz8w9Fr9e3//i0i\n\tlHvkMCwKzhnr1SIPNdV9OrAZoGjZ5Gk/wE8xQ2kTOkb7l66qlnjp+/H960QLwB5Le3Gf\n\tbd9A==","X-Gm-Message-State":"AOAM532iCVuQ5Lj4mV5qAnhLWeL1A8fufmnfL8sFTHNadWpUIq0t3gy5\n\tOyusOy9w3LVUFLKgSdFNB7UyKUSgWf+Huh+zG0ou6JdDMOh26mAKbHkL+DGtItIpXNUWd80WvgJ\n\tuGvV5MBIc4tiOzktuQpFOFiuIgIQwgfEpTCD+af2tSGz3Y2dPkQ==","X-Received":["by 2002:a54:4381:: with SMTP id u1mr278658oiv.70.1638387625703; \n\tWed, 01 Dec 2021 11:40:25 -0800 (PST)","by 2002:a54:4381:: with SMTP id u1mr278620oiv.70.1638387625429; \n\tWed, 01 Dec 2021 11:40:25 -0800 (PST)"],"X-Google-Smtp-Source":"ABdhPJwvNTlQZffUvJxqtm24ahUPqRkjEkGI2QkfDQKlHBotnJ4noS25U37Q4YSRYw1MslMrDQDwaR6KyXSNjk5c3/c=","MIME-Version":"1.0","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>\n\t<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>\n\t<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>\n\t<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>\n\t<YafN+cmGty+UdZC9@pendragon.ideasonboard.com>","In-Reply-To":"<YafN+cmGty+UdZC9@pendragon.ideasonboard.com>","From":"Eric Curtin <ecurtin@redhat.com>","Date":"Wed, 1 Dec 2021 19:40:14 +0000","Message-ID":"<CAOgh=FzNM26pkdLgbZ+a84PQucXRQnNNMvj2uVCktMOALwyj+A@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21541,"web_url":"https://patchwork.libcamera.org/comment/21541/","msgid":"<CAOgh=FxVS=3G_HqSPMcD8bNaWACspVCCAVW+k=fUAqSDJe235Q@mail.gmail.com>","date":"2021-12-01T20:18:10","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"That was the old logic with the \"return 0\"'s before commit\n\n1de0f90dd43200b0f101b8c732c35c2669d027ad\n\nexit the loop instantly once one of these conditions are met.\n\nMind if I send a patch to change to the goto logic in the last email?\n\nThat way we exit the loop early like before and we still have the\n\n\"Using KMS plane \"\n\ncout printed.\n\nIs mise le meas/Regards,\n\nEric Curtin\n\nOn Wed, 1 Dec 2021 at 19:40, Eric Curtin <ecurtin@redhat.com> wrote:\n>\n> I can try tomorrow, it's getting closer to bedtime in Ireland.\n>\n> One thing I don't understand about that for loop logic, is that it breaks\n> out of the inner-most loop on a valid entry but keeps looping because\n> of the outer loops. I don't understand why we keep looping.\n>\n> Behaving like this basically instead, would actually fix it for me even\n> though it may not be the best fix, it's also faster of course:\n>\n>   /*\n>    * Find a CRTC and plane suitable for the request format and the\n>    * connector at the end of the pipeline. Restrict the search to primary\n>    * planes for now.\n>    */\n>   for (const DRM::Encoder* encoder : connector_->encoders()) {\n>     for (const DRM::Crtc* crtc : encoder->possibleCrtcs()) {\n>       for (const DRM::Plane* plane : crtc->planes()) {\n>         if (plane->type() != DRM::Plane::TypePrimary)\n>           continue;\n>\n>         if (plane->supportsFormat(format)) {\n>           crtc_ = crtc;\n>           plane_ = plane;\n>           format_ = format;\n>           goto break_all;\n>         }\n>\n>         if (plane->supportsFormat(xFormat)) {\n>           crtc_ = crtc;\n>           plane_ = plane;\n>           format_ = xFormat;\n>           goto break_all;\n>         }\n>       }\n>     }\n>   }\n>\n> break_all:\n>\n> Is mise le meas/Regards,\n>\n> Eric Curtin\n>\n> On Wed, 1 Dec 2021 at 19:33, Laurent Pinchart\n> <laurent.pinchart@ideasonboard.com> wrote:\n> >\n> > Hi Eric,\n> >\n> > On Wed, Dec 01, 2021 at 07:05:15PM +0000, Eric Curtin wrote:\n> > > On Wed, 1 Dec 2021 at 18:55, Laurent Pinchart wrote:\n> > > > On Wed, Dec 01, 2021 at 06:43:02PM +0000, Eric Curtin wrote:\n> > > > > $ sudo modetest\n> > > > > trying to open device 'i915'...done\n> > > > > Encoders:\n> > > > > id crtc type possible crtcs possible clones\n> > > > > 238 98 TMDS 0x00000007 0x00000001\n> > > > > 246 0 TMDS 0x00000007 0x00000002\n> > > > >\n> > > > > Connectors:\n> > > > > id encoder status name size (mm) modes encoders\n> > > > > 239 238 connected eDP-1          340x190 1 238\n> > > > >   modes:\n> > > > > index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n> > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > >\n> > > > [snip] (no other connector)\n> > > >\n> > > > > CRTCs:\n> > > > > id fb pos size\n> > > > > 98 259 (0,0) (1920x1080)\n> > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > >\n> > > > [snip]\n> > > >\n> > > > > 167 0 (0,0) (0x0)\n> > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > >\n> > > > [snip]\n> > > >\n> > > > > 236 0 (0,0) (0x0)\n> > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > >\n> > > > [snip]\n> > > >\n> > > > According to this, it should be possible to configure a pipeline using\n> > > > any CRTC to encoder 238 and connector 239 (eDP-1). I assume that's what\n> > > > cam is doing, picking CRTC 236.\n> > > >\n> > > > Let's first validate that this can actually work, can you get something\n> > > > on the display when running\n> > > >\n> > > > modetest -s 239@236:1920x1080\n> > >\n> > > Yup sure. This seems to work fine,\n> > >\n> > > $ sudo modetest -s 239@236:1920x1080\n> > > trying to open device 'i915'...done\n> > > setting mode 1920x1080-59.98Hz on connectors 239, crtc 23\n> >\n> > So that configuration can work. The question now is why it doesn't work\n> > with cam. It's a bit hard for me to debug that remotely. It may be a\n> > matter of having to disable the CRTC that is already connected to the\n> > connector.\n> >\n> > This being said, we can also optimize the KMS sink in cam to pick a CRTC\n> > that would reuse an existing CRTC -> encoder -> connector route when one\n> > is available. I think it would also solve (or work around) your problem.\n> >\n> > Would you like to give either option a try ?\n> >\n> > > > (if I remember the syntax correctly)\n> > > >\n> > > > > On Wed, 1 Dec 2021 at 18:31, Laurent Pinchart wrote:\n> > > > > > On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > > > > > > Hi Laurent,\n> > > > > > >\n> > > > > > > Thanks for welcoming me.\n> > > > > > >\n> > > > > > > Another suggested solution would be welcome, let me describe\n> > > > > > > what happens, it's been reproduced on multiple machines.\n> > > > > > >\n> > > > > > > So here the the CRTCs output of modetest on my machine:\n> > > > > > >\n> > > > > > > CRTCs:\n> > > > > > > id      fb      pos     size\n> > > > > > > 98      256     (0,0)   (1920x1080)\n> > > > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > > > > ...\n> > > > > > > 167     0       (0,0)   (0x0)\n> > > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > > > ...\n> > > > > > > 236     0       (0,0)   (0x0)\n> > > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > > >\n> > > > > > > So these lines are executed 3 times:\n> > > > > > >\n> > > > > > > if (plane->supportsFormat(format)) {\n> > > > > > >     crtc_ = crtc;\n> > > > > > >\n> > > > > > > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > > > > > > 236, break out of loop.\n> > > > > > >\n> > > > > > > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > > > > > > display anything on my machine but 98 does.\n> > > > > >\n> > > > > > The issue isn't so much the selected CRTC I believe, but the selected\n> > > > > > connector (of course the CRTC plays a role there). Could you share the\n> > > > > > full DRM device topology (CRTCs, encoders, connectors) ?\n> > > > > >\n> > > > > > > A alternative to fix this would be apprecitaion!\n> > > > > > >\n> > > > > > > I run like this:\n> > > > > > >\n> > > > > > > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> > > > > > >\n> > > > > > > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > > > > > > >\n> > > > > > > > Hi Eric,\n> > > > > > > >\n> > > > > > > > Thank you for the patch, and welcome to libcamera.\n> > > > > > > >\n> > > > > > > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > > > > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > > > > > > actually the first one. This can be identified by checking if the clock\n> > > > > > > > > variable is non-zero.\n> > > > > > > > >\n> > > > > > > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > > > > > > ---\n> > > > > > > > >  src/cam/drm.cpp      | 2 +-\n> > > > > > > > >  src/cam/drm.h        | 2 ++\n> > > > > > > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > > > > > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > > > > > > >\n> > > > > > > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > > > > > > index f2530091..808e5a87 100644\n> > > > > > > > > --- a/src/cam/drm.cpp\n> > > > > > > > > +++ b/src/cam/drm.cpp\n> > > > > > > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > > > > > > >  }\n> > > > > > > > >\n> > > > > > > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > > > > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > > > > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > > > > > > >  {\n> > > > > > > > >  }\n> > > > > > > > >\n> > > > > > > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > > > > > > index de57e445..d05e6d13 100644\n> > > > > > > > > --- a/src/cam/drm.h\n> > > > > > > > > +++ b/src/cam/drm.h\n> > > > > > > > > @@ -149,12 +149,14 @@ public:\n> > > > > > > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > > > > > > >\n> > > > > > > > >       unsigned int index() const { return index_; }\n> > > > > > > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > > > > > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > > > > > > >\n> > > > > > > > >  private:\n> > > > > > > > >       friend Device;\n> > > > > > > > >\n> > > > > > > > >       unsigned int index_;\n> > > > > > > > > +     const drmModeCrtc *crtc_;\n> > > > > > > > >       std::vector<const Plane *> planes_;\n> > > > > > > > >  };\n> > > > > > > > >\n> > > > > > > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > > > > > > index d30fba78..aa0b7a3c 100644\n> > > > > > > > > --- a/src/cam/kms_sink.cpp\n> > > > > > > > > +++ b/src/cam/kms_sink.cpp\n> > > > > > > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > > > > > > >        */\n> > > > > > > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > > > > > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > > > > > > +                     if (!crtc->clock()) {\n> > > > > > > > > +                             continue;\n> > > > > > > > > +                     }\n> > > > > > > >\n> > > > > > > > I don't think this is quite right. When the Crtc instance is created,\n> > > > > > > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > > > > > > is not enabled when the cam application is started will thus be skipped,\n> > > > > > > > even if it can be used.\n> > > > > > > >\n> > > > > > > > On a side note, no need for curly braces.\n> > > > > > > >\n> > > > > > > > > +\n> > > > > > > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > > > > > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > > > > > > >                                       continue;\n> > > >\n> > > > --\n> > > > Regards,\n> > > >\n> > > > Laurent Pinchart\n> > > >\n> > >\n> >\n> > --\n> > Regards,\n> >\n> > Laurent Pinchart\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 05EF1BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 20:18:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 523AA6082A;\n\tWed,  1 Dec 2021 21:18:25 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2ABD6607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 21:18:24 +0100 (CET)","from mail-oo1-f72.google.com (mail-oo1-f72.google.com\n\t[209.85.161.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\tus-mta-65-lKLEOFLfNQidxcRuMe3ImQ-1; Wed, 01 Dec 2021 15:18:22 -0500","by mail-oo1-f72.google.com with SMTP id\n\tg20-20020a4a7554000000b002caefc8179cso3926760oof.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 01 Dec 2021 12:18:22 -0800 (PST)"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"J4eRL4vb\"; dkim-atps=neutral","relay.mimecast.com;\n\tauth=pass smtp.auth=CUSA124A263 smtp.mailfrom=ecurtin@redhat.com"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1638389903;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=MLj7C2uFbFe0J+zFeLVY+9vXBimZ0/pmZMRzBLLiQdY=;\n\tb=J4eRL4vbiJnvjVUWIj5vlLNOohGXZcHOP/cCKAwZz/WxtCdeKJP9rJcrSdPWzbUkt68Ve7\n\tqty4BpMoYjulBA70hWKzJocK3E7lpvF/2kOfQTncJdsSS0VZdLRnaa8rgTBhvMKy0WO3VA\n\tQk4UyP2GjJ58nV4BjnvM/2qciTObS/o=","X-MC-Unique":"lKLEOFLfNQidxcRuMe3ImQ-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=MLj7C2uFbFe0J+zFeLVY+9vXBimZ0/pmZMRzBLLiQdY=;\n\tb=GGM48VkHL1y2l/YalT29lOuC+nIkumvpjxoqGLNFiP62Dufae4TLaZ8QyPHEMMaKll\n\te4cA7PyV24AeL0SVQ4H0DFlfEd6ZPi/6hZF31AuG2kokgbXpSr5X37FhOZC50zYr9bmH\n\tS/9IulM3x73lKs0VWcr6A1FzDJMIXXW2armc0CdujiPZzv+BCciN1ANlgFNWbiPjzHnA\n\tfOmL3KtQdG6X+smUAh3Ou4+LWCz9B8O06j35nXoGVzZWzsJmcv3v1zzZcvr/MEywC+ff\n\tArJv1bJ55Bf4wxFaCXJztFUYUerYSGaRowCw4U18H7Ytr46HydJAjsWYViY5A3AlGzAG\n\toD1g==","X-Gm-Message-State":"AOAM531tyHA7kRgVDqZVQ88ZhvhBazhb0DUaZtj62W4Qscrs4Mp7ALDP\n\tk73WHHop2ain4np+dopedr1OexhhZr0+7ev+U7pRZDmJG1sgPQDz08SFgQL8Sv2ENDvZY0iiJDc\n\tsFcw5NdIcCL7X9qaqvfIBiBrcde4epHLJwmeAcCj2z9hK6bS1ow==","X-Received":["by 2002:a54:4381:: with SMTP id u1mr478801oiv.70.1638389901180; \n\tWed, 01 Dec 2021 12:18:21 -0800 (PST)","by 2002:a54:4381:: with SMTP id u1mr478775oiv.70.1638389900841; \n\tWed, 01 Dec 2021 12:18:20 -0800 (PST)"],"X-Google-Smtp-Source":"ABdhPJz6+bsvfqf+LHzZ58ufd26JuvIaJaNdtTFblhDroOlk/ARi/z2DX2eZeCxarMzEIWPKlRYCoJjOqOSgqCH+fjw=","MIME-Version":"1.0","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>\n\t<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>\n\t<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>\n\t<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>\n\t<YafN+cmGty+UdZC9@pendragon.ideasonboard.com>\n\t<CAOgh=FzNM26pkdLgbZ+a84PQucXRQnNNMvj2uVCktMOALwyj+A@mail.gmail.com>","In-Reply-To":"<CAOgh=FzNM26pkdLgbZ+a84PQucXRQnNNMvj2uVCktMOALwyj+A@mail.gmail.com>","From":"Eric Curtin <ecurtin@redhat.com>","Date":"Wed, 1 Dec 2021 20:18:10 +0000","Message-ID":"<CAOgh=FxVS=3G_HqSPMcD8bNaWACspVCCAVW+k=fUAqSDJe235Q@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21542,"web_url":"https://patchwork.libcamera.org/comment/21542/","msgid":"<YafmyEBGJibrMzP+@pendragon.ideasonboard.com>","date":"2021-12-01T21:19:04","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Eric,\n\nOn Wed, Dec 01, 2021 at 08:18:10PM +0000, Eric Curtin wrote:\n> That was the old logic with the \"return 0\"'s before commit\n> \n> 1de0f90dd43200b0f101b8c732c35c2669d027ad\n> \n> exit the loop instantly once one of these conditions are met.\n> \n> Mind if I send a patch to change to the goto logic in the last email?\n> \n> That way we exit the loop early like before and we still have the\n> \n> \"Using KMS plane \"\n> \n> cout printed.\n\nIt seems to be a bug in that commit, yes. Please feel free to submit a\nfix (and include a Fixes: line in the patch, you can look at git log for\nexamples if you're not familiar with that).\n\n> On Wed, 1 Dec 2021 at 19:40, Eric Curtin wrote:\n> >\n> > I can try tomorrow, it's getting closer to bedtime in Ireland.\n> >\n> > One thing I don't understand about that for loop logic, is that it breaks\n> > out of the inner-most loop on a valid entry but keeps looping because\n> > of the outer loops. I don't understand why we keep looping.\n> >\n> > Behaving like this basically instead, would actually fix it for me even\n> > though it may not be the best fix, it's also faster of course:\n> >\n> >   /*\n> >    * Find a CRTC and plane suitable for the request format and the\n> >    * connector at the end of the pipeline. Restrict the search to primary\n> >    * planes for now.\n> >    */\n> >   for (const DRM::Encoder* encoder : connector_->encoders()) {\n> >     for (const DRM::Crtc* crtc : encoder->possibleCrtcs()) {\n> >       for (const DRM::Plane* plane : crtc->planes()) {\n> >         if (plane->type() != DRM::Plane::TypePrimary)\n> >           continue;\n> >\n> >         if (plane->supportsFormat(format)) {\n> >           crtc_ = crtc;\n> >           plane_ = plane;\n> >           format_ = format;\n> >           goto break_all;\n> >         }\n> >\n> >         if (plane->supportsFormat(xFormat)) {\n> >           crtc_ = crtc;\n> >           plane_ = plane;\n> >           format_ = xFormat;\n> >           goto break_all;\n> >         }\n> >       }\n> >     }\n> >   }\n> >\n> > break_all:\n> >\n> > On Wed, 1 Dec 2021 at 19:33, Laurent Pinchart wrote:\n> > > On Wed, Dec 01, 2021 at 07:05:15PM +0000, Eric Curtin wrote:\n> > > > On Wed, 1 Dec 2021 at 18:55, Laurent Pinchart wrote:\n> > > > > On Wed, Dec 01, 2021 at 06:43:02PM +0000, Eric Curtin wrote:\n> > > > > > $ sudo modetest\n> > > > > > trying to open device 'i915'...done\n> > > > > > Encoders:\n> > > > > > id crtc type possible crtcs possible clones\n> > > > > > 238 98 TMDS 0x00000007 0x00000001\n> > > > > > 246 0 TMDS 0x00000007 0x00000002\n> > > > > >\n> > > > > > Connectors:\n> > > > > > id encoder status name size (mm) modes encoders\n> > > > > > 239 238 connected eDP-1          340x190 1 238\n> > > > > >   modes:\n> > > > > > index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot\n> > > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > >\n> > > > > [snip] (no other connector)\n> > > > >\n> > > > > > CRTCs:\n> > > > > > id fb pos size\n> > > > > > 98 259 (0,0) (1920x1080)\n> > > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > >\n> > > > > [snip]\n> > > > >\n> > > > > > 167 0 (0,0) (0x0)\n> > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > >\n> > > > > [snip]\n> > > > >\n> > > > > > 236 0 (0,0) (0x0)\n> > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > >\n> > > > > [snip]\n> > > > >\n> > > > > According to this, it should be possible to configure a pipeline using\n> > > > > any CRTC to encoder 238 and connector 239 (eDP-1). I assume that's what\n> > > > > cam is doing, picking CRTC 236.\n> > > > >\n> > > > > Let's first validate that this can actually work, can you get something\n> > > > > on the display when running\n> > > > >\n> > > > > modetest -s 239@236:1920x1080\n> > > >\n> > > > Yup sure. This seems to work fine,\n> > > >\n> > > > $ sudo modetest -s 239@236:1920x1080\n> > > > trying to open device 'i915'...done\n> > > > setting mode 1920x1080-59.98Hz on connectors 239, crtc 23\n> > >\n> > > So that configuration can work. The question now is why it doesn't work\n> > > with cam. It's a bit hard for me to debug that remotely. It may be a\n> > > matter of having to disable the CRTC that is already connected to the\n> > > connector.\n> > >\n> > > This being said, we can also optimize the KMS sink in cam to pick a CRTC\n> > > that would reuse an existing CRTC -> encoder -> connector route when one\n> > > is available. I think it would also solve (or work around) your problem.\n> > >\n> > > Would you like to give either option a try ?\n> > >\n> > > > > (if I remember the syntax correctly)\n> > > > >\n> > > > > > On Wed, 1 Dec 2021 at 18:31, Laurent Pinchart wrote:\n> > > > > > > On Wed, Dec 01, 2021 at 06:03:43PM +0000, Eric Curtin wrote:\n> > > > > > > > Hi Laurent,\n> > > > > > > >\n> > > > > > > > Thanks for welcoming me.\n> > > > > > > >\n> > > > > > > > Another suggested solution would be welcome, let me describe\n> > > > > > > > what happens, it's been reproduced on multiple machines.\n> > > > > > > >\n> > > > > > > > So here the the CRTCs output of modetest on my machine:\n> > > > > > > >\n> > > > > > > > CRTCs:\n> > > > > > > > id      fb      pos     size\n> > > > > > > > 98      256     (0,0)   (1920x1080)\n> > > > > > > >   #0 1920x1080 59.98 1920 1968 2000 2080 1080 1083 1088 1111 138600\n> > > > > > > > flags: nhsync, nvsync; type: preferred, driver\n> > > > > > > > ...\n> > > > > > > > 167     0       (0,0)   (0x0)\n> > > > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > > > > ...\n> > > > > > > > 236     0       (0,0)   (0x0)\n> > > > > > > >   #0  -nan 0 0 0 0 0 0 0 0 0 flags: ; type:\n> > > > > > > >\n> > > > > > > > So these lines are executed 3 times:\n> > > > > > > >\n> > > > > > > > if (plane->supportsFormat(format)) {\n> > > > > > > >     crtc_ = crtc;\n> > > > > > > >\n> > > > > > > > crtc_ = 98, break out of loop, crtc_ = 167, break out of loop, crtc_ =\n> > > > > > > > 236, break out of loop.\n> > > > > > > >\n> > > > > > > > So crtc_ is set in the end to be the one with an id of 236, which doesn't\n> > > > > > > > display anything on my machine but 98 does.\n> > > > > > >\n> > > > > > > The issue isn't so much the selected CRTC I believe, but the selected\n> > > > > > > connector (of course the CRTC plays a role there). Could you share the\n> > > > > > > full DRM device topology (CRTCs, encoders, connectors) ?\n> > > > > > >\n> > > > > > > > A alternative to fix this would be apprecitaion!\n> > > > > > > >\n> > > > > > > > I run like this:\n> > > > > > > >\n> > > > > > > > build/src/cam/cam -c1 -DeDP-1 -spixelformat=YUYV -C0\n> > > > > > > >\n> > > > > > > > On Wed, 1 Dec 2021 at 17:14, Laurent Pinchart wrote:\n> > > > > > > > >\n> > > > > > > > > Hi Eric,\n> > > > > > > > >\n> > > > > > > > > Thank you for the patch, and welcome to libcamera.\n> > > > > > > > >\n> > > > > > > > > On Wed, Dec 01, 2021 at 04:44:13PM +0000, Eric Curtin wrote:\n> > > > > > > > > > When looping through possibleCrtcs on my machine, the only valid crtc is\n> > > > > > > > > > actually the first one. This can be identified by checking if the clock\n> > > > > > > > > > variable is non-zero.\n> > > > > > > > > >\n> > > > > > > > > > Signed-off-by: Eric Curtin <ecurtin@redhat.com>\n> > > > > > > > > > ---\n> > > > > > > > > >  src/cam/drm.cpp      | 2 +-\n> > > > > > > > > >  src/cam/drm.h        | 2 ++\n> > > > > > > > > >  src/cam/kms_sink.cpp | 4 ++++\n> > > > > > > > > >  3 files changed, 7 insertions(+), 1 deletion(-)\n> > > > > > > > > >\n> > > > > > > > > > diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp\n> > > > > > > > > > index f2530091..808e5a87 100644\n> > > > > > > > > > --- a/src/cam/drm.cpp\n> > > > > > > > > > +++ b/src/cam/drm.cpp\n> > > > > > > > > > @@ -128,7 +128,7 @@ std::unique_ptr<Blob> Mode::toBlob(Device *dev) const\n> > > > > > > > > >  }\n> > > > > > > > > >\n> > > > > > > > > >  Crtc::Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index)\n> > > > > > > > > > -     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index)\n> > > > > > > > > > +     : Object(dev, crtc->crtc_id, Object::TypeCrtc), index_(index), crtc_(crtc)\n> > > > > > > > > >  {\n> > > > > > > > > >  }\n> > > > > > > > > >\n> > > > > > > > > > diff --git a/src/cam/drm.h b/src/cam/drm.h\n> > > > > > > > > > index de57e445..d05e6d13 100644\n> > > > > > > > > > --- a/src/cam/drm.h\n> > > > > > > > > > +++ b/src/cam/drm.h\n> > > > > > > > > > @@ -149,12 +149,14 @@ public:\n> > > > > > > > > >       Crtc(Device *dev, const drmModeCrtc *crtc, unsigned int index);\n> > > > > > > > > >\n> > > > > > > > > >       unsigned int index() const { return index_; }\n> > > > > > > > > > +     uint32_t clock() const { return crtc_->mode.clock; }\n> > > > > > > > > >       const std::vector<const Plane *> &planes() const { return planes_; }\n> > > > > > > > > >\n> > > > > > > > > >  private:\n> > > > > > > > > >       friend Device;\n> > > > > > > > > >\n> > > > > > > > > >       unsigned int index_;\n> > > > > > > > > > +     const drmModeCrtc *crtc_;\n> > > > > > > > > >       std::vector<const Plane *> planes_;\n> > > > > > > > > >  };\n> > > > > > > > > >\n> > > > > > > > > > diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> > > > > > > > > > index d30fba78..aa0b7a3c 100644\n> > > > > > > > > > --- a/src/cam/kms_sink.cpp\n> > > > > > > > > > +++ b/src/cam/kms_sink.cpp\n> > > > > > > > > > @@ -166,6 +166,10 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n> > > > > > > > > >        */\n> > > > > > > > > >       for (const DRM::Encoder *encoder : connector_->encoders()) {\n> > > > > > > > > >               for (const DRM::Crtc *crtc : encoder->possibleCrtcs()) {\n> > > > > > > > > > +                     if (!crtc->clock()) {\n> > > > > > > > > > +                             continue;\n> > > > > > > > > > +                     }\n> > > > > > > > >\n> > > > > > > > > I don't think this is quite right. When the Crtc instance is created,\n> > > > > > > > > drmModeCrtc.mode contains the currently configured mode. Any CRTC that\n> > > > > > > > > is not enabled when the cam application is started will thus be skipped,\n> > > > > > > > > even if it can be used.\n> > > > > > > > >\n> > > > > > > > > On a side note, no need for curly braces.\n> > > > > > > > >\n> > > > > > > > > > +\n> > > > > > > > > >                       for (const DRM::Plane *plane : crtc->planes()) {\n> > > > > > > > > >                               if (plane->type() != DRM::Plane::TypePrimary)\n> > > > > > > > > >                                       continue;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 33324BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Dec 2021 21:19:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C7B06082A;\n\tWed,  1 Dec 2021 22:19:31 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0BB09607DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Dec 2021 22:19:30 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7DFC88AE;\n\tWed,  1 Dec 2021 22:19:29 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"CJRcJCTy\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638393569;\n\tbh=RyIqHCLNuYGCekXz5ZiYiUHyI2L0RPHEDe6eq/iGJ6g=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=CJRcJCTyqzJlAt7Sp0ufdBMfAeDAWGqwPKDun8smnWGmXwJkUO9+3CcPrI2AhFyVs\n\tqFEXCvTNjtXDjpthCTnnLG2NVRNcg6KJM9ISoAZal9tDmjawif55oL6kYvwXFqhFZ4\n\tNY/Ya3rXYUDx/SYAt8Bs4+K1iC7VYrtWccAy8PGY=","Date":"Wed, 1 Dec 2021 23:19:04 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Eric Curtin <ecurtin@redhat.com>","Message-ID":"<YafmyEBGJibrMzP+@pendragon.ideasonboard.com>","References":"<20211201164413.95396-1-ecurtin@redhat.com>\n\t<YaetPYl/FEblE6HE@pendragon.ideasonboard.com>\n\t<CAOgh=FxNzaGSwbzDr8FgB9D5LqMuUoqSg++z513LbWsyb+Pu0g@mail.gmail.com>\n\t<Yae/fmxgEcbrsK7R@pendragon.ideasonboard.com>\n\t<CAOgh=Fw_rp1Ri_ULf0Wkj0xVsgGKa7ra7g2tWC8h80_Dxfmx9A@mail.gmail.com>\n\t<YafFDu4LrN9ysgvO@pendragon.ideasonboard.com>\n\t<CAOgh=FwEcdPnz+F+KVHvr=+-v9m2Yq_5yMUL3Cyz1X7Ttika8A@mail.gmail.com>\n\t<YafN+cmGty+UdZC9@pendragon.ideasonboard.com>\n\t<CAOgh=FzNM26pkdLgbZ+a84PQucXRQnNNMvj2uVCktMOALwyj+A@mail.gmail.com>\n\t<CAOgh=FxVS=3G_HqSPMcD8bNaWACspVCCAVW+k=fUAqSDJe235Q@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAOgh=FxVS=3G_HqSPMcD8bNaWACspVCCAVW+k=fUAqSDJe235Q@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: select valid crtc","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]