diff --git a/gfx/layers/ipc/CompositorBridgeChild.cpp b/gfx/layers/ipc/CompositorBridgeChild.cpp index 618b3d58483c..6424428024e4 100644 --- a/gfx/layers/ipc/CompositorBridgeChild.cpp +++ b/gfx/layers/ipc/CompositorBridgeChild.cpp @@ -1132,7 +1132,7 @@ CompositorBridgeChild::HandleFatalError(const char* aName, const char* aMsg) con PWebRenderBridgeChild* CompositorBridgeChild::AllocPWebRenderBridgeChild(const wr::PipelineId& aPipelineId, TextureFactoryIdentifier*, uint32_t *aIdNamespace) { - WebRenderBridgeChild* child = new WebRenderBridgeChild(aPipelineId, *aIdNamespace); + WebRenderBridgeChild* child = new WebRenderBridgeChild(aPipelineId); child->AddIPDLReference(); return child; } diff --git a/gfx/layers/ipc/CompositorBridgeParent.cpp b/gfx/layers/ipc/CompositorBridgeParent.cpp index 72251a2ee853..872f503e91d3 100644 --- a/gfx/layers/ipc/CompositorBridgeParent.cpp +++ b/gfx/layers/ipc/CompositorBridgeParent.cpp @@ -1591,8 +1591,8 @@ CompositorBridgeParent::AllocPWebRenderBridgeParent(const wr::PipelineId& aPipel RefPtr holder = new WebRenderCompositableHolder(); MOZ_ASSERT(api); // TODO have a fallback api->SetRootPipeline(aPipelineId); - *aIdNamespace = api->GetNamespace().mHandle; mWrBridge = new WebRenderBridgeParent(this, aPipelineId, mWidget, nullptr, Move(api), Move(holder)); + *aIdNamespace = mWrBridge->GetIdNameSpace(); mCompositorScheduler = mWrBridge->CompositorScheduler(); MOZ_ASSERT(mCompositorScheduler); diff --git a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp index 76492b1ee0ed..ae91468ae656 100644 --- a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp +++ b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp @@ -228,7 +228,8 @@ CrossProcessCompositorBridgeParent::AllocPWebRenderBridgeParent(const wr::Pipeli sIndirectLayerTrees[pipelineHandle].mCrossProcessParent = this; sIndirectLayerTrees[pipelineHandle].mWrBridge = parent; *aTextureFactoryIdentifier = parent->GetTextureFactoryIdentifier(); - *aIdNamespace = api->GetNamespace().mHandle; + *aIdNamespace = parent->GetIdNameSpace(); + return parent; } diff --git a/gfx/layers/wr/WebRenderBridgeChild.cpp b/gfx/layers/wr/WebRenderBridgeChild.cpp index 3a87b1c52cc5..ab4d9b4b2261 100644 --- a/gfx/layers/wr/WebRenderBridgeChild.cpp +++ b/gfx/layers/wr/WebRenderBridgeChild.cpp @@ -15,9 +15,9 @@ namespace mozilla { namespace layers { -WebRenderBridgeChild::WebRenderBridgeChild(const wr::PipelineId& aPipelineId, uint32_t aIdNamespace) +WebRenderBridgeChild::WebRenderBridgeChild(const wr::PipelineId& aPipelineId) : mIsInTransaction(false) - , mIdNamespace(aIdNamespace) + , mIdNamespace(0) , mResourceId(0) , mIPCOpen(false) , mDestroyed(false) diff --git a/gfx/layers/wr/WebRenderBridgeChild.h b/gfx/layers/wr/WebRenderBridgeChild.h index ee9b921620ce..e251f50f8333 100644 --- a/gfx/layers/wr/WebRenderBridgeChild.h +++ b/gfx/layers/wr/WebRenderBridgeChild.h @@ -28,7 +28,7 @@ class WebRenderBridgeChild final : public PWebRenderBridgeChild NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebRenderBridgeChild, override) public: - explicit WebRenderBridgeChild(const wr::PipelineId& aPipelineId, uint32_t aIdNamespace); + explicit WebRenderBridgeChild(const wr::PipelineId& aPipelineId); void AddWebRenderCommand(const WebRenderCommand& aCmd); void AddWebRenderCommands(const nsTArray& aCommands); @@ -56,6 +56,10 @@ public: uint32_t GetNextResourceId() { return ++mResourceId; } uint32_t GetNamespace() { return mIdNamespace; } + void SetNamespace(uint32_t aIdNamespace) + { + mIdNamespace = aIdNamespace; + } private: friend class CompositorBridgeChild; diff --git a/gfx/layers/wr/WebRenderBridgeParent.cpp b/gfx/layers/wr/WebRenderBridgeParent.cpp index ef68812743e8..577d48dffaa0 100644 --- a/gfx/layers/wr/WebRenderBridgeParent.cpp +++ b/gfx/layers/wr/WebRenderBridgeParent.cpp @@ -75,6 +75,8 @@ private: InfallibleTArray* mActorsToDestroy; }; +/* static */ uint32_t WebRenderBridgeParent::sIdNameSpace = 0; + WebRenderBridgeParent::WebRenderBridgeParent(CompositorBridgeParentBase* aCompositorBridge, const wr::PipelineId& aPipelineId, widget::CompositorWidget* aWidget, @@ -91,6 +93,7 @@ WebRenderBridgeParent::WebRenderBridgeParent(CompositorBridgeParentBase* aCompos , mChildLayerObserverEpoch(0) , mParentLayerObserverEpoch(0) , mWrEpoch(0) + , mIdNameSpace(++sIdNameSpace) , mDestroyed(false) { MOZ_ASSERT(mCompositableHolder); diff --git a/gfx/layers/wr/WebRenderBridgeParent.h b/gfx/layers/wr/WebRenderBridgeParent.h index 26dd1788253e..fb4440db7f29 100644 --- a/gfx/layers/wr/WebRenderBridgeParent.h +++ b/gfx/layers/wr/WebRenderBridgeParent.h @@ -133,6 +133,11 @@ public: aNotifications->AppendElements(Move(mImageCompositeNotifications)); } + uint32_t GetIdNameSpace() + { + return mIdNameSpace; + } + private: virtual ~WebRenderBridgeParent(); @@ -178,8 +183,11 @@ private: std::queue mPendingTransactionIds; uint32_t mWrEpoch; + uint32_t mIdNameSpace; bool mDestroyed; + + static uint32_t sIdNameSpace; }; } // namespace layers diff --git a/gfx/layers/wr/WebRenderLayerManager.cpp b/gfx/layers/wr/WebRenderLayerManager.cpp index 39c2fe0d40eb..a19dc8c14f5c 100644 --- a/gfx/layers/wr/WebRenderLayerManager.cpp +++ b/gfx/layers/wr/WebRenderLayerManager.cpp @@ -228,6 +228,7 @@ WebRenderLayerManager::Initialize(PCompositorBridgeChild* aCBChild, LayoutDeviceIntSize size = mWidget->GetClientSize(); WrBridge()->SendCreate(size.ToUnknownSize()); WrBridge()->IdentifyTextureHost(textureFactoryIdentifier); + WrBridge()->SetNamespace(id_namespace); *aTextureFactoryIdentifier = textureFactoryIdentifier; }