summaryrefslogtreecommitdiff
path: root/mozilla-1441743.patch
diff options
context:
space:
mode:
Diffstat (limited to 'mozilla-1441743.patch')
-rw-r--r--mozilla-1441743.patch336
1 files changed, 0 insertions, 336 deletions
diff --git a/mozilla-1441743.patch b/mozilla-1441743.patch
deleted file mode 100644
index 59018c7..0000000
--- a/mozilla-1441743.patch
+++ /dev/null
@@ -1,336 +0,0 @@
-diff --git a/widget/gtk/WindowSurfaceWayland.h b/widget/gtk/WindowSurfaceWayland.h
---- a/widget/gtk/WindowSurfaceWayland.h
-+++ b/widget/gtk/WindowSurfaceWayland.h
-@@ -3,16 +3,17 @@
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
- #ifndef _MOZILLA_WIDGET_GTK_WINDOW_SURFACE_WAYLAND_H
- #define _MOZILLA_WIDGET_GTK_WINDOW_SURFACE_WAYLAND_H
-
- #include <prthread.h>
-+#include "mozilla/gfx/Types.h"
-
- namespace mozilla {
- namespace widget {
-
- // Our general connection to Wayland display server,
- // holds our display connection and runs event loop.
- class nsWaylandDisplay : public nsISupports {
- NS_DECL_THREADSAFE_ISUPPORTS
-@@ -61,17 +62,17 @@ private:
- };
-
- // Holds actual graphics data for wl_surface
- class WindowBackBuffer {
- public:
- WindowBackBuffer(nsWaylandDisplay* aDisplay, int aWidth, int aHeight);
- ~WindowBackBuffer();
-
-- already_AddRefed<gfx::DrawTarget> Lock(const LayoutDeviceIntRegion& aRegion);
-+ already_AddRefed<gfx::DrawTarget> Lock();
-
- void Attach(wl_surface* aSurface);
- void Detach();
- bool IsAttached() { return mAttached; }
-
- bool Resize(int aWidth, int aHeight);
- bool SetImageDataFromBackBuffer(class WindowBackBuffer* aSourceBuffer);
-
-@@ -107,27 +108,33 @@ public:
- WindowSurfaceWayland(nsWindow *aWindow);
- ~WindowSurfaceWayland();
-
- already_AddRefed<gfx::DrawTarget> Lock(const LayoutDeviceIntRegion& aRegion) override;
- void Commit(const LayoutDeviceIntRegion& aInvalidRegion) final;
- void FrameCallbackHandler();
-
- private:
-- WindowBackBuffer* GetBufferToDraw(int aWidth, int aHeight);
-+ WindowBackBuffer* GetFrontBufferToDraw(int aWidth, int aHeight);
- void UpdateScaleFactor();
-
-+ already_AddRefed<gfx::DrawTarget> LockFrontBuffer(int aWidth, int aHeight);
-+ already_AddRefed<gfx::DrawTarget> LockImageSurface(const gfx::IntSize& aLockSize);
-+ bool CommitImageSurface(const LayoutDeviceIntRegion& aRegion);
-+
- // TODO: Do we need to hold a reference to nsWindow object?
- nsWindow* mWindow;
- nsWaylandDisplay* mWaylandDisplay;
- WindowBackBuffer* mFrontBuffer;
- WindowBackBuffer* mBackBuffer;
-+ RefPtr<gfxImageSurface> mImageSurface;
- wl_callback* mFrameCallback;
- wl_surface* mFrameCallbackSurface;
- MessageLoop* mDisplayThreadMessageLoop;
-+ bool mDirectWlBufferDraw;
- bool mDelayedCommit;
- bool mFullScreenDamage;
- bool mIsMainThread;
- };
-
- } // namespace widget
- } // namespace mozilla
-
-
-diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
---- a/widget/gtk/WindowSurfaceWayland.cpp
-+++ b/widget/gtk/WindowSurfaceWayland.cpp
-@@ -299,16 +299,17 @@ nsWaylandDisplay::Matches(wl_display *aD
- }
-
- NS_IMPL_ISUPPORTS(nsWaylandDisplay, nsISupports);
-
- nsWaylandDisplay::nsWaylandDisplay(wl_display *aDisplay)
- : mThreadId(PR_GetCurrentThread())
- // gfx::SurfaceFormat::B8G8R8A8 is a basic Wayland format
- // and is always present.
-+ // TODO: Provide also format without alpha (Bug 1470126).
- , mFormat(gfx::SurfaceFormat::B8G8R8A8)
- , mShm(nullptr)
- , mDisplay(aDisplay)
- {
- if (NS_IsMainThread()) {
- // Use default event queue in main thread operated by Gtk+.
- mEventQueue = nullptr;
- } else {
-@@ -530,21 +531,19 @@ WindowBackBuffer::SetImageDataFromBackBu
- }
-
- mShmPool.SetImageDataFromPool(&aSourceBuffer->mShmPool,
- aSourceBuffer->mWidth * aSourceBuffer->mHeight * BUFFER_BPP);
- return true;
- }
-
- already_AddRefed<gfx::DrawTarget>
--WindowBackBuffer::Lock(const LayoutDeviceIntRegion& aRegion)
-+WindowBackBuffer::Lock()
- {
-- gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
-- gfx::IntSize lockSize(bounds.XMost(), bounds.YMost());
--
-+ gfx::IntSize lockSize(mWidth, mHeight);
- return gfxPlatform::CreateDrawTargetForData(static_cast<unsigned char*>(mShmPool.GetImageData()),
- lockSize,
- BUFFER_BPP * mWidth,
- mWaylandDisplay->GetSurfaceFormat());
- }
-
- static void
- frame_callback_handler(void *data, struct wl_callback *callback, uint32_t time)
-@@ -560,16 +559,17 @@ static const struct wl_callback_listener
- WindowSurfaceWayland::WindowSurfaceWayland(nsWindow *aWindow)
- : mWindow(aWindow)
- , mWaylandDisplay(WaylandDisplayGet(aWindow->GetWaylandDisplay()))
- , mFrontBuffer(nullptr)
- , mBackBuffer(nullptr)
- , mFrameCallback(nullptr)
- , mFrameCallbackSurface(nullptr)
- , mDisplayThreadMessageLoop(MessageLoop::current())
-+ , mDirectWlBufferDraw(true)
- , mDelayedCommit(false)
- , mFullScreenDamage(false)
- , mIsMainThread(NS_IsMainThread())
- {
- }
-
- WindowSurfaceWayland::~WindowSurfaceWayland()
- {
-@@ -598,17 +598,17 @@ WindowSurfaceWayland::UpdateScaleFactor(
- {
- wl_surface* waylandSurface = mWindow->GetWaylandSurface();
- if (waylandSurface) {
- wl_surface_set_buffer_scale(waylandSurface, mWindow->GdkScaleFactor());
- }
- }
-
- WindowBackBuffer*
--WindowSurfaceWayland::GetBufferToDraw(int aWidth, int aHeight)
-+WindowSurfaceWayland::GetFrontBufferToDraw(int aWidth, int aHeight)
- {
- if (!mFrontBuffer) {
- mFrontBuffer = new WindowBackBuffer(mWaylandDisplay, aWidth, aHeight);
- mBackBuffer = new WindowBackBuffer(mWaylandDisplay, aWidth, aHeight);
- return mFrontBuffer;
- }
-
- if (!mFrontBuffer->IsAttached()) {
-@@ -647,46 +647,149 @@ WindowSurfaceWayland::GetBufferToDraw(in
- // the new buffer and leave gecko to render new whole content.
- mFrontBuffer->Resize(aWidth, aHeight);
- }
-
- return mFrontBuffer;
- }
-
- already_AddRefed<gfx::DrawTarget>
-+WindowSurfaceWayland::LockFrontBuffer(int aWidth, int aHeight)
-+{
-+ WindowBackBuffer* buffer = GetFrontBufferToDraw(aWidth, aHeight);
-+ if (buffer) {
-+ return buffer->Lock();
-+ }
-+
-+ NS_WARNING("WindowSurfaceWayland::LockFrontBuffer(): No buffer available");
-+ return nullptr;
-+}
-+
-+already_AddRefed<gfx::DrawTarget>
-+WindowSurfaceWayland::LockImageSurface(const gfx::IntSize& aLockSize)
-+{
-+ if (!mImageSurface || mImageSurface->CairoStatus() ||
-+ !(aLockSize <= mImageSurface->GetSize())) {
-+ mImageSurface = new gfxImageSurface(aLockSize,
-+ SurfaceFormatToImageFormat(mWaylandDisplay->GetSurfaceFormat()));
-+ if (mImageSurface->CairoStatus()) {
-+ return nullptr;
-+ }
-+ }
-+
-+ return gfxPlatform::CreateDrawTargetForData(mImageSurface->Data(),
-+ mImageSurface->GetSize(),
-+ mImageSurface->Stride(),
-+ mWaylandDisplay->GetSurfaceFormat());
-+}
-+
-+/*
-+ 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.
-+ - mFrontBuffer is available - that's an ideal situation.
-+ - mFrontBuffer is locked by compositor - flip buffers and draw.
-+ - if we can't flip buffers - 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());
-
-- // We allocate back buffer to widget size but return only
-- // portion requested by aRegion.
-- LayoutDeviceIntRect rect = mWindow->GetBounds();
-- WindowBackBuffer* buffer = GetBufferToDraw(rect.width,
-- rect.height);
-- if (!buffer) {
-- NS_WARNING("No drawing buffer available");
-- return nullptr;
-+ LayoutDeviceIntRect screenRect = mWindow->GetBounds();
-+ gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
-+ gfx::IntSize lockSize(bounds.XMost(), bounds.YMost());
-+
-+ // Are we asked for entire nsWindow to draw?
-+ mDirectWlBufferDraw = (aRegion.GetNumRects() == 1 &&
-+ bounds.x == 0 && bounds.y == 0 &&
-+ lockSize.width == screenRect.width &&
-+ lockSize.height == screenRect.height);
-+
-+ if (mDirectWlBufferDraw) {
-+ RefPtr<gfx::DrawTarget> dt = LockFrontBuffer(screenRect.width,
-+ screenRect.height);
-+ if (dt) {
-+ return dt.forget();
-+ }
-+
-+ // We don't have any front buffer available. Try indirect drawing
-+ // to mImageSurface which is mirrored to front buffer at commit.
-+ mDirectWlBufferDraw = false;
- }
-
-- return buffer->Lock(aRegion);
-+ return LockImageSurface(lockSize);
-+}
-+
-+bool
-+WindowSurfaceWayland::CommitImageSurface(const LayoutDeviceIntRegion& aRegion)
-+{
-+ MOZ_ASSERT(!mDirectWlBufferDraw);
-+
-+ LayoutDeviceIntRect screenRect = mWindow->GetBounds();
-+ gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
-+
-+ gfx::Rect rect(bounds);
-+ if (rect.IsEmpty()) {
-+ return false;
-+ }
-+
-+ RefPtr<gfx::DrawTarget> dt = LockFrontBuffer(screenRect.width,
-+ screenRect.height);
-+ RefPtr<gfx::SourceSurface> surf =
-+ gfx::Factory::CreateSourceSurfaceForCairoSurface(mImageSurface->CairoSurface(),
-+ mImageSurface->GetSize(),
-+ mImageSurface->Format());
-+ if (!dt || !surf) {
-+ return false;
-+ }
-+
-+ 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());
-+ }
-+ dt->PushDeviceSpaceClipRects(rects.Elements(), rects.Length());
-+ }
-+
-+ dt->DrawSurface(surf, rect, rect);
-+
-+ if (numRects != 1) {
-+ dt->PopClip();
-+ }
-+
-+ return true;
- }
-
- void
- WindowSurfaceWayland::Commit(const LayoutDeviceIntRegion& aInvalidRegion)
- {
- MOZ_ASSERT(mIsMainThread == NS_IsMainThread());
-
- wl_surface* waylandSurface = mWindow->GetWaylandSurface();
- if (!waylandSurface) {
- // Target window is already destroyed - don't bother to render there.
-+ NS_WARNING("WindowSurfaceWayland::Commit(): parent wl_surface is already hidden/deleted.");
- return;
- }
- wl_proxy_set_queue((struct wl_proxy *)waylandSurface,
- mWaylandDisplay->GetEventQueue());
-
-+ if (!mDirectWlBufferDraw) {
-+ // We have new content at mImageSurface - copy data to mFrontBuffer first.
-+ CommitImageSurface(aInvalidRegion);
-+ }
-+
- if (mFullScreenDamage) {
- LayoutDeviceIntRect rect = mWindow->GetBounds();
- wl_surface_damage(waylandSurface, 0, 0, rect.width, rect.height);
- mFullScreenDamage = false;
- } else {
- for (auto iter = aInvalidRegion.RectIter(); !iter.Done(); iter.Next()) {
- const mozilla::LayoutDeviceIntRect &r = iter.Get();
- wl_surface_damage(waylandSurface, r.x, r.y, r.width, r.height);
-@@ -730,17 +833,17 @@ WindowSurfaceWayland::FrameCallbackHandl
- mFrameCallback = nullptr;
- mFrameCallbackSurface = nullptr;
- }
-
- if (mDelayedCommit) {
- wl_surface* waylandSurface = mWindow->GetWaylandSurface();
- if (!waylandSurface) {
- // Target window is already destroyed - don't bother to render there.
-- NS_WARNING("No drawing buffer available");
-+ NS_WARNING("WindowSurfaceWayland::FrameCallbackHandler(): parent wl_surface is already hidden/deleted.");
- return;
- }
- wl_proxy_set_queue((struct wl_proxy *)waylandSurface,
- mWaylandDisplay->GetEventQueue());
-
- // Send pending surface to compositor and register frame callback
- // for possible subsequent drawing.
- mFrameCallback = wl_surface_frame(waylandSurface);
bgstack15