From patchwork Thu Aug 18 06:49: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: 17147 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 27DFAC3272 for ; Thu, 18 Aug 2022 06:49:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D9C6261FC3; Thu, 18 Aug 2022 08:49:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805379; bh=bDvORoIUe0uTvaji4up/ANrXfR+JDCGHoGlryz7BcPI=; 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=EoH2yr8iIWTxH5FFmNMmH1asero5Sc6qwWIyVJC5PEyIPDMfyc6+rC7TPO95FLjko SoHmyp2FfOF6oVypMv1T449KGhUpt805KpdiDJwjFN79DaQIp3sudkpZQi0CxbSY2t FnHhr8GfKPxKPosI2L9sHf9A/vsUTOKpJe8/2Be693Nfli2bf9L5PSZosNAAkliKeA F15fsGf3vyk8yLzCX4cCuWnb6OwyEOOGLUiugQDGUXdX7kegNxYB+F9NNWZt9KfWcr cRfG2hEwGn737G2At1h2AI8WOMNy97Javj3fjoRfNitDX+UiXs2SKVnkJwfF0ZTc6e XqVkjsqJUwXUQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 26F9661FA3 for ; Thu, 18 Aug 2022 08:49:38 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="e+WnHS/F"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F11734A8; Thu, 18 Aug 2022 08:49:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805377; bh=bDvORoIUe0uTvaji4up/ANrXfR+JDCGHoGlryz7BcPI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e+WnHS/FEANwxf4CJaiYpO5wF5D4VZC4zh5f+JjRca56Q01G1OPufZ/s96pVB6wfe O2CbNFhkYkA7vLsRuY/OWyydN3jrW5GCLKGx8kDXFVIH70Vrmr8oGxcmj0RfTOmxb2 GD6cMM5ayk/rgDJ47kxKCYTtnJhEePdueZSkEvgY= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:16 +0900 Message-Id: <20220818064923.2573060-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 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 Thu Aug 18 06:49: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: 17148 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 A6FF1C3272 for ; Thu, 18 Aug 2022 06:49:41 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7049D61FC6; Thu, 18 Aug 2022 08:49:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805381; bh=FPxIVhUWlgSwS6C9jBbIlUYDOVAkWvM8Y63TJdGGpt8=; 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=YLNjclYl6KSpOCWQ218sSTJGhEROJmAryCZqtBnV8JrrK2JxWgvAz6r3ReaI742T0 Y9yw5gVhGJYP6/9JfKmU6fgV/TT9L3itX0XsIRynYE1hg7tpa3cdYCyectI/xeXeeJ VkZhJZ/ibaMI2NQexCYfM3sXx41UMVxzRQ6r776VEUsjzgCA0UkDW98aqaiI7n15nF tCHY36WltZ16/xUHJ6PTulTi6q6dimEiv4iPWgDEsyENBOhiHgF3QvxM0znPc/pCus fKE7xZR7azxZOEv8etwKmQzTMrVls3CIR1Grk9u4f6cVEt8BNM9FJQt67AzNksmxqE 6gapk9L794XUA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5B87661FA3 for ; Thu, 18 Aug 2022 08:49:40 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="RuSuQ56D"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 96B5E4A8; Thu, 18 Aug 2022 08:49:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805380; bh=FPxIVhUWlgSwS6C9jBbIlUYDOVAkWvM8Y63TJdGGpt8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RuSuQ56DmNFrgpDQKme9KWEmGbGTAzKJPYLROqlEdNElTVcqno4+np0dqnjBKQUuw TYIxipzUGl1VxTEw2HA3rXHl0cqV2v036mq3vBYS4IiSvSciKgy8jknvld/a6RRreS pmZNWivFMmSTTPbKFZLRC2AwADSBXeHk9rPkyYS0= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:17 +0900 Message-Id: <20220818064923.2573060-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 --- 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 Thu Aug 18 06:49: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: 17149 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 40072C3272 for ; Thu, 18 Aug 2022 06:49:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F1FB761FC9; Thu, 18 Aug 2022 08:49:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805384; bh=pxIiDs65YU5IvNRL26MqLAg/N5wkumWmK36N6xO+SYA=; 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=GSReYMq5BEtTmFG9AcrR7QyfL0wIMEbQo+m7x3OihiDysFaR8hXA4IaxtbGTHVaIa MG01GFiX3AoCsf0wPqQP0k6U0P+G7SOBY5L8CPSnhin+LtyasQI3rs5czxl+eGTMdP M9oXN5rlrurQpK8qb+A23FqKO17DLCTY/mY9zFu8EFQIk5BHlznx5EhACbMVt1mLHV kiVNaUV3eKbuJzMzhhM884NsMbkGM1vkg7PEz9+cDEmJnQEE7WKrLdmq6BF8SWxwbh BDBoBrV9stc7YGMnk5mp31NzkQusVM7w2pEZdMjgNBmGWa2mFUvom87WxLV/qWSuki JCWmmWzyJblgw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4FF6961FA3 for ; Thu, 18 Aug 2022 08:49:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="F47Hp9OY"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A8B2D4A8; Thu, 18 Aug 2022 08:49:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805382; bh=pxIiDs65YU5IvNRL26MqLAg/N5wkumWmK36N6xO+SYA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F47Hp9OYlbJ+Nm4+40BTQY/l0FkoIGchJ5W9c9Sl9XYl2HXlQyCcwm9nyOYmIIQcz NssH7aEDRDyHVMTlnAC4uHMuBuz5tjaeaLbBLnYt1tz9VvnS5fO8gnOUwlXdKZNTcU o3j5pF0NMiqGv4CJMxrNld6IxN59oF3FpMDiL1pY= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:18 +0900 Message-Id: <20220818064923.2573060-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 --- 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 Thu Aug 18 06:49: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: 17150 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 D11A6C3272 for ; Thu, 18 Aug 2022 06:49:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 97BF561FCB; Thu, 18 Aug 2022 08:49:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805385; bh=FgXZX85vMNdhkD2BbjNvYNq4SD2K4AepZVEriwSojt4=; 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=bCRZpya7jF3CDiCcpQWPB0dASfRYY8eQYDQH2rOncpdbCu6+KZYnYWFYEkzsJA/Gf rUSzHKYY72motXGtcRpYAXDi5ICUjxBiu5vEVCSb5zH08UINPCM63jWtDmEZatmyMF q/lHOKb2r6wLhil7KNc++WPkc8z3czycIN2ka/S6jze1frPN5M9NDb5ZFcBqExRFJO pzONUYywxcVOiMEE70EDcHQQyM1lQZ+BZx125A/lC3/VS3fibxuohVjuf3dlM/egg0 XCzIuiA2UWd3KXO//JWM3iAPBMFabqcotICC3Tom5/aQhuikHCn3s9Bfg8pbDB/UJ0 0kp43woXmEnbg== 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 3609F61FCB for ; Thu, 18 Aug 2022 08:49:44 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="WpNZliSQ"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B8DE34A8; Thu, 18 Aug 2022 08:49:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805384; bh=FgXZX85vMNdhkD2BbjNvYNq4SD2K4AepZVEriwSojt4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WpNZliSQEWNEU9R/7hxZmwOSyMVP26WiKPuj8txTIEKyH6xvjoMMJMncbmuHRxAIf bMW7URUMuXYWqoQAmP5S5zks51lSURAzQtHhq8MSgwgS7HDBnEMzUgQ1G1MCptSa2S Fn6Hc6ZqxuKE7MAh1zi/cymi6h/AtD3OOc2NXGOk= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:19 +0900 Message-Id: <20220818064923.2573060-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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. The [Flags] attribute can also 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 --- Question for reviewers: Should we use a different attribute name to specify that an enum should be an enum class? My rationale here was that if you want to use an enum for Flags then you put the [Flags] attribute on it, then it'll be generated as an enum class, and just like how in C++ you have to wrap E in Flags<>, the analogous form in mojom is the [Flags] attribute. Also, I did try converting all enums to enum classes; it broke a lot of raspberrypi stuff because they expect enums to be usable as both flags and ints (as far as I could understand)... 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 | 23 ++++++++++++++++++- 5 files changed, 35 insertions(+), 5 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..fa185177 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_flags}} {{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..5534b24e 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 \ @@ -223,6 +225,15 @@ def IsEnum(element): def IsFd(element): return mojom.IsStructKind(element.kind) and element.kind.mojom_name == "SharedFD" +def IsFlags(element): + if not hasattr(element, 'attributes'): + return False + if element.attributes is None: + return False + if 'Flags' in element.attributes: + return True + return False + def IsMap(element): return mojom.IsMapKind(element.kind) @@ -251,9 +262,13 @@ 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): + if mojom.IsEnumKind(element): + return element.mojom_name + return f'Flags<{GetFullNameForElement(element.kind)}>' # structs if (mojom.IsEnumKind(element) or mojom.IsInterfaceKind(element) or @@ -311,6 +326,11 @@ def GetFullNameForElement(element): if namespace_str == '': return name + + if IsFlags(element): + name = re.match(r'^Flags<(.*)>$', name).group(1) + return f'Flags<{namespace_str}::{name}>' + return f'{namespace_str}::{name}' def ValidateZeroLength(l, s, cap=True): @@ -408,6 +428,7 @@ 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, From patchwork Thu Aug 18 06:49:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17151 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 79A41C3272 for ; Thu, 18 Aug 2022 06:49:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 48EF961FBC; Thu, 18 Aug 2022 08:49:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805388; bh=ddiDn4wIQpHPXpH+3oQHD9fg+6Q9Y6R+CrEvhwYRXHg=; 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=0y2jDMtA9ANObfiultZT4eXTGWtKz7PMNzck88Y5KmA/b2/MTn7OhZNZz43ysghkk nIG5lYlMy/aOsWvUq14TfJnVcU/WmajyOiqRlv1RaPRbVQWH2j+dbDAMKjpFS2JISX nQAar4wPj5105m/BrD1K5oA2i56r0qgU5TS0n9Pr0DjamuLM/k2mjsgHqLYlNSTepY B687vRUzLhWUP+vCy5LakibgSE3fsIRqMwTwAnvIdsVYn57um7G6UVKUve4wZBdl5p lmmRdYvNKVlpxSeQuOALN0vz87V6jv8HlmeFKS7aSNK6Mt1W7lY24YQhIsL3TMMp0S aB8OgXEcq2AAQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 28CBF61FBC for ; Thu, 18 Aug 2022 08:49:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="kxDxwbWE"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A4E0F51C; Thu, 18 Aug 2022 08:49:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805385; bh=ddiDn4wIQpHPXpH+3oQHD9fg+6Q9Y6R+CrEvhwYRXHg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kxDxwbWEN1khBOH8f4+VnKQq/lFFVZPOiDmySohZsKF1OkqErhwBfxQTqOk/O519n kF8X0c9gDP2krBfFjCbJIuTBvPTTphk3GhFeI7kc+SkXMXT62SoZ7E/YlFqS8pUogt FIHiiyNzhvsELVGDgiOANqBOq0145iAGm3cNlzoU= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:20 +0900 Message-Id: <20220818064923.2573060-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 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..698f4e89 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, }; +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 Thu Aug 18 06:49:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17152 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 DF6DEC3272 for ; Thu, 18 Aug 2022 06:49:49 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A160161FD1; Thu, 18 Aug 2022 08:49:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805389; bh=npUDbZLGool3VOVqx9GoDbsppFUywqhIh7ngaY1b6BI=; 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=NL2iopJy7cVz2Vz7RP7ulskBJzW33igBjvUeihR/0lRsTB/IM7t5Y8q7kxlrNPXCt ZZw7II4xs4z6F5nOp3TqReR7fLgXutxTTCcpzxTc+lpVQ8aZBXs2KT47UJZhFH//hY ubTFWqyw3UU3ettkNnEeQfgsArIK0qvoTqD7APp6AATq68yYWay2b5ByFuBnNyDzZ9 NH3a9kdfRo3QhRWyLS5AO7QxnNenalcAbksvr4RF2vbl2YfLTzfl9T8ndJ/+wStjg3 VohLXonfnMPBTrzP5KBGKlx1qytDZyLiJ2psdly4+0wJTxDxto5jdd3pQZIteKeWU0 1PZrR9hkmThIg== 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 EE1ED61FA3 for ; Thu, 18 Aug 2022 08:49:47 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vjW4o2p5"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9BA1056D; Thu, 18 Aug 2022 08:49:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805387; bh=npUDbZLGool3VOVqx9GoDbsppFUywqhIh7ngaY1b6BI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vjW4o2p51VXRRl9I1JD9O4s9Y2UqBLNmvHTc1kIllLTUztydiNf/oyhogcUUMTQs3 XEuVyZjIh+OwjERw7EzxzkAAwyZAmAYOK0NGN8xLxC1XzB8r5tw18d/Ec4weyfNUSo XI/d9DqDT4Ieft23XPZhc240ah5F7b2ARwBMAdAw= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:21 +0900 Message-Id: <20220818064923.2573060-7-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 --- 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..6bf39a1c 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 153cf849..983bd514 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 Thu Aug 18 06:49:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17153 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 4FA9DC3272 for ; Thu, 18 Aug 2022 06:49:51 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0CFAA61FD4; Thu, 18 Aug 2022 08:49:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1660805391; bh=8wG9DxocDQCfQ+PTkwmkOOlfdCW2U6NvA1pxl5SZGU0=; 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=B9fMb5GgICl1LgpxDZuocTeP4T0XlQSKrlquyeJgZ2BtV9D4d1dafr2h0z0MLQ53u 8Y/d8/QbSWSSlvKJ+uFtOjxTxEk4SHOMuQ3zPN0OOboZA7XUB4lSRH8dTm9fGcsa0n 6GrQsvNUp3ssPNiv7ZBFRxMBS85003Ch7CL+WtVfq3+KRnc2HSvHlaj6bXjtmDYFAh QoPMBAbeC5PRngwy5YbUIFsSTHeJm/KB9RAdgJaCei9H0C3foIlDvmTshQ0udtk7q7 4txGz854d2VgI+c2v+5lJ201G+qzlBCpmUzp8r+mmbd7IW7jyhUeoCQLGBhk+/NyBz QbUsNc3I7zZtg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D72CA61FD4 for ; Thu, 18 Aug 2022 08:49:49 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="hpriGal6"; dkim-atps=neutral Received: from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 64B724A8; Thu, 18 Aug 2022 08:49:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1660805389; bh=8wG9DxocDQCfQ+PTkwmkOOlfdCW2U6NvA1pxl5SZGU0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hpriGal6XnOstTE7sVnfYn374vW6kJNuattpzUS4C3KDAyJLkN/nn+XYOWnZ2jf/I UkYAp4U76lNnfzRXpEMRxnCp+hqmB+5TkO1Fmz1bb6VEggMxeEDqEDkc/mzHwAPMU/ 6kWNQuaVgxO9OZ2t2LQO2WRM4WNVsylNK2IJJVNI= To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Aug 2022 15:49:22 +0900 Message-Id: <20220818064923.2573060-8-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818064923.2573060-1-paul.elder@ideasonboard.com> References: <20220818064923.2573060-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 v2: - use new attribute-based mojom definition for Flags --- include/libcamera/ipa/vimc.mojom | 14 ++++++++++++-- src/ipa/vimc/vimc.cpp | 21 +++++++++++++++++---- src/libcamera/pipeline/vimc/vimc.cpp | 16 +++++++++++++--- test/ipa/ipa_interface_test.cpp | 6 +++++- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 16149787..15948d77 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -17,8 +17,18 @@ enum IPAOperationCode { IPAOperationStop, }; +[Flags] enum TestFlags { + 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] TestFlags inFlags) + => (int32 ret, [Flags] TestFlags outFlags); configure(libcamera.IPACameraSensorInfo sensorInfo, map streamConfig, @@ -41,5 +51,5 @@ interface IPAVimcInterface { }; interface IPAVimcEventInterface { - paramsBufferReady(uint32 bufferId); + paramsBufferReady(uint32 bufferId, [Flags] TestFlags flags); }; diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 6bf39a1c..bb4ca355 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; @@ -65,8 +68,10 @@ IPAVimc::~IPAVimc() if (fd_ != -1) ::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 +81,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::TestFlags::Flag2) ? "" : "not ") + << "set"; + + *outFlags |= ipa::vimc::TestFlags::Flag1; + File conf(settings.configurationFile); if (!conf.open(File::OpenModeFlag::ReadOnly)) { LOG(IPAVimc, Error) << "Failed to open configuration file"; @@ -144,7 +156,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 983bd514..e74a8679 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,16 @@ 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; + Flags outFlags; + inFlags |= ipa::vimc::TestFlags::Flag2; + data->ipa_->init(IPASettings{ conf, data->sensor_->model() }, + ipa::vimc::IPAOperationInit, inFlags, &outFlags); + + LOG(VIMC, Debug) + << "Flag 1 was " + << ((outFlags & ipa::vimc::TestFlags::Flag1) ? "" : "not ") + << "set"; /* Create and register the camera. */ std::set streams{ &data->stream_ }; @@ -608,7 +617,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..47c7352b 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;