summaryrefslogtreecommitdiff
path: root/mozilla-1462642.patch
diff options
context:
space:
mode:
authorMartin Stransky <stransky@redhat.com>2018-05-25 12:50:35 +0200
committerMartin Stransky <stransky@redhat.com>2018-05-25 12:50:35 +0200
commitdd0eb4d9d89c3b796044c7fac8397c8713c5cdeb (patch)
treea784b13aa5a0fb07ed8cc7c7f50ecdb3650c2e12 /mozilla-1462642.patch
parentUpdate to 60.0.1 (diff)
downloadlibrewolf-fedora-ff-dd0eb4d9d89c3b796044c7fac8397c8713c5cdeb.tar.gz
librewolf-fedora-ff-dd0eb4d9d89c3b796044c7fac8397c8713c5cdeb.tar.bz2
librewolf-fedora-ff-dd0eb4d9d89c3b796044c7fac8397c8713c5cdeb.zip
Enable Wayland backend
Diffstat (limited to 'mozilla-1462642.patch')
-rw-r--r--mozilla-1462642.patch183
1 files changed, 183 insertions, 0 deletions
diff --git a/mozilla-1462642.patch b/mozilla-1462642.patch
new file mode 100644
index 0000000..9bd6ab8
--- /dev/null
+++ b/mozilla-1462642.patch
@@ -0,0 +1,183 @@
+diff -up firefox-60.0.1/gfx/gl/GLContextEGL.h.mozilla-1462642 firefox-60.0.1/gfx/gl/GLContextEGL.h
+--- firefox-60.0.1/gfx/gl/GLContextEGL.h.mozilla-1462642 2018-05-16 07:38:29.000000000 +0200
++++ firefox-60.0.1/gfx/gl/GLContextEGL.h 2018-05-25 10:54:09.271902218 +0200
+@@ -133,6 +133,10 @@ protected:
+ static EGLSurface CreatePBufferSurfaceTryingPowerOfTwo(EGLConfig config,
+ EGLenum bindToTextureFormat,
+ gfx::IntSize& pbsize);
++#if defined(MOZ_WAYLAND)
++ static EGLSurface CreateWaylandBufferSurface(EGLConfig config,
++ gfx::IntSize& pbsize);
++#endif
+ #if defined(MOZ_WIDGET_ANDROID)
+ public:
+ EGLSurface CreateCompatibleSurface(void* aWindow);
+diff -up firefox-60.0.1/gfx/gl/GLContextProviderEGL.cpp.mozilla-1462642 firefox-60.0.1/gfx/gl/GLContextProviderEGL.cpp
+--- firefox-60.0.1/gfx/gl/GLContextProviderEGL.cpp.mozilla-1462642 2018-05-25 10:54:09.258902265 +0200
++++ firefox-60.0.1/gfx/gl/GLContextProviderEGL.cpp 2018-05-25 10:55:57.634553279 +0200
+@@ -63,6 +63,17 @@
+ #include "ScopedGLHelpers.h"
+ #include "TextureImageEGL.h"
+
++#if defined(MOZ_WAYLAND)
++#include "nsAutoPtr.h"
++#include "nsDataHashtable.h"
++
++#include <gtk/gtk.h>
++#include <gdk/gdkx.h>
++#include <gdk/gdkwayland.h>
++#include <wayland-egl.h>
++#include <dlfcn.h>
++#endif
++
+ using namespace mozilla::gfx;
+
+ namespace mozilla {
+@@ -70,6 +81,35 @@ namespace gl {
+
+ using namespace mozilla::widget;
+
++#if defined(MOZ_WAYLAND)
++class WaylandGLSurface {
++public:
++ WaylandGLSurface(struct wl_surface *aWaylandSurface,
++ struct wl_egl_window *aEGLWindow);
++ ~WaylandGLSurface();
++private:
++ struct wl_surface *mWaylandSurface;
++ struct wl_egl_window *mEGLWindow;
++};
++
++static nsDataHashtable<nsPtrHashKey<void>, WaylandGLSurface*>
++ sWaylandGLSurface;
++
++void
++DeleteWaylandGLSurface(EGLSurface surface)
++{
++ // We're running on Wayland which means our EGLSurface may
++ // have attached Wayland backend data which must be released.
++ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
++ auto entry = sWaylandGLSurface.Lookup(surface);
++ if (entry) {
++ delete entry.Data();
++ entry.Remove();
++ }
++ }
++}
++#endif
++
+ #define ADD_ATTR_2(_array, _k, _v) do { \
+ (_array).AppendElement(_k); \
+ (_array).AppendElement(_v); \
+@@ -125,6 +165,9 @@ DestroySurface(EGLSurface oldSurface) {
+ EGL_NO_SURFACE, EGL_NO_SURFACE,
+ EGL_NO_CONTEXT);
+ sEGLLibrary.fDestroySurface(EGL_DISPLAY(), oldSurface);
++#if defined(MOZ_WAYLAND)
++ DeleteWaylandGLSurface(oldSurface);
++#endif
+ }
+ }
+
+@@ -588,6 +631,52 @@ TRY_AGAIN_POWER_OF_TWO:
+ return surface;
+ }
+
++#if defined(MOZ_WAYLAND)
++WaylandGLSurface::WaylandGLSurface(struct wl_surface *aWaylandSurface,
++ struct wl_egl_window *aEGLWindow)
++ : mWaylandSurface(aWaylandSurface)
++ , mEGLWindow(aEGLWindow)
++{
++}
++
++WaylandGLSurface::~WaylandGLSurface()
++{
++ wl_egl_window_destroy(mEGLWindow);
++ wl_surface_destroy(mWaylandSurface);
++}
++
++EGLSurface
++GLContextEGL::CreateWaylandBufferSurface(EGLConfig config,
++ mozilla::gfx::IntSize& pbsize)
++{
++ // Available as of GTK 3.8+
++ static auto sGdkWaylandDisplayGetWlCompositor =
++ (wl_compositor *(*)(GdkDisplay *))
++ dlsym(RTLD_DEFAULT, "gdk_wayland_display_get_wl_compositor");
++
++ if (!sGdkWaylandDisplayGetWlCompositor)
++ return nullptr;
++
++ struct wl_compositor *compositor =
++ sGdkWaylandDisplayGetWlCompositor(gdk_display_get_default());
++ struct wl_surface *wlsurface = wl_compositor_create_surface(compositor);
++ struct wl_egl_window *eglwindow =
++ wl_egl_window_create(wlsurface, pbsize.width, pbsize.height);
++
++ EGLSurface surface =
++ sEGLLibrary.fCreateWindowSurface(EGL_DISPLAY(), config, eglwindow, 0);
++
++ if (surface) {
++ WaylandGLSurface* waylandData =
++ new WaylandGLSurface(wlsurface, eglwindow);
++ auto entry = sWaylandGLSurface.LookupForAdd(surface);
++ entry.OrInsert([&waylandData](){ return waylandData; });
++ }
++
++ return surface;
++}
++#endif
++
+ static const EGLint kEGLConfigAttribsOffscreenPBuffer[] = {
+ LOCAL_EGL_SURFACE_TYPE, LOCAL_EGL_PBUFFER_BIT,
+ LOCAL_EGL_RENDERABLE_TYPE, LOCAL_EGL_OPENGL_ES2_BIT,
+@@ -807,7 +896,17 @@ FillContextAttribs(bool alpha, bool dept
+ bool es3, nsTArray<EGLint>* out)
+ {
+ out->AppendElement(LOCAL_EGL_SURFACE_TYPE);
++#if defined(MOZ_WAYLAND)
++ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
++ // Wayland on desktop does not support PBuffer or FBO.
++ // We create a dummy wl_egl_window instead.
++ out->AppendElement(LOCAL_EGL_WINDOW_BIT);
++ } else {
++ out->AppendElement(LOCAL_EGL_PBUFFER_BIT);
++ }
++#else
+ out->AppendElement(LOCAL_EGL_PBUFFER_BIT);
++#endif
+
+ out->AppendElement(LOCAL_EGL_RENDERABLE_TYPE);
+ if (es3) {
+@@ -926,9 +1025,17 @@ GLContextEGL::CreateEGLPBufferOffscreenC
+ }
+
+ mozilla::gfx::IntSize pbSize(size);
+- EGLSurface surface = GLContextEGL::CreatePBufferSurfaceTryingPowerOfTwo(config,
+- LOCAL_EGL_NONE,
+- pbSize);
++ EGLSurface surface = nullptr;
++#if defined(MOZ_WAYLAND)
++ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
++ surface = GLContextEGL::CreateWaylandBufferSurface(config, pbSize);
++ } else
++#endif
++ {
++ surface = GLContextEGL::CreatePBufferSurfaceTryingPowerOfTwo(config,
++ LOCAL_EGL_NONE,
++ pbSize);
++ }
+ if (!surface) {
+ *out_failureId = NS_LITERAL_CSTRING("FEATURE_FAILURE_EGL_POT");
+ NS_WARNING("Failed to create PBuffer for context!");
+@@ -941,6 +1048,9 @@ GLContextEGL::CreateEGLPBufferOffscreenC
+ if (!gl) {
+ NS_WARNING("Failed to create GLContext from PBuffer");
+ sEGLLibrary.fDestroySurface(sEGLLibrary.Display(), surface);
++#if defined(MOZ_WAYLAND)
++ DeleteWaylandGLSurface(surface);
++#endif
+ return nullptr;
+ }
+
bgstack15