author | sotaro <sotaro.ikeda.g@gmail.com> |
Sat, 23 Feb 2019 08:59:53 +0900 | |
changeset 460722 | 0e0b4b2f297307d8c3178acca10dc3b4a2c55359 |
parent 460721 | 75f417cfd0d21205c36493cfd1086faacd4a5182 |
child 460723 | 1c74156717f19c20279571e493dac202cf89d4ef |
push id | 35597 |
push user | rmaries@mozilla.com |
push date | Sat, 23 Feb 2019 04:15:57 +0000 |
treeherder | mozilla-central@6924dd16f7b1 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | nical |
bugs | 1529027 |
milestone | 67.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp +++ b/gfx/layers/wr/WebRenderBridgeParent.cpp @@ -1376,17 +1376,17 @@ void WebRenderBridgeParent::RemovePipeli } auto it = mAsyncCompositables.find(wr::AsUint64(aPipelineId)); if (it == mAsyncCompositables.end()) { return; } RefPtr<WebRenderImageHost>& wrHost = it->second; - wrHost->ClearWrBridge(); + wrHost->ClearWrBridge(this); mAsyncImageManager->RemoveAsyncImagePipeline(aPipelineId, aTxn); aTxn.RemovePipeline(aPipelineId); mAsyncCompositables.erase(wr::AsUint64(aPipelineId)); return; } void WebRenderBridgeParent::DeleteImage(const ImageKey& aKey, wr::TransactionBuilder& aUpdates) { @@ -2001,17 +2001,17 @@ void WebRenderBridgeParent::ClearResourc if (wrTexture) { mAsyncImageManager->HoldExternalImage(mPipelineId, wrEpoch, wrTexture); } } mTextureHosts.clear(); for (const auto& entry : mAsyncCompositables) { wr::PipelineId pipelineId = wr::AsPipelineId(entry.first); RefPtr<WebRenderImageHost> host = entry.second; - host->ClearWrBridge(); + host->ClearWrBridge(this); mAsyncImageManager->RemoveAsyncImagePipeline(pipelineId, txn); txn.RemovePipeline(pipelineId); } mAsyncCompositables.clear(); for (const auto& entry : mSharedSurfaceIds) { mAsyncImageManager->HoldExternalImage(mPipelineId, mWrEpoch, entry.second); } mSharedSurfaceIds.clear();
--- a/gfx/layers/wr/WebRenderBridgeParent.h +++ b/gfx/layers/wr/WebRenderBridgeParent.h @@ -13,16 +13,17 @@ #include "CompositableHost.h" // for CompositableHost, ImageCompositeNotificationInfo #include "GLContextProvider.h" #include "mozilla/layers/CompositableTransactionParent.h" #include "mozilla/layers/CompositorVsyncSchedulerOwner.h" #include "mozilla/layers/PWebRenderBridgeParent.h" #include "mozilla/layers/UiCompositorControllerParent.h" #include "mozilla/Maybe.h" #include "mozilla/UniquePtr.h" +#include "mozilla/WeakPtr.h" #include "mozilla/webrender/WebRenderTypes.h" #include "mozilla/webrender/WebRenderAPI.h" #include "mozilla/webrender/RenderThread.h" #include "nsTArrayForwardDeclare.h" namespace mozilla { namespace gl { @@ -44,18 +45,20 @@ class CompositorAnimationStorage; class CompositorBridgeParentBase; class CompositorVsyncScheduler; class AsyncImagePipelineManager; class WebRenderImageHost; class WebRenderBridgeParent final : public PWebRenderBridgeParent, public CompositorVsyncSchedulerOwner, public CompositableParentManager, - public layers::FrameRecorder { + public layers::FrameRecorder, + public SupportsWeakPtr<WebRenderBridgeParent> { public: + MOZ_DECLARE_WEAKREFERENCE_TYPENAME(WebRenderBridgeParent) WebRenderBridgeParent(CompositorBridgeParentBase* aCompositorBridge, const wr::PipelineId& aPipelineId, widget::CompositorWidget* aWidget, CompositorVsyncScheduler* aScheduler, RefPtr<wr::WebRenderAPI>&& aApi, RefPtr<AsyncImagePipelineManager>&& aImageMgr, RefPtr<CompositorAnimationStorage>&& aAnimStorage, TimeDuration aVsyncRate);
--- a/gfx/layers/wr/WebRenderImageHost.cpp +++ b/gfx/layers/wr/WebRenderImageHost.cpp @@ -25,17 +25,16 @@ using namespace gfx; namespace layers { class ISurfaceAllocator; WebRenderImageHost::WebRenderImageHost(const TextureInfo& aTextureInfo) : CompositableHost(aTextureInfo), ImageComposite(), - mWrBridge(nullptr), mWrBridgeBindings(0) {} WebRenderImageHost::~WebRenderImageHost() { MOZ_ASSERT(!mWrBridge); } void WebRenderImageHost::UseTextureHost( const nsTArray<TimedTexture>& aTextures) { CompositableHost::UseTextureHost(aTextures); MOZ_ASSERT(aTextures.Length() >= 1); @@ -245,19 +244,24 @@ void WebRenderImageHost::SetWrBridge(Web // the layer tree. However this should be limited to things such as video // which will not be reused across different WebRenderBridgeParent objects. MOZ_ASSERT(aWrBridge); MOZ_ASSERT(!mWrBridge || mWrBridge == aWrBridge); mWrBridge = aWrBridge; ++mWrBridgeBindings; } -void WebRenderImageHost::ClearWrBridge() { +void WebRenderImageHost::ClearWrBridge(WebRenderBridgeParent* aWrBridge) { + MOZ_ASSERT(aWrBridge); MOZ_ASSERT(mWrBridgeBindings > 0); --mWrBridgeBindings; if (mWrBridgeBindings == 0) { + MOZ_ASSERT(aWrBridge == mWrBridge); + if (aWrBridge != mWrBridge) { + gfxCriticalNote << "WrBridge mismatch happened"; + } SetCurrentTextureHost(nullptr); mWrBridge = nullptr; } } } // namespace layers } // namespace mozilla
--- a/gfx/layers/wr/WebRenderImageHost.h +++ b/gfx/layers/wr/WebRenderImageHost.h @@ -4,16 +4,17 @@ * 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_GFX_WEBRENDERIMAGEHOST_H #define MOZILLA_GFX_WEBRENDERIMAGEHOST_H #include "CompositableHost.h" // for CompositableHost #include "mozilla/layers/ImageComposite.h" // for ImageComposite +#include "mozilla/WeakPtr.h" namespace mozilla { namespace layers { class WebRenderBridgeParent; /** * ImageHost. Works with ImageClientSingle and ImageClientBuffered @@ -68,27 +69,27 @@ class WebRenderImageHost : public Compos uint32_t GetDroppedFrames() override { return GetDroppedFramesAndReset(); } virtual WebRenderImageHost* AsWebRenderImageHost() override { return this; } TextureHost* GetAsTextureHostForComposite(); void SetWrBridge(WebRenderBridgeParent* aWrBridge); - void ClearWrBridge(); + void ClearWrBridge(WebRenderBridgeParent* aWrBridge); TextureHost* GetCurrentTextureHost() { return mCurrentTextureHost; } protected: // ImageComposite virtual TimeStamp GetCompositionTime() const override; void SetCurrentTextureHost(TextureHost* aTexture); - WebRenderBridgeParent* MOZ_NON_OWNING_REF mWrBridge; + WeakPtr<WebRenderBridgeParent> mWrBridge; uint32_t mWrBridgeBindings; CompositableTextureHostRef mCurrentTextureHost; }; } // namespace layers } // namespace mozilla