From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- widget/gtk/WindowSurfaceWaylandMultiBuffer.h | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 widget/gtk/WindowSurfaceWaylandMultiBuffer.h (limited to 'widget/gtk/WindowSurfaceWaylandMultiBuffer.h') diff --git a/widget/gtk/WindowSurfaceWaylandMultiBuffer.h b/widget/gtk/WindowSurfaceWaylandMultiBuffer.h new file mode 100644 index 0000000000..e14a626de0 --- /dev/null +++ b/widget/gtk/WindowSurfaceWaylandMultiBuffer.h @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * 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_MULTI_BUFFER_H +#define _MOZILLA_WIDGET_GTK_WINDOW_SURFACE_WAYLAND_MULTI_BUFFER_H + +#include "mozilla/gfx/2D.h" +#include "mozilla/gfx/Types.h" +#include "mozilla/Mutex.h" +#include "nsTArray.h" +#include "nsWaylandDisplay.h" +#include "nsWindow.h" +#include "WaylandBuffer.h" +#include "WindowSurface.h" + +namespace mozilla::widget { + +using gfx::DrawTarget; + +// WindowSurfaceWaylandMB is an abstraction for wl_surface +// and related management +class WindowSurfaceWaylandMB : public WindowSurface { + public: + WindowSurfaceWaylandMB(RefPtr aWindow, + GtkCompositorWidget* aCompositorWidget); + ~WindowSurfaceWaylandMB() = default; + + // 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()/ + // FlushPendingCommits(). + already_AddRefed Lock( + const LayoutDeviceIntRegion& aInvalidRegion) override; + void Commit(const LayoutDeviceIntRegion& aInvalidRegion) final; + + private: + void Commit(const MutexAutoLock& aProofOfLock, + const LayoutDeviceIntRegion& aInvalidRegion); + RefPtr ObtainBufferFromPool( + const MutexAutoLock& aProofOfLock, const LayoutDeviceIntSize& aSize); + void ReturnBufferToPool(const MutexAutoLock& aProofOfLock, + const RefPtr& aBuffer); + void EnforcePoolSizeLimit(const MutexAutoLock& aProofOfLock); + void CollectPendingSurfaces(const MutexAutoLock& aProofOfLock); + void HandlePartialUpdate(const MutexAutoLock& aProofOfLock, + const LayoutDeviceIntRegion& aInvalidRegion); + void IncrementBufferAge(const MutexAutoLock& aProofOfLock); + // Return true if window size was updated. + bool MaybeUpdateWindowSize(); + + mozilla::Mutex mSurfaceLock MOZ_UNANNOTATED; + + RefPtr mWindow; + // WindowSurfaceWaylandMB is owned by GtkCompositorWidget so we can't + // reference it. + GtkCompositorWidget* mCompositorWidget; + LayoutDeviceIntSize mWindowSize; + + RefPtr mInProgressBuffer; + RefPtr mFrontBuffer; + LayoutDeviceIntRegion mFrontBufferInvalidRegion; + + // buffer pool + nsTArray> mInUseBuffers; + nsTArray> mPendingBuffers; + nsTArray> mAvailableBuffers; + + // delayed commits + bool mFrameInProcess; + bool mCallbackRequested; +}; + +} // namespace mozilla::widget + +#endif // _MOZILLA_WIDGET_GTK_WINDOW_SURFACE_WAYLAND_MULTI_BUFFER_H -- cgit v1.2.3