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