Patch Detail
Show a patch.
GET /api/patches/16941/?format=api
{ "id": 16941, "url": "https://patchwork.libcamera.org/api/patches/16941/?format=api", "web_url": "https://patchwork.libcamera.org/patch/16941/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20220803112150.3040287-7-paul.elder@ideasonboard.com>", "date": "2022-08-03T11:21:47", "name": "[libcamera-devel,6/9] utils: ipc: Add support for Flags", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "0e760900932fcf58b3aace6bd9ba0bdb9ee20aa3", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/16941/mbox/", "series": [ { "id": 3367, "url": "https://patchwork.libcamera.org/api/series/3367/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3367", "date": "2022-08-03T11:21:41", "name": "utils: ipc: Add support for enums and Flags", "version": 1, "mbox": "https://patchwork.libcamera.org/series/3367/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/16941/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/16941/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 B306DBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 3 Aug 2022 11:22:11 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4872763326;\n\tWed, 3 Aug 2022 13:22:11 +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 B4B7763319\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 3 Aug 2022 13:22:09 +0200 (CEST)", "from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp\n\t[175.177.42.159])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8582E8AF;\n\tWed, 3 Aug 2022 13:22:08 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659525731;\n\tbh=/NGan9s9HW07JsJi6kq8U0LIajG4q31kQhSXuTrxuo4=;\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=H94kCP6hZuBNqPSPA/+/sR4cg/umgCicQcXAGmg6SfxLgYmMGLku/269Jsw0x2gqc\n\tUob4iA5oWNIKxeLA0EChiMhCsmfPqUFh49JnDDi/D8NU8pOfWGpiy6rpPCntdrGvG2\n\t1ge5crcMnbkF6AX9rsLSJcAxJVB8bna/7uV6zijKq9ogXMir9gdnS9vqsxFd9qfkoG\n\tbsgD34ccu6/+914qZ8lSx4prq64Hogjbs3Nt9+tS7orc5KpcfJK639DYL1YBuDtGTQ\n\tmdrZ27Ql6joCC4ZuxzQt13ZL13sxm3ZsDGk2xmlrsYC4vr3uMblVCtIab/AGHV+juQ\n\t/ZM7gc7UOhBvw==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1659525729;\n\tbh=/NGan9s9HW07JsJi6kq8U0LIajG4q31kQhSXuTrxuo4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=rsh+LdXUfEoJJtzK3fChmi3ZL9Xt3Hwd7TwOGYIvbBuu6RxyGNBcoXXJ6o2unR7nK\n\tMUwmyoR/goZVnXVWh58PeqoeNTuPTa3/IAvg+QpyD073q1w7OrT5v1IRdD0qXDlNCn\n\tkxWuLyVrLgOTcXUReDIkJ4j8Ku+wX0S6tnuaTqgg=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"rsh+LdXU\"; dkim-atps=neutral", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 3 Aug 2022 20:21:47 +0900", "Message-Id": "<20220803112150.3040287-7-paul.elder@ideasonboard.com>", "X-Mailer": "git-send-email 2.30.2", "In-Reply-To": "<20220803112150.3040287-1-paul.elder@ideasonboard.com>", "References": "<20220803112150.3040287-1-paul.elder@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH 6/9] 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 defined and used in mojom as \"Flags_E_t\", and the code generator\nwill convert it to \"Flags<E>\". It is usable and has been tested in\nstruct members, function input and output parameters, and Signal\nparameters.\n\nThis does not add support for returning Flags as direct return values.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n---\n .../core_ipa_interface.h.tmpl | 4 +++\n .../definition_functions.tmpl | 13 +++++++\n .../module_ipa_interface.h.tmpl | 4 +++\n .../libcamera_templates/proxy_functions.tmpl | 10 ++++--\n .../libcamera_templates/serializer.tmpl | 4 +++\n .../generators/mojom_libcamera_generator.py | 35 ++++++++++++++++++-\n 6 files changed, 66 insertions(+), 4 deletions(-)", "diff": "diff --git a/utils/ipc/generators/libcamera_templates/core_ipa_interface.h.tmpl b/utils/ipc/generators/libcamera_templates/core_ipa_interface.h.tmpl\nindex a565b59a..2fd55119 100644\n--- a/utils/ipc/generators/libcamera_templates/core_ipa_interface.h.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/core_ipa_interface.h.tmpl\n@@ -30,6 +30,10 @@ static const {{const.kind|name}} {{const.mojom_name}} = {{const.value}};\n {{funcs.define_enum(enum)}}\n {% endfor %}\n \n+{% for flag in flags %}\n+{{funcs.define_flags(flag)}}\n+{% endfor %}\n+\n {%- for struct in structs_gen_header %}\n {{funcs.define_struct(struct)}}\n {% endfor %}\ndiff --git a/utils/ipc/generators/libcamera_templates/definition_functions.tmpl b/utils/ipc/generators/libcamera_templates/definition_functions.tmpl\nindex 94bb4918..3dbcfca0 100644\n--- a/utils/ipc/generators/libcamera_templates/definition_functions.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/definition_functions.tmpl\n@@ -16,6 +16,19 @@ enum {{enum.mojom_name}} {\n };\n {%- endmacro -%}\n \n+{#\n+ # \\brief Generate Flags definition\n+ #\n+ # \\param flags Enum object from which a Flags definition is to be generated\n+ #}\n+{%- macro define_flags(flags) -%}\n+enum class {{flags|flags_name}} {\n+{%- for field in flags.fields %}\n+\t{{field.mojom_name}} = {{field.numeric_value}},\n+{%- endfor %}\n+};\n+{%- endmacro -%}\n+\n {#\n # \\brief Generate struct definition\n #\ndiff --git a/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl\nindex 415ec283..5e003849 100644\n--- a/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl\n@@ -48,6 +48,10 @@ enum class {{cmd_event_enum_name}} {\n {{funcs.define_enum(enum)}}\n {% endfor %}\n \n+{% for flag in flags %}\n+{{funcs.define_flags(flag)}}\n+{% endfor %}\n+\n {%- for struct in structs_nonempty %}\n {{funcs.define_struct(struct)}}\n {% endfor %}\ndiff --git a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\nindex dc35620f..c5e24323 100644\n--- a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\n@@ -59,7 +59,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@@ -102,7 +104,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@@ -130,7 +134,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..22de6fdd 100644\n--- a/utils/ipc/generators/mojom_libcamera_generator.py\n+++ b/utils/ipc/generators/mojom_libcamera_generator.py\n@@ -47,6 +47,8 @@ _bit_widths = {\n mojom.DOUBLE: '64',\n }\n \n+_flags_re = r'^Flags_(.*)_t$'\n+\n def ModuleName(path):\n return path.split('/')[-1].split('.')[0]\n \n@@ -74,6 +76,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 +227,16 @@ 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, 'mojom_name'):\n+ return False\n+ if re.match(_flags_re, element.mojom_name):\n+ return True\n+ if hasattr(element, 'kind'):\n+ if hasattr(element.kind, 'mojom_name'):\n+ return True if re.match(_flags_re, element.kind.mojom_name) else False\n+ return False\n+\n def IsMap(element):\n return mojom.IsMapKind(element.kind)\n \n@@ -251,9 +265,20 @@ def ByteWidthFromCppType(t):\n raise Exception('invalid type')\n return str(int(_bit_widths[key]) // 8)\n \n+def FlagsName(element):\n+ if hasattr(element, 'mojom_name'):\n+ if re.match(_flags_re, element.mojom_name):\n+ return re.sub(_flags_re, lambda match: match.group(1), element.mojom_name)\n+ if hasattr(element, 'kind'):\n+ if hasattr(element.kind, 'mojom_name'):\n+ return re.sub(_flags_re, lambda match: match.group(1), element.kind.mojom_name)\n+ return None\n \n # Get the type name for a given element\n def GetNameForElement(element):\n+ # Flags\n+ if IsFlags(element):\n+ return f'Flags<{FlagsName(element)}>'\n # structs\n if (mojom.IsEnumKind(element) or\n mojom.IsInterfaceKind(element) or\n@@ -311,6 +336,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@@ -401,6 +431,7 @@ class Generator(generator.Generator):\n 'choose': Choose,\n 'comma_sep': CommaSep,\n 'default_value': GetDefaultValue,\n+ 'flags_name': FlagsName,\n 'has_default_fields': HasDefaultFields,\n 'has_fd': HasFd,\n 'is_async': IsAsync,\n@@ -408,6 +439,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@@ -433,7 +465,8 @@ class Generator(generator.Generator):\n 'cmd_enum_name': '_%sCmd' % self.module_name,\n 'cmd_event_enum_name': '_%sEventCmd' % self.module_name,\n 'consts': self.module.constants,\n- 'enums': self.module.enums,\n+ 'enums': [enum for enum in self.module.enums if not IsFlags(enum)],\n+ 'flags': [enum for enum in self.module.enums if IsFlags(enum)],\n 'has_array': len([x for x in self.module.kinds.keys() if x[0] == 'a']) > 0,\n 'has_map': len([x for x in self.module.kinds.keys() if x[0] == 'm']) > 0,\n 'has_namespace': self.module.mojom_namespace != '',\n", "prefixes": [ "libcamera-devel", "6/9" ] }