[libcamera-devel] [PATCH v2 2/7] utils: ipc: Add support for enums in function parameters

Paul Elder paul.elder at ideasonboard.com
Thu Aug 18 08:49:17 CEST 2022


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 <paul.elder at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

---
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<uint8_t> {{param.mojom_name}}Buf;
 {%- if param|has_fd %}
 	std::vector<SharedFD> {{param.mojom_name}}Fds;
@@ -59,7 +62,11 @@
 {%- else %}
 	std::tie({{param.mojom_name}}Buf, std::ignore) =
 {%- endif %}
+{%- if param|is_enum %}
+		IPADataSerializer<uint32_t>::serialize(static_cast<uint32_t>({{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<uint32_t>::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 -%}
 
 
-- 
2.30.2



More information about the libcamera-devel mailing list