diff --git a/gfx/gl/GLScreenBuffer.cpp b/gfx/gl/GLScreenBuffer.cpp --- a/gfx/gl/GLScreenBuffer.cpp +++ b/gfx/gl/GLScreenBuffer.cpp @@ -88,10 +88,14 @@ #if defined(XP_MACOSX) factory = SurfaceFactory_IOSurface::Create(gl, caps, ipcChannel, flags); #elif defined(MOZ_WAYLAND) - if (gl->GetContextType() == GLContextType::EGL) { - if (gfxPlatformGtk::GetPlatform()->UseWaylandDMABufWebGL()) { - factory = - MakeUnique(gl, caps, ipcChannel, flags); + if (gl->GetContextType() == GLContextType::EGL && + gfxPlatformGtk::GetPlatform()->UseWaylandDMABufWebGL()) { + auto DMABUFFactory = + MakeUnique(gl, caps, ipcChannel, flags); + if (DMABUFFactory && DMABUFFactory->CanCreateSurface()) { + factory = std::move(DMABUFFactory); + } else { + gfxPlatformGtk::GetPlatform()->DisableWaylandDMABufWebGL(); } } #elif defined(MOZ_X11) diff --git a/gfx/gl/SharedSurfaceDMABUF.h b/gfx/gl/SharedSurfaceDMABUF.h --- a/gfx/gl/SharedSurfaceDMABUF.h +++ b/gfx/gl/SharedSurfaceDMABUF.h @@ -71,6 +71,11 @@ bool hasAlpha = mReadCaps.alpha; return SharedSurface_DMABUF::Create(mGL, mFormats, size, hasAlpha); } + + bool CanCreateSurface() { + UniquePtr test = CreateShared(gfx::IntSize(1, 1)); + return test != nullptr; + } }; } // namespace gl diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h --- a/gfx/thebes/gfxPlatformGtk.h +++ b/gfx/thebes/gfxPlatformGtk.h @@ -88,7 +88,8 @@ #ifdef MOZ_WAYLAND bool UseWaylandDMABufTextures(); - bool UseWaylandDMABufWebGL(); + bool UseWaylandDMABufWebGL() { return mUseWebGLDmabufBackend; } + void DisableWaylandDMABufWebGL() { mUseWebGLDmabufBackend = false; } bool UseWaylandHardwareVideoDecoding(); #endif @@ -110,6 +111,9 @@ #ifdef MOZ_X11 Display* mCompositorDisplay; #endif +#ifdef MOZ_WAYLAND + bool mUseWebGLDmabufBackend; +#endif }; #endif /* GFX_PLATFORM_GTK_H */ diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp --- a/gfx/thebes/gfxPlatformGtk.cpp +++ b/gfx/thebes/gfxPlatformGtk.cpp @@ -116,6 +116,9 @@ Factory::ReleaseFTLibrary(gPlatformFTLibrary); gPlatformFTLibrary = nullptr; + + mUseWebGLDmabufBackend = + IsWaylandDisplay() && nsWaylandDisplay::IsDMABufWebGLEnabled(); } void gfxPlatformGtk::FlushContentDrawing() { @@ -725,9 +728,6 @@ bool gfxPlatformGtk::UseWaylandDMABufTextures() { return IsWaylandDisplay() && nsWaylandDisplay::IsDMABufTexturesEnabled(); } -bool gfxPlatformGtk::UseWaylandDMABufWebGL() { - return IsWaylandDisplay() && nsWaylandDisplay::IsDMABufWebGLEnabled(); -} bool gfxPlatformGtk::UseWaylandHardwareVideoDecoding() { return IsWaylandDisplay() && nsWaylandDisplay::IsDMABufVAAPIEnabled() && gfxPlatform::CanUseHardwareVideoDecoding(); diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -9111,7 +9111,7 @@ # Use DMABuf backend for WebGL on Wayland. - name: widget.wayland-dmabuf-webgl.enabled type: RelaxedAtomicBool - value: false + value: true mirror: always # Use VA-API for video playback on Wayland.