Message ID | 20221011105859.457567-3-paul.elder@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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 >
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 -%}