Patch Detail
Show a patch.
GET /api/1.1/patches/17150/?format=api
{ "id": 17150, "url": "https://patchwork.libcamera.org/api/1.1/patches/17150/?format=api", "web_url": "https://patchwork.libcamera.org/patch/17150/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20220818064923.2573060-5-paul.elder@ideasonboard.com>", "date": "2022-08-18T06:49:19", "name": "[libcamera-devel,v2,4/7] utils: ipc: Add support for Flags", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "2ba4b801797adfef859888b520fdad57625ac621", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/1.1/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/17150/mbox/", "series": [ { "id": 3424, "url": "https://patchwork.libcamera.org/api/1.1/series/3424/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3424", "date": "2022-08-18T06:49:15", "name": "utils: ipc: Add support for enums and Flags", "version": 2, "mbox": "https://patchwork.libcamera.org/series/3424/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/17150/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/17150/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D11A6C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 18 Aug 2022 06:49:45 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 97BF561FCB;\n\tThu, 18 Aug 2022 08:49:45 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3609F61FCB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Aug 2022 08:49:44 +0200 (CEST)", "from pyrite.rasen.tech (KD027085204050.au-net.ne.jp [27.85.204.50])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B8DE34A8;\n\tThu, 18 Aug 2022 08:49:42 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1660805385;\n\tbh=FgXZX85vMNdhkD2BbjNvYNq4SD2K4AepZVEriwSojt4=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=bCRZpya7jF3CDiCcpQWPB0dASfRYY8eQYDQH2rOncpdbCu6+KZYnYWFYEkzsJA/Gf\n\trUSzHKYY72motXGtcRpYAXDi5ICUjxBiu5vEVCSb5zH08UINPCM63jWtDmEZatmyMF\n\tq/lHOKb2r6wLhil7KNc++WPkc8z3czycIN2ka/S6jze1frPN5M9NDb5ZFcBqExRFJO\n\tpzONUYywxcVOiMEE70EDcHQQyM1lQZ+BZx125A/lC3/VS3fibxuohVjuf3dlM/egg0\n\tXCzIuiA2UWd3KXO//JWM3iAPBMFabqcotICC3Tom5/aQhuikHCn3s9Bfg8pbDB/UJ0\n\t0kp43woXmEnbg==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1660805384;\n\tbh=FgXZX85vMNdhkD2BbjNvYNq4SD2K4AepZVEriwSojt4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=WpNZliSQEWNEU9R/7hxZmwOSyMVP26WiKPuj8txTIEKyH6xvjoMMJMncbmuHRxAIf\n\tbMW7URUMuXYWqoQAmP5S5zks51lSURAzQtHhq8MSgwgS7HDBnEMzUgQ1G1MCptSa2S\n\tFn6Hc6ZqxuKE7MAh1zi/cymi6h/AtD3OOc2NXGOk=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"WpNZliSQ\"; dkim-atps=neutral", "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", "Content-Transfer-Encoding": "8bit", "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": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "From": "Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>", "Reply-To": "Paul Elder <paul.elder@ideasonboard.com>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Add Flags<E> as a supported type in the IPA interface.\n\nIt is used in mojom with the [Flags] attribute. Any field or parameter\ntype E that is prefixed with the [Flags] attribute will direct the code\ngenerator to generate the type name \"Flags<E>\" and appropriate\nserialization/deserialization code for Flags<E> instead of for E.\n\nIt is usable and has been tested in struct members, function input and\noutput parameters, and Signal parameters. This does not add support for\nreturning Flags as direct return values.\n\nThe [Flags] attribute can also be used on enum definitions, which will\ninstruct the code generator to convert it to an enum class instead of a\nraw enum.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nQuestion for reviewers: Should we use a different attribute name to\nspecify that an enum should be an enum class?\n\nMy rationale here was that if you want to use an enum for Flags then you\nput the [Flags] attribute on it, then it'll be generated as an enum\nclass, and just like how in C++ you have to wrap E in Flags<>, the\nanalogous form in mojom is the [Flags] attribute.\n\nAlso, I did try converting all enums to enum classes; it broke a lot of\nraspberrypi stuff because they expect enums to be usable as both flags\nand ints (as far as I could understand)...\n\nChanges in v2:\n- Use mojom attribute to specify that a field should be Flags<E>,\n instead of using a magic type name format\n---\n include/libcamera/ipa/ipa_interface.h | 1 +\n .../definition_functions.tmpl | 2 +-\n .../libcamera_templates/proxy_functions.tmpl | 10 +++++---\n .../libcamera_templates/serializer.tmpl | 4 ++++\n .../generators/mojom_libcamera_generator.py | 23 ++++++++++++++++++-\n 5 files changed, 35 insertions(+), 5 deletions(-)", "diff": "diff --git a/include/libcamera/ipa/ipa_interface.h b/include/libcamera/ipa/ipa_interface.h\nindex 50ca0e7b..8afcfe21 100644\n--- a/include/libcamera/ipa/ipa_interface.h\n+++ b/include/libcamera/ipa/ipa_interface.h\n@@ -13,6 +13,7 @@\n #include <map>\n #include <vector>\n \n+#include <libcamera/base/flags.h>\n #include <libcamera/base/signal.h>\n \n #include <libcamera/controls.h>\ndiff --git a/utils/ipc/generators/libcamera_templates/definition_functions.tmpl b/utils/ipc/generators/libcamera_templates/definition_functions.tmpl\nindex 94bb4918..fa185177 100644\n--- a/utils/ipc/generators/libcamera_templates/definition_functions.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/definition_functions.tmpl\n@@ -9,7 +9,7 @@\n # \\param enum Enum object whose definition is to be generated\n #}\n {%- macro define_enum(enum) -%}\n-enum {{enum.mojom_name}} {\n+enum{{\" class\" if enum|is_flags}} {{enum.mojom_name}} {\n {%- for field in enum.fields %}\n \t{{field.mojom_name}} = {{field.numeric_value}},\n {%- endfor %}\ndiff --git a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\nindex cbcfb64a..2be65d43 100644\n--- a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\n@@ -62,7 +62,9 @@\n {%- else %}\n \tstd::tie({{param.mojom_name}}Buf, std::ignore) =\n {%- endif %}\n-{%- if param|is_enum %}\n+{%- if param|is_flags %}\n+\t\tIPADataSerializer<{{param|name_full}}>::serialize({{param.mojom_name}}\n+{%- elif param|is_enum %}\n \t\tIPADataSerializer<uint32_t>::serialize(static_cast<uint32_t>({{param.mojom_name}})\n {%- else %}\n \t\tIPADataSerializer<{{param|name}}>::serialize({{param.mojom_name}}\n@@ -105,7 +107,9 @@\n #}\n {%- macro deserialize_param(param, pointer, loop, buf, fds, iter, data_size) -%}\n {{\"*\" if pointer}}{{param.mojom_name}} =\n-{%- if param|is_enum %}\n+{%- if param|is_flags %}\n+IPADataSerializer<{{param|name_full}}>::deserialize(\n+{%- elif param|is_enum %}\n static_cast<{{param|name_full}}>(IPADataSerializer<uint32_t>::deserialize(\n {%- else %}\n IPADataSerializer<{{param|name}}>::deserialize(\n@@ -133,7 +137,7 @@ IPADataSerializer<{{param|name}}>::deserialize(\n {%- if param|needs_control_serializer %}\n \t&controlSerializer_\n {%- endif -%}\n-){{\")\" if param|is_enum}};\n+){{\")\" if param|is_enum and not param|is_flags}};\n {%- endmacro -%}\n \n \ndiff --git a/utils/ipc/generators/libcamera_templates/serializer.tmpl b/utils/ipc/generators/libcamera_templates/serializer.tmpl\nindex 77bae36f..eec75211 100644\n--- a/utils/ipc/generators/libcamera_templates/serializer.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/serializer.tmpl\n@@ -34,6 +34,8 @@\n \t\tstd::tie({{field.mojom_name}}, std::ignore) =\n \t{%- if field|is_pod %}\n \t\t\tIPADataSerializer<{{field|name}}>::serialize(data.{{field.mojom_name}});\n+\t{%- elif field|is_flags %}\n+\t\t\tIPADataSerializer<{{field|name_full}}>::serialize(data.{{field.mojom_name}});\n \t{%- elif field|is_enum %}\n \t\t\tIPADataSerializer<uint{{field|bit_width}}_t>::serialize(data.{{field.mojom_name}});\n \t{%- endif %}\n@@ -96,6 +98,8 @@\n \t\t{{- check_data_size(field_size, 'dataSize', field.mojom_name, 'data')}}\n \t\t{%- if field|is_pod %}\n \t\tret.{{field.mojom_name}} = IPADataSerializer<{{field|name}}>::deserialize(m, m + {{field_size}});\n+\t\t{%- elif field|is_flags %}\n+\t\tret.{{field.mojom_name}} = IPADataSerializer<{{field|name_full}}>::deserialize(m, m + {{field_size}});\n \t\t{%- else %}\n \t\tret.{{field.mojom_name}} = static_cast<{{field|name_full}}>(IPADataSerializer<uint{{field|bit_width}}_t>::deserialize(m, m + {{field_size}}));\n \t\t{%- endif %}\ndiff --git a/utils/ipc/generators/mojom_libcamera_generator.py b/utils/ipc/generators/mojom_libcamera_generator.py\nindex 753bfc73..5534b24e 100644\n--- a/utils/ipc/generators/mojom_libcamera_generator.py\n+++ b/utils/ipc/generators/mojom_libcamera_generator.py\n@@ -74,6 +74,8 @@ def GetDefaultValue(element):\n return element.default\n if type(element.kind) == mojom.Kind:\n return '0'\n+ if IsFlags(element):\n+ return ''\n if mojom.IsEnumKind(element.kind):\n return f'static_cast<{element.kind.mojom_name}>(0)'\n if isinstance(element.kind, mojom.Struct) and \\\n@@ -223,6 +225,15 @@ def IsEnum(element):\n def IsFd(element):\n return mojom.IsStructKind(element.kind) and element.kind.mojom_name == \"SharedFD\"\n \n+def IsFlags(element):\n+ if not hasattr(element, 'attributes'):\n+ return False\n+ if element.attributes is None:\n+ return False\n+ if 'Flags' in element.attributes:\n+ return True\n+ return False\n+\n def IsMap(element):\n return mojom.IsMapKind(element.kind)\n \n@@ -251,9 +262,13 @@ def ByteWidthFromCppType(t):\n raise Exception('invalid type')\n return str(int(_bit_widths[key]) // 8)\n \n-\n # Get the type name for a given element\n def GetNameForElement(element):\n+ # Flags\n+ if IsFlags(element):\n+ if mojom.IsEnumKind(element):\n+ return element.mojom_name\n+ return f'Flags<{GetFullNameForElement(element.kind)}>'\n # structs\n if (mojom.IsEnumKind(element) or\n mojom.IsInterfaceKind(element) or\n@@ -311,6 +326,11 @@ def GetFullNameForElement(element):\n \n if namespace_str == '':\n return name\n+\n+ if IsFlags(element):\n+ name = re.match(r'^Flags<(.*)>$', name).group(1)\n+ return f'Flags<{namespace_str}::{name}>'\n+\n return f'{namespace_str}::{name}'\n \n def ValidateZeroLength(l, s, cap=True):\n@@ -408,6 +428,7 @@ class Generator(generator.Generator):\n 'is_controls': IsControls,\n 'is_enum': IsEnum,\n 'is_fd': IsFd,\n+ 'is_flags': IsFlags,\n 'is_map': IsMap,\n 'is_plain_struct': IsPlainStruct,\n 'is_pod': IsPod,\n", "prefixes": [ "libcamera-devel", "v2", "4/7" ] }