diff options
Diffstat (limited to 'mozilla-1580152.patch')
-rw-r--r-- | mozilla-1580152.patch | 618 |
1 files changed, 0 insertions, 618 deletions
diff --git a/mozilla-1580152.patch b/mozilla-1580152.patch deleted file mode 100644 index 6260d3c..0000000 --- a/mozilla-1580152.patch +++ /dev/null @@ -1,618 +0,0 @@ -diff -up firefox-69.0/widget/gtk/mozwayland/mozwayland.h.mozilla-1580152 firefox-69.0/widget/gtk/mozwayland/mozwayland.h ---- firefox-69.0/widget/gtk/mozwayland/mozwayland.h.mozilla-1580152 2019-09-16 11:11:30.081299217 +0200 -+++ firefox-69.0/widget/gtk/mozwayland/mozwayland.h 2019-09-16 11:11:30.089299191 +0200 -@@ -27,6 +27,9 @@ MOZ_EXPORT struct wl_proxy* wl_proxy_mar - struct wl_proxy* proxy, uint32_t opcode, - const struct wl_interface* interface, ...); - -+MOZ_EXPORT void* wl_proxy_create_wrapper(void* proxy); -+MOZ_EXPORT void wl_proxy_wrapper_destroy(void* proxy_wrapper); -+ - /* We need implement some missing functions from wayland-client-protocol.h - */ - #ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM -diff -up firefox-69.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1580152 firefox-69.0/widget/gtk/nsWaylandDisplay.cpp ---- firefox-69.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1580152 2019-09-16 11:11:30.081299217 +0200 -+++ firefox-69.0/widget/gtk/nsWaylandDisplay.cpp 2019-09-16 11:11:30.089299191 +0200 -@@ -243,6 +243,61 @@ bool nsWaylandDisplay::DispatchEventQueu - return true; - } - -+void nsWaylandDisplay::SyncEnd() { -+ wl_callback_destroy(mSyncCallback); -+ mSyncCallback = NULL; -+} -+ -+static void wayland_sync_callback(void* data, struct wl_callback* callback, -+ uint32_t time) { -+ auto display = static_cast<nsWaylandDisplay*>(data); -+ display->SyncEnd(); -+} -+ -+static const struct wl_callback_listener sync_callback_listener = { -+ .done = wayland_sync_callback}; -+ -+void nsWaylandDisplay::SyncBegin() { -+ WaitForSyncEnd(); -+ -+ // Use wl_display_sync() to synchronize wayland events. -+ // See dri2_wl_swap_buffers_with_damage() from MESA -+ // or wl_display_roundtrip_queue() from wayland-client. -+ struct wl_display* displayWrapper = -+ static_cast<wl_display*>(wl_proxy_create_wrapper((void*)mDisplay)); -+ if (!displayWrapper) { -+ NS_WARNING("Failed to create wl_proxy wrapper!"); -+ return; -+ } -+ -+ wl_proxy_set_queue((struct wl_proxy*)displayWrapper, mEventQueue); -+ mSyncCallback = wl_display_sync(displayWrapper); -+ wl_proxy_wrapper_destroy((void*)displayWrapper); -+ -+ if (!mSyncCallback) { -+ NS_WARNING("Failed to create wl_display_sync callback!"); -+ return; -+ } -+ -+ wl_callback_add_listener(mSyncCallback, &sync_callback_listener, this); -+ wl_display_flush(mDisplay); -+} -+ -+void nsWaylandDisplay::WaitForSyncEnd() { -+ // We're done here -+ if (!mSyncCallback) { -+ return; -+ } -+ -+ while (mSyncCallback != NULL) { -+ if (wl_display_dispatch_queue(mDisplay, mEventQueue) == -1) { -+ NS_WARNING("wl_display_dispatch_queue failed!"); -+ SyncEnd(); -+ return; -+ } -+ } -+} -+ - bool nsWaylandDisplay::Matches(wl_display* aDisplay) { - return mThreadId == PR_GetCurrentThread() && aDisplay == mDisplay; - } -@@ -305,6 +360,7 @@ nsWaylandDisplay::nsWaylandDisplay(wl_di - mSubcompositor(nullptr), - mSeat(nullptr), - mShm(nullptr), -+ mSyncCallback(nullptr), - mPrimarySelectionDeviceManager(nullptr), - mRegistry(nullptr), - mGbmDevice(nullptr), -diff -up firefox-69.0/widget/gtk/nsWaylandDisplay.h.mozilla-1580152 firefox-69.0/widget/gtk/nsWaylandDisplay.h ---- firefox-69.0/widget/gtk/nsWaylandDisplay.h.mozilla-1580152 2019-09-16 11:11:30.081299217 +0200 -+++ firefox-69.0/widget/gtk/nsWaylandDisplay.h 2019-09-16 11:11:30.089299191 +0200 -@@ -41,6 +41,11 @@ class nsWaylandDisplay { - virtual ~nsWaylandDisplay(); - - bool DispatchEventQueue(); -+ -+ void SyncBegin(); -+ void SyncEnd(); -+ void WaitForSyncEnd(); -+ - bool Matches(wl_display* aDisplay); - - MessageLoop* GetDispatcherThreadLoop() { return mDispatcherThreadLoop; } -@@ -90,6 +95,7 @@ class nsWaylandDisplay { - wl_subcompositor* mSubcompositor; - wl_seat* mSeat; - wl_shm* mShm; -+ wl_callback* mSyncCallback; - gtk_primary_selection_device_manager* mPrimarySelectionDeviceManager; - wl_registry* mRegistry; - zwp_linux_dmabuf_v1* mDmabuf; -diff -up firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1580152 firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp ---- firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1580152 2019-09-16 11:11:30.086299200 +0200 -+++ firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp 2019-09-16 11:57:35.462193492 +0200 -@@ -32,6 +32,9 @@ extern mozilla::LazyLogModule gWidgetWay - # define LOGWAYLAND(args) - #endif /* MOZ_LOGGING */ - -+// Maximal compositin timeout it miliseconds -+#define COMPOSITING_TIMEOUT 200 -+ - namespace mozilla { - namespace widget { - -@@ -198,6 +201,10 @@ available and gfx.wayland_dmabuf_backend - #define BUFFER_BPP 4 - gfx::SurfaceFormat WindowBackBuffer::mFormat = gfx::SurfaceFormat::B8G8R8A8; - -+nsWaylandDisplay* WindowBackBuffer::GetWaylandDisplay() { -+ return mWindowSurfaceWayland->GetWaylandDisplay(); -+} -+ - int WaylandShmPool::CreateTemporaryFile(int aSize) { - const char* tmppath = getenv("XDG_RUNTIME_DIR"); - MOZ_RELEASE_ASSERT(tmppath, "Missing XDG_RUNTIME_DIR env variable."); -@@ -342,10 +349,11 @@ void WindowBackBufferShm::Clear() { - memset(mShmPool.GetImageData(), 0, mHeight * mWidth * BUFFER_BPP); - } - --WindowBackBufferShm::WindowBackBufferShm(nsWaylandDisplay* aWaylandDisplay, -- int aWidth, int aHeight) -- : WindowBackBuffer(aWaylandDisplay), -- mShmPool(aWaylandDisplay, aWidth * aHeight * BUFFER_BPP), -+WindowBackBufferShm::WindowBackBufferShm( -+ WindowSurfaceWayland* aWindowSurfaceWayland, int aWidth, int aHeight) -+ : WindowBackBuffer(aWindowSurfaceWayland), -+ mShmPool(aWindowSurfaceWayland->GetWaylandDisplay(), -+ aWidth * aHeight * BUFFER_BPP), - mWaylandBuffer(nullptr), - mWidth(aWidth), - mHeight(aHeight), -@@ -387,6 +395,9 @@ void WindowBackBufferShm::Detach(wl_buff - aBuffer ? wl_proxy_get_id((struct wl_proxy*)aBuffer) : -1)); - - mAttached = false; -+ -+ // Commit any potential cached drawings from latest Lock()/Commit() cycle. -+ mWindowSurfaceWayland->CommitWaylandBuffer(); - } - - bool WindowBackBufferShm::SetImageDataFromBuffer( -@@ -416,8 +427,8 @@ already_AddRefed<gfx::DrawTarget> Window - } - - WindowBackBufferDMABuf::WindowBackBufferDMABuf( -- nsWaylandDisplay* aWaylandDisplay, int aWidth, int aHeight) -- : WindowBackBuffer(aWaylandDisplay) { -+ WindowSurfaceWayland* aWindowSurfaceWayland, int aWidth, int aHeight) -+ : WindowBackBuffer(aWindowSurfaceWayland) { - mDMAbufSurface.Create(aWidth, aHeight); - LOGWAYLAND( - ("WindowBackBufferDMABuf::WindowBackBufferDMABuf [%p] Created DMABuf " -@@ -475,6 +486,9 @@ bool WindowBackBufferDMABuf::SetImageDat - - void WindowBackBufferDMABuf::Detach(wl_buffer* aBuffer) { - mDMAbufSurface.WLBufferDetach(); -+ -+ // Commit any potential cached drawings from latest Lock()/Commit() cycle. -+ mWindowSurfaceWayland->CommitWaylandBuffer(); - } - - void WindowBackBufferDMABuf::Clear() { mDMAbufSurface.Clear(); } -@@ -496,10 +510,11 @@ WindowSurfaceWayland::WindowSurfaceWayla - mWaylandBuffer(nullptr), - mFrameCallback(nullptr), - mLastCommittedSurface(nullptr), -- mDisplayThreadMessageLoop(MessageLoop::current()), - mDelayedCommitHandle(nullptr), -+ mLastCommitTime(0), - mDrawToWaylandBufferDirectly(true), -- mPendingCommit(false), -+ mBufferPendingCommit(false), -+ mBufferCommitAllowed(false), - mWholeWindowBufferDamage(false), - mBufferNeedsClear(false), - mIsMainThread(NS_IsMainThread()), -@@ -508,7 +523,7 @@ WindowSurfaceWayland::WindowSurfaceWayla - } - - WindowSurfaceWayland::~WindowSurfaceWayland() { -- if (mPendingCommit) { -+ if (mBufferPendingCommit) { - NS_WARNING("Deleted WindowSurfaceWayland with a pending commit!"); - } - -@@ -547,7 +562,7 @@ WindowBackBuffer* WindowSurfaceWayland:: - if (UseDMABufBackend()) { - static bool sDMABufBufferCreated = false; - WindowBackBuffer* buffer = -- new WindowBackBufferDMABuf(mWaylandDisplay, aWidth, aHeight); -+ new WindowBackBufferDMABuf(this, aWidth, aHeight); - if (buffer) { - sDMABufBufferCreated = true; - return buffer; -@@ -564,7 +579,7 @@ WindowBackBuffer* WindowSurfaceWayland:: - } - } - -- return new WindowBackBufferShm(mWaylandDisplay, aWidth, aHeight); -+ return new WindowBackBufferShm(this, aWidth, aHeight); - } - - WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferToDraw( -@@ -675,6 +690,11 @@ already_AddRefed<gfx::DrawTarget> Window - (void*)this, (void*)buffer)); - - if (!buffer) { -+ if (mLastCommitTime && (g_get_monotonic_time() / 1000) - mLastCommitTime > -+ COMPOSITING_TIMEOUT) { -+ NS_WARNING( -+ "Slow response from Wayland compositor, visual glitches ahead."); -+ } - return nullptr; - } - -@@ -724,10 +744,9 @@ static bool IsPopupFullScreenUpdate(Layo - // box is equal to window borders. - if (aRegion.GetNumRects() > 2) return false; - -- gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect(); -- gfx::IntSize lockSize(bounds.XMost(), bounds.YMost()); -- -- return (screenRect.width == lockSize.width && -+ IntRect lockSize = aRegion.GetBounds().ToUnknownRect(); -+ return (lockSize.x == 0 && lockSize.y == 0 && -+ screenRect.width == lockSize.width && - screenRect.height == lockSize.height); - } - -@@ -738,8 +757,7 @@ static bool IsPopupFullScreenUpdate(Layo - to clip/buffer the drawing and we can return wl_buffer directly - for drawing. - - mWaylandBuffer is available - that's an ideal situation. -- - mWaylandBuffer is locked by compositor - flip buffers and draw. -- - if we can't flip buffers - go B) -+ - mWaylandBuffer is locked by compositor - go B) - - B) Lock() is requested for part(s) of screen. We need to provide temporary - surface to draw into and copy result (clipped) to target wl_surface. -@@ -747,14 +765,17 @@ static bool IsPopupFullScreenUpdate(Layo - already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::Lock( - const LayoutDeviceIntRegion& aRegion) { - MOZ_ASSERT(mIsMainThread == NS_IsMainThread()); -- -- // Disable all commits from frame callback handler and delayed comit handler -- // as we're updated by gecko compositor. -- mPendingCommit = false; -+ -+ // Wait until all pending events are processed. There may be queued -+ // wl_buffer release event which releases our wl_buffer for further rendering. -+ mWaylandDisplay->WaitForSyncEnd(); -+ -+ // Disable all commits (from potential frame callback/delayed handlers) -+ // until next WindowSurfaceWayland::Commit() call. -+ mBufferCommitAllowed = false; - - LayoutDeviceIntRect lockedScreenRect = mWindow->GetBounds(); -- gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect(); -- gfx::IntSize lockSize(bounds.XMost(), bounds.YMost()); -+ gfx::IntRect lockSize = aRegion.GetBounds().ToUnknownRect(); - - // Are we asked for entire nsWindow to draw? - bool isTransparentPopup = -@@ -775,10 +796,10 @@ already_AddRefed<gfx::DrawTarget> Window - } - - LOGWAYLAND( -- ("WindowSurfaceWayland::Lock [%p] lockSize [%d x %d] windowSize [%d x " -- "%d]\n", -- (void*)this, lockSize.width, lockSize.height, lockedScreenRect.width, -- lockedScreenRect.height)); -+ ("WindowSurfaceWayland::Lock [%p] [%d,%d] -> [%d x %d] rects %d " -+ "windowSize [%d x %d]\n", -+ (void*)this, lockSize.x, lockSize.y, lockSize.width, lockSize.height, -+ aRegion.GetNumRects(), lockedScreenRect.width, lockedScreenRect.height)); - LOGWAYLAND((" nsWindow = %p\n", mWindow)); - LOGWAYLAND((" isPopup = %d\n", mWindow->IsWaylandPopup())); - LOGWAYLAND((" isTransparentPopup = %d\n", isTransparentPopup)); -@@ -789,7 +810,7 @@ already_AddRefed<gfx::DrawTarget> Window - LOGWAYLAND((" mBufferNeedsClear = %d\n", mBufferNeedsClear)); - LOGWAYLAND((" mWholeWindowBufferDamage = %d\n", mWholeWindowBufferDamage)); - --#if DEBUG -+#if MOZ_LOGGING - if (!(mBufferScreenRect == lockedScreenRect)) { - LOGWAYLAND((" screen size changed\n")); - } -@@ -836,7 +857,7 @@ already_AddRefed<gfx::DrawTarget> Window - mDrawToWaylandBufferDirectly = false; - - LOGWAYLAND((" Indirect drawing.\n")); -- return LockImageSurface(lockSize); -+ return LockImageSurface(gfx::IntSize(lockSize.XMost(), lockSize.YMost())); - } - - void WindowImageSurface::Draw(gfx::SourceSurface* aSurface, -@@ -875,34 +896,42 @@ WindowImageSurface::WindowImageSurface( - mImageSurface->Format()); - } - -+void WindowSurfaceWayland::CacheImageSurface( -+ const LayoutDeviceIntRegion& aRegion) { -+#ifdef MOZ_LOGGING -+ gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect(); -+ LOGWAYLAND(("WindowSurfaceWayland::CacheImageSurface [%p]\n", (void*)this)); -+ LOGWAYLAND((" rects num %d\n", aRegion.GetNumRects())); -+ LOGWAYLAND((" bounds [ %d, %d] -> [%d x %d]\n", bounds.x, bounds.y, -+ bounds.width, bounds.height)); -+#endif -+ -+ mDelayedImageCommits.AppendElement( -+ WindowImageSurface(mImageSurface, aRegion)); -+ // mImageSurface is owned by mDelayedImageCommits -+ mImageSurface = nullptr; -+ -+ LOGWAYLAND( -+ (" There's %d cached images\n", int(mDelayedImageCommits.Length()))); -+} -+ - void WindowSurfaceWayland::DrawDelayedImageCommits( - gfx::DrawTarget* aDrawTarget, LayoutDeviceIntRegion& aWaylandBufferDamage) { -+ LOGWAYLAND( -+ ("WindowSurfaceWayland::DrawDelayedImageCommits [%p]\n", (void*)this)); -+ - for (unsigned int i = 0; i < mDelayedImageCommits.Length(); i++) { - mDelayedImageCommits[i].Draw(aDrawTarget, aWaylandBufferDamage); - } - mDelayedImageCommits.Clear(); - } - --bool WindowSurfaceWayland::CommitImageSurfaceToWaylandBuffer( -- const LayoutDeviceIntRegion& aRegion, -- LayoutDeviceIntRegion& aWaylandBufferDamage) { -- MOZ_ASSERT(!mDrawToWaylandBufferDirectly); -- --#ifdef DEBUG -- gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect(); -- gfx::Rect rect(bounds); -- MOZ_ASSERT(!rect.IsEmpty(), "Empty drawing?"); --#endif -- -- LOGWAYLAND( -- ("WindowSurfaceWayland::CommitImageSurfaceToWaylandBuffer [%p] " -- "screenSize [%d x %d]\n", -- (void*)this, mBufferScreenRect.width, mBufferScreenRect.height)); -+bool WindowSurfaceWayland::CommitImageCacheToWaylandBuffer() { -+ if (!mDelayedImageCommits.Length()) { -+ return false; -+ } - -- mDelayedImageCommits.AppendElement( -- WindowImageSurface(mImageSurface, aRegion)); -- // mImageSurface is owned by mDelayedImageCommits -- mImageSurface = nullptr; -+ MOZ_ASSERT(!mDrawToWaylandBufferDirectly); - - RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer( - /* aCanSwitchBuffer */ mWholeWindowBufferDamage); -@@ -911,10 +940,10 @@ bool WindowSurfaceWayland::CommitImageSu - } - - LOGWAYLAND((" Flushing %ld cached WindowImageSurfaces to Wayland buffer\n", -- long(mDelayedImageCommits.Length() + 1))); -+ long(mDelayedImageCommits.Length()))); - - // Draw any delayed image commits first -- DrawDelayedImageCommits(dt, aWaylandBufferDamage); -+ DrawDelayedImageCommits(dt, mWaylandBufferDamage); - UnlockWaylandBuffer(); - - return true; -@@ -932,7 +961,8 @@ static void WaylandBufferDelayCommitHand - } - - void WindowSurfaceWayland::CommitWaylandBuffer() { -- MOZ_ASSERT(mPendingCommit, "Committing empty surface!"); -+ MOZ_ASSERT(!mWaylandBuffer->IsAttached(), -+ "We can't draw to attached wayland buffer!"); - - LOGWAYLAND(("WindowSurfaceWayland::CommitWaylandBuffer [%p]\n", (void*)this)); - LOGWAYLAND( -@@ -941,6 +971,21 @@ void WindowSurfaceWayland::CommitWayland - LOGWAYLAND((" mDelayedCommitHandle = %p\n", mDelayedCommitHandle)); - LOGWAYLAND((" mFrameCallback = %p\n", mFrameCallback)); - LOGWAYLAND((" mLastCommittedSurface = %p\n", mLastCommittedSurface)); -+ LOGWAYLAND((" mBufferPendingCommit = %d\n", mBufferPendingCommit)); -+ LOGWAYLAND((" mBufferCommitAllowed = %d\n", mBufferCommitAllowed)); -+ -+ if (!mBufferCommitAllowed) { -+ return; -+ } -+ -+ if (CommitImageCacheToWaylandBuffer()) { -+ mBufferPendingCommit = true; -+ } -+ -+ // There's nothing to do here -+ if (!mBufferPendingCommit) { -+ return; -+ } - - wl_surface* waylandSurface = mWindow->GetWaylandSurface(); - if (!waylandSurface) { -@@ -986,6 +1031,7 @@ void WindowSurfaceWayland::CommitWayland - } - - if (mWholeWindowBufferDamage) { -+ LOGWAYLAND((" send whole screen damage\n")); - wl_surface_damage(waylandSurface, 0, 0, mBufferScreenRect.width, - mBufferScreenRect.height); - mWholeWindowBufferDamage = false; -@@ -994,6 +1040,8 @@ void WindowSurfaceWayland::CommitWayland - for (auto iter = mWaylandBufferDamage.RectIter(); !iter.Done(); - iter.Next()) { - mozilla::LayoutDeviceIntRect r = iter.Get(); -+ LOGWAYLAND((" wl_surface_damage_buffer [%d, %d] -> [%d, %d]\n", r.x, -+ r.y, r.width, r.height)); - wl_surface_damage_buffer(waylandSurface, r.x, r.y, r.width, r.height); - } - } -@@ -1012,24 +1060,31 @@ void WindowSurfaceWayland::CommitWayland - - mWaylandBuffer->Attach(waylandSurface); - mLastCommittedSurface = waylandSurface; -+ mLastCommitTime = g_get_monotonic_time() / 1000; -+ -+ // Ask wl_display to start events synchronization. We're going wait -+ // until all events are processed before next WindowSurfaceWayland::Lock() -+ // as we need freed wl_buffer there. -+ mWaylandDisplay->SyncBegin(); - - // There's no pending commit, all changes are sent to compositor. -- mPendingCommit = false; -+ mBufferPendingCommit = false; - } - - void WindowSurfaceWayland::Commit(const LayoutDeviceIntRegion& aInvalidRegion) { - MOZ_ASSERT(mIsMainThread == NS_IsMainThread()); - --#ifdef DEBUG -- { -- gfx::IntRect bounds = aInvalidRegion.GetBounds().ToUnknownRect(); -- gfx::IntSize lockSize(bounds.XMost(), bounds.YMost()); -+ // Flush all waiting events explicitly as we need -+ // mWaylandDisplay->FlushEventQueue(); - -+#ifdef MOZ_LOGGING -+ { -+ gfx::IntRect lockSize = aInvalidRegion.GetBounds().ToUnknownRect(); - LOGWAYLAND( -- ("WindowSurfaceWayland::Commit [%p] lockSize [%d x %d] screenSize [%d " -- "x %d]\n", -- (void*)this, lockSize.width, lockSize.height, mBufferScreenRect.width, -- mBufferScreenRect.height)); -+ ("WindowSurfaceWayland::Commit [%p] damage size [%d, %d] -> [%d x %d]" -+ "screenSize [%d x %d]\n", -+ (void*)this, lockSize.x, lockSize.y, lockSize.width, lockSize.height, -+ mBufferScreenRect.width, mBufferScreenRect.height)); - LOGWAYLAND((" mDrawToWaylandBufferDirectly = %d\n", - mDrawToWaylandBufferDirectly)); - LOGWAYLAND( -@@ -1044,21 +1099,15 @@ void WindowSurfaceWayland::Commit(const - mWaylandBufferDamage.OrWith(aInvalidRegion); - } - UnlockWaylandBuffer(); -- mPendingCommit = true; -+ mBufferPendingCommit = true; - } else { - MOZ_ASSERT(!mWaylandBuffer->IsLocked(), - "Drawing to already locked buffer?"); -- if (CommitImageSurfaceToWaylandBuffer(aInvalidRegion, -- mWaylandBufferDamage)) { -- // Our cached drawing is flushed, we can draw fullscreen again. -- mDrawToWaylandBufferDirectly = true; -- mPendingCommit = true; -- } -+ CacheImageSurface(aInvalidRegion); - } - -- if (mPendingCommit) { -- CommitWaylandBuffer(); -- } -+ mBufferCommitAllowed = true; -+ CommitWaylandBuffer(); - } - - void WindowSurfaceWayland::FrameCallbackHandler() { -@@ -1074,9 +1123,7 @@ void WindowSurfaceWayland::FrameCallback - wl_callback_destroy(mFrameCallback); - mFrameCallback = nullptr; - -- if (mPendingCommit) { -- CommitWaylandBuffer(); -- } -+ CommitWaylandBuffer(); - } - - void WindowSurfaceWayland::DelayedCommitHandler() { -@@ -1089,9 +1136,7 @@ void WindowSurfaceWayland::DelayedCommit - free(mDelayedCommitHandle); - mDelayedCommitHandle = nullptr; - -- if (mPendingCommit) { -- CommitWaylandBuffer(); -- } -+ CommitWaylandBuffer(); - } - - } // namespace widget -diff -up firefox-69.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1580152 firefox-69.0/widget/gtk/WindowSurfaceWayland.h ---- firefox-69.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1580152 2019-09-16 11:11:30.080299221 +0200 -+++ firefox-69.0/widget/gtk/WindowSurfaceWayland.h 2019-09-16 11:11:30.090299187 +0200 -@@ -17,6 +17,8 @@ - namespace mozilla { - namespace widget { - -+class WindowSurfaceWayland; -+ - // Allocates and owns shared memory for Wayland drawing surface - class WaylandShmPool { - public: -@@ -69,20 +71,22 @@ class WindowBackBuffer { - - static gfx::SurfaceFormat GetSurfaceFormat() { return mFormat; } - -- nsWaylandDisplay* GetWaylandDisplay() { return mWaylandDisplay; }; -+ nsWaylandDisplay* GetWaylandDisplay(); - -- WindowBackBuffer(nsWaylandDisplay* aWaylandDisplay) -- : mWaylandDisplay(aWaylandDisplay){}; -+ WindowBackBuffer(WindowSurfaceWayland* aWindowSurfaceWayland) -+ : mWindowSurfaceWayland(aWindowSurfaceWayland){}; - virtual ~WindowBackBuffer(){}; - -+ protected: -+ WindowSurfaceWayland* mWindowSurfaceWayland; -+ - private: - static gfx::SurfaceFormat mFormat; -- nsWaylandDisplay* mWaylandDisplay; - }; - - class WindowBackBufferShm : public WindowBackBuffer { - public: -- WindowBackBufferShm(nsWaylandDisplay* aWaylandDisplay, int aWidth, -+ WindowBackBufferShm(WindowSurfaceWayland* aWindowSurfaceWayland, int aWidth, - int aHeight); - ~WindowBackBufferShm(); - -@@ -121,8 +125,8 @@ class WindowBackBufferShm : public Windo - - class WindowBackBufferDMABuf : public WindowBackBuffer { - public: -- WindowBackBufferDMABuf(nsWaylandDisplay* aWaylandDisplay, int aWidth, -- int aHeight); -+ WindowBackBufferDMABuf(WindowSurfaceWayland* aWindowSurfaceWayland, -+ int aWidth, int aHeight); - ~WindowBackBufferDMABuf(); - - bool IsAttached(); -@@ -175,6 +179,9 @@ class WindowSurfaceWayland : public Wind - void Commit(const LayoutDeviceIntRegion& aInvalidRegion) final; - void FrameCallbackHandler(); - void DelayedCommitHandler(); -+ void CommitWaylandBuffer(); -+ -+ nsWaylandDisplay* GetWaylandDisplay() { return mWaylandDisplay; }; - - private: - WindowBackBuffer* CreateWaylandBuffer(int aWidth, int aHeight); -@@ -185,10 +192,9 @@ class WindowSurfaceWayland : public Wind - - already_AddRefed<gfx::DrawTarget> LockImageSurface( - const gfx::IntSize& aLockSize); -- bool CommitImageSurfaceToWaylandBuffer( -- const LayoutDeviceIntRegion& aRegion, -- LayoutDeviceIntRegion& aWaylandBufferDamage); -- void CommitWaylandBuffer(); -+ -+ void CacheImageSurface(const LayoutDeviceIntRegion& aRegion); -+ bool CommitImageCacheToWaylandBuffer(); - - void DrawDelayedImageCommits(gfx::DrawTarget* aDrawTarget, - LayoutDeviceIntRegion& aWaylandBufferDamage); -@@ -205,12 +211,13 @@ class WindowSurfaceWayland : public Wind - WindowBackBuffer* mBackupBuffer[BACK_BUFFER_NUM]; - wl_callback* mFrameCallback; - wl_surface* mLastCommittedSurface; -- MessageLoop* mDisplayThreadMessageLoop; - WindowSurfaceWayland** mDelayedCommitHandle; - RefPtr<gfxImageSurface> mImageSurface; - AutoTArray<WindowImageSurface, 30> mDelayedImageCommits; -+ int64_t mLastCommitTime; - bool mDrawToWaylandBufferDirectly; -- bool mPendingCommit; -+ bool mBufferPendingCommit; -+ bool mBufferCommitAllowed; - bool mWholeWindowBufferDamage; - bool mBufferNeedsClear; - bool mIsMainThread; |