diff --git a/gfx/gl/GLContextProviderEGL.cpp b/gfx/gl/GLContextProviderEGL.cpp index eb7c42e4f02e..719076274d70 100644 --- a/gfx/gl/GLContextProviderEGL.cpp +++ b/gfx/gl/GLContextProviderEGL.cpp @@ -847,6 +847,9 @@ EGLSurface GLContextEGL::CreateWaylandBufferSurface( EGLSurface GLContextEGL::CreateGBMBufferSurface(EglDisplay& egl, EGLConfig config, mozilla::gfx::IntSize& pbsize) { + if (!nsGbmLib::IsAvailable()) { + return nullptr; + } struct gbm_surface* gbmSurface = nsGbmLib::CreateSurface( GetDMABufDevice()->GetGbmDevice(), pbsize.width, pbsize.height, GBM_FORMAT_ARGB8888, GBM_BO_USE_RENDERING); diff --git a/widget/gtk/DMABufLibWrapper.cpp b/widget/gtk/DMABufLibWrapper.cpp index 5ab8ad9c895c..81ff723517d1 100644 --- a/widget/gtk/DMABufLibWrapper.cpp +++ b/widget/gtk/DMABufLibWrapper.cpp @@ -1,5 +1,5 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:expandtab:shiftwidth=4:tabstop=4: +/* -*- 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 @@ -29,9 +29,9 @@ namespace widget { // https://gitlab.freedesktop.org/mesa/mesa/-/issues/4422 mozilla::StaticMutex nsGbmLib::sDRILock MOZ_UNANNOTATED; +bool nsGbmLib::sLoaded = false; void* nsGbmLib::sGbmLibHandle = nullptr; void* nsGbmLib::sXf86DrmLibHandle = nullptr; -bool nsGbmLib::sLibLoaded = false; CreateDeviceFunc nsGbmLib::sCreateDevice; DestroyDeviceFunc nsGbmLib::sDestroyDevice; CreateFunc nsGbmLib::sCreate; @@ -63,63 +63,63 @@ bool nsGbmLib::IsLoaded() { sDestroySurface != nullptr; } -bool nsGbmLib::IsAvailable() { - if (!Load()) { +bool nsGbmLib::Load() { + static bool sTriedToLoad = false; + if (sTriedToLoad) { + return sLoaded; + } + + sTriedToLoad = true; + + MOZ_ASSERT(!sGbmLibHandle); + MOZ_ASSERT(!sLoaded); + + LOGDMABUF(("Loading DMABuf system library %s ...\n", GBMLIB_NAME)); + + sGbmLibHandle = dlopen(GBMLIB_NAME, RTLD_LAZY | RTLD_LOCAL); + if (!sGbmLibHandle) { + LOGDMABUF(("Failed to load %s, dmabuf isn't available.\n", GBMLIB_NAME)); return false; } - return IsLoaded(); -} -bool nsGbmLib::Load() { - if (!sGbmLibHandle && !sLibLoaded) { - LOGDMABUF(("Loading DMABuf system library %s ...\n", GBMLIB_NAME)); - sLibLoaded = true; + sCreateDevice = (CreateDeviceFunc)dlsym(sGbmLibHandle, "gbm_create_device"); + sDestroyDevice = + (DestroyDeviceFunc)dlsym(sGbmLibHandle, "gbm_device_destroy"); + sCreate = (CreateFunc)dlsym(sGbmLibHandle, "gbm_bo_create"); + sCreateWithModifiers = (CreateWithModifiersFunc)dlsym( + sGbmLibHandle, "gbm_bo_create_with_modifiers"); + sGetModifier = (GetModifierFunc)dlsym(sGbmLibHandle, "gbm_bo_get_modifier"); + sGetStride = (GetStrideFunc)dlsym(sGbmLibHandle, "gbm_bo_get_stride"); + sGetFd = (GetFdFunc)dlsym(sGbmLibHandle, "gbm_bo_get_fd"); + sDestroy = (DestroyFunc)dlsym(sGbmLibHandle, "gbm_bo_destroy"); + sMap = (MapFunc)dlsym(sGbmLibHandle, "gbm_bo_map"); + sUnmap = (UnmapFunc)dlsym(sGbmLibHandle, "gbm_bo_unmap"); + sGetPlaneCount = + (GetPlaneCountFunc)dlsym(sGbmLibHandle, "gbm_bo_get_plane_count"); + sGetHandleForPlane = (GetHandleForPlaneFunc)dlsym( + sGbmLibHandle, "gbm_bo_get_handle_for_plane"); + sGetStrideForPlane = (GetStrideForPlaneFunc)dlsym( + sGbmLibHandle, "gbm_bo_get_stride_for_plane"); + sGetOffset = (GetOffsetFunc)dlsym(sGbmLibHandle, "gbm_bo_get_offset"); + sDeviceIsFormatSupported = (DeviceIsFormatSupportedFunc)dlsym( + sGbmLibHandle, "gbm_device_is_format_supported"); + sCreateSurface = + (CreateSurfaceFunc)dlsym(sGbmLibHandle, "gbm_surface_create"); + sDestroySurface = + (DestroySurfaceFunc)dlsym(sGbmLibHandle, "gbm_surface_destroy"); - sGbmLibHandle = dlopen(GBMLIB_NAME, RTLD_LAZY | RTLD_LOCAL); - if (!sGbmLibHandle) { - LOGDMABUF(("Failed to load %s, dmabuf isn't available.\n", GBMLIB_NAME)); - return false; - } - - sCreateDevice = (CreateDeviceFunc)dlsym(sGbmLibHandle, "gbm_create_device"); - sDestroyDevice = - (DestroyDeviceFunc)dlsym(sGbmLibHandle, "gbm_device_destroy"); - sCreate = (CreateFunc)dlsym(sGbmLibHandle, "gbm_bo_create"); - sCreateWithModifiers = (CreateWithModifiersFunc)dlsym( - sGbmLibHandle, "gbm_bo_create_with_modifiers"); - sGetModifier = (GetModifierFunc)dlsym(sGbmLibHandle, "gbm_bo_get_modifier"); - sGetStride = (GetStrideFunc)dlsym(sGbmLibHandle, "gbm_bo_get_stride"); - sGetFd = (GetFdFunc)dlsym(sGbmLibHandle, "gbm_bo_get_fd"); - sDestroy = (DestroyFunc)dlsym(sGbmLibHandle, "gbm_bo_destroy"); - sMap = (MapFunc)dlsym(sGbmLibHandle, "gbm_bo_map"); - sUnmap = (UnmapFunc)dlsym(sGbmLibHandle, "gbm_bo_unmap"); - sGetPlaneCount = - (GetPlaneCountFunc)dlsym(sGbmLibHandle, "gbm_bo_get_plane_count"); - sGetHandleForPlane = (GetHandleForPlaneFunc)dlsym( - sGbmLibHandle, "gbm_bo_get_handle_for_plane"); - sGetStrideForPlane = (GetStrideForPlaneFunc)dlsym( - sGbmLibHandle, "gbm_bo_get_stride_for_plane"); - sGetOffset = (GetOffsetFunc)dlsym(sGbmLibHandle, "gbm_bo_get_offset"); - sDeviceIsFormatSupported = (DeviceIsFormatSupportedFunc)dlsym( - sGbmLibHandle, "gbm_device_is_format_supported"); - sCreateSurface = - (CreateSurfaceFunc)dlsym(sGbmLibHandle, "gbm_surface_create"); - sDestroySurface = - (DestroySurfaceFunc)dlsym(sGbmLibHandle, "gbm_surface_destroy"); - - sXf86DrmLibHandle = dlopen(DRMLIB_NAME, RTLD_LAZY | RTLD_LOCAL); - if (!sXf86DrmLibHandle) { - LOGDMABUF(("Failed to load %s, dmabuf isn't available.\n", DRMLIB_NAME)); - return false; - } - sDrmPrimeHandleToFD = - (DrmPrimeHandleToFDFunc)dlsym(sXf86DrmLibHandle, "drmPrimeHandleToFD"); - if (!IsLoaded()) { - LOGDMABUF(("Failed to load all symbols from %s\n", GBMLIB_NAME)); - } + sXf86DrmLibHandle = dlopen(DRMLIB_NAME, RTLD_LAZY | RTLD_LOCAL); + if (!sXf86DrmLibHandle) { + LOGDMABUF(("Failed to load %s, dmabuf isn't available.\n", DRMLIB_NAME)); + return false; } - - return sGbmLibHandle; + sDrmPrimeHandleToFD = + (DrmPrimeHandleToFDFunc)dlsym(sXf86DrmLibHandle, "drmPrimeHandleToFD"); + sLoaded = IsLoaded(); + if (!sLoaded) { + LOGDMABUF(("Failed to load all symbols from %s\n", GBMLIB_NAME)); + } + return sLoaded; } gbm_device* nsDMABufDevice::GetGbmDevice() { diff --git a/widget/gtk/DMABufLibWrapper.h b/widget/gtk/DMABufLibWrapper.h index 95cb0b1f3424..50248c2f8915 100644 --- a/widget/gtk/DMABufLibWrapper.h +++ b/widget/gtk/DMABufLibWrapper.h @@ -1,5 +1,5 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:expandtab:shiftwidth=4:tabstop=4: +/* -*- 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 @@ -56,9 +56,9 @@ typedef void (*DestroySurfaceFunc)(struct gbm_surface*); class nsGbmLib { public: - static bool Load(); - static bool IsLoaded(); - static bool IsAvailable(); + static bool IsAvailable() { + return sLoaded || Load(); + } static bool IsModifierAvailable(); static struct gbm_device* CreateDevice(int fd) { @@ -147,6 +147,9 @@ class nsGbmLib { } private: + static bool Load(); + static bool IsLoaded(); + static CreateDeviceFunc sCreateDevice; static DestroyDeviceFunc sDestroyDevice; static CreateFunc sCreate; @@ -165,11 +168,11 @@ class nsGbmLib { static DrmPrimeHandleToFDFunc sDrmPrimeHandleToFD; static CreateSurfaceFunc sCreateSurface; static DestroySurfaceFunc sDestroySurface; + static bool sLoaded; static void* sGbmLibHandle; static void* sXf86DrmLibHandle; static mozilla::StaticMutex sDRILock MOZ_UNANNOTATED; - static bool sLibLoaded; }; struct GbmFormat {