[libcamera-devel,v3,2/7] utils: ipc: Add support for enums in function parameters
diff mbox series

Message ID 20220826154419.4099372-3-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • utils: ipc: Add support for enums and Flags
Related show

Commit Message

Paul Elder Aug. 26, 2022, 3:44 p.m. UTC
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@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

---
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(-)

Patch
diff mbox series

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 -%}