[libcamera-devel] [PATCH v2] ipa: core.mojom: Rework core file documentation
Jacopo Mondi
jacopo at jmondi.org
Mon Jul 26 16:31:37 CEST 2021
Hi Paul,
thanks for your comment
On Mon, Jul 19, 2021 at 03:09:20PM +0900, paul.elder at ideasonboard.com wrote:
> Hi Jacopo,
>
> On Fri, Jul 16, 2021 at 02:19:02PM +0200, Jacopo Mondi wrote:
> > The comment block at the beginning of the core.mojom file is meant to
> > provide an overview of how to use libcamera defined types in the definition
> > of mojom interfaces.
> >
> > As the IPA/IPC interface definition mechanism evolved, the documentation
> > has not been updated accordingly.
> >
> > Update the file comments to match the most recent IPA/IPC
> > interface definition and generation mechanism.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > v1->v2:
> > - Address Paul's comment and clarify points that were not clear to me when I
> > wrote v1 :)
> > - (de)serializers implementations go in ipa_data_serializer.cpp
> > - types used as array/map members do not require a mojom definition
> > - remove duplications
> > - s/the library/libcamera
> > - While at it, make all statements start with a capital letter and end without a
> > full-stop.
> > ---
> > include/libcamera/ipa/core.mojom | 67 +++++++++++++++++++-------------
> > 1 file changed, 40 insertions(+), 27 deletions(-)
> >
> > diff --git a/include/libcamera/ipa/core.mojom b/include/libcamera/ipa/core.mojom
> > index b32f30939454..39fac624658a 100644
> > --- a/include/libcamera/ipa/core.mojom
> > +++ b/include/libcamera/ipa/core.mojom
> > @@ -15,40 +15,53 @@ module libcamera;
> > *
> > * Attributes:
> > * - skipHeader - structs only, and only in core.mojom
> > - * - designate that this struct shall not have a C++ header definition
> > - * generated
> > + * - Do not generate a C++ definition for the structure
> > + * - Any type used in a mojom interface definition must have a corresponding
> > + * definition in a mojo file for the Mojo core to accept it, except for
>
> Here you say "Mojo core" and below you say "build system"... idk which
> one is better, though. We don't really have a "Mojo core" (we only use
> the mojo lexer and parser; the code generator and certainly the IPC
> system is custom), but also "build system" sounds too ambiguous?
>
The "code generator" ?
> > + * types used as map/array members for which a definition is not required
>
> If the type is *only* used as a map/array member, then the type doesn't
> need to be defined in mojom. It still needs to be defined in C++, and a
> (de)serializer implemented, though. I think you point it out below under
> "Rules", but it might be good to point out the caveat here too?
Yes, I missed the fact that is should be *only* used as a container
member.
>
> > + * - This attribute allows defining a symbol for the Mojo core that
> > + * corresponds to a libcamera type without duplicating its definition in the
> > + * generated C++ headers
> > * - skipSerdes - structs only, and only in core.mojom
> > - * - designate that this struct shall not have a (de)serializer generated
> > - * - all fields need a (de)serializer to be defined, either hand-written
> > - * in ipa_data_serializer.h
> > + * - Do not generate a (de)serializer for the structure
> > + * - This attribute instructs the build system that a (de)serializer is
> > + * available for the type and there's no need to generate one
> > + * - All types need a (de)serializer to be defined in order to be transported
> > + * over the IPA protocol. The (de)serializer can be:
> > + * - Manually implemented as a template specialization in
> > + * ipa_data_serializer.cpp in the libcamera sources
> > + * - Generated at build time for types defined in a mojo interfaces
>
> Maybe clarify that the second situation is when skipSerdes is *not*
> specified?
>
I just said above "Do not generate a (de)serializer..."
I'll swap points, to make this one the first one and give a general
introduction and then introduce skipSerdes
> > * - hasFd - struct fields or empty structs only
> > - * - designate that this field or empty struct contains a FileDescriptor
> > + * - Designate that this field or empty struct contains a FileDescriptor
> > *
> > * Rules:
> > - * - Any struct that is used in a struct definition in mojom must also be
> > - * defined in mojom
> > - * - If the struct has both a definition in a C++ header and a (de)serializer
> > - * in ipa_data_serializer.h, then the struct shall be declared as empty,
> > - * with both the [skipHeader] and [skipSerdes] attributes
> > - * - If the struct only has a definition in a C++ header, but no
> > - * (de)serializer, then the struct definition should have the [skipHeader]
> > - * attribute
> > - * - Nested structures (e.g. FrameBuffer::Plane) cannot be defined in mojom.
> > - * - Avoid them, by defining them in a header in C++ and a (de)serializer in
> > - * ipa_data_serializer.h
> > - * - If a struct is in an array/map inside a struct, then the struct that is
> > - * the member of the array/map does not need a mojom definition if it is
> > - * defined in a C++ header.
> > - * - This can be used to embed nested structures. The C++ double colon is
> > - * replaced with a dot (e.g. FrameBuffer::Plane -> FrameBuffer.Plane)
> > - * - The struct must still be defined in a header in C++ and a (de)serializer
> > - * implemented in ipa_data_serializer.h, as it cannot be defined in mojom
> > + * - If the type is defined in a libcamera C++ header *and* a (de)serializer is
> > + * available then the type shall be declared as empty with both attributes
> > + * associated and specified as: [skipHeader, skipSerdes]
> > + * - Example: [skipHeader, skipSerdes] ControlList {};
> > + * - If the type is defined in libcamera but no (de)serializer is available
> > + * then the type definition in the core.mojom file should have the
> > + * [skipHeader] attribute only
> > + * - A (de)serializer will be generated for the type
> > + * - If a type definition has [skipHeader], then the header where the type is
> > + * defined must be included in ipa_interface.h
> > + * - Types that are contained in an array/map do not require a mojom definition
>
> Again, types that are *only* used as array/map members.
>
> > + * if one exists in libcamera
>
> Yes that is correct, if there is no definition of the type in libcamera,
> then you can define it in mojom and let the code generator generate the
> C++ definition and the (de)serializer. (technically it's if-and-only-if
> but whatever)
>
> > + * - Nested types (e.g. FrameBuffer::Plane) cannot be directly used in mojom
>
> The original says cannot be *defined*.
>
> > + * - If used directly in mojom, the nested type shall be defined in a C++
>
> "cannot be directly used" "if used directly" :D
>
> > + * header and a (de)serializer shall be provided
>
> This is the condition for using nested types. The restriction is that
> they can only be used as map/array members. I think you mention that
> below but bringing it up here might be better?
>
> > + * - The C++ namespace separator :: is replaced with a dot
> > + * - In example, to directly use the FrameBuffer::Plane type:
> > + * - Provide a definition of the Plane type in a C++ header
>
> s/Plane/FrameBuffer::Plane/ ?
>
> > + * - Include the header in ipa_interface.h
> > + * - Provide a (de)serializer implementation ipa_data_serializer.cpp
> > + * - In mojom, reference the type as FrameBuffer.Plane
>
> This can only be referenced as a map/array member.
>
> > + * - Nested types can be used without an associated C++ definition if used
>
> s/can be/can only be/ because nested types can't be defined.
>
> s/C++ definition/mojom definition/
>
> The C++ definition + (de)serializer is certainly required.
This now looks like
* - Nested types (e.g. FrameBuffer::Plane) cannot be defined in mojom
* - If used in mojom, the nested type shall be defined in a C++ header
* and a (de)serializer shall be provided
* - Nested types can only be used as part of array/map containers
* - When using the type, the C++ namespace separator :: is replaced with a
* dot
* - In example, to use the FrameBuffer::Plane type in mojom:
* - Provide a definition of the FrameBuffer::Plane type in a C++ header
* - Include the header in ipa_interface.h
* - Provide a (de)serializer implementation ipa_data_serializer.cpp
* - In mojom, reference the type as FrameBuffer.Plane and only as map/array
* member
>
>
> Sorry this is so complicated :(
Nah, don't worry, not easy to express stuff, thank you for sticking with it and
rectify my understanding.
v3 out soon
Thanks
j
>
>
> Paul
>
> > + * as part of an array/map container
> > * - [skipHeader] and [skipSerdes] only work here in core.mojom.
> > - * - If a struct definition has [skipHeader], then the header where the
> > - * struct is defined must be #included in ipa_interface.h
> > * - If a field in a struct has a FileDescriptor, but is not explicitly
> > * defined so in mojom, then the field must be marked with the [hasFd]
> > - * attribute.
> > + * attribute
> > *
> > * \todo Generate documentation from Doxygen comments in .mojom files
> > * \todo Figure out how to keep the skipHeader structs in sync with their
> > --
> > 2.32.0
> >
More information about the libcamera-devel
mailing list