[libcamera-devel,4/4] android: mm: generic: Use GraphicBufferAllocator instead of gralloc.h
diff mbox series

Message ID 20230912-gralloc-api-v4-v1-4-0f80402d8e7a@baylibre.com
State Superseded
Headers show
Series
  • android: switch over to modern gralloc API via libui
Related show

Commit Message

Mattijs Korpershoek Sept. 12, 2023, 9:36 a.m. UTC
gralloc.h is a very old API that has been deprecated at least since
Android P (9).

Switch over to a higher level abstraction of gralloc from libui, which
is compatible with Android 11 and up.
Libui:
* is provided in the VNDK (so it's available to vendors).
* is also used in the camera vts test named VtsAidlHalCameraProvider_TargetTest.

Drop the libhardware stub since we no longer need it.

Note: GraphicsBufferAllocator being a Singleton, buffer lifecycle
management is easier.

Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
---
 src/android/mm/generic_frame_buffer_allocator.cpp | 58 +++++++----------------
 src/android/mm/libhardware_stub.c                 | 17 -------
 src/android/mm/meson.build                        |  8 ++--
 3 files changed, 20 insertions(+), 63 deletions(-)

Patch
diff mbox series

diff --git a/src/android/mm/generic_frame_buffer_allocator.cpp b/src/android/mm/generic_frame_buffer_allocator.cpp
index 7ecef2c669df..43e1539aac89 100644
--- a/src/android/mm/generic_frame_buffer_allocator.cpp
+++ b/src/android/mm/generic_frame_buffer_allocator.cpp
@@ -16,8 +16,8 @@ 
 #include "libcamera/internal/framebuffer.h"
 
 #include <hardware/camera3.h>
-#include <hardware/gralloc.h>
-#include <hardware/hardware.h>
+#include <ui/GraphicBufferAllocator.h>
+#include <utils/Errors.h>
 
 #include "../camera_device.h"
 #include "../frame_buffer_allocator.h"
@@ -33,35 +33,28 @@  class GenericFrameBufferData : public FrameBuffer::Private
 	LIBCAMERA_DECLARE_PUBLIC(FrameBuffer)
 
 public:
-	GenericFrameBufferData(struct alloc_device_t *allocDevice,
+	GenericFrameBufferData(android::GraphicBufferAllocator &allocDevice,
 			       buffer_handle_t handle,
 			       const std::vector<FrameBuffer::Plane> &planes)
 		: FrameBuffer::Private(planes), allocDevice_(allocDevice),
 		  handle_(handle)
 	{
-		ASSERT(allocDevice_);
 		ASSERT(handle_);
 	}
 
 	~GenericFrameBufferData() override
 	{
 		/*
-		 * allocDevice_ is used to destroy handle_. allocDevice_ is
-		 * owned by PlatformFrameBufferAllocator::Private.
-		 * GenericFrameBufferData must be destroyed before it is
-		 * destroyed.
-		 *
-		 * \todo Consider managing alloc_device_t with std::shared_ptr
-		 * if this is difficult to maintain.
-		 *
 		 * \todo Thread safety against alloc_device_t is not documented.
 		 * Is it no problem to call alloc/free in parallel?
 		 */
-		allocDevice_->free(allocDevice_, handle_);
+		android::status_t status = allocDevice_.free(handle_);
+		if (status != android::NO_ERROR)
+			LOG(HAL, Error) << "Error freeing framebuffer: " << status;
 	}
 
 private:
-	struct alloc_device_t *allocDevice_;
+	android::GraphicBufferAllocator &allocDevice_;
 	const buffer_handle_t handle_;
 };
 } /* namespace */
@@ -73,50 +66,33 @@  class PlatformFrameBufferAllocator::Private : public Extensible::Private
 public:
 	Private(CameraDevice *const cameraDevice)
 		: cameraDevice_(cameraDevice),
-		  hardwareModule_(nullptr),
-		  allocDevice_(nullptr)
+		  allocDevice_(android::GraphicBufferAllocator::get())
 	{
-		hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &hardwareModule_);
-		ASSERT(hardwareModule_);
 	}
 
-	~Private() override;
+	~Private() = default;
 
 	std::unique_ptr<HALFrameBuffer>
 	allocate(int halPixelFormat, const libcamera::Size &size, uint32_t usage);
 
 private:
 	const CameraDevice *const cameraDevice_;
-	const struct hw_module_t *hardwareModule_;
-	struct alloc_device_t *allocDevice_;
+	android::GraphicBufferAllocator &allocDevice_;
 };
 
-PlatformFrameBufferAllocator::Private::~Private()
-{
-	if (allocDevice_)
-		gralloc_close(allocDevice_);
-	dlclose(hardwareModule_->dso);
-}
-
 std::unique_ptr<HALFrameBuffer>
 PlatformFrameBufferAllocator::Private::allocate(int halPixelFormat,
 						const libcamera::Size &size,
 						uint32_t usage)
 {
-	if (!allocDevice_) {
-		int ret = gralloc_open(hardwareModule_, &allocDevice_);
-		if (ret) {
-			LOG(HAL, Fatal) << "gralloc_open() failed: " << ret;
-			return nullptr;
-		}
-	}
-
-	int stride = 0;
+	uint32_t stride = 0;
 	buffer_handle_t handle = nullptr;
-	int ret = allocDevice_->alloc(allocDevice_, size.width, size.height,
-				      halPixelFormat, usage, &handle, &stride);
-	if (ret) {
-		LOG(HAL, Error) << "failed buffer allocation: " << ret;
+
+	android::status_t status = allocDevice_.allocate(size.width, size.height, halPixelFormat,
+							 1 /*layerCount*/, usage, &handle, &stride,
+							 "libcameraHAL");
+	if (status != android::NO_ERROR) {
+		LOG(HAL, Error) << "failed buffer allocation: " << status;
 		return nullptr;
 	}
 	if (!handle) {
diff --git a/src/android/mm/libhardware_stub.c b/src/android/mm/libhardware_stub.c
deleted file mode 100644
index 00f15cd90cac..000000000000
--- a/src/android/mm/libhardware_stub.c
+++ /dev/null
@@ -1,17 +0,0 @@ 
-/* SPDX-License-Identifier: Apache-2.0 */
-/*
- * Copyright (C) 2023, Ideas on Board
- *
- * libhardware_stub.c - Android libhardware stub for test compilation
- */
-
-#include <errno.h>
-
-#include <hardware/hardware.h>
-
-int hw_get_module(const char *id __attribute__((__unused__)),
-		  const struct hw_module_t **module)
-{
-	*module = NULL;
-	return -ENOTSUP;
-}
diff --git a/src/android/mm/meson.build b/src/android/mm/meson.build
index e9ceb3afba67..203b8c3e5804 100644
--- a/src/android/mm/meson.build
+++ b/src/android/mm/meson.build
@@ -4,13 +4,11 @@  platform = get_option('android_platform')
 if platform == 'generic'
     android_hal_sources += files(['generic_camera_buffer.cpp',
                                   'generic_frame_buffer_allocator.cpp'])
-    android_deps += [libdl]
 
-    libhardware = dependency('libhardware', required : false)
-    if libhardware.found()
-        android_deps += [libhardware]
+    libui = dependency('libui', required : false)
+    if libui.found()
+        android_deps += [libui]
     else
-        android_hal_sources += files(['libhardware_stub.c'])
         android_hal_sources += files(['graphic_buffer_allocator_stub.cpp'])
     endif
 elif platform == 'cros'