From patchwork Mon Aug 29 23:30:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17241 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 918D4C3272 for ; Mon, 29 Aug 2022 23:30:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5749C61FC9; Tue, 30 Aug 2022 01:30:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815832; bh=9kzPlDoRIasagF8/labxkUQADTW+Hl2wsgpQaP8LK9Y=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=bK9BNYKUaB3SgIz5MqS2aYviRDv9PRZFJSpiwyUhlSu+jbrzUIdf/uNVSQ34HLloY L47P3zyONLKUQH0ngzg7O/oOf7ry9KeeiDkEWMZiVeTu4fttpNbpdepqGT+Fz1UGDd /ZqRhkoXPg/fGl+RjIoGzCMNRjFgSbBJMG0U0MRnuM6++AgigurqIsuzDKpfH4HpDl w94fOiOuB4gEgVR9XrKo4ONz+3covS3KNYbikbJDwnZyM0iUjAwag1C+RSJWnCrcik P2wVP1KFYq99O4k6D2nCODbwbntRMocZcyHrv4bYKA0l2hLrGk4xESISlk7f+uuLUg 5ao9kC/UrNCQA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F1A5F61FBD for ; Tue, 30 Aug 2022 01:30:27 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Q/rIJPJ0"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 86AA16F2; Tue, 30 Aug 2022 01:30:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815827; bh=9kzPlDoRIasagF8/labxkUQADTW+Hl2wsgpQaP8LK9Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q/rIJPJ01SlqPD6jUZbKPaYH3HzwXG5vwhbGdBJgv6JI/lU0AYSw/HNAPXmnFEeu8 l5CGq/IE8Yr/ZeMD2jAISF/WfzAVaBudFUtgF7OdWPuFaRbwbYH3Dp/FL244+Oxz6H 7Biqqi6WojV9wCtR7pHI2wGAOr74Ddvux4CFcaZA= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:11 -0500 Message-Id: <20220829233017.2699444-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 1/7] test: generated_serializer: Test enum that is struct member X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add an enum field to the test struct member to test serialization/deserialization of enums that are struct members. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- No change in v4 No change in v3 No change in v2 --- .../generated_serializer/generated_serializer_test.cpp | 4 ++++ .../generated_serializer/include/libcamera/ipa/test.mojom | 1 + 2 files changed, 5 insertions(+) diff --git a/test/serialization/generated_serializer/generated_serializer_test.cpp b/test/serialization/generated_serializer/generated_serializer_test.cpp index 698c81d6..a4639a80 100644 --- a/test/serialization/generated_serializer/generated_serializer_test.cpp +++ b/test/serialization/generated_serializer/generated_serializer_test.cpp @@ -51,6 +51,7 @@ if (struct1.field != struct2.field) { \ t.s2 = "goodbye"; t.s3 = "lorem ipsum"; t.i = 58527; + t.c = ipa::test::IPAOperationInit; std::vector serialized; @@ -69,6 +70,7 @@ if (struct1.field != struct2.field) { \ TEST_FIELD_EQUALITY(t, u, s2); TEST_FIELD_EQUALITY(t, u, s3); TEST_FIELD_EQUALITY(t, u, i); + TEST_FIELD_EQUALITY(t, u, c); /* Test vector of generated structs */ @@ -92,11 +94,13 @@ if (struct1.field != struct2.field) { \ TEST_FIELD_EQUALITY(v[0], w[0], s2); TEST_FIELD_EQUALITY(v[0], w[0], s3); TEST_FIELD_EQUALITY(v[0], w[0], i); + TEST_FIELD_EQUALITY(v[0], w[0], c); TEST_FIELD_EQUALITY(v[1], w[1], s1); TEST_FIELD_EQUALITY(v[1], w[1], s2); TEST_FIELD_EQUALITY(v[1], w[1], s3); TEST_FIELD_EQUALITY(v[1], w[1], i); + TEST_FIELD_EQUALITY(v[1], w[1], c); return TestPass; } diff --git a/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom b/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom index 5f200885..73081b40 100644 --- a/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom +++ b/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom @@ -18,6 +18,7 @@ struct TestStruct { string s2; int32 i; string s3; + IPAOperationCode c; }; interface IPATestInterface { From patchwork Mon Aug 29 23:30:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17242 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id AF95BC3272 for ; Mon, 29 Aug 2022 23:30:33 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0118A61FCB; Tue, 30 Aug 2022 01:30:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815833; bh=MYU606i8EwFZCs3I/T0Dfsm3IbmzvjzvJaVt6A0S0P4=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=GC+XO9PdyCaXUpdL9dM09A9fK1RA4dmuuzsTCqhdI3XgRI1Dq1F456IymZNB35Ptt qiHW6J3kglIQawpDfyJ8SWbqY7wXzjdRPUotOsmieS0wFCaqbG7p9SgjTMplQaC8Hs NaL+I+HC4ZPraT0+3QSGo1mmjZujO9hfGqc83s2iR2Kc3xTdAZH2IHrGvX8ngc78OV kPkIuWKjxLkh2KfB3o46SUTDKBdwRUNONZhf+QtHD6pu6IM3M+++dX11WZZHqgzVOE 8PYW6EogQVtuvx93v6L9un4MJpVHDdVgyYXNXUZ0fq3YDuqOni17m/qauY2EL6FV6e onbbBi1y8wg3A== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 61C7B61FBE for ; Tue, 30 Aug 2022 01:30:29 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="beUjBhYk"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 14870481; Tue, 30 Aug 2022 01:30:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815828; bh=MYU606i8EwFZCs3I/T0Dfsm3IbmzvjzvJaVt6A0S0P4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=beUjBhYkt8zz7IlJrhQQXrFLSAJ07rINRbEX2HQGHEacnnNfkwScm2B0kYvTFDfzy 02Urmlk4j4TLqBcytdz80x4yUTK8EE/cfnbMeu36woTCddP4L/zoYtdrnGRdgTr61/ gal0nGqFL0wCkzfNeA0RXrn2DVAv8Cpv30eYDd8g= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:12 -0500 Message-Id: <20220829233017.2699444-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 2/7] utils: ipc: Add support for enums in function parameters X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" There is already support for enums as struct members, but there was no support for enums in function parameters. Add it. This does not add support for returning enums as direct return values. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- No change in v4 No change in v3 Changes in v2: - add static assertion to confirm that the enum type fits in int32_t --- .../libcamera_templates/proxy_functions.tmpl | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl index bac826a7..cbcfb64a 100644 --- a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl +++ b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl @@ -52,6 +52,9 @@ #} {%- macro serialize_call(params, buf, fds) %} {%- for param in params %} +{%- if param|is_enum %} + static_assert(sizeof({{param|name_full}}) <= 4); +{%- endif %} std::vector {{param.mojom_name}}Buf; {%- if param|has_fd %} std::vector {{param.mojom_name}}Fds; @@ -59,7 +62,11 @@ {%- else %} std::tie({{param.mojom_name}}Buf, std::ignore) = {%- endif %} +{%- if param|is_enum %} + IPADataSerializer::serialize(static_cast({{param.mojom_name}}) +{%- else %} IPADataSerializer<{{param|name}}>::serialize({{param.mojom_name}} +{% endif -%} {{- ", &controlSerializer_" if param|needs_control_serializer -}} ); {%- endfor %} @@ -97,7 +104,12 @@ # This code is meant to be used by macro deserialize_call. #} {%- macro deserialize_param(param, pointer, loop, buf, fds, iter, data_size) -%} -{{"*" if pointer}}{{param.mojom_name}} = IPADataSerializer<{{param|name}}>::deserialize( +{{"*" if pointer}}{{param.mojom_name}} = +{%- if param|is_enum %} +static_cast<{{param|name_full}}>(IPADataSerializer::deserialize( +{%- else %} +IPADataSerializer<{{param|name}}>::deserialize( +{%- endif %} {{buf}}{{- ".cbegin()" if not iter}} + {{param.mojom_name}}Start, {%- if loop.last and not iter %} {{buf}}.cend() @@ -121,7 +133,7 @@ {%- if param|needs_control_serializer %} &controlSerializer_ {%- endif -%} -); +){{")" if param|is_enum}}; {%- endmacro -%} From patchwork Mon Aug 29 23:30:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17243 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id A0D91C327D for ; Mon, 29 Aug 2022 23:30:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id EADAC61FC7; Tue, 30 Aug 2022 01:30:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815834; bh=F/6XAvTyZBjVFq/yAo/+7z/8mDpIfsJZ8h1zXWNbvVQ=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=BtQEY+zo+OrsdiZEbJxK4aSyctYLO049MxD16zPKsxlkc63h+IgWokyIZanoa9nip FpzmO+d4NdNpimza00OakGYQ4aG2kLKGG4D79ukqpgnhA2qPFUw/NfUzFsGwKy3TD1 JmFOrYUP1wClZbK39xShkkNiEPmgBsQ/5gpHdIbggdFOsPNItQV/xsvJcD2W0rWWaR RxlU3on9XTPGDj2XvIp5FOQQ94o15+IzYbFd0ijgB8hJN9q7UX0DTj/1k/sSx/3aI0 tD7A5Xf86TVwB3NAK8m/vKKRW2DflQ9zNLfN8lgDv1KdRtJfOtVnbt5Z5/0WEfCMBA XeUP/UFfa3y+g== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 413D561F9C for ; Tue, 30 Aug 2022 01:30:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Dbj5cvP7"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4E4CF6F2; Tue, 30 Aug 2022 01:30:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815830; bh=F/6XAvTyZBjVFq/yAo/+7z/8mDpIfsJZ8h1zXWNbvVQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dbj5cvP7MBF4qiFKKf/LamjU+PTMtN7dT+8NQWgzS4rjaCL7Cj3DRSGbrfRdkjPSl gseO7JOdTxxC2VH55y0ihWykglnoVTPz7NNS4uIEMHkPZPg43S39pY4MPrhBeuiV7c Yet3Kza/0TZ1byDyLdtDciYyhXmsJbEvnXiFG9fg= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:13 -0500 Message-Id: <20220829233017.2699444-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 3/7] libcamera: ipa_data_serializer: Add serializer for Flags X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Implement an IPADataSerializer for Flags. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- No change in v4 No change in v3 Changes in v2: - use Flags's Type cast to avoid friend class --- .../libcamera/internal/ipa_data_serializer.h | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h index 30bdaebc..981d2f5c 100644 --- a/include/libcamera/internal/ipa_data_serializer.h +++ b/include/libcamera/internal/ipa_data_serializer.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -301,6 +302,51 @@ public: } }; +/* Serialization format for Flags is same as for PODs */ +template +class IPADataSerializer> +{ +public: + static std::tuple, std::vector> + serialize(const Flags &data, [[maybe_unused]] ControlSerializer *cs = nullptr) + { + std::vector dataVec; + dataVec.reserve(sizeof(Flags)); + appendPOD(dataVec, static_cast::Type>(data)); + + return { dataVec, {} }; + } + + static Flags deserialize(std::vector &data, + [[maybe_unused]] ControlSerializer *cs = nullptr) + { + return deserialize(data.cbegin(), data.end()); + } + + static Flags deserialize(std::vector::const_iterator dataBegin, + std::vector::const_iterator dataEnd, + [[maybe_unused]] ControlSerializer *cs = nullptr) + { + return Flags{ static_cast(readPOD(dataBegin, 0, dataEnd)) }; + } + + static Flags deserialize(std::vector &data, + [[maybe_unused]] std::vector &fds, + [[maybe_unused]] ControlSerializer *cs = nullptr) + { + return deserialize(data.cbegin(), data.end()); + } + + static Flags deserialize(std::vector::const_iterator dataBegin, + std::vector::const_iterator dataEnd, + [[maybe_unused]] std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, + [[maybe_unused]] ControlSerializer *cs = nullptr) + { + return deserialize(dataBegin, dataEnd); + } +}; + #endif /* __DOXYGEN__ */ } /* namespace libcamera */ From patchwork Mon Aug 29 23:30:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17244 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 28A1AC3272 for ; Mon, 29 Aug 2022 23:30:36 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D681261FCC; Tue, 30 Aug 2022 01:30:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815835; bh=o7XOi1VrNwH6ZRzbX/Hyk6Dj4LHnWGZwYSj5+IxFgGg=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Z9CKbtxDYi6LH1lAwtFImV5U2zKIfY+NXNHfgnMV0eBeRA6Bu+mbc2xaCf2JsZ7tx d4oQ43iQA7f14IV7yZiPvAWPaQelu5uflsTqS2m3bZ6p6uJuD2/YUzkk3aXYrxvFYf NXTJ4wPUWNShxyvE2Nk2qq0wM5p2BQsd66Cab1m4gbS7Mj417ITubSfuwvn737xKPl IqcmcoO4zqEBhZ16Mls3jngvLh8J78r6OrrteWbVyUon9Lj1//4YHCSS1jVaX+2PUq ux+LDucMROsM7VVuy3xAI1U9+MFHexr/QhKi+S73Kkr7co0PP5cwcj2xoYQOJqE1y1 vMq+G1lByyxpQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id ABB9F61F9C for ; Tue, 30 Aug 2022 01:30:31 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZzN8L1Ft"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6BE27802; Tue, 30 Aug 2022 01:30:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815831; bh=o7XOi1VrNwH6ZRzbX/Hyk6Dj4LHnWGZwYSj5+IxFgGg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZzN8L1FtZiz8c2LNo8f0IcOMQ4fqUlucDbNvcgSgrygDuKAIqtdIeWXQ85Qf+voOt 6MA1xnHKaw4yMc7L94//2Rk21jMCz/F7jjnnN5f5+d+rkLDzM3lLCk5Lxu2WDFFzpi Vo+SmkwpDPxVWKfRh0odJlt03NLAyGtDvc/FaBX4= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:14 -0500 Message-Id: <20220829233017.2699444-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 4/7] utils: ipc: Add support for Flags X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add Flags as a supported type in the IPA interface. It is used in mojom with the [flags] attribute. Any field or parameter type E that is prefixed with the [flags] attribute will direct the code generator to generate the type name "Flags" and appropriate serialization/deserialization code for Flags instead of for E. It is usable and has been tested in struct members, function input and output parameters, and Signal parameters. This does not add support for returning Flags as direct return values. Additionally, the [scopedEnum] attribute can be used on enum definitions, which will instruct the code generator to convert it to an enum class instead of a raw enum. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- Changes in v4: - make flags also passed directly (as opposed to const references) Changes in v3.1: - add documentation of [scopedEnum] and [flags] to core.mojom - it's not the best place, but better somewhere than nowhere for now Changes in v3: - change flags attribute from [Flags] to [flags] - make it so that enum input parameters are passed directly (as opposed to const references) - to turn enum definitions in mojom to enum classes, use the [scopedEnum] attribute (as opposed to the [Flags] attribute in v2) - correspondingly, the function in the mojom generator python script is separated out from IsFlags() into IsScoped() - clean up IsFlags() - simplify GetFullNameForElement() for flags Question for reviewers (in v2): Should we use a different attribute name to specify that an enum should be an enum class? Answer (in v3): Yes; that attribute name is [scopedEnum] Changes in v2: - Use mojom attribute to specify that a field should be Flags, instead of using a magic type name format --- include/libcamera/ipa/core.mojom | 9 ++++++ include/libcamera/ipa/ipa_interface.h | 1 + .../definition_functions.tmpl | 2 +- .../module_ipa_interface.h.tmpl | 2 +- .../module_ipa_proxy.h.tmpl | 2 +- .../libcamera_templates/proxy_functions.tmpl | 10 +++++-- .../libcamera_templates/serializer.tmpl | 4 +++ .../generators/mojom_libcamera_generator.py | 29 +++++++++++++++++-- 8 files changed, 50 insertions(+), 9 deletions(-) diff --git a/include/libcamera/ipa/core.mojom b/include/libcamera/ipa/core.mojom index 74f3339e..ef28ff2d 100644 --- a/include/libcamera/ipa/core.mojom +++ b/include/libcamera/ipa/core.mojom @@ -33,6 +33,15 @@ module libcamera; * available for the type and there's no need to generate one * - hasFd - struct fields or empty structs only * - Designate that this field or empty struct contains a SharedFD + * - scopedEnum - enum definitions + * - Designate that this enum should be an enum class, as opposed to a pure + * enum + * - flags - struct fields or function parameters that are enums + * - Designate that this enum type E should be Flags in the generated C++ + * code + * - For example, if a struct field is defined as `[flags] ErrorFlag f;` + * (where ErrorFlag is defined as an enum elsewhere in mojom), then the + * generated code for this field will be `Flags f` * * Rules: * - If the type is defined in a libcamera C++ header *and* a (de)serializer is diff --git a/include/libcamera/ipa/ipa_interface.h b/include/libcamera/ipa/ipa_interface.h index 50ca0e7b..8afcfe21 100644 --- a/include/libcamera/ipa/ipa_interface.h +++ b/include/libcamera/ipa/ipa_interface.h @@ -13,6 +13,7 @@ #include #include +#include #include #include diff --git a/utils/ipc/generators/libcamera_templates/definition_functions.tmpl b/utils/ipc/generators/libcamera_templates/definition_functions.tmpl index 94bb4918..8b8509f3 100644 --- a/utils/ipc/generators/libcamera_templates/definition_functions.tmpl +++ b/utils/ipc/generators/libcamera_templates/definition_functions.tmpl @@ -9,7 +9,7 @@ # \param enum Enum object whose definition is to be generated #} {%- macro define_enum(enum) -%} -enum {{enum.mojom_name}} { +enum{{" class" if enum|is_scoped}} {{enum.mojom_name}} { {%- for field in enum.fields %} {{field.mojom_name}} = {{field.numeric_value}}, {%- endfor %} diff --git a/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl index 415ec283..160601f7 100644 --- a/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl +++ b/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl @@ -69,7 +69,7 @@ public: {%- for method in interface_event.methods %} Signal< {%- for param in method.parameters -%} - {{"const " if not param|is_pod}}{{param|name}}{{" &" if not param|is_pod}} + {{"const " if not param|is_pod}}{{param|name}}{{" &" if not param|is_pod and not param|is_enum}} {{- ", " if not loop.last}} {%- endfor -%} > {{method.mojom_name}}; diff --git a/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl index c308dd10..ed270f5c 100644 --- a/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl +++ b/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl @@ -46,7 +46,7 @@ public: {%- for method in interface_event.methods %} Signal< {%- for param in method.parameters -%} - {{"const " if not param|is_pod}}{{param|name}}{{" &" if not param|is_pod}} + {{"const " if not param|is_pod}}{{param|name}}{{" &" if not param|is_pod and not param|is_enum}} {{- ", " if not loop.last}} {%- endfor -%} > {{method.mojom_name}}; diff --git a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl index cbcfb64a..2be65d43 100644 --- a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl +++ b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl @@ -62,7 +62,9 @@ {%- else %} std::tie({{param.mojom_name}}Buf, std::ignore) = {%- endif %} -{%- if param|is_enum %} +{%- if param|is_flags %} + IPADataSerializer<{{param|name_full}}>::serialize({{param.mojom_name}} +{%- elif param|is_enum %} IPADataSerializer::serialize(static_cast({{param.mojom_name}}) {%- else %} IPADataSerializer<{{param|name}}>::serialize({{param.mojom_name}} @@ -105,7 +107,9 @@ #} {%- macro deserialize_param(param, pointer, loop, buf, fds, iter, data_size) -%} {{"*" if pointer}}{{param.mojom_name}} = -{%- if param|is_enum %} +{%- if param|is_flags %} +IPADataSerializer<{{param|name_full}}>::deserialize( +{%- elif param|is_enum %} static_cast<{{param|name_full}}>(IPADataSerializer::deserialize( {%- else %} IPADataSerializer<{{param|name}}>::deserialize( @@ -133,7 +137,7 @@ IPADataSerializer<{{param|name}}>::deserialize( {%- if param|needs_control_serializer %} &controlSerializer_ {%- endif -%} -){{")" if param|is_enum}}; +){{")" if param|is_enum and not param|is_flags}}; {%- endmacro -%} diff --git a/utils/ipc/generators/libcamera_templates/serializer.tmpl b/utils/ipc/generators/libcamera_templates/serializer.tmpl index 77bae36f..eec75211 100644 --- a/utils/ipc/generators/libcamera_templates/serializer.tmpl +++ b/utils/ipc/generators/libcamera_templates/serializer.tmpl @@ -34,6 +34,8 @@ std::tie({{field.mojom_name}}, std::ignore) = {%- if field|is_pod %} IPADataSerializer<{{field|name}}>::serialize(data.{{field.mojom_name}}); + {%- elif field|is_flags %} + IPADataSerializer<{{field|name_full}}>::serialize(data.{{field.mojom_name}}); {%- elif field|is_enum %} IPADataSerializer::serialize(data.{{field.mojom_name}}); {%- endif %} @@ -96,6 +98,8 @@ {{- check_data_size(field_size, 'dataSize', field.mojom_name, 'data')}} {%- if field|is_pod %} ret.{{field.mojom_name}} = IPADataSerializer<{{field|name}}>::deserialize(m, m + {{field_size}}); + {%- elif field|is_flags %} + ret.{{field.mojom_name}} = IPADataSerializer<{{field|name_full}}>::deserialize(m, m + {{field_size}}); {%- else %} ret.{{field.mojom_name}} = static_cast<{{field|name_full}}>(IPADataSerializer::deserialize(m, m + {{field_size}})); {%- endif %} diff --git a/utils/ipc/generators/mojom_libcamera_generator.py b/utils/ipc/generators/mojom_libcamera_generator.py index 753bfc73..cffe6a8c 100644 --- a/utils/ipc/generators/mojom_libcamera_generator.py +++ b/utils/ipc/generators/mojom_libcamera_generator.py @@ -74,6 +74,8 @@ def GetDefaultValue(element): return element.default if type(element.kind) == mojom.Kind: return '0' + if IsFlags(element): + return '' if mojom.IsEnumKind(element.kind): return f'static_cast<{element.kind.mojom_name}>(0)' if isinstance(element.kind, mojom.Struct) and \ @@ -184,7 +186,7 @@ def MethodParameters(method): params = [] for param in method.parameters: params.append('const %s %s%s' % (GetNameForElement(param), - '&' if not IsPod(param) else '', + '' if IsPod(param) or IsEnum(param) else '&', param.mojom_name)) for param in MethodParamOutputs(method): params.append(f'{GetNameForElement(param)} *{param.mojom_name}') @@ -220,9 +222,21 @@ def IsControls(element): def IsEnum(element): return mojom.IsEnumKind(element.kind) +def IsScoped(element): + attributes = getattr(element, 'attributes', None) + if not attributes: + return False + return 'scopedEnum' in attributes + def IsFd(element): return mojom.IsStructKind(element.kind) and element.kind.mojom_name == "SharedFD" +def IsFlags(element): + attributes = getattr(element, 'attributes', None) + if not attributes: + return False + return 'flags' in attributes + def IsMap(element): return mojom.IsMapKind(element.kind) @@ -251,9 +265,11 @@ def ByteWidthFromCppType(t): raise Exception('invalid type') return str(int(_bit_widths[key]) // 8) - # Get the type name for a given element def GetNameForElement(element): + # Flags + if IsFlags(element): + return f'Flags<{GetFullNameForElement(element.kind)}>' # structs if (mojom.IsEnumKind(element) or mojom.IsInterfaceKind(element) or @@ -302,7 +318,8 @@ def GetNameForElement(element): def GetFullNameForElement(element): name = GetNameForElement(element) namespace_str = '' - if mojom.IsStructKind(element): + if (mojom.IsStructKind(element) or + mojom.IsEnumKind(element)): namespace_str = element.module.mojom_namespace.replace('.', '::') elif (hasattr(element, 'kind') and (mojom.IsStructKind(element.kind) or @@ -311,6 +328,10 @@ def GetFullNameForElement(element): if namespace_str == '': return name + + if IsFlags(element): + return GetNameForElement(element) + return f'{namespace_str}::{name}' def ValidateZeroLength(l, s, cap=True): @@ -408,9 +429,11 @@ class Generator(generator.Generator): 'is_controls': IsControls, 'is_enum': IsEnum, 'is_fd': IsFd, + 'is_flags': IsFlags, 'is_map': IsMap, 'is_plain_struct': IsPlainStruct, 'is_pod': IsPod, + 'is_scoped': IsScoped, 'is_str': IsStr, 'method_input_has_fd': MethodInputHasFd, 'method_output_has_fd': MethodOutputHasFd, From patchwork Mon Aug 29 23:30:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17245 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 8CE17C327D for ; Mon, 29 Aug 2022 23:30:36 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 383F161FD5; Tue, 30 Aug 2022 01:30:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815836; bh=OPX9tVTE9tfS/uyxhwQfAiMdzY4kRBOzOH8oS2aB4vk=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=xO8s4/G9fgd3oumOGN9sRRwaTK/5lkX+qdKd+o0N0vJj6T2/uHUNcZ8BJOHXx0eEK SNWurNI0hmB7X7aJdIstBzO3xfvephL14d56e9qBn2A0o91OZWu0NrG69lg1MvEmGY xdpKVBI0+fK3sJmtpFzwBUwLLYRm6OT7N5u1ZJzwCJ5JDzynO7VuRCo2SqFyMhGJ4i jg3GWPziguE3GyhlV3vrvToMJM6fLDWYvFZ88YqnzTumkI/RN2XW1W9ZhezG5hfNPo zn6n38LT/k6TvGLQN8enOqoiCbbepL4Oq/j9K/YdcRmYcjS6ei9POuY4WwSkmLro2x JwOjfZkkMyMDw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1FC1661FCC for ; Tue, 30 Aug 2022 01:30:33 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="nw5i3qD7"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C268D481; Tue, 30 Aug 2022 01:30:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815832; bh=OPX9tVTE9tfS/uyxhwQfAiMdzY4kRBOzOH8oS2aB4vk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nw5i3qD7AbnZd1dt8oXgfuY4CMgWz4uulDJwFQ616YLoD+d+FTDMljHjaRolKqG95 kHC3FdbpjOlhPJc7MQZTVMgJSokZOR5q+AKuTns8OdIjmRopbvHhnIwvVto+iI6PNf nPDHV8Iy01mJazqieMn6tK7yMK+LQYLcnbCOkKwY= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:15 -0500 Message-Id: <20220829233017.2699444-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 5/7] test: generated_serializer: Test Flags that is struct member X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add a Flags field to the test struct to test serialization/deserialization of Flags that are struct members. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- No change in v4 Changes in v3: - add [scopedEnum] to enum ErrorFlags - s/[Flags]/[flags]/ Changes in v2: - use new attribute-based mojom definition for Flags --- .../generated_serializer_test.cpp | 19 +++++++++++++++++++ .../include/libcamera/ipa/test.mojom | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/test/serialization/generated_serializer/generated_serializer_test.cpp b/test/serialization/generated_serializer/generated_serializer_test.cpp index a4639a80..a2d71d62 100644 --- a/test/serialization/generated_serializer/generated_serializer_test.cpp +++ b/test/serialization/generated_serializer/generated_serializer_test.cpp @@ -53,6 +53,11 @@ if (struct1.field != struct2.field) { \ t.i = 58527; t.c = ipa::test::IPAOperationInit; + Flags flags; + flags |= ipa::test::ErrorFlags::Error1; + flags |= ipa::test::ErrorFlags::Error2; + t.f = flags; + std::vector serialized; std::tie(serialized, ignore) = @@ -72,6 +77,10 @@ if (struct1.field != struct2.field) { \ TEST_FIELD_EQUALITY(t, u, i); TEST_FIELD_EQUALITY(t, u, c); + if (t.f != u.f) { + cerr << "Flags f field incorrect" << endl; + return TestFail; + } /* Test vector of generated structs */ std::vector v = { t, u }; @@ -96,12 +105,22 @@ if (struct1.field != struct2.field) { \ TEST_FIELD_EQUALITY(v[0], w[0], i); TEST_FIELD_EQUALITY(v[0], w[0], c); + if (v[0].f != w[0].f) { + cerr << "Flags f field incorrect" << endl; + return TestFail; + } + TEST_FIELD_EQUALITY(v[1], w[1], s1); TEST_FIELD_EQUALITY(v[1], w[1], s2); TEST_FIELD_EQUALITY(v[1], w[1], s3); TEST_FIELD_EQUALITY(v[1], w[1], i); TEST_FIELD_EQUALITY(v[1], w[1], c); + if (v[1].f != w[1].f) { + cerr << "Flags f field incorrect" << endl; + return TestFail; + } + return TestPass; } diff --git a/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom b/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom index 73081b40..a988c996 100644 --- a/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom +++ b/test/serialization/generated_serializer/include/libcamera/ipa/test.mojom @@ -9,6 +9,13 @@ enum IPAOperationCode { IPAOperationStop, }; +[scopedEnum] enum ErrorFlags { + Error1 = 0x1, + Error2 = 0x2, + Error3 = 0x4, + Error4 = 0x8, +}; + struct IPASettings {}; struct TestStruct { @@ -19,6 +26,7 @@ struct TestStruct { int32 i; string s3; IPAOperationCode c; + [flags] ErrorFlags f; }; interface IPATestInterface { From patchwork Mon Aug 29 23:30:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17246 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 24154C327E for ; Mon, 29 Aug 2022 23:30:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9309261FD7; Tue, 30 Aug 2022 01:30:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815836; bh=0/RRu7BLsWdcQQigO7OhWyPdI8AS1Uwc6X2fjIBx9ks=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=3DYxM15VH/F0r8LKmJH+fZIoBTKXpsFVv/hi48WiHV07/FRhyt3kIeX5taAdDN/OM O33IWeReamU8lJWiOkYzzR6gTw4UM4s1Dn50UVTCxvZE8R0XPDOYTwxFXEIz2F/72n FCS7VaSH/+S9PXvWNP6MraqMMVXzCTCto2qB38FYiJbQKfihlXin4vaBgV6F3XaYh0 DcdNSRWR99+Qs8db2qUlVvObM1wGT7ckiHzXmFwZHp75cfSdeMPPxDkd1OLzHiD33J 0/t5yPbZt2+doyCl/3kH+/HwFX52ic6vFCKkhnN8obgEbasEblFSdEghobevvrcG8P 4yhKvui6tG2oQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5A6FD61FC6 for ; Tue, 30 Aug 2022 01:30:34 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Z1D2DJBg"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3158F802; Tue, 30 Aug 2022 01:30:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815834; bh=0/RRu7BLsWdcQQigO7OhWyPdI8AS1Uwc6X2fjIBx9ks=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z1D2DJBgPEOu7rmi0JWLilU5wVM+GXJpzyOnnuQYwk8JlGHdLyWJHeitvi19pOSsv Sy6BiyyuFJ9yZXHDsgYD+hbHT4tzwkob1ZVrG/KMt2qTu++l8hQV1rghIlpQNJyV+W xfhwNoW4FKR75YhiPsr5SvgCJ1ZFH9Y8sDNRLMYE= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:16 -0500 Message-Id: <20220829233017.2699444-7-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 6/7] ipa: vimc: Add IPAOperationCode to init() parameter list X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" For the purpose of testing serializing/deserializing enums in function parameters, add IPAOperationCode to the parameter list of init(). Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- Changes in v4: - remove [TEST] from commit subject Changes in v3: - pass enum by value as opposed to by const reference No changes in v2 --- include/libcamera/ipa/vimc.mojom | 2 +- src/ipa/vimc/vimc.cpp | 6 ++++-- src/libcamera/pipeline/vimc/vimc.cpp | 2 +- test/ipa/ipa_interface_test.cpp | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 718b9674..16149787 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -18,7 +18,7 @@ enum IPAOperationCode { }; interface IPAVimcInterface { - init(libcamera.IPASettings settings) => (int32 ret); + init(libcamera.IPASettings settings, IPAOperationCode code) => (int32 ret); configure(libcamera.IPACameraSensorInfo sensorInfo, map streamConfig, diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 85afb279..5d494b63 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -31,7 +31,7 @@ public: IPAVimc(); ~IPAVimc(); - int init(const IPASettings &settings) override; + int init(const IPASettings &settings, const ipa::vimc::IPAOperationCode code) override; int start() override; void stop() override; @@ -66,7 +66,7 @@ IPAVimc::~IPAVimc() ::close(fd_); } -int IPAVimc::init(const IPASettings &settings) +int IPAVimc::init(const IPASettings &settings, const ipa::vimc::IPAOperationCode code) { trace(ipa::vimc::IPAOperationInit); @@ -74,6 +74,8 @@ int IPAVimc::init(const IPASettings &settings) << "initializing vimc IPA with configuration file " << settings.configurationFile; + LOG(IPAVimc, Debug) << "Got opcode " << code; + File conf(settings.configurationFile); if (!conf.open(File::OpenModeFlag::ReadOnly)) { LOG(IPAVimc, Error) << "Failed to open configuration file"; diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index d2f2e460..df749bf7 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -471,7 +471,7 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) data->ipa_->paramsBufferReady.connect(data.get(), &VimcCameraData::paramsBufferReady); std::string conf = data->ipa_->configurationFile("vimc.conf"); - data->ipa_->init(IPASettings{ conf, data->sensor_->model() }); + data->ipa_->init(IPASettings{ conf, data->sensor_->model() }, ipa::vimc::IPAOperationInit); /* Create and register the camera. */ std::set streams{ &data->stream_ }; diff --git a/test/ipa/ipa_interface_test.cpp b/test/ipa/ipa_interface_test.cpp index 3c0df843..b9fa15cd 100644 --- a/test/ipa/ipa_interface_test.cpp +++ b/test/ipa/ipa_interface_test.cpp @@ -106,7 +106,7 @@ protected: /* Test initialization of IPA module. */ std::string conf = ipa_->configurationFile("vimc.conf"); - int ret = ipa_->init(IPASettings{ conf, "vimc" }); + int ret = ipa_->init(IPASettings{ conf, "vimc" }, ipa::vimc::IPAOperationInit); if (ret < 0) { cerr << "IPA interface init() failed" << endl; return TestFail; From patchwork Mon Aug 29 23:30:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17247 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id A72DFC3272 for ; Mon, 29 Aug 2022 23:30:41 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 658BB61FC3; Tue, 30 Aug 2022 01:30:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661815841; bh=gyFO5yZ8W3hKiEYdURUVdWjC+0Vjk0vpRcIuWdgK82I=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=x3c/RZgsYVuEjU7GZcNKrfnQMiv8gZTp1YdLCOgbjaVZ61cPqh36ihKEFzClFy1Kq qlXevJwhrh2dRFyhDKTolZsw6/vicdh8uQqt4U56DayTNp8V/pEyOt6brQZy8quFdi NDgkSXZY7PKxcub5j9AiYNMjtocON6fjvKig9BOwNrHY6gRJOqbL+oGfqLr7K48OpO odnbRIbM64EO/mLAZlmVhjYoVjXOplPqULUEqUShWyQwzt6XCQhwVkEswfrQLnUii9 s1wTSF6Uwyeo6BFjkf4vHP3fDRVBXAdEEwurH4EGjb6CC4bsLREkOBA4BjJfINuqtA mxJ77GUbuM/zg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C099E61FC8 for ; Tue, 30 Aug 2022 01:30:35 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="GQCjM/dA"; dkim-atps=neutral Received: from pyrite.mediacom.info (unknown [IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 827056F2; Tue, 30 Aug 2022 01:30:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661815835; bh=gyFO5yZ8W3hKiEYdURUVdWjC+0Vjk0vpRcIuWdgK82I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GQCjM/dAn/Pc6DvB+2fu3PuDequF2WjHaSVXcrp44pQBEC3nwnADwqwzGqd0taUow Beh87W172j+R8F+gcZX5rYL0cwKyo/p70YbGlD+7t9zc2SaCwRmtik8gDkX7FKoWBB QFyOzIUJ7/jEL+rB1Ar8atd/TjKDJBP8j0nmqW8s= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Aug 2022 18:30:17 -0500 Message-Id: <20220829233017.2699444-8-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220829233017.2699444-1-paul.elder@ideasonboard.com> References: <20220829233017.2699444-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 7/7] ipa: vimc: Add Flags to parameters X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" For the purpose of testing serializing/deserializing Flags in function parameters, add an enum class TestFlags and Flags to some function parameters, both for input and output and Signals. While at it, update the ipa_interface_test. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- Changes in v4: - make flags also passed directly (as opposed to const references) - remove [TEST] from commit subject Changes in v3: - s/TestFlags/TestFlag/ - add [scopedEnum] to enum Testflag Changes in v2: - use new attribute-based mojom definition for Flags --- include/libcamera/ipa/vimc.mojom | 14 ++++++++++++-- src/ipa/vimc/vimc.cpp | 20 +++++++++++++++++--- src/libcamera/pipeline/vimc/vimc.cpp | 15 ++++++++++++--- test/ipa/ipa_interface_test.cpp | 6 +++++- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 16149787..dd991f7e 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -17,8 +17,18 @@ enum IPAOperationCode { IPAOperationStop, }; +[scopedEnum] enum TestFlag { + Flag1 = 0x1, + Flag2 = 0x2, + Flag3 = 0x4, + Flag4 = 0x8, +}; + interface IPAVimcInterface { - init(libcamera.IPASettings settings, IPAOperationCode code) => (int32 ret); + init(libcamera.IPASettings settings, + IPAOperationCode code, + [flags] TestFlag inFlags) + => (int32 ret, [flags] TestFlag outFlags); configure(libcamera.IPACameraSensorInfo sensorInfo, map streamConfig, @@ -41,5 +51,5 @@ interface IPAVimcInterface { }; interface IPAVimcEventInterface { - paramsBufferReady(uint32 bufferId); + paramsBufferReady(uint32 bufferId, [flags] TestFlag flags); }; diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 5d494b63..9256bbba 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -31,7 +31,10 @@ public: IPAVimc(); ~IPAVimc(); - int init(const IPASettings &settings, const ipa::vimc::IPAOperationCode code) override; + int init(const IPASettings &settings, + const ipa::vimc::IPAOperationCode code, + const Flags inFlags, + Flags *outFlags) override; int start() override; void stop() override; @@ -66,7 +69,10 @@ IPAVimc::~IPAVimc() ::close(fd_); } -int IPAVimc::init(const IPASettings &settings, const ipa::vimc::IPAOperationCode code) +int IPAVimc::init(const IPASettings &settings, + const ipa::vimc::IPAOperationCode code, + const Flags inFlags, + Flags *outFlags) { trace(ipa::vimc::IPAOperationInit); @@ -76,6 +82,13 @@ int IPAVimc::init(const IPASettings &settings, const ipa::vimc::IPAOperationCode LOG(IPAVimc, Debug) << "Got opcode " << code; + LOG(IPAVimc, Debug) + << "Flag 2 was " + << (inFlags & ipa::vimc::TestFlag::Flag2 ? "" : "not ") + << "set"; + + *outFlags |= ipa::vimc::TestFlag::Flag1; + File conf(settings.configurationFile); if (!conf.open(File::OpenModeFlag::ReadOnly)) { LOG(IPAVimc, Error) << "Failed to open configuration file"; @@ -144,7 +157,8 @@ void IPAVimc::fillParamsBuffer([[maybe_unused]] uint32_t frame, uint32_t bufferI return; } - paramsBufferReady.emit(bufferId); + Flags flags; + paramsBufferReady.emit(bufferId, flags); } void IPAVimc::initTrace() diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index df749bf7..f85d05f7 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -54,7 +54,7 @@ public: int init(); int allocateMockIPABuffers(); void bufferReady(FrameBuffer *buffer); - void paramsBufferReady(unsigned int id); + void paramsBufferReady(unsigned int id, const Flags flags); MediaDevice *media_; std::unique_ptr sensor_; @@ -471,7 +471,15 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) data->ipa_->paramsBufferReady.connect(data.get(), &VimcCameraData::paramsBufferReady); std::string conf = data->ipa_->configurationFile("vimc.conf"); - data->ipa_->init(IPASettings{ conf, data->sensor_->model() }, ipa::vimc::IPAOperationInit); + Flags inFlags = ipa::vimc::TestFlag::Flag2; + Flags outFlags; + data->ipa_->init(IPASettings{ conf, data->sensor_->model() }, + ipa::vimc::IPAOperationInit, inFlags, &outFlags); + + LOG(VIMC, Debug) + << "Flag 1 was " + << (outFlags & ipa::vimc::TestFlag::Flag1 ? "" : "not ") + << "set"; /* Create and register the camera. */ std::set streams{ &data->stream_ }; @@ -608,7 +616,8 @@ int VimcCameraData::allocateMockIPABuffers() return video_->exportBuffers(kBufCount, &mockIPABufs_); } -void VimcCameraData::paramsBufferReady([[maybe_unused]] unsigned int id) +void VimcCameraData::paramsBufferReady([[maybe_unused]] unsigned int id, + [[maybe_unused]] const Flags flags) { } diff --git a/test/ipa/ipa_interface_test.cpp b/test/ipa/ipa_interface_test.cpp index b9fa15cd..cec943f0 100644 --- a/test/ipa/ipa_interface_test.cpp +++ b/test/ipa/ipa_interface_test.cpp @@ -106,7 +106,11 @@ protected: /* Test initialization of IPA module. */ std::string conf = ipa_->configurationFile("vimc.conf"); - int ret = ipa_->init(IPASettings{ conf, "vimc" }, ipa::vimc::IPAOperationInit); + Flags inFlags; + Flags outFlags; + int ret = ipa_->init(IPASettings{ conf, "vimc" }, + ipa::vimc::IPAOperationInit, + inFlags, &outFlags); if (ret < 0) { cerr << "IPA interface init() failed" << endl; return TestFail;