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

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

Commit Message

Paul Elder Oct. 11, 2022, 10:58 a.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 v5

No change in v4

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

Comments

Jacopo Mondi Oct. 12, 2022, 7:20 a.m. UTC | #1
Hi Paul

On Tue, Oct 11, 2022 at 07:58:52PM +0900, Paul Elder via libcamera-devel wrote:
> 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>
>

I'm defintely not well versed when it comes to mojo, but this seems to
make sense to me
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Thanks
   j

> ---
> No change in v5
>
> No change in v4
>
> 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(-)
>
> 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
>

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