Bug 1771146 - Check for gbm availability correctly before trying to create a surface. r=stransky,jgilbert

(And try to make it cheaper).

Differential Revision: https://phabricator.services.mozilla.com/D147312
This commit is contained in:
Emilio Cobos Álvarez 2022-05-27 07:35:44 +00:00
Родитель dd892c6dd1
Коммит ddb8e6f491
3 изменённых файлов: 67 добавлений и 61 удалений

Просмотреть файл

@ -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);

Просмотреть файл

@ -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() {

Просмотреть файл

@ -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 {