diff options
author | Martin Stransky <stransky@redhat.com> | 2019-10-18 20:43:19 +0200 |
---|---|---|
committer | Martin Stransky <stransky@redhat.com> | 2019-10-18 20:43:19 +0200 |
commit | 302967b0a822136f55649d389e0345870cae57a9 (patch) | |
tree | 74f03934005af107c89866275a8b2ff9e354bf32 /mozilla-1581748.patch | |
parent | Spec file update - firefox-wayland package (diff) | |
download | librewolf-fedora-ff-302967b0a822136f55649d389e0345870cae57a9.tar.gz librewolf-fedora-ff-302967b0a822136f55649d389e0345870cae57a9.tar.bz2 librewolf-fedora-ff-302967b0a822136f55649d389e0345870cae57a9.zip |
Updated to 70.0 Build 2
Diffstat (limited to 'mozilla-1581748.patch')
-rw-r--r-- | mozilla-1581748.patch | 574 |
1 files changed, 0 insertions, 574 deletions
diff --git a/mozilla-1581748.patch b/mozilla-1581748.patch deleted file mode 100644 index 9177f5b..0000000 --- a/mozilla-1581748.patch +++ /dev/null @@ -1,574 +0,0 @@ -diff -up firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1581748 firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp ---- firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1581748 2019-09-17 13:19:47.190908284 +0200 -+++ firefox-69.0/widget/gtk/WindowSurfaceWayland.cpp 2019-09-17 13:19:47.196908262 +0200 -@@ -32,7 +32,7 @@ extern mozilla::LazyLogModule gWidgetWay - # define LOGWAYLAND(args) - #endif /* MOZ_LOGGING */ - --// Maximal compositin timeout it miliseconds -+// Maximal compositing timeout it miliseconds - #define COMPOSITING_TIMEOUT 200 - - namespace mozilla { -@@ -513,13 +513,15 @@ WindowSurfaceWayland::WindowSurfaceWayla - mDelayedCommitHandle(nullptr), - mLastCommitTime(0), - mDrawToWaylandBufferDirectly(true), -+ mCanSwitchWaylandBuffer(true), - mBufferPendingCommit(false), - mBufferCommitAllowed(false), -- mWholeWindowBufferDamage(false), - mBufferNeedsClear(false), - mIsMainThread(NS_IsMainThread()), - mNeedScaleFactorUpdate(true) { - for (int i = 0; i < BACK_BUFFER_NUM; i++) mBackupBuffer[i] = nullptr; -+ mRenderingCacheMode = CACHE_ALL; -+ - } - - WindowSurfaceWayland::~WindowSurfaceWayland() { -@@ -591,8 +593,6 @@ WindowBackBuffer* WindowSurfaceWayland:: - - // There's no buffer created yet, create a new one. - if (!mWaylandBuffer) { -- MOZ_ASSERT(aCanSwitchBuffer && mWholeWindowBufferDamage, -- "Created new buffer for partial drawing!"); - LOGWAYLAND((" Created new buffer [%d x %d]\n", mBufferScreenRect.width, - mBufferScreenRect.height)); - -@@ -682,9 +682,8 @@ WindowBackBuffer* WindowSurfaceWayland:: - return mWaylandBuffer; - } - --already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::LockWaylandBuffer( -- bool aCanSwitchBuffer) { -- WindowBackBuffer* buffer = GetWaylandBufferToDraw(aCanSwitchBuffer); -+already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::LockWaylandBuffer() { -+ WindowBackBuffer* buffer = GetWaylandBufferToDraw(mCanSwitchWaylandBuffer); - - LOGWAYLAND(("WindowSurfaceWayland::LockWaylandBuffer [%p] Got buffer %p\n", - (void*)this, (void*)buffer)); -@@ -698,7 +697,9 @@ already_AddRefed<gfx::DrawTarget> Window - return nullptr; - } - -- if (mBufferNeedsClear && mWholeWindowBufferDamage) { -+ mCanSwitchWaylandBuffer = false; -+ -+ if (mBufferNeedsClear) { - buffer->Clear(); - mBufferNeedsClear = false; - } -@@ -728,40 +729,30 @@ already_AddRefed<gfx::DrawTarget> Window - WindowBackBuffer::GetSurfaceFormat()); - } - --static bool IsWindowFullScreenUpdate(LayoutDeviceIntRect& screenRect, -- const LayoutDeviceIntRegion& aRegion) { -- if (aRegion.GetNumRects() > 1) return false; -- -- IntRect rect = aRegion.RectIter().Get().ToUnknownRect(); -- return (rect.x == 0 && rect.y == 0 && screenRect.width == rect.width && -- screenRect.height == rect.height); -+static bool IsWindowFullScreenUpdate( -+ LayoutDeviceIntRect& aScreenRect, -+ const LayoutDeviceIntRegion& aUpdatedRegion) { -+ if (aUpdatedRegion.GetNumRects() > 1) return false; -+ -+ IntRect rect = aUpdatedRegion.RectIter().Get().ToUnknownRect(); -+ return (rect.x == 0 && rect.y == 0 && aScreenRect.width == rect.width && -+ aScreenRect.height == rect.height); - } - --static bool IsPopupFullScreenUpdate(LayoutDeviceIntRect& screenRect, -- const LayoutDeviceIntRegion& aRegion) { -+static bool IsPopupFullScreenUpdate( -+ LayoutDeviceIntRect& aScreenRect, -+ const LayoutDeviceIntRegion& aUpdatedRegion) { - // We know that popups can be drawn from two parts; a panel and an arrow. - // Assume we redraw whole popups when we have two rects and bounding - // box is equal to window borders. -- if (aRegion.GetNumRects() > 2) return false; -+ if (aUpdatedRegion.GetNumRects() > 2) return false; - -- IntRect lockSize = aRegion.GetBounds().ToUnknownRect(); -+ gfx::IntRect lockSize = aUpdatedRegion.GetBounds().ToUnknownRect(); - return (lockSize.x == 0 && lockSize.y == 0 && -- screenRect.width == lockSize.width && -- screenRect.height == lockSize.height); -+ aScreenRect.width == lockSize.width && -+ aScreenRect.height == lockSize.height); - } - --/* -- There are some situations which can happen here: -- -- A) Lock() is called to whole surface. In that case we don't need -- 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 - 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. -- */ - already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::Lock( - const LayoutDeviceIntRegion& aRegion) { - MOZ_ASSERT(mIsMainThread == NS_IsMainThread()); -@@ -777,22 +768,31 @@ already_AddRefed<gfx::DrawTarget> Window - LayoutDeviceIntRect lockedScreenRect = mWindow->GetBounds(); - gfx::IntRect lockSize = aRegion.GetBounds().ToUnknownRect(); - -- // Are we asked for entire nsWindow to draw? - bool isTransparentPopup = - mWindow->IsWaylandPopup() && - (eTransparencyTransparent == mWindow->GetTransparencyMode()); - -- // We have request to lock whole buffer/window. -- mWholeWindowBufferDamage = -- isTransparentPopup ? IsPopupFullScreenUpdate(lockedScreenRect, aRegion) -- : IsWindowFullScreenUpdate(lockedScreenRect, aRegion); -- -- // Clear buffer when we (re)draw new transparent popup window, -- // otherwise leave it as-is, mBufferNeedsClear can be set from previous -- // (already pending) commits which are cached now. -- if (mWholeWindowBufferDamage) { -+ bool windowRedraw = isTransparentPopup -+ ? IsPopupFullScreenUpdate(lockedScreenRect, aRegion) -+ : IsWindowFullScreenUpdate(lockedScreenRect, aRegion); -+ if (windowRedraw) { -+ // Clear buffer when we (re)draw new transparent popup window, -+ // otherwise leave it as-is, mBufferNeedsClear can be set from previous -+ // (already pending) commits which are cached now. - mBufferNeedsClear = - mWindow->WaylandSurfaceNeedsClear() || isTransparentPopup; -+ -+ // Store info that we can switch WaylandBuffer when we flush -+ // mImageSurface / mDelayedImageCommits. Don't clear it - it's cleared -+ // at LockWaylandBuffer() when we actualy switch the buffer. -+ mCanSwitchWaylandBuffer = windowRedraw; -+ -+ // We do full buffer repaint so clear our cached drawings. -+ mDelayedImageCommits.Clear(); -+ mWaylandBufferDamage.SetEmpty(); -+ -+ // Also do scale factor update for whole window updates just to be sure. -+ mNeedScaleFactorUpdate = true; - } - - LOGWAYLAND( -@@ -808,7 +808,7 @@ already_AddRefed<gfx::DrawTarget> Window - LOGWAYLAND((" IsWindowFullScreenUpdate = %d\n", - IsWindowFullScreenUpdate(lockedScreenRect, aRegion))); - LOGWAYLAND((" mBufferNeedsClear = %d\n", mBufferNeedsClear)); -- LOGWAYLAND((" mWholeWindowBufferDamage = %d\n", mWholeWindowBufferDamage)); -+ LOGWAYLAND((" windowRedraw = %d\n", windowRedraw)); - - #if MOZ_LOGGING - if (!(mBufferScreenRect == lockedScreenRect)) { -@@ -822,8 +822,9 @@ already_AddRefed<gfx::DrawTarget> Window - // We can't commit them any more as they're for former window size, so - // scratch them. - mDelayedImageCommits.Clear(); -+ mWaylandBufferDamage.SetEmpty(); - -- if (!mWholeWindowBufferDamage) { -+ if (!windowRedraw) { - NS_WARNING("Partial screen update when window is resized!"); - // This should not happen. Screen size changed but we got only - // partal screen update instead of whole screen. Discard this painting -@@ -833,52 +834,56 @@ already_AddRefed<gfx::DrawTarget> Window - mBufferScreenRect = lockedScreenRect; - } - -- if (mWholeWindowBufferDamage) { -- // We can lock/commit entire buffer direcly. -- mDrawToWaylandBufferDirectly = true; -- -- // If there's any pending image commit scratch them as we're going -- // to redraw the whole sceen anyway. -- mDelayedImageCommits.Clear(); -+ mDrawToWaylandBufferDirectly = -+ (windowRedraw || mRenderingCacheMode != CACHE_ALL); - -- RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer( -- /* aCanSwitchBuffer */ mWholeWindowBufferDamage); -+ if (mDrawToWaylandBufferDirectly) { -+ LOGWAYLAND((" Direct drawing\n")); -+ RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer(); - if (dt) { -+ if (!windowRedraw) { -+ DrawDelayedImageCommits(dt, mWaylandBufferDamage); -+ } - return dt.forget(); - } - } - -- // We do indirect drawing due to: -- // -- // 1) We don't have any front buffer available. Try indirect drawing -- // to mImageSurface which is mirrored to front buffer at commit. -- // 2) Only part of the screen is locked. We can't lock entire screen for -- // such drawing as it produces visible artifacts. -+ // Any caching is disabled and we don't have any back buffer available. -+ if (mRenderingCacheMode == CACHE_NONE) { -+ return nullptr; -+ } -+ -+ // We do indirect drawing because there isn't any front buffer available. -+ // Do indirect drawing to mImageSurface which is commited to wayland -+ // wl_buffer by DrawDelayedImageCommits() later. - mDrawToWaylandBufferDirectly = false; - - LOGWAYLAND((" Indirect drawing.\n")); - return LockImageSurface(gfx::IntSize(lockSize.XMost(), lockSize.YMost())); - } - -+bool WindowImageSurface::OverlapsSurface( -+ class WindowImageSurface& aBottomSurface) { -+ return mUpdateRegion.Contains(aBottomSurface.mUpdateRegion); -+} -+ - void WindowImageSurface::Draw(gfx::SourceSurface* aSurface, - gfx::DrawTarget* aDest, - const LayoutDeviceIntRegion& aRegion) { -- uint32_t numRects = aRegion.GetNumRects(); -- if (numRects != 1) { -- AutoTArray<IntRect, 32> rects; -- rects.SetCapacity(numRects); -- for (auto iter = aRegion.RectIter(); !iter.Done(); iter.Next()) { -- rects.AppendElement(iter.Get().ToUnknownRect()); -- } -- aDest->PushDeviceSpaceClipRects(rects.Elements(), rects.Length()); -- } -- -+#ifdef MOZ_LOGGING - gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect(); -- gfx::Rect rect(bounds); -- aDest->DrawSurface(aSurface, rect, rect); -+ LOGWAYLAND(("WindowImageSurface::Draw\n")); -+ LOGWAYLAND((" rects num %d\n", aRegion.GetNumRects())); -+ LOGWAYLAND((" bounds [ %d, %d] -> [%d x %d]\n", bounds.x, bounds.y, -+ bounds.width, bounds.height)); -+#endif - -- if (numRects != 1) { -- aDest->PopClip(); -+ for (auto iter = aRegion.RectIter(); !iter.Done(); iter.Next()) { -+ mozilla::LayoutDeviceIntRect r = iter.Get(); -+ gfx::Rect rect(r.ToUnknownRect()); -+ LOGWAYLAND((" draw rect [%f,%f] -> [%f x %f]\n", rect.x, rect.y, -+ rect.width, rect.height)); -+ aDest->DrawSurface(aSurface, rect, rect); - } - } - -@@ -896,6 +901,18 @@ WindowImageSurface::WindowImageSurface( - mImageSurface->Format()); - } - -+void WindowSurfaceWayland::DrawDelayedImageCommits( -+ gfx::DrawTarget* aDrawTarget, LayoutDeviceIntRegion& aWaylandBufferDamage) { -+ LOGWAYLAND( -+ ("WindowSurfaceWayland::DrawDelayedImageCommits [%p]\n", (void*)this)); -+ MOZ_ASSERT(mDelayedImageCommits.Length() > 0, "Nothing to draw?"); -+ -+ for (unsigned int i = 0; i < mDelayedImageCommits.Length(); i++) { -+ mDelayedImageCommits[i].Draw(aDrawTarget, aWaylandBufferDamage); -+ } -+ mDelayedImageCommits.Clear(); -+} -+ - void WindowSurfaceWayland::CacheImageSurface( - const LayoutDeviceIntRegion& aRegion) { - #ifdef MOZ_LOGGING -@@ -906,8 +923,26 @@ void WindowSurfaceWayland::CacheImageSur - bounds.width, bounds.height)); - #endif - -- mDelayedImageCommits.AppendElement( -- WindowImageSurface(mImageSurface, aRegion)); -+ WindowImageSurface surf = WindowImageSurface(mImageSurface, aRegion); -+ -+ if (mDelayedImageCommits.Length()) { -+ int lastSurf = mDelayedImageCommits.Length() - 1; -+ if (surf.OverlapsSurface(mDelayedImageCommits[lastSurf])) { -+#ifdef MOZ_LOGGING -+ { -+ gfx::IntRect size = mDelayedImageCommits[lastSurf] -+ .GetUpdateRegion() -+ ->GetBounds() -+ .ToUnknownRect(); -+ LOGWAYLAND((" removing [ %d, %d] -> [%d x %d]\n", size.x, size.y, -+ size.width, size.height)); -+ } -+#endif -+ mDelayedImageCommits.RemoveElementAt(lastSurf); -+ } -+ } -+ -+ mDelayedImageCommits.AppendElement(surf); - // mImageSurface is owned by mDelayedImageCommits - mImageSurface = nullptr; - -@@ -915,17 +950,6 @@ void WindowSurfaceWayland::CacheImageSur - (" 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::CommitImageCacheToWaylandBuffer() { - if (!mDelayedImageCommits.Length()) { - return false; -@@ -933,8 +957,7 @@ bool WindowSurfaceWayland::CommitImageCa - - MOZ_ASSERT(!mDrawToWaylandBufferDirectly); - -- RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer( -- /* aCanSwitchBuffer */ mWholeWindowBufferDamage); -+ RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer(); - if (!dt) { - return false; - } -@@ -942,7 +965,6 @@ bool WindowSurfaceWayland::CommitImageCa - LOGWAYLAND((" Flushing %ld cached WindowImageSurfaces to Wayland buffer\n", - long(mDelayedImageCommits.Length()))); - -- // Draw any delayed image commits first - DrawDelayedImageCommits(dt, mWaylandBufferDamage); - UnlockWaylandBuffer(); - -@@ -967,7 +989,7 @@ void WindowSurfaceWayland::CommitWayland - LOGWAYLAND(("WindowSurfaceWayland::CommitWaylandBuffer [%p]\n", (void*)this)); - LOGWAYLAND( - (" mDrawToWaylandBufferDirectly = %d\n", mDrawToWaylandBufferDirectly)); -- LOGWAYLAND((" mWholeWindowBufferDamage = %d\n", mWholeWindowBufferDamage)); -+ LOGWAYLAND((" mCanSwitchWaylandBuffer = %d\n", mCanSwitchWaylandBuffer)); - LOGWAYLAND((" mDelayedCommitHandle = %p\n", mDelayedCommitHandle)); - LOGWAYLAND((" mFrameCallback = %p\n", mFrameCallback)); - LOGWAYLAND((" mLastCommittedSurface = %p\n", mLastCommittedSurface)); -@@ -1030,20 +1052,11 @@ void WindowSurfaceWayland::CommitWayland - mLastCommittedSurface = nullptr; - } - -- if (mWholeWindowBufferDamage) { -- LOGWAYLAND((" send whole screen damage\n")); -- wl_surface_damage(waylandSurface, 0, 0, mBufferScreenRect.width, -- mBufferScreenRect.height); -- mWholeWindowBufferDamage = false; -- mNeedScaleFactorUpdate = true; -- } else { -- 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); -- } -+ 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); - } - - // Clear all back buffer damage as we're committing -@@ -1062,9 +1075,9 @@ void WindowSurfaceWayland::CommitWayland - mLastCommittedSurface = waylandSurface; - mLastCommitTime = g_get_monotonic_time() / 1000; - -- // Ask wl_display to start events synchronization. We're going wait -+ // Ask wl_display to start events synchronization. We're going to wait - // until all events are processed before next WindowSurfaceWayland::Lock() -- // as we need freed wl_buffer there. -+ // as we hope for free wl_buffer there. - mWaylandDisplay->SyncBegin(); - - // There's no pending commit, all changes are sent to compositor. -@@ -1074,9 +1087,6 @@ void WindowSurfaceWayland::CommitWayland - void WindowSurfaceWayland::Commit(const LayoutDeviceIntRegion& aInvalidRegion) { - MOZ_ASSERT(mIsMainThread == NS_IsMainThread()); - -- // Flush all waiting events explicitly as we need -- // mWaylandDisplay->FlushEventQueue(); -- - #ifdef MOZ_LOGGING - { - gfx::IntRect lockSize = aInvalidRegion.GetBounds().ToUnknownRect(); -@@ -1087,17 +1097,12 @@ void WindowSurfaceWayland::Commit(const - mBufferScreenRect.width, mBufferScreenRect.height)); - LOGWAYLAND((" mDrawToWaylandBufferDirectly = %d\n", - mDrawToWaylandBufferDirectly)); -- LOGWAYLAND( -- (" mWholeWindowBufferDamage = %d\n", mWholeWindowBufferDamage)); - } - #endif - - if (mDrawToWaylandBufferDirectly) { - MOZ_ASSERT(mWaylandBuffer->IsLocked()); -- // If we're not at fullscreen damage add drawing area from aInvalidRegion -- if (!mWholeWindowBufferDamage) { -- mWaylandBufferDamage.OrWith(aInvalidRegion); -- } -+ mWaylandBufferDamage.OrWith(aInvalidRegion); - UnlockWaylandBuffer(); - mBufferPendingCommit = true; - } else { -diff -up firefox-69.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1581748 firefox-69.0/widget/gtk/WindowSurfaceWayland.h ---- firefox-69.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1581748 2019-09-17 13:19:47.191908280 +0200 -+++ firefox-69.0/widget/gtk/WindowSurfaceWayland.h 2019-09-17 13:19:47.197908258 +0200 -@@ -161,6 +161,10 @@ class WindowImageSurface { - WindowImageSurface(gfxImageSurface* aImageSurface, - const LayoutDeviceIntRegion& aUpdateRegion); - -+ bool OverlapsSurface(class WindowImageSurface& aBottomSurface); -+ -+ const LayoutDeviceIntRegion* GetUpdateRegion() { return &mUpdateRegion; }; -+ - private: - RefPtr<gfx::SourceSurface> mSurface; - RefPtr<gfxImageSurface> mImageSurface; -@@ -174,20 +178,59 @@ class WindowSurfaceWayland : public Wind - explicit WindowSurfaceWayland(nsWindow* aWindow); - ~WindowSurfaceWayland(); - -+ // Lock() / Commit() are called by gecko when Firefox -+ // wants to display something. Lock() returns a DrawTarget -+ // where gecko paints. When gecko is done it calls Commit() -+ // and we try to send the DrawTarget (backed by wl_buffer) -+ // to wayland compositor. -+ // -+ // If we fail (wayland compositor is busy, -+ // wl_surface is not created yet) we queue the painting -+ // and we send it to wayland compositor in FrameCallbackHandler()/ -+ // DelayedCommitHandler/CommitWaylandBuffer(). - already_AddRefed<gfx::DrawTarget> Lock( - const LayoutDeviceIntRegion& aRegion) override; - void Commit(const LayoutDeviceIntRegion& aInvalidRegion) final; -+ -+ // It's called from wayland compositor when there's the right -+ // time to send wl_buffer to display. It's no-op if there's no -+ // queued commits. - void FrameCallbackHandler(); -+ -+ // When a new window is created we may not have a valid wl_surface -+ // for drawing (Gtk haven't created it yet). All commits are queued -+ // and DelayedCommitHandler() is called by timer when wl_surface is ready -+ // for drawing. - void DelayedCommitHandler(); -+ -+ // Try to commit all queued drawings to Wayland compositor. This is usually -+ // called from other routines but can be used to explicitly flush -+ // all drawings as we do when wl_buffer is released -+ // (see WindowBackBufferShm::Detach() for instance). - void CommitWaylandBuffer(); - - nsWaylandDisplay* GetWaylandDisplay() { return mWaylandDisplay; }; - -+ // Image cache mode can be set by widget.wayland_cache_mode -+ typedef enum { -+ // Cache and clip all drawings, default. It's slowest -+ // but also without any rendered artifacts. -+ CACHE_ALL = 0, -+ // Cache drawing only when back buffer is missing. May produce -+ // some rendering artifacts and flickering when partial screen update -+ // is rendered. -+ CACHE_MISSING = 1, -+ // Don't cache anything, draw only when back buffer is available. -+ // Suitable for fullscreen content only like fullscreen video playback and -+ // may work well with dmabuf backend. -+ CACHE_NONE = 2 -+ } RenderingCacheMode; -+ - private: - WindowBackBuffer* CreateWaylandBuffer(int aWidth, int aHeight); - WindowBackBuffer* GetWaylandBufferToDraw(bool aCanSwitchBuffer); - -- already_AddRefed<gfx::DrawTarget> LockWaylandBuffer(bool aCanSwitchBuffer); -+ already_AddRefed<gfx::DrawTarget> LockWaylandBuffer(); - void UnlockWaylandBuffer(); - - already_AddRefed<gfx::DrawTarget> LockImageSurface( -@@ -206,23 +249,71 @@ class WindowSurfaceWayland : public Wind - // mBufferScreenRect is window size when our wayland buffer was allocated. - LayoutDeviceIntRect mBufferScreenRect; - nsWaylandDisplay* mWaylandDisplay; -+ -+ // Actual buffer (backed by wl_buffer) where all drawings go into. -+ // Drawn areas are stored at mWaylandBufferDamage and if there's -+ // any uncommited drawings which needs to be send to wayland compositor -+ // the mBufferPendingCommit is set. - WindowBackBuffer* mWaylandBuffer; -- LayoutDeviceIntRegion mWaylandBufferDamage; - WindowBackBuffer* mBackupBuffer[BACK_BUFFER_NUM]; -+ LayoutDeviceIntRegion mWaylandBufferDamage; -+ -+ // After every commit to wayland compositor a frame callback is requested. -+ // Any next commit to wayland compositor will happen when frame callback -+ // comes from wayland compositor back as it's the best time to do the commit. - wl_callback* mFrameCallback; - wl_surface* mLastCommittedSurface; -+ -+ // Registered reference to pending DelayedCommitHandler() call. - WindowSurfaceWayland** mDelayedCommitHandle; -+ -+ // Cached drawings. If we can't get WaylandBuffer (wl_buffer) at -+ // WindowSurfaceWayland::Lock() we direct gecko rendering to -+ // mImageSurface. -+ // If we can't get WaylandBuffer at WindowSurfaceWayland::Commit() -+ // time, mImageSurface is moved to mDelayedImageCommits which -+ // holds all cached drawings. -+ // mDelayedImageCommits can be drawn by FrameCallbackHandler(), -+ // DelayedCommitHandler() or when WaylandBuffer is detached. - RefPtr<gfxImageSurface> mImageSurface; - AutoTArray<WindowImageSurface, 30> mDelayedImageCommits; -+ - int64_t mLastCommitTime; -+ -+ // Indicates that we don't have any cached drawings at mDelayedImageCommits -+ // and WindowSurfaceWayland::Lock() returned WaylandBuffer to gecko -+ // to draw into. - bool mDrawToWaylandBufferDirectly; -+ -+ // Set when our cached drawings (mDelayedImageCommits) contains -+ // full screen damage. That means we can safely switch WaylandBuffer -+ // at LockWaylandBuffer(). -+ bool mCanSwitchWaylandBuffer; -+ -+ // Set when actual WaylandBuffer contains drawings which are not send to -+ // wayland compositor yet. - bool mBufferPendingCommit; -+ -+ // We can't send WaylandBuffer (wl_buffer) to compositor when gecko -+ // is rendering into it (i.e. between WindowSurfaceWayland::Lock() / -+ // WindowSurfaceWayland::Commit()). -+ // Thus we use mBufferCommitAllowed to disable commit by callbacks -+ // (FrameCallbackHandler(), DelayedCommitHandler()) - bool mBufferCommitAllowed; -- bool mWholeWindowBufferDamage; -+ -+ // We need to clear WaylandBuffer when entire transparent window is repainted. -+ // This typically apply to popup windows. - bool mBufferNeedsClear; -+ - bool mIsMainThread; -+ -+ // When new WaylandBuffer (wl_buffer) is send to wayland compositor -+ // (buffer switch or resize) we also need to set its scale factor. - bool mNeedScaleFactorUpdate; - -+ // Image caching strategy, see RenderingCacheMode for details. -+ RenderingCacheMode mRenderingCacheMode; -+ - static bool UseDMABufBackend(); - static bool mUseDMABufInitialized; - static bool mUseDMABuf; |