Blob Blame History Raw
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<SurfaceFactory_DMABUF>(gl, caps, ipcChannel, flags);
+    if (gl->GetContextType() == GLContextType::EGL &&
+        gfxPlatformGtk::GetPlatform()->UseWaylandDMABufWebGL()) {
+      auto DMABUFFactory =
+          MakeUnique<SurfaceFactory_DMABUF>(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<SharedSurface> 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.