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

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Aug 9 03:04:16 CEST 2022


Hi Paul,

Thank you for the patch.

On Wed, Aug 03, 2022 at 08:21:43PM +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 at ideasonboard.com>
> ---
>  .../libcamera_templates/proxy_functions.tmpl        | 13 +++++++++++--
>  1 file changed, 11 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..dc35620f 100644
> --- a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl
> +++ b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl
> @@ -59,7 +59,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}})

C++ has a concept of underlying type for enumerations (see
https://en.cppreference.com/w/cpp/language/enum and
https://en.cppreference.com/w/cpp/types/underlying_type). We could use
that to serialize to an integer type suitable for the enum, but I think
that's overkill. However, it would be good to make sure we don't
silently truncate the value here. A

static_assert(sizeof({{param|name_full}}) <= 4);

would work. It can be placed in either the serialization or
deserializatin code, once should be enough. With that,

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +{%- else %}
>  		IPADataSerializer<{{param|name}}>::serialize({{param.mojom_name}}
> +{% endif -%}
>  {{- ", &controlSerializer_" if param|needs_control_serializer -}}
>  );
>  {%- endfor %}
> @@ -97,7 +101,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 +130,7 @@
>  {%- if param|needs_control_serializer %}
>  	&controlSerializer_
>  {%- endif -%}
> -);
> +){{")" if param|is_enum}};
>  {%- endmacro -%}
>  
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list