From patchwork Fri Aug 26 15:44: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: 17207 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 C9712C0DA4 for ; Fri, 26 Aug 2022 15:44:35 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7F33D61FC8; Fri, 26 Aug 2022 17:44:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528675; bh=vWdOx//zLDaQIWBu9M75u2XVZc87j7dCUeLyt2XafUI=; 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=y8hyU8zFFjdBLZDDr3Gyj49eJTZRl5I7FsaqMv41iKVaSU/B1kOwUDH8VRwjQeYed fhE8sm72eVAWHPf23OueBzorCcPKkniUkP/pmK0QqW4KyVIIYv88BnEgjK88poirKf yr7CpF41PckxQ25pGCisH+hM94/FKCIzhqCe/UwB5KTK60Ryih2jqW9mJY/93VI7Vk NLgjly4/m2ozgJbsu8ti4UaEcmxp+rDyWvuSFQyyxATUUdSy1xzklYazcMwGwnDoeO Lepks7r2yCjDOuHEUsDQ0vxy4ZscRnEJE9Y3mdmVEQVtY3wV7Qm7wyBqTcfa8caq0X rbtE/3AEJ7QNg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5D3F161FBB for ; Fri, 26 Aug 2022 17:44:31 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="bZgtJHpb"; 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 DCCFE3F1; Fri, 26 Aug 2022 17:44:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528671; bh=vWdOx//zLDaQIWBu9M75u2XVZc87j7dCUeLyt2XafUI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bZgtJHpbgGVFQ4noqK14fLtd46TaPyvTjGpCbmUKOfLwJq7sW6SegRM29hlh3Sos6 B5TAcqKaHlvKZAKYfLfn6V1VVQODv1AKMS6nFXGTrBIPbiOX8rBVJy66vPkL13Thgb SfJq/QEx7LZBez0A7CYBsU3J0T3X/2iiVn/hVyZk= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:13 -0500 Message-Id: <20220826154419.4099372-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 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 Fri Aug 26 15:44: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: 17208 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 BE7FFC0DA4 for ; Fri, 26 Aug 2022 15:44:36 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 36DD661FCA; Fri, 26 Aug 2022 17:44:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528676; bh=IxFSiWGSzsiGxLtILB+AtR6jLdWwt4vkvdZm+aOgHII=; 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=I2//k/zkwdlsA4Nnunofnu3cpIsQEXgSRpnoIF/io684Ev3vAZ5xVlutDvmLR5Imr Cqhph3YWRfJFt6/OnvWKjzHOePGXeyiTRfS6KFvdrrAjnu8V62QGHR84fPomIVYMHa PkmJYeB/yioCOXO15DSV4TEjlQ6/m5hpU+WiMpYojScIoH5Kfz6HWs8c1ObFojn9Oz HSbGEI/No1kgERRKbkGBVbxwoHaZ1sZdXD5MxAvCHgpR9GPuAc5UnLd8S8AhQaEYsX TC4OWJW+xFqEFVtwID7air08I4Ns8Vuoj8GXZ9RHnjIsWqKmb7JJ6fLSLeiVVIyM7F ZdUvkXhn/SJsQ== 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 90E7E61FBB for ; Fri, 26 Aug 2022 17:44:32 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="fzNRvpXs"; 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 850B62B3; Fri, 26 Aug 2022 17:44:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528672; bh=IxFSiWGSzsiGxLtILB+AtR6jLdWwt4vkvdZm+aOgHII=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fzNRvpXsxb064MJP/fzOzxZvz4FIkO+yqbR/QDC09IW02XrPXl6t050ED8lsNFQ0F 1TOnWs50SARLBYlnZhH35uR/oE3xjnKBaIlRxN/H1YfASlXRAJ06YTvX/x3NxE62EC 3DtU1AIiLjIeLzVP6IfxKeafj7LzdIAj+YGDl79g= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:14 -0500 Message-Id: <20220826154419.4099372-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 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 Fri Aug 26 15:44: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: 17209 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 C95DEC0DA4 for ; Fri, 26 Aug 2022 15:44:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2831D61FC5; Fri, 26 Aug 2022 17:44:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528677; bh=rmQpjLQZHsKVokFD6pzioHyuH+K6kzwivw1jck3vgD8=; 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=NOv+3ELoTN0F2cQKLWwCMXhZ/NFbjr+HOUknOYmvYyPfur21WRFk0U8NNQfpqm34M I9KJXgst3QN9WgzAkvtMBwZuu1vsL5aGFYO/YEKIhtkpYzsUGQuA0RIaXAJAfp0SnO 7hsVMOM+xwiRj75ZVsA0r/96DI6gbWuRxaAL6uADTF2qksZ/ExHmv5LOY6gWH3K5SB wLYzlkHrAbL1jIY46qh1l1mFAPv9TAa/ZTEDKAlI7mW5m0hZh66Z0NW+CZpp3mRUUs EKy9MY6tAGwhWITn9ASoEk4DW68r3P56L2FjJTS9QQ+Cnyzdsecxl1FODtTh3QmvIN 0xcEOP0eZeX8A== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DE7AB61FA2 for ; Fri, 26 Aug 2022 17:44:33 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="CEMO35Yh"; 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 A41EC3F1; Fri, 26 Aug 2022 17:44:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528673; bh=rmQpjLQZHsKVokFD6pzioHyuH+K6kzwivw1jck3vgD8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CEMO35YhzKswi5xMaPyqo02nyl91MaD6Ri/UzrPFD/rCDbHVNW+8Wjff13IuuCKf+ D/IhNIrSTyN2J8c8iYG+snYjTwwJQP5LCyBaAgYX92F0teHrUs743ZX0VSqJzlK0Du F6Tsj3Ve2+ZPoi1fLvREN0pezDUZBWEO4UDySk/A= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:15 -0500 Message-Id: <20220826154419.4099372-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 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 Fri Aug 26 15:44: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: 17210 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 5B8DAC0DA4 for ; Fri, 26 Aug 2022 15:44:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1580161FD2; Fri, 26 Aug 2022 17:44:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528680; bh=d5fCOfVqrda4N82+q2mGC3I1rfmX1OMctWv7DHy9bhE=; 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=CSXgkyRh8eFG3XUug4jUzs+EuDN4KXR227RVJX9MFWxhVo1jm30LxkDn1wofU6Kze 7i3pucUlMe4uJYVSulH/MLBIW1rEM4DEFLswT00tbd8EGFkqXRXPrW4gNGF06TsioZ xHAhKSrNlq8TmJY1oz4KHmPYrvbZfi3ioEajOXteXuDxbyAud1SmSbHCR5JzvMtcP1 m8EHJBZ6p78RJqLYnmla9uFc94/Pl4oHdwCtr1NGDlljWnszrOdtiJZwFj03aFR+5P +TgpXOIiOr51CEweQe8EbQHnsUssBPi6nUVJo76Ry1y7YAGLfhbUzP93OnW11B0MK3 E/chL5XA8DCzw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0EE3461FBB for ; Fri, 26 Aug 2022 17:44:35 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="sRSQ9t6O"; 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 191A9547; Fri, 26 Aug 2022 17:44:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528674; bh=d5fCOfVqrda4N82+q2mGC3I1rfmX1OMctWv7DHy9bhE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sRSQ9t6OvxkheeKoUXhpwuAtgOwYrY99gEzpMTfdp5VxrffCprDrpUZuK2S5V/FjW 58i4baz2SuaTR66/7/wftiQaascrzKnSk19u1zcQqCgVY167qkAYWAx86wUJ8ujG9a eCyNFYHt4YT1hLHYUCeDvDRs1tKojTQ17cMaOUG0= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:16 -0500 Message-Id: <20220826154419.4099372-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 --- 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/ipa_interface.h | 1 + .../definition_functions.tmpl | 2 +- .../libcamera_templates/proxy_functions.tmpl | 10 +++++-- .../libcamera_templates/serializer.tmpl | 4 +++ .../generators/mojom_libcamera_generator.py | 29 +++++++++++++++++-- 5 files changed, 39 insertions(+), 7 deletions(-) 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/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..d7fe2031 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) and not IsFlags(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 Fri Aug 26 15:44: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: 17211 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 C7D3DC327D for ; Fri, 26 Aug 2022 15:44:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 751B261FCB; Fri, 26 Aug 2022 17:44:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528680; bh=B3IpfrJu1ZQn5Z4bAjb0etf6JChLMz1BILYAvJsw77g=; 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=JH3bEUMgOgiU3A35omOroaJks+rnjGgpPHkqWM/SRn1at5MxiS9dN0DryOklCTjvc 7WMiTZgzdYW6OXflrvJFhdBNMMPPc3demMuHUeI3ynwkFYZPkxsRfJUuGt1JOdaay0 +TmZCp6E4D3vO6gWDK06ww0boD3pY9ietlCTpB0cvxrEkZCw2NhCq+O34s6qbkbvYB eQzqfWhfk0VVS8TefcJLjGlJZvOVE93Pg/PLLDNZ3XaTx5W+u1T+d5SKOxirl7/a/3 IbbPB3OxKhj+oHysykAD5G8fj+pXNUq2c5IbqK38Tmf9qKx1bdamD5Z9EYnsh60U8I D+PBgcqdJLvAQ== 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 56CE961FCB for ; Fri, 26 Aug 2022 17:44:36 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="DR6cG4SB"; 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 254272B3; Fri, 26 Aug 2022 17:44:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528676; bh=B3IpfrJu1ZQn5Z4bAjb0etf6JChLMz1BILYAvJsw77g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DR6cG4SBYNfBpq2SLKPbyZXJXGJ7b3GAJG0cNFM4xv7LHyYeeZaM8UDgr3R0ZTPWU JIRTtxviolI1MUsCI+Tkth6Au0a4MzO3/pPEvpS+E5tG16pZKUho508aHKlCIkEaU3 cKnUwGvIv6Dm2akhSEWnWeMhKXkyTn3rLNf//8SY= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:17 -0500 Message-Id: <20220826154419.4099372-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 --- 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 Fri Aug 26 15:44:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17212 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 8A346C0DA4 for ; Fri, 26 Aug 2022 15:44:41 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2F00061FD6; Fri, 26 Aug 2022 17:44:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528681; bh=+FHJ6QecNeYmfX84qym7VMdWK5PTUfG8B01xcFDTLEY=; 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=Aocbmh1b0EXbRgTZcqdyyLDErYO4OlXfVymHExdiypQ1ggNDBuZkuuRHq7p6nIjJH XfR/93hhA/kuZ6JFtEldZ+DYB2ZWcERZa1WuKqHIeFdNYtW5xjmGqdRzLh7fmSpLcE lkef0IICqpNRrm8k1pj4BKoggonexK9sQAe5wfSeR7twGRerZGqXkuNuSwbKcuPjxG FUb4oWjgB4B5gxSgxjmEcOxfzAShn5tgMRb4Lll9hNSmGsU6nPmvbBeU/hrFE/jpA4 DgLQkohgMwrb3jvO4j5FIkyGQvfj9GPyAxKH6fefOrvvCo/zhqxobEoEvEB5IpCtuG gRhWZ206ONgLw== 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 CE99861FC4 for ; Fri, 26 Aug 2022 17:44:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="biBrlvrL"; 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 8A5613F1; Fri, 26 Aug 2022 17:44:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528677; bh=+FHJ6QecNeYmfX84qym7VMdWK5PTUfG8B01xcFDTLEY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=biBrlvrLJe332pOB33M63P5AwaPMUosW19ZwkBMOseE5fVGtNuo6YFYTpNOHhEpyB CpNMQs8L2rkwKGPyq2lEKENr3j6DarIApAFEFVL3V97u7PAWKIjiLTP/7DK4KYh0xr W2Z3DGX0U7XjWig3KeicvDKANJ8+M+bE535Oh1BA= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:18 -0500 Message-Id: <20220826154419.4099372-7-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 6/7] [TEST] 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 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 Fri Aug 26 15:44:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17213 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 3FE6AC327D for ; Fri, 26 Aug 2022 15:44:42 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E502F61FD0; Fri, 26 Aug 2022 17:44:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661528681; bh=U5FfIX3ukRC13pPIGaC9TSCC1Vzh2VnTK5BkeAE93j8=; 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=1GLEp9ITR5CNtVvp2itVghOwv+0gxMYq/z2m7mvU9g2yMFgpI2nOIJrXUJ1caYHYH QTavN3ZtvMDBFBRBiIROukhAtxjndG+wPcjdN9Y46ZgKrq2L/13zs3tDMSwrvqn/OV EdM6fDz2012wOwNQ0lFl0fBdnnxr6p0qxWkRMpr3MQmMWsjYY7f2x2ntDayELPbJ3T ERMOwtvdhAKzDQvgnXQpaZCTG/NBMtk8YnFtB1IC+aJg0dOPmihyqFl48VIVV/36aD qqxD2qGkxLaOr7FssMSL+p3WwpNDNlrreupzSQPIcEEvPz1ggnKyfyI9JO/8ZVQUOc 9mNt/G2/QkX0A== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1EF9B61FC4 for ; Fri, 26 Aug 2022 17:44:39 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vr9BdDYH"; 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 F2C312B3; Fri, 26 Aug 2022 17:44:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1661528678; bh=U5FfIX3ukRC13pPIGaC9TSCC1Vzh2VnTK5BkeAE93j8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vr9BdDYHaNszh30CiPQ+T7dq5ZTj/1dNrzrF1aM1+tIO6Bd4vnQU/vLTZJZsRpjD2 5/44rlUtnqKXSy4x9+nbptgMK7zSkUuEORY82x1nmFNCxtaPS0delgw6u8779jvqsG Cm9mDoU6WGNmE1rNHN14tEustp/Xi9XKIKyY74i8= To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Aug 2022 10:44:19 -0500 Message-Id: <20220826154419.4099372-8-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220826154419.4099372-1-paul.elder@ideasonboard.com> References: <20220826154419.4099372-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 7/7] [TEST] 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 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..e5744ed1 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..95b4adaa 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;