92e16f9
diff -up firefox-101.0.1/gfx/config/gfxVars.h.D149238.diff firefox-101.0.1/gfx/config/gfxVars.h
92e16f9
--- firefox-101.0.1/gfx/config/gfxVars.h.D149238.diff	2022-06-14 14:28:15.301514131 +0200
92e16f9
+++ firefox-101.0.1/gfx/config/gfxVars.h	2022-06-14 14:29:32.221087732 +0200
92e16f9
@@ -91,7 +91,8 @@ class gfxVarReceiver;
92e16f9
   _(AllowWebGPU, bool, false)                                      \
92e16f9
   _(UseVP8HwDecode, bool, false)                                   \
92e16f9
   _(UseVP9HwDecode, bool, false)                                   \
92e16f9
-  _(HwDecodedVideoNoCopy, bool, false)
92e16f9
+  _(HwDecodedVideoNoCopy, bool, false)                             \
92e16f9
+  _(UseDMABufSurfaceExport, bool, true)
92e16f9
 
92e16f9
 /* Add new entries above this line. */
92e16f9
 
92e16f9
diff -up firefox-101.0.1/gfx/gl/SharedSurfaceDMABUF.cpp.D149238.diff firefox-101.0.1/gfx/gl/SharedSurfaceDMABUF.cpp
92e16f9
--- firefox-101.0.1/gfx/gl/SharedSurfaceDMABUF.cpp.D149238.diff	2022-06-14 14:28:15.297513997 +0200
92e16f9
+++ firefox-101.0.1/gfx/gl/SharedSurfaceDMABUF.cpp	2022-06-14 14:28:15.301514131 +0200
92e16f9
@@ -9,6 +9,7 @@
92e16f9
 #include "GLContextEGL.h"
92e16f9
 #include "MozFramebuffer.h"
92e16f9
 #include "mozilla/layers/LayersSurfaces.h"  // for SurfaceDescriptor, etc
92e16f9
+#include "mozilla/gfx/gfxVars.h"
92e16f9
 
92e16f9
 namespace mozilla::gl {
92e16f9
 
92e16f9
@@ -27,22 +28,39 @@ UniquePtr<SharedSurface_DMABUF> SharedSu
92e16f9
   const auto& context = gle->mContext;
92e16f9
   const auto& egl = *(gle->mEgl);
92e16f9
 
92e16f9
-  if (!HasDmaBufExtensions(gle)) {
92e16f9
-    return nullptr;
92e16f9
-  }
92e16f9
-
92e16f9
-  auto fb = MozFramebuffer::Create(desc.gl, desc.size, 0, false);
92e16f9
-  if (!fb) return nullptr;
92e16f9
-
92e16f9
-  const auto buffer = reinterpret_cast<EGLClientBuffer>(fb->ColorTex());
92e16f9
-  const auto image =
92e16f9
-      egl.fCreateImage(context, LOCAL_EGL_GL_TEXTURE_2D, buffer, nullptr);
92e16f9
-  if (!image) return nullptr;
92e16f9
-
92e16f9
-  const RefPtr<DMABufSurface> surface = DMABufSurfaceRGBA::CreateDMABufSurface(
92e16f9
-      desc.gl, image, desc.size.width, desc.size.height);
92e16f9
-  if (!surface) return nullptr;
92e16f9
+  RefPtr<DMABufSurface> surface;
92e16f9
+  UniquePtr<MozFramebuffer> fb;
92e16f9
 
92e16f9
+  if (!HasDmaBufExtensions(gle) || !gfx::gfxVars::UseDMABufSurfaceExport()) {
92e16f9
+    // Use MESA_image_dma_buf_export is not supported or it's broken.
92e16f9
+    // Create dmabuf surface directly via. GBM and create
92e16f9
+    // EGLImage/framebuffer over it.
92e16f9
+    const auto flags = static_cast<DMABufSurfaceFlags>(
92e16f9
+        DMABUF_TEXTURE | DMABUF_USE_MODIFIERS | DMABUF_ALPHA);
92e16f9
+    surface = DMABufSurfaceRGBA::CreateDMABufSurface(desc.size.width,
92e16f9
+                                                     desc.size.height, flags);
92e16f9
+    if (!surface || !surface->CreateTexture(desc.gl)) {
92e16f9
+      return nullptr;
92e16f9
+    }
92e16f9
+    const auto tex = surface->GetTexture();
92e16f9
+    fb = MozFramebuffer::CreateForBacking(desc.gl, desc.size, 0, false,
92e16f9
+                                          LOCAL_GL_TEXTURE_2D, tex);
92e16f9
+    if (!fb) return nullptr;
92e16f9
+  } else {
92e16f9
+    // Use MESA_image_dma_buf_export so create EGLImage/framebuffer directly
92e16f9
+    // and derive dmabuf from it.
92e16f9
+    fb = MozFramebuffer::Create(desc.gl, desc.size, 0, false);
92e16f9
+    if (!fb) return nullptr;
92e16f9
+
92e16f9
+    const auto buffer = reinterpret_cast<EGLClientBuffer>(fb->ColorTex());
92e16f9
+    const auto image =
92e16f9
+        egl.fCreateImage(context, LOCAL_EGL_GL_TEXTURE_2D, buffer, nullptr);
92e16f9
+    if (!image) return nullptr;
92e16f9
+
92e16f9
+    surface = DMABufSurfaceRGBA::CreateDMABufSurface(
92e16f9
+        desc.gl, image, desc.size.width, desc.size.height);
92e16f9
+    if (!surface) return nullptr;
92e16f9
+  }
92e16f9
   return AsUnique(new SharedSurface_DMABUF(desc, std::move(fb), surface));
92e16f9
 }
92e16f9
 
92e16f9
diff -up firefox-101.0.1/gfx/thebes/gfxPlatform.cpp.D149238.diff firefox-101.0.1/gfx/thebes/gfxPlatform.cpp
92e16f9
--- firefox-101.0.1/gfx/thebes/gfxPlatform.cpp.D149238.diff	2022-06-08 23:06:36.000000000 +0200
92e16f9
+++ firefox-101.0.1/gfx/thebes/gfxPlatform.cpp	2022-06-14 14:28:15.302514165 +0200
92e16f9
@@ -2851,6 +2851,17 @@ void gfxPlatform::InitWebGLConfig() {
92e16f9
       gfxVars::SetAllowEglRbab(false);
92e16f9
     }
92e16f9
   }
92e16f9
+
92e16f9
+  if (kIsWayland || kIsX11) {
92e16f9
+    // Disable EGL_MESA_image_dma_buf_export on mesa/radeonsi due to
92e16f9
+    // https://gitlab.freedesktop.org/mesa/mesa/-/issues/6666
92e16f9
+    nsString adapterDriverVendor;
92e16f9
+    gfxInfo->GetAdapterDriverVendor(adapterDriverVendor);
92e16f9
+    if (adapterDriverVendor.Find("mesa") != -1 &&
92e16f9
+        adapterDriverVendor.Find("radeonsi") != -1) {
92e16f9
+      gfxVars::SetUseDMABufSurfaceExport(false);
92e16f9
+    }
92e16f9
+  }
92e16f9
 }
92e16f9
 
92e16f9
 void gfxPlatform::InitWebGPUConfig() {