[libcamera-devel] [PATCH RFC] android: mm: generic: use GRALLOC_HARDWARE_MODULE_ID
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Mar 1 00:20:13 CET 2023
Hi Mattijs,
On Tue, Feb 28, 2023 at 02:49:27PM +0100, Mattijs Korpershoek wrote:
> Hi Laurent,
>
> Thank you for your review.
>
> On lun., févr. 27, 2023 at 18:52, Laurent Pinchart wrote:
>
> > Hi Mattijs,
> >
> > On Mon, Feb 27, 2023 at 09:54:02AM +0100, Mattijs Korpershoek via libcamera-devel wrote:
> >> PlatformFrameBufferAllocator is an abstraction over gralloc.
> >> Right now hardwareModule_ points towards a CAMERA_HARDWARE_MODULE_ID.
> >>
> >> When gralloc_open() is called we observe:
> >> libcamera: DEBUG HAL camera3_hal.cpp:75 Open camera gpu0
> >> libcamera: ERROR Camera camera.cpp:524 Camera in Configured state trying acquire() requiring state Available
> >> 01-23 14:14:04.742 370 416 E libcamera: FATAL HAL generic_frame_buffer_allocator.cpp:105 gralloc_open() failed: -87
> >>
> >> Which is wrong, gralloc_open() is attempting to re-open the camera HAL,
> >> instead of the gralloc HAL.
> >>
> >> Point to a GRALLOC_HARDWARE_MODULE_ID instead so that we can request
> >> buffers from gralloc in android.
> >
> > Good catch !
> >
> >> Note: this add a new dependency on android's libhardware [1]
> >>
> >> [1] https://android.googlesource.com/platform/hardware/libhardware
> >>
> >> Fixes: c58662c5770e ("android: Introduce PlatformFrameBufferAllocator")
> >> Signed-off-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
> >> ---
> >> RFC as this adds an additional link-time dependency on an AOSP project
> >> (libhardware) and I'm unsure how to handle this.
> >>
> >> I thought of using the subprojects structure as done for libyuv but
> >> since libhardware has other AOSP deps (like libvnksupport) I'm not sure
> >> this is appropriate.
> >>
> >> Any thoughts on this?
> >
> > We can require linking against AOSP libraries when compiling this code,
> > that's not an issue. A subproject isn't needed (and wouldn't be
> > practical anyway).
>
> Thank you, that is helpful.
>
> Does that mean that the change can be kept as-is, and it's acceptable to
> have link errors when building with
> -Dandroid=enabled -Dandroid_platform=generic ?
It should fail at meson setup time, when creating the libhardware
dependency.
> > How did you test-link this patch ?
>
> I have link-tested this patch in an Android 12 AOSP-based environment.
>
> I also build-tested using the meson build system, noticing the link error.
>
> I work in a BayLibre specific integration, where have generated
> Android.bp files with a python script based on the meson files. It
> parses the meson.build files to generate Android.bp files.
>
> We use this to build libcamera, the Android Camera HAL and the cam app.
>
> As I'm not sure sure the libcamera wants to maintain this, I did not
> submit it.
For now, our plan is to support building against the NDK, but a script
that generates Android.bp files is something that could be interesting.
We wouldn't commit the generated files to the repository, but we could
host the script until a better option is found. I wonder if it could be
implemented as a meson backend...
> If this seems useful for libcamera, I can polish this up and submit it.
>
> >> ---
> >> src/android/mm/generic_frame_buffer_allocator.cpp | 5 +++--
> >> 1 file changed, 3 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/src/android/mm/generic_frame_buffer_allocator.cpp b/src/android/mm/generic_frame_buffer_allocator.cpp
> >> index 3750e1bf52a9..58e6c68c4998 100644
> >> --- a/src/android/mm/generic_frame_buffer_allocator.cpp
> >> +++ b/src/android/mm/generic_frame_buffer_allocator.cpp
> >> @@ -72,9 +72,10 @@ class PlatformFrameBufferAllocator::Private : public Extensible::Private
> >> public:
> >> Private(CameraDevice *const cameraDevice)
> >> : cameraDevice_(cameraDevice),
> >> - hardwareModule_(cameraDevice->camera3Device()->common.module),
> >> + hardwareModule_(nullptr),
> >> allocDevice_(nullptr)
> >> {
> >> + hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &hardwareModule_);
> >
> > hw_get_module(), if my understanding is correct, ends up dlopen()ing the
> > module. Is there anything we need to do in the destructor to close the
> > module ?
>
> Your understanding is correct, hw_get_module() ends up doing dlopen().
> AFAIK, there is no equivalent of release the hardwareModule_. There is
> no hw_put_module().
>
> I've skimmed through some other implementations of HALs (such as
> gatekeeper) and they indeed call dclose().
Lovely API design... *sigh*
> Thanks a lot for bringing this up. I will send a v2.
>
> >> ASSERT(hardwareModule_);
> >> }
> >>
> >> @@ -85,7 +86,7 @@ public:
> >>
> >> private:
> >> const CameraDevice *const cameraDevice_;
> >> - struct hw_module_t *const hardwareModule_;
> >> + const struct hw_module_t *hardwareModule_;
> >> struct alloc_device_t *allocDevice_;
> >> };
> >>
> >>
> >> ---
> >> base-commit: 58e0b6e18c425072a47594f42fc0b61801403aca
> >> change-id: 20230227-android-gralloc-04e31d5edc68
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list