From fca521d398e5fb867c4aacabcc9ecec2bcda3846 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Tue, 19 Dec 2023 05:10:32 +0000 Subject: [PATCH] Bug 1855742 - Part 4. Make CanvasManagerChild manage ActiveResourceTracker. r=gfx-reviewers,lsalzman This patch makes the CanvasManagerChild creates/manager the ActiveResourceTracker instead of the WebRenderBridgeChild. Since PCanvas is now managed by PCanvasManager, and ActiveResourceTracker is only used by the PCanvas recording plumbing, we need it on every thread that the CanvasManagerChild can be created. Differential Revision: https://phabricator.services.mozilla.com/D189529 --- gfx/ipc/CanvasManagerChild.cpp | 14 ++++++++ gfx/ipc/CanvasManagerChild.h | 4 +++ gfx/layers/PersistentBufferProvider.cpp | 23 ++++++++++--- gfx/layers/PersistentBufferProvider.h | 3 +- gfx/layers/ipc/ActiveResource.h | 45 +++++++++++++++++++++++++ gfx/layers/ipc/KnowsCompositor.cpp | 10 ++---- gfx/layers/ipc/KnowsCompositor.h | 41 ++-------------------- gfx/layers/moz.build | 1 + gfx/layers/wr/WebRenderBridgeChild.cpp | 7 +--- gfx/layers/wr/WebRenderBridgeChild.h | 5 --- 10 files changed, 90 insertions(+), 63 deletions(-) create mode 100644 gfx/layers/ipc/ActiveResource.h diff --git a/gfx/ipc/CanvasManagerChild.cpp b/gfx/ipc/CanvasManagerChild.cpp index 5528a13f884a..fa7b46908cce 100644 --- a/gfx/ipc/CanvasManagerChild.cpp +++ b/gfx/ipc/CanvasManagerChild.cpp @@ -10,6 +10,7 @@ #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Swizzle.h" #include "mozilla/ipc/Endpoint.h" +#include "mozilla/layers/ActiveResource.h" #include "mozilla/layers/CanvasChild.h" #include "mozilla/layers/CompositorManagerChild.h" #include "mozilla/webgpu/WebGPUChild.h" @@ -38,6 +39,11 @@ void CanvasManagerChild::ActorDestroy(ActorDestroyReason aReason) { } void CanvasManagerChild::Destroy() { + if (mActiveResourceTracker) { + mActiveResourceTracker->AgeAllGenerations(); + mActiveResourceTracker.reset(); + } + if (mCanvasChild) { mCanvasChild->Destroy(); mCanvasChild = nullptr; @@ -198,6 +204,14 @@ RefPtr CanvasManagerChild::GetWebGPUChild() { return mWebGPUChild; } +layers::ActiveResourceTracker* CanvasManagerChild::GetActiveResourceTracker() { + if (!mActiveResourceTracker) { + mActiveResourceTracker = MakeUnique( + 1000, "CanvasManagerChild", GetCurrentSerialEventTarget()); + } + return mActiveResourceTracker.get(); +} + already_AddRefed CanvasManagerChild::GetSnapshot( uint32_t aManagerId, int32_t aProtocolId, const Maybe& aOwnerId, SurfaceFormat aFormat, diff --git a/gfx/ipc/CanvasManagerChild.h b/gfx/ipc/CanvasManagerChild.h index 54480753c0a4..04249c5b3970 100644 --- a/gfx/ipc/CanvasManagerChild.h +++ b/gfx/ipc/CanvasManagerChild.h @@ -19,6 +19,7 @@ class WorkerPrivate; namespace layers { class CanvasChild; +class ActiveResourceTracker; } // namespace layers namespace webgpu { @@ -55,6 +56,8 @@ class CanvasManagerChild final : public PCanvasManagerChild { RefPtr GetWebGPUChild(); + layers::ActiveResourceTracker* GetActiveResourceTracker(); + private: ~CanvasManagerChild(); void Destroy(); @@ -62,6 +65,7 @@ class CanvasManagerChild final : public PCanvasManagerChild { RefPtr mWorkerRef; RefPtr mCanvasChild; RefPtr mWebGPUChild; + UniquePtr mActiveResourceTracker; const uint32_t mId; bool mActive = true; bool mBlocked = false; diff --git a/gfx/layers/PersistentBufferProvider.cpp b/gfx/layers/PersistentBufferProvider.cpp index 117f9bc82eae..486ecd0a1e59 100644 --- a/gfx/layers/PersistentBufferProvider.cpp +++ b/gfx/layers/PersistentBufferProvider.cpp @@ -6,10 +6,12 @@ #include "PersistentBufferProvider.h" +#include "mozilla/layers/KnowsCompositor.h" #include "mozilla/layers/RemoteTextureMap.h" #include "mozilla/layers/TextureClient.h" #include "mozilla/layers/TextureForwarder.h" #include "mozilla/gfx/gfxVars.h" +#include "mozilla/gfx/CanvasManagerChild.h" #include "mozilla/gfx/DrawTargetWebgl.h" #include "mozilla/gfx/Logging.h" #include "mozilla/Maybe.h" @@ -305,7 +307,11 @@ PersistentBufferProviderShared::~PersistentBufferProviderShared() { MOZ_COUNT_DTOR(PersistentBufferProviderShared); if (IsActivityTracked()) { - mKnowsCompositor->GetActiveResourceTracker()->RemoveObject(this); + if (auto* cm = CanvasManagerChild::Get()) { + cm->GetActiveResourceTracker()->RemoveObject(this); + } else { + MOZ_ASSERT_UNREACHABLE("Tracked but no CanvasManagerChild!"); + } } Destroy(); @@ -325,7 +331,11 @@ bool PersistentBufferProviderShared::SetKnowsCompositor( } if (IsActivityTracked()) { - mKnowsCompositor->GetActiveResourceTracker()->RemoveObject(this); + if (auto* cm = CanvasManagerChild::Get()) { + cm->GetActiveResourceTracker()->RemoveObject(this); + } else { + MOZ_ASSERT_UNREACHABLE("Tracked but no CanvasManagerChild!"); + } } if (mKnowsCompositor->GetTextureForwarder() != @@ -406,12 +416,17 @@ PersistentBufferProviderShared::BorrowDrawTarget( return nullptr; } + auto* cm = CanvasManagerChild::Get(); + if (NS_WARN_IF(!cm)) { + return nullptr; + } + MOZ_ASSERT(!mSnapshot); if (IsActivityTracked()) { - mKnowsCompositor->GetActiveResourceTracker()->MarkUsed(this); + cm->GetActiveResourceTracker()->MarkUsed(this); } else { - mKnowsCompositor->GetActiveResourceTracker()->AddObject(this); + cm->GetActiveResourceTracker()->AddObject(this); } if (mDrawTarget) { diff --git a/gfx/layers/PersistentBufferProvider.h b/gfx/layers/PersistentBufferProvider.h index e857cf7c1ab2..8af960f806d8 100644 --- a/gfx/layers/PersistentBufferProvider.h +++ b/gfx/layers/PersistentBufferProvider.h @@ -9,7 +9,7 @@ #include "mozilla/Assertions.h" // for MOZ_ASSERT, etc #include "mozilla/RefPtr.h" // for RefPtr, already_AddRefed, etc -#include "mozilla/layers/KnowsCompositor.h" +#include "mozilla/layers/ActiveResource.h" #include "mozilla/layers/LayersSurfaces.h" #include "mozilla/layers/LayersTypes.h" #include "mozilla/RefCounted.h" @@ -28,6 +28,7 @@ class DrawTarget; namespace layers { +class KnowsCompositor; struct RemoteTextureOwnerId; class TextureClient; diff --git a/gfx/layers/ipc/ActiveResource.h b/gfx/layers/ipc/ActiveResource.h new file mode 100644 index 000000000000..6e7db6054168 --- /dev/null +++ b/gfx/layers/ipc/ActiveResource.h @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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_ACTIVERESOURCE +#define MOZILLA_LAYERS_ACTIVERESOURCE + +#include "nsExpirationTracker.h" + +namespace mozilla::layers { + +/** + * See ActiveResourceTracker below. + */ +class ActiveResource { + public: + virtual void NotifyInactive() = 0; + nsExpirationState* GetExpirationState() { return &mExpirationState; } + bool IsActivityTracked() { return mExpirationState.IsTracked(); } + + private: + nsExpirationState mExpirationState; +}; + +/** + * A convenience class on top of nsExpirationTracker + */ +class ActiveResourceTracker final + : public nsExpirationTracker { + public: + ActiveResourceTracker(uint32_t aExpirationCycle, const char* aName, + nsIEventTarget* aEventTarget) + : nsExpirationTracker(aExpirationCycle, aName, aEventTarget) {} + + void NotifyExpired(ActiveResource* aResource) override { + RemoveObject(aResource); + aResource->NotifyInactive(); + } +}; + +} // namespace mozilla::layers + +#endif diff --git a/gfx/layers/ipc/KnowsCompositor.cpp b/gfx/layers/ipc/KnowsCompositor.cpp index 4d2ed90603f5..2c735637485f 100644 --- a/gfx/layers/ipc/KnowsCompositor.cpp +++ b/gfx/layers/ipc/KnowsCompositor.cpp @@ -9,8 +9,7 @@ #include "mozilla/layers/ImageBridgeChild.h" #include "mozilla/ipc/ProtocolUtils.h" -namespace mozilla { -namespace layers { +namespace mozilla::layers { void KnowsCompositor::IdentifyTextureHost( const TextureFactoryIdentifier& aIdentifier) { @@ -47,10 +46,6 @@ LayersIPCActor* KnowsCompositorMediaProxy::GetLayersIPCActor() { return mThreadSafeAllocator->GetLayersIPCActor(); } -ActiveResourceTracker* KnowsCompositorMediaProxy::GetActiveResourceTracker() { - return mThreadSafeAllocator->GetActiveResourceTracker(); -} - void KnowsCompositorMediaProxy::SyncWithCompositor() { mThreadSafeAllocator->SyncWithCompositor(); } @@ -109,5 +104,4 @@ void DestroySurfaceDescriptor(ipc::IShmemAllocator* aAllocator, *aSurface = SurfaceDescriptor(); } -} // namespace layers -} // namespace mozilla +} // namespace mozilla::layers diff --git a/gfx/layers/ipc/KnowsCompositor.h b/gfx/layers/ipc/KnowsCompositor.h index 0124a970d197..2a71b0d28973 100644 --- a/gfx/layers/ipc/KnowsCompositor.h +++ b/gfx/layers/ipc/KnowsCompositor.h @@ -9,45 +9,15 @@ #include "mozilla/layers/LayersTypes.h" // for LayersBackend #include "mozilla/layers/CompositorTypes.h" -#include "nsExpirationTracker.h" #include "mozilla/DataMutex.h" #include "mozilla/layers/SyncObject.h" -namespace mozilla { -namespace layers { +namespace mozilla::layers { class TextureForwarder; class LayersIPCActor; class ImageBridgeChild; -/** - * See ActiveResourceTracker below. - */ -class ActiveResource { - public: - virtual void NotifyInactive() = 0; - nsExpirationState* GetExpirationState() { return &mExpirationState; } - bool IsActivityTracked() { return mExpirationState.IsTracked(); } - - private: - nsExpirationState mExpirationState; -}; - -/** - * A convenience class on top of nsExpirationTracker - */ -class ActiveResourceTracker : public nsExpirationTracker { - public: - ActiveResourceTracker(uint32_t aExpirationCycle, const char* aName, - nsIEventTarget* aEventTarget) - : nsExpirationTracker(aExpirationCycle, aName, aEventTarget) {} - - void NotifyExpired(ActiveResource* aResource) override { - RemoveObject(aResource); - aResource->NotifyInactive(); - } -}; - /** * An abstract interface for classes that are tied to a specific Compositor * across IPDL and uses TextureFactoryIdentifier to describe this Compositor. @@ -212,10 +182,6 @@ class KnowsCompositor { */ virtual TextureForwarder* GetTextureForwarder() = 0; virtual LayersIPCActor* GetLayersIPCActor() = 0; - virtual ActiveResourceTracker* GetActiveResourceTracker() { - MOZ_ASSERT_UNREACHABLE("Unimplemented"); - return nullptr; - } protected: struct SharedData { @@ -250,8 +216,6 @@ class KnowsCompositorMediaProxy : public KnowsCompositor { LayersIPCActor* GetLayersIPCActor() override; - ActiveResourceTracker* GetActiveResourceTracker() override; - void SyncWithCompositor() override; protected: @@ -260,7 +224,6 @@ class KnowsCompositorMediaProxy : public KnowsCompositor { RefPtr mThreadSafeAllocator; }; -} // namespace layers -} // namespace mozilla +} // namespace mozilla::layers #endif diff --git a/gfx/layers/moz.build b/gfx/layers/moz.build index a2ba02bc94af..78a945189d2f 100644 --- a/gfx/layers/moz.build +++ b/gfx/layers/moz.build @@ -143,6 +143,7 @@ EXPORTS.mozilla.layers += [ "DirectionUtils.h", "Effects.h", "ImageDataSerializer.h", + "ipc/ActiveResource.h", "ipc/APZChild.h", "ipc/APZCTreeManagerChild.h", "ipc/APZCTreeManagerParent.h", diff --git a/gfx/layers/wr/WebRenderBridgeChild.cpp b/gfx/layers/wr/WebRenderBridgeChild.cpp index ff6ec722313a..8a7555d917e3 100644 --- a/gfx/layers/wr/WebRenderBridgeChild.cpp +++ b/gfx/layers/wr/WebRenderBridgeChild.cpp @@ -66,8 +66,6 @@ void WebRenderBridgeChild::DoDestroy() { // mDestroyed is used to prevent calling Send__delete__() twice. // When this function is called from CompositorBridgeChild::Destroy(). - // mActiveResourceTracker is not cleared here, since it is - // used by PersistentBufferProviderShared. mDestroyed = true; mManager = nullptr; } @@ -519,11 +517,8 @@ void WebRenderBridgeChild::EndClearCachedResources() { void WebRenderBridgeChild::SetWebRenderLayerManager( WebRenderLayerManager* aManager) { MOZ_ASSERT(aManager && !mManager); - mManager = aManager; - MOZ_ASSERT(NS_IsMainThread() || !XRE_IsContentProcess()); - mActiveResourceTracker = - MakeUnique(1000, "CompositableForwarder", nullptr); + mManager = aManager; } ipc::IShmemAllocator* WebRenderBridgeChild::GetShmemAllocator() { diff --git a/gfx/layers/wr/WebRenderBridgeChild.h b/gfx/layers/wr/WebRenderBridgeChild.h index 2bd8dc8570d9..683041fe460a 100644 --- a/gfx/layers/wr/WebRenderBridgeChild.h +++ b/gfx/layers/wr/WebRenderBridgeChild.h @@ -94,9 +94,6 @@ class WebRenderBridgeChild final : public PWebRenderBridgeChild, TextureForwarder* GetTextureForwarder() override; LayersIPCActor* GetLayersIPCActor() override; void SyncWithCompositor() override; - ActiveResourceTracker* GetActiveResourceTracker() override { - return mActiveResourceTracker.get(); - } void AddPipelineIdForCompositable(const wr::PipelineId& aPipelineId, const CompositableHandle& aHandle, @@ -258,8 +255,6 @@ class WebRenderBridgeChild final : public PWebRenderBridgeChild, uint32_t mFontInstanceKeysDeleted; nsTHashMap mFontInstanceKeys; - UniquePtr mActiveResourceTracker; - RefCountedShmem mResourceShm; };