/* -*- 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