diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/gbm/libgbm/mozgbm.cpp | |
parent | Initial commit. (diff) | |
download | firefox-upstream/124.0.1.tar.xz firefox-upstream/124.0.1.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/gbm/libgbm/mozgbm.cpp')
-rw-r--r-- | third_party/gbm/libgbm/mozgbm.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/third_party/gbm/libgbm/mozgbm.cpp b/third_party/gbm/libgbm/mozgbm.cpp new file mode 100644 index 0000000000..bc024a11c0 --- /dev/null +++ b/third_party/gbm/libgbm/mozgbm.cpp @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: + */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/Types.h" +#include "prlink.h" + +#include <gbm/gbm.h> + +#define GET_FUNC(func, lib) \ + func##_fn = \ + (decltype(func##_fn))PR_FindFunctionSymbol(lib, #func) \ + +#define IS_FUNC_LOADED(func) \ + (func != nullptr) \ + +static struct gbm_device * (*gbm_create_device_fn)(int fd); +static void (*gbm_device_destroy_fn)(struct gbm_device* gbm); + +bool IsGBMLibraryLoaded() { + static bool isLoaded = + (IS_FUNC_LOADED(gbm_create_device_fn) && + IS_FUNC_LOADED(gbm_device_destroy_fn)); + + return isLoaded; +} + +bool LoadGBMLibrary() { + static PRLibrary* gbmLib = nullptr; + static bool gbmInitialized = false; + + //TODO Thread safe + if (!gbmInitialized) { + gbmInitialized = true; + gbmLib = PR_LoadLibrary("libgbm.so.1"); + if (!gbmLib) { + return false; + } + + GET_FUNC(gbm_create_device, gbmLib); + GET_FUNC(gbm_device_destroy, gbmLib); + } + + return IsGBMLibraryLoaded(); +} + +struct gbm_device * +gbm_create_device(int fd) +{ + if (!LoadGBMLibrary()) { + return nullptr; + } + return gbm_create_device_fn(fd); +} + +void +gbm_device_destroy(struct gbm_device* gbm) +{ + if (!LoadGBMLibrary()) { + return; + } + return gbm_device_destroy_fn(gbm); +} |