summaryrefslogtreecommitdiff
path: root/D147420.diff
diff options
context:
space:
mode:
Diffstat (limited to 'D147420.diff')
-rw-r--r--D147420.diff179
1 files changed, 179 insertions, 0 deletions
diff --git a/D147420.diff b/D147420.diff
new file mode 100644
index 0000000..1ee3af1
--- /dev/null
+++ b/D147420.diff
@@ -0,0 +1,179 @@
+diff -up firefox-101.0/gfx/gl/GLContextEGL.h.D147420.diff firefox-101.0/gfx/gl/GLContextEGL.h
+--- firefox-101.0/gfx/gl/GLContextEGL.h.D147420.diff 2022-05-27 01:16:54.000000000 +0200
++++ firefox-101.0/gfx/gl/GLContextEGL.h 2022-06-07 09:01:17.487787806 +0200
+@@ -106,6 +106,9 @@ class GLContextEGL final : public GLCont
+ static RefPtr<GLContextEGL> CreateEGLPBufferOffscreenContextImpl(
+ std::shared_ptr<EglDisplay>, const GLContextCreateDesc&,
+ const gfx::IntSize& size, bool aUseGles, nsACString* const out_FailureId);
++ static RefPtr<GLContextEGL> CreateEGLSurfacelessContext(
++ const std::shared_ptr<EglDisplay> display,
++ const GLContextCreateDesc& desc, nsACString* const out_failureId);
+
+ static EGLSurface CreateEGLSurfaceForCompositorWidget(
+ widget::CompositorWidget* aCompositorWidget, const EGLConfig aConfig);
+diff -up firefox-101.0/gfx/gl/GLContextProviderEGL.cpp.D147420.diff firefox-101.0/gfx/gl/GLContextProviderEGL.cpp
+--- firefox-101.0/gfx/gl/GLContextProviderEGL.cpp.D147420.diff 2022-05-27 01:16:54.000000000 +0200
++++ firefox-101.0/gfx/gl/GLContextProviderEGL.cpp 2022-06-07 09:01:17.487787806 +0200
+@@ -1190,16 +1190,42 @@ RefPtr<GLContextEGL> GLContextEGL::Creat
+ }
+
+ /*static*/
++RefPtr<GLContextEGL> GLContextEGL::CreateEGLSurfacelessContext(
++ const std::shared_ptr<EglDisplay> display, const GLContextCreateDesc& desc,
++ nsACString* const out_failureId) {
++ const EGLConfig config = {};
++ auto fullDesc = GLContextDesc{desc};
++ fullDesc.isOffscreen = true;
++ RefPtr<GLContextEGL> gl = GLContextEGL::CreateGLContext(
++ display, fullDesc, config, EGL_NO_SURFACE, false, out_failureId);
++ if (!gl) {
++ NS_WARNING("Failed to create surfaceless GL context");
++ return nullptr;
++ }
++ return gl;
++}
++
++/*static*/
+ already_AddRefed<GLContext> GLContextProviderEGL::CreateHeadless(
+ const GLContextCreateDesc& desc, nsACString* const out_failureId) {
+ const auto display = DefaultEglDisplay(out_failureId);
+ if (!display) {
+ return nullptr;
+ }
+- mozilla::gfx::IntSize dummySize = mozilla::gfx::IntSize(16, 16);
+- auto ret = GLContextEGL::CreateEGLPBufferOffscreenContext(
+- display, desc, dummySize, out_failureId);
+- return ret.forget();
++ RefPtr<GLContextEGL> gl;
++#ifdef MOZ_WAYLAND
++ if (!gdk_display_get_default() &&
++ display->IsExtensionSupported(EGLExtension::MESA_platform_surfaceless)) {
++ gl =
++ GLContextEGL::CreateEGLSurfacelessContext(display, desc, out_failureId);
++ } else
++#endif
++ {
++ mozilla::gfx::IntSize dummySize = mozilla::gfx::IntSize(16, 16);
++ gl = GLContextEGL::CreateEGLPBufferOffscreenContext(
++ display, desc, dummySize, out_failureId);
++ }
++ return gl.forget();
+ }
+
+ // Don't want a global context on Android as 1) share groups across 2 threads
+diff -up firefox-101.0/gfx/gl/GLDefs.h.D147420.diff firefox-101.0/gfx/gl/GLDefs.h
+--- firefox-101.0/gfx/gl/GLDefs.h.D147420.diff 2022-05-27 01:16:54.000000000 +0200
++++ firefox-101.0/gfx/gl/GLDefs.h 2022-06-07 09:01:17.487787806 +0200
+@@ -104,6 +104,9 @@ bool CheckContextLost(const GLContext* g
+ // EGL_ANGLE_image_d3d11_texture
+ #define LOCAL_EGL_D3D11_TEXTURE_ANGLE 0x3484
+
++// EGL_MESA_platform_surfaceless
++#define LOCAL_EGL_PLATFORM_SURFACELESS_MESA 0x31DD
++
+ // clang-format on
+
+ #endif
+diff -up firefox-101.0/gfx/gl/GLLibraryEGL.cpp.D147420.diff firefox-101.0/gfx/gl/GLLibraryEGL.cpp
+--- firefox-101.0/gfx/gl/GLLibraryEGL.cpp.D147420.diff 2022-05-27 01:16:54.000000000 +0200
++++ firefox-101.0/gfx/gl/GLLibraryEGL.cpp 2022-06-07 09:03:04.077349997 +0200
+@@ -82,7 +82,8 @@ static const char* sEGLExtensionNames[]
+ "EGL_KHR_swap_buffers_with_damage",
+ "EGL_EXT_buffer_age",
+ "EGL_KHR_partial_update",
+- "EGL_NV_robustness_video_memory_purge"};
++ "EGL_NV_robustness_video_memory_purge",
++ "EGL_MESA_platform_surfaceless"};
+
+ PRLibrary* LoadApitraceLibrary() {
+ const char* path = nullptr;
+@@ -151,6 +152,19 @@ static std::shared_ptr<EglDisplay> GetAn
+ return EglDisplay::Create(egl, display, false, aProofOfLock);
+ }
+
++#ifdef MOZ_WAYLAND
++static std::shared_ptr<EglDisplay> GetAndInitSurfacelessDisplay(
++ GLLibraryEGL& egl, const StaticMutexAutoLock& aProofOfLock) {
++ const EGLAttrib attrib_list[] = {LOCAL_EGL_NONE};
++ const EGLDisplay display = egl.fGetPlatformDisplay(
++ LOCAL_EGL_PLATFORM_SURFACELESS_MESA, EGL_DEFAULT_DISPLAY, attrib_list);
++ if (display == EGL_NO_DISPLAY) {
++ return nullptr;
++ }
++ return EglDisplay::Create(egl, display, true, aProofOfLock);
++}
++#endif
++
+ static std::shared_ptr<EglDisplay> GetAndInitWARPDisplay(
+ GLLibraryEGL& egl, void* displayType,
+ const StaticMutexAutoLock& aProofOfLock) {
+@@ -629,6 +643,11 @@ bool GLLibraryEGL::Init(nsACString* cons
+ END_OF_SYMBOLS};
+ (void)fnLoadSymbols(symbols);
+ }
++ {
++ const SymLoadStruct symbols[] = {SYMBOL(GetPlatformDisplay),
++ END_OF_SYMBOLS};
++ (void)fnLoadSymbols(symbols);
++ }
+
+ return true;
+ }
+@@ -806,7 +825,9 @@ std::shared_ptr<EglDisplay> GLLibraryEGL
+ #ifdef MOZ_WAYLAND
+ // Some drivers doesn't support EGL_DEFAULT_DISPLAY
+ GdkDisplay* gdkDisplay = gdk_display_get_default();
+- if (widget::GdkIsWaylandDisplay(gdkDisplay)) {
++ if (!gdkDisplay) {
++ ret = GetAndInitSurfacelessDisplay(*this, aProofOfLock);
++ } else if (widget::GdkIsWaylandDisplay(gdkDisplay)) {
+ nativeDisplay = widget::WaylandDisplayGetWLDisplay(gdkDisplay);
+ if (!nativeDisplay) {
+ NS_WARNING("Failed to get wl_display.");
+@@ -814,7 +835,9 @@ std::shared_ptr<EglDisplay> GLLibraryEGL
+ }
+ }
+ #endif
+- ret = GetAndInitDisplay(*this, nativeDisplay, aProofOfLock);
++ if (!ret) {
++ ret = GetAndInitDisplay(*this, nativeDisplay, aProofOfLock);
++ }
+ }
+
+ if (!ret) {
+diff -up firefox-101.0/gfx/gl/GLLibraryEGL.h.D147420.diff firefox-101.0/gfx/gl/GLLibraryEGL.h
+--- firefox-101.0/gfx/gl/GLLibraryEGL.h.D147420.diff 2022-05-27 01:16:54.000000000 +0200
++++ firefox-101.0/gfx/gl/GLLibraryEGL.h 2022-06-07 09:01:17.487787806 +0200
+@@ -107,6 +107,7 @@ enum class EGLExtension {
+ EXT_buffer_age,
+ KHR_partial_update,
+ NV_robustness_video_memory_purge,
++ MESA_platform_surfaceless,
+ Max
+ };
+
+diff -up firefox-101.0/widget/gtk/DMABufSurface.cpp.D147420.diff firefox-101.0/widget/gtk/DMABufSurface.cpp
+--- firefox-101.0/widget/gtk/DMABufSurface.cpp.D147420.diff 2022-06-07 09:01:17.486787773 +0200
++++ firefox-101.0/widget/gtk/DMABufSurface.cpp 2022-06-07 09:01:17.487787806 +0200
+@@ -1259,7 +1259,7 @@ bool DMABufSurfaceYUV::VerifyTextureCrea
+ nsCString discardFailureId;
+ sSnapshotContext = GLContextProvider::CreateHeadless({}, &discardFailureId);
+ if (!sSnapshotContext) {
+- NS_WARNING("Failed to create snapshot GLContext");
++ LOGDMABUF((" failed to create snapshot GLContext"));
+ return false;
+ }
+ }
+@@ -1268,10 +1268,12 @@ bool DMABufSurfaceYUV::VerifyTextureCrea
+
+ for (int i = 0; i < mBufferPlaneCount; i++) {
+ if (!CreateEGLImage(sSnapshotContext, i)) {
++ LOGDMABUF((" failed to create EGL image!"));
+ return false;
+ }
+ }
+
++ LOGDMABUF((" success"));
+ return true;
+ }
+
bgstack15