diff options
Diffstat (limited to 'third_party/gbm/libgbm')
-rw-r--r-- | third_party/gbm/libgbm/moz.build | 16 | ||||
-rw-r--r-- | third_party/gbm/libgbm/mozgbm.cpp | 66 |
2 files changed, 82 insertions, 0 deletions
diff --git a/third_party/gbm/libgbm/moz.build b/third_party/gbm/libgbm/moz.build new file mode 100644 index 0000000000..0953d2f17a --- /dev/null +++ b/third_party/gbm/libgbm/moz.build @@ -0,0 +1,16 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# 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/. + +SOURCES += [ + 'mozgbm.cpp', +] + +if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": + CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS'] + +LOCAL_INCLUDES += ['/third_party/gbm'] + +FINAL_LIBRARY = 'xul' 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); +} |