new file mode 100644
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2024, Linaro Ltd.
+ *
+ * Authors:
+ * Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+ *
+ * gbm.h - Helper class for managing GBM interactions.
+ */
+
+#pragma once
+
+#include <gbm.h>
+
+#include <libcamera/base/log.h>
+
+#include <libcamera/formats.h>
+
+namespace libcamera {
+
+LOG_DECLARE_CATEGORY(GBM)
+
+class GBM
+{
+public:
+ GBM();
+ ~GBM();
+
+ int createDevice();
+ struct gbm_device *getDevice() { return gbm_device_; }
+ PixelFormat getPixelFormat() { return format_; }
+
+private:
+ int fd_;
+ struct gbm_device *gbm_device_;
+ PixelFormat format_;
+};
+
+} // namespace libcamera
@@ -24,6 +24,7 @@ libcamera_internal_headers = files([
'dma_buf_allocator.h',
'formats.h',
'framebuffer.h',
+ 'gbm.h',
'ipa_data_serializer.h',
'ipa_manager.h',
'ipa_module.h',
new file mode 100644
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2024, Linaro Ltd.
+ *
+ * Authors:
+ * Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+ *
+ * egl.cpp - Helper class for managing GBM interactions.
+ */
+
+#include "libcamera/internal/gbm.h"
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include <linux/dma-buf.h>
+#include <linux/dma-heap.h>
+
+namespace libcamera {
+
+LOG_DEFINE_CATEGORY(GBM)
+
+GBM::GBM()
+{
+ fd_ = 0;
+}
+
+GBM::~GBM()
+{
+ if (gbm_device_)
+ gbm_device_destroy(gbm_device_);
+
+ if (fd_ >= 0)
+ close(fd_);
+}
+
+int GBM::createDevice()
+{
+ const char *dri_node = "/dev/dri/renderD128"; //TODO: get from an env or config setting
+
+ fd_ = open(dri_node, O_RDWR | O_CLOEXEC);
+ if (fd_ < 0) {
+ LOG(GBM, Error) << "Open " << dri_node << " fail " << fd_;
+ return fd_;
+ }
+
+ gbm_device_ = gbm_create_device(fd_);
+ if (!gbm_device_) {
+ LOG(GBM, Error) << "gbm_crate_device fail";
+ goto fail;
+ }
+
+ format_ = libcamera::formats::ARGB8888;
+
+ return 0;
+fail:
+ return -ENODEV;
+}
+} //namespace libcamera
@@ -68,6 +68,16 @@ libcamera_deps = []
libatomic = cc.find_library('atomic', required : false)
libthreads = dependency('threads')
+libgbm = cc.find_library('gbm', required: false)
+gbm_works = cc.check_header('gbm.h', required: false)
+
+if libgbm.found() and gbm_works
+ config_h.set('HAVE_GBM', 1)
+ libcamera_internal_sources += files([
+ 'gbm.cpp',
+ ])
+endif
+
subdir('base')
subdir('converter')
subdir('ipa')
@@ -181,6 +191,7 @@ libcamera_deps += [
libcamera_base_private,
libcrypto,
libdl,
+ libgbm,
liblttng,
libudev,
libyaml,
A helper class to interact with GBM. This will allow us to specify the internal storage format of the CPU when making a texture for the Debayer vertext/fragment shaders and thus ensure we receive an uncompressed and untiled output buffer. Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> --- include/libcamera/internal/gbm.h | 39 ++++++++++++++++++++++ include/libcamera/internal/meson.build | 1 + src/libcamera/gbm.cpp | 61 ++++++++++++++++++++++++++++++++++ src/libcamera/meson.build | 11 ++++++ 4 files changed, 112 insertions(+)