From 0ebf5bdf043a27fd3dfb7f92e0cb63d88954c44d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 03:47:29 +0200 Subject: Adding upstream version 115.8.0esr. Signed-off-by: Daniel Baumann --- gfx/layers/SurfacePoolWayland.h | 127 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 gfx/layers/SurfacePoolWayland.h (limited to 'gfx/layers/SurfacePoolWayland.h') diff --git a/gfx/layers/SurfacePoolWayland.h b/gfx/layers/SurfacePoolWayland.h new file mode 100644 index 0000000000..6a746e732c --- /dev/null +++ b/gfx/layers/SurfacePoolWayland.h @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 2; 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_layers_SurfacePoolWayland_h +#define mozilla_layers_SurfacePoolWayland_h + +#include + +#include "GLContext.h" +#include "MozFramebuffer.h" +#include "mozilla/layers/SurfacePool.h" +#include "mozilla/widget/WaylandBuffer.h" + +#include + +namespace mozilla::layers { + +class SurfacePoolWayland final : public SurfacePool { + public: + // Get a handle for a new window. aGL can be nullptr. + RefPtr GetHandleForGL(gl::GLContext* aGL) override; + + // Destroy all GL resources associated with aGL managed by this pool. + void DestroyGLResourcesForContext(gl::GLContext* aGL) override; + + private: + friend class SurfacePoolHandleWayland; + friend RefPtr SurfacePool::Create(size_t aPoolSizeLimit); + + explicit SurfacePoolWayland(size_t aPoolSizeLimit); + + RefPtr ObtainBufferFromPool(const gfx::IntSize& aSize, + gl::GLContext* aGL); + void ReturnBufferToPool(const RefPtr& aBuffer); + void EnforcePoolSizeLimit(); + void CollectPendingSurfaces(); + Maybe GetFramebufferForBuffer( + const RefPtr& aBuffer, gl::GLContext* aGL, + bool aNeedsDepthBuffer); + + struct GLResourcesForBuffer final { + RefPtr mGL; // non-null + UniquePtr mFramebuffer; // non-null + }; + + struct SurfacePoolEntry final { + const gfx::IntSize mSize; + const RefPtr mWaylandBuffer; // non-null + Maybe mGLResources; + }; + + bool CanRecycleSurfaceForRequest(const MutexAutoLock& aProofOfLock, + const SurfacePoolEntry& aEntry, + const gfx::IntSize& aSize, + gl::GLContext* aGL); + + RefPtr GetDepthBufferForSharing( + const MutexAutoLock& aProofOfLock, gl::GLContext* aGL, + const gfx::IntSize& aSize); + UniquePtr CreateFramebufferForTexture( + const MutexAutoLock& aProofOfLock, gl::GLContext* aGL, + const gfx::IntSize& aSize, GLuint aTexture, bool aNeedsDepthBuffer); + + Mutex mMutex MOZ_UNANNOTATED; + + // Stores the entries for surfaces that are in use by NativeLayerWayland, i.e. + // an entry is inside mInUseEntries between calls to ObtainSurfaceFromPool() + // and ReturnSurfaceToPool(). + std::unordered_map mInUseEntries; + + // Stores entries which are no longer in use by NativeLayerWayland but are + // still in use by the window server, i.e. for which + // WaylandBuffer::IsAttached() still returns true. + // These entries are checked once per frame inside + // CollectPendingSurfaces(), and returned to mAvailableEntries once the + // window server is done. + nsTArray mPendingEntries; + + // Stores entries which are available for recycling. These entries are not + // in use by a NativeLayerWayland or by the window server. + nsTArray mAvailableEntries; + size_t mPoolSizeLimit; + + template + void ForEachEntry(F aFn); + + struct DepthBufferEntry final { + RefPtr mGL; + gfx::IntSize mSize; + WeakPtr mBuffer; + }; + + nsTArray mDepthBuffers; +}; + +// A surface pool handle that is stored on NativeLayerWayland and keeps the +// SurfacePool alive. +class SurfacePoolHandleWayland final : public SurfacePoolHandle { + public: + SurfacePoolHandleWayland* AsSurfacePoolHandleWayland() override { + return this; + } + + RefPtr ObtainBufferFromPool(const gfx::IntSize& aSize); + void ReturnBufferToPool(const RefPtr& aBuffer); + Maybe GetFramebufferForBuffer( + const RefPtr& aBuffer, bool aNeedsDepthBuffer); + const auto& gl() { return mGL; } + + RefPtr Pool() override { return mPool; } + void OnBeginFrame() override; + void OnEndFrame() override; + + private: + friend class SurfacePoolWayland; + SurfacePoolHandleWayland(RefPtr aPool, + gl::GLContext* aGL); + + const RefPtr mPool; + const RefPtr mGL; +}; + +} // namespace mozilla::layers + +#endif -- cgit v1.2.3