summaryrefslogtreecommitdiffstats
path: root/widget/gtk/DMABufLibWrapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/gtk/DMABufLibWrapper.h')
-rw-r--r--widget/gtk/DMABufLibWrapper.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/widget/gtk/DMABufLibWrapper.h b/widget/gtk/DMABufLibWrapper.h
new file mode 100644
index 0000000000..9723083ad8
--- /dev/null
+++ b/widget/gtk/DMABufLibWrapper.h
@@ -0,0 +1,231 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=2:tabstop=2:
+ */
+/* 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/. */
+
+#ifndef __MOZ_DMABUF_LIB_WRAPPER_H__
+#define __MOZ_DMABUF_LIB_WRAPPER_H__
+
+#include "mozilla/widget/gbm.h"
+#include "mozilla/StaticMutex.h"
+#include <mutex>
+
+#ifdef MOZ_LOGGING
+# include "mozilla/Logging.h"
+# include "nsTArray.h"
+# include "Units.h"
+extern mozilla::LazyLogModule gDmabufLog;
+# define LOGDMABUF(args) MOZ_LOG(gDmabufLog, mozilla::LogLevel::Debug, args)
+#else
+# define LOGDMABUF(args)
+#endif /* MOZ_LOGGING */
+
+#ifndef DRM_FORMAT_MOD_INVALID
+# define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
+#endif
+
+namespace mozilla {
+namespace widget {
+
+typedef struct gbm_device* (*CreateDeviceFunc)(int);
+typedef void (*DestroyDeviceFunc)(struct gbm_device*);
+typedef struct gbm_bo* (*CreateFunc)(struct gbm_device*, uint32_t, uint32_t,
+ uint32_t, uint32_t);
+typedef struct gbm_bo* (*CreateWithModifiersFunc)(struct gbm_device*, uint32_t,
+ uint32_t, uint32_t,
+ const uint64_t*,
+ const unsigned int);
+typedef uint64_t (*GetModifierFunc)(struct gbm_bo*);
+typedef uint32_t (*GetStrideFunc)(struct gbm_bo*);
+typedef int (*GetFdFunc)(struct gbm_bo*);
+typedef void (*DestroyFunc)(struct gbm_bo*);
+typedef void* (*MapFunc)(struct gbm_bo*, uint32_t, uint32_t, uint32_t, uint32_t,
+ uint32_t, uint32_t*, void**);
+typedef void (*UnmapFunc)(struct gbm_bo*, void*);
+typedef int (*GetPlaneCountFunc)(struct gbm_bo*);
+typedef union gbm_bo_handle (*GetHandleForPlaneFunc)(struct gbm_bo*, int);
+typedef uint32_t (*GetStrideForPlaneFunc)(struct gbm_bo*, int);
+typedef uint32_t (*GetOffsetFunc)(struct gbm_bo*, int);
+typedef int (*DeviceIsFormatSupportedFunc)(struct gbm_device*, uint32_t,
+ uint32_t);
+typedef int (*DrmPrimeHandleToFDFunc)(int, uint32_t, uint32_t, int*);
+typedef struct gbm_surface* (*CreateSurfaceFunc)(struct gbm_device*, uint32_t,
+ uint32_t, uint32_t, uint32_t);
+typedef void (*DestroySurfaceFunc)(struct gbm_surface*);
+
+class GbmLib {
+ public:
+ static bool IsAvailable() { return sLoaded || Load(); }
+ static bool IsModifierAvailable();
+
+ static struct gbm_device* CreateDevice(int fd) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sCreateDevice(fd);
+ };
+ static void DestroyDevice(struct gbm_device* gdm) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sDestroyDevice(gdm);
+ };
+ static struct gbm_bo* Create(struct gbm_device* gbm, uint32_t width,
+ uint32_t height, uint32_t format,
+ uint32_t flags) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sCreate(gbm, width, height, format, flags);
+ }
+ static void Destroy(struct gbm_bo* bo) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ sDestroy(bo);
+ }
+ static uint32_t GetStride(struct gbm_bo* bo) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetStride(bo);
+ }
+ static int GetFd(struct gbm_bo* bo) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetFd(bo);
+ }
+ static void* Map(struct gbm_bo* bo, uint32_t x, uint32_t y, uint32_t width,
+ uint32_t height, uint32_t flags, uint32_t* stride,
+ void** map_data) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sMap(bo, x, y, width, height, flags, stride, map_data);
+ }
+ static void Unmap(struct gbm_bo* bo, void* map_data) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ sUnmap(bo, map_data);
+ }
+ static struct gbm_bo* CreateWithModifiers(struct gbm_device* gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format,
+ const uint64_t* modifiers,
+ const unsigned int count) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sCreateWithModifiers(gbm, width, height, format, modifiers, count);
+ }
+ static uint64_t GetModifier(struct gbm_bo* bo) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetModifier(bo);
+ }
+ static int GetPlaneCount(struct gbm_bo* bo) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetPlaneCount(bo);
+ }
+ static union gbm_bo_handle GetHandleForPlane(struct gbm_bo* bo, int plane) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetHandleForPlane(bo, plane);
+ }
+ static uint32_t GetStrideForPlane(struct gbm_bo* bo, int plane) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetStrideForPlane(bo, plane);
+ }
+ static uint32_t GetOffset(struct gbm_bo* bo, int plane) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sGetOffset(bo, plane);
+ }
+ static int DeviceIsFormatSupported(struct gbm_device* gbm, uint32_t format,
+ uint32_t usage) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sDeviceIsFormatSupported(gbm, format, usage);
+ }
+ static int DrmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags,
+ int* prime_fd) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sDrmPrimeHandleToFD(fd, handle, flags, prime_fd);
+ }
+ static struct gbm_surface* CreateSurface(struct gbm_device* gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format, uint32_t flags) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sCreateSurface(gbm, width, height, format, flags);
+ }
+ static void DestroySurface(struct gbm_surface* surface) {
+ StaticMutexAutoLock lockDRI(sDRILock);
+ return sDestroySurface(surface);
+ }
+
+ private:
+ static bool Load();
+ static bool IsLoaded();
+
+ static CreateDeviceFunc sCreateDevice;
+ static DestroyDeviceFunc sDestroyDevice;
+ static CreateFunc sCreate;
+ static CreateWithModifiersFunc sCreateWithModifiers;
+ static GetModifierFunc sGetModifier;
+ static GetStrideFunc sGetStride;
+ static GetFdFunc sGetFd;
+ static DestroyFunc sDestroy;
+ static MapFunc sMap;
+ static UnmapFunc sUnmap;
+ static GetPlaneCountFunc sGetPlaneCount;
+ static GetHandleForPlaneFunc sGetHandleForPlane;
+ static GetStrideForPlaneFunc sGetStrideForPlane;
+ static GetOffsetFunc sGetOffset;
+ static DeviceIsFormatSupportedFunc sDeviceIsFormatSupported;
+ static DrmPrimeHandleToFDFunc sDrmPrimeHandleToFD;
+ static CreateSurfaceFunc sCreateSurface;
+ static DestroySurfaceFunc sDestroySurface;
+ static bool sLoaded;
+
+ static void* sGbmLibHandle;
+ static void* sXf86DrmLibHandle;
+ static mozilla::StaticMutex sDRILock MOZ_UNANNOTATED;
+};
+
+struct GbmFormat {
+ bool mIsSupported;
+ bool mHasAlpha;
+ int mFormat;
+ nsTArray<uint64_t> mModifiers;
+};
+
+class DMABufDevice {
+ public:
+ DMABufDevice();
+ ~DMABufDevice();
+
+ int OpenDRMFd();
+ gbm_device* GetGbmDevice();
+ int GetDmabufFD(uint32_t aGEMHandle);
+
+ bool IsEnabled(nsACString& aFailureId);
+
+ // Use dmabuf for WebRender general web content
+ static bool IsDMABufTexturesEnabled();
+ // Use dmabuf for WebGL content
+ static bool IsDMABufWebGLEnabled();
+ static void DisableDMABufWebGL();
+
+#ifdef MOZ_WAYLAND
+ void AddFormatModifier(bool aHasAlpha, int aFormat, uint32_t mModifierHi,
+ uint32_t mModifierLo);
+#endif
+ GbmFormat* GetGbmFormat(bool aHasAlpha);
+
+ private:
+ void Configure();
+#ifdef MOZ_WAYLAND
+ void LoadFormatModifiers();
+ void SetModifiersToGfxVars();
+ void GetModifiersFromGfxVars();
+#endif
+
+ private:
+ GbmFormat mXRGBFormat;
+ GbmFormat mARGBFormat;
+
+ int mDRMFd = -1;
+ std::once_flag mFlagGbmDevice;
+ gbm_device* mGbmDevice = nullptr;
+ const char* mFailureId = nullptr;
+ nsAutoCString mDrmRenderNode;
+};
+
+DMABufDevice* GetDMABufDevice();
+
+} // namespace widget
+} // namespace mozilla
+
+#endif // __MOZ_DMABUF_LIB_WRAPPER_H__