diff --git a/gfx/layers/apz/src/APZCTreeManager.cpp b/gfx/layers/apz/src/APZCTreeManager.cpp index 7dba494add18..6da4288996b5 100644 --- a/gfx/layers/apz/src/APZCTreeManager.cpp +++ b/gfx/layers/apz/src/APZCTreeManager.cpp @@ -2795,7 +2795,7 @@ APZCTreeManager::HitTestResult APZCTreeManager::GetAPZCAtPointWR( const ScreenPoint& aHitTestPoint, const RecursiveMutexAutoLock& aProofOfTreeLock) { HitTestResult hit; - RefPtr wr = GetWebRenderAPIAtPoint(aHitTestPoint); + RefPtr wr = GetWebRenderAPI(); if (!wr) { // If WebRender isn't running, fall back to the root APZC. // This is mostly for the benefit of GTests which do not @@ -3606,25 +3606,12 @@ LayerToParentLayerMatrix4x4 APZCTreeManager::ComputeTransformForNode( return aNode->GetTransform() * AsyncTransformMatrix(); } -already_AddRefed APZCTreeManager::GetWebRenderAPI( - wr::RenderRoot aRenderRoot) const { +already_AddRefed APZCTreeManager::GetWebRenderAPI() const { RefPtr api; CompositorBridgeParent::CallWithIndirectShadowTree( mRootLayersId, [&](LayerTreeState& aState) -> void { if (aState.mWrBridge) { - api = aState.mWrBridge->GetWebRenderAPI(aRenderRoot); - } - }); - return api.forget(); -} - -already_AddRefed APZCTreeManager::GetWebRenderAPIAtPoint( - const ScreenPoint& aPoint) const { - RefPtr api; - CompositorBridgeParent::CallWithIndirectShadowTree( - mRootLayersId, [&](LayerTreeState& aState) -> void { - if (aState.mWrBridge) { - api = aState.mWrBridge->GetWebRenderAPIAtPoint(aPoint); + api = aState.mWrBridge->GetWebRenderAPI(); } }); return api.forget(); diff --git a/gfx/layers/apz/src/APZCTreeManager.h b/gfx/layers/apz/src/APZCTreeManager.h index 77172bdfdf8b..58cc9063f421 100644 --- a/gfx/layers/apz/src/APZCTreeManager.h +++ b/gfx/layers/apz/src/APZCTreeManager.h @@ -506,20 +506,9 @@ class APZCTreeManager : public IAPZCTreeManager, public APZInputBridge { // Assert that the current thread is the updater thread for this APZCTM. void AssertOnUpdaterThread(); - // Returns a pointer to the WebRenderAPI this APZCTreeManager is for, for - // the provided RenderRoot (since an APZCTreeManager can cover multiple - // RenderRoots). This might be null (for example, if WebRender is not - // enabled). - already_AddRefed GetWebRenderAPI( - wr::RenderRoot aRenderRoot) const; - - // Returns a pointer to the root WebRenderAPI for the RenderRoot that owns - // the given point. For example, if aPoint is in the content area and - // RenderRoot splitting is enabled, this will return the WebRenderAPI for - // the Content RenderRoot. + // Returns a pointer to the WebRenderAPI this APZCTreeManager is for. // This might be null (for example, if WebRender is not enabled). - already_AddRefed GetWebRenderAPIAtPoint( - const ScreenPoint& aPoint) const; + already_AddRefed GetWebRenderAPI() const; protected: // Protected destructor, to discourage deletion outside of Release(): diff --git a/gfx/layers/apz/src/APZUpdater.cpp b/gfx/layers/apz/src/APZUpdater.cpp index f41d23940918..3a5080b7c013 100644 --- a/gfx/layers/apz/src/APZUpdater.cpp +++ b/gfx/layers/apz/src/APZUpdater.cpp @@ -358,8 +358,7 @@ void APZUpdater::RunOnUpdaterThread(LayersId aLayersId, mUpdaterQueue.push_back(QueuedTask{aLayersId, task}); } if (sendWakeMessage) { - RefPtr api = - mApz->GetWebRenderAPI(wr::RenderRoot::Default); + RefPtr api = mApz->GetWebRenderAPI(); if (api) { api->WakeSceneBuilder(); } else { diff --git a/gfx/layers/ipc/CompositorBridgeParent.cpp b/gfx/layers/ipc/CompositorBridgeParent.cpp index 699e9d788eca..443fddf866c9 100644 --- a/gfx/layers/ipc/CompositorBridgeParent.cpp +++ b/gfx/layers/ipc/CompositorBridgeParent.cpp @@ -496,8 +496,7 @@ void CompositorBridgeParent::StopAndClearResources() { } indirectBridgeParents.clear(); - RefPtr api = - mWrBridge->GetWebRenderAPI(wr::RenderRoot::Default); + RefPtr api = mWrBridge->GetWebRenderAPI(); // Ensure we are not holding the sIndirectLayerTreesLock here because we // are going to block on WR threads in order to shut it down properly. mWrBridge->Destroy(); @@ -1209,8 +1208,7 @@ CompositorBridgeParent::GetCompositorBridgeParentFromWindowId( // state->mWrBridge might be a root WebRenderBridgeParent or one of a // content process, but in either case the state->mParent will be the same. // So we don't need to distinguish between the two. - if (RefPtr api = - state->mWrBridge->GetWebRenderAPI(wr::RenderRoot::Default)) { + if (RefPtr api = state->mWrBridge->GetWebRenderAPI()) { if (api->GetId() == aWindowId) { return state->mParent; } @@ -1827,11 +1825,10 @@ mozilla::ipc::IPCResult CompositorBridgeParent::RecvAdoptChild( if (childWrBridge) { MOZ_ASSERT(mWrBridge); - nsTArray> apis; - DebugOnly cloneSuccess = mWrBridge->CloneWebRenderAPIs(apis); - MOZ_ASSERT(cloneSuccess); + RefPtr api = mWrBridge->GetWebRenderAPI(); + api = api->Clone(); wr::Epoch newEpoch = childWrBridge->UpdateWebRender( - mWrBridge->CompositorScheduler(), std::move(apis), + mWrBridge->CompositorScheduler(), std::move(api), mWrBridge->AsyncImageManager(), GetAnimationStorage(), mWrBridge->GetTextureFactoryIdentifier()); // Pretend we composited, since parent CompositorBridgeParent was replaced. @@ -1898,33 +1895,28 @@ PWebRenderBridgeParent* CompositorBridgeParent::AllocPWebRenderBridgeParent( // Same as for mApzUpdater, but for the sampler thread. mApzSampler->SetWebRenderWindowId(windowId); } - nsTArray> apis; - apis.AppendElement( - wr::WebRenderAPI::Create(this, std::move(widget), windowId, aSize)); - if (!apis[0]) { + RefPtr api = + wr::WebRenderAPI::Create(this, std::move(widget), windowId, aSize); + if (!api) { mWrBridge = WebRenderBridgeParent::CreateDestroyed(aPipelineId); mWrBridge.get()->AddRef(); // IPDL reference return mWrBridge; } - nsTArray> clonedApis; - for (auto& api : apis) { - wr::TransactionBuilder txn; - txn.SetRootPipeline(aPipelineId); - api->SendTransaction(txn); - clonedApis.AppendElement(api->Clone()); - } + wr::TransactionBuilder txn; + txn.SetRootPipeline(aPipelineId); + api->SendTransaction(txn); bool useCompositorWnd = false; #ifdef XP_WIN useCompositorWnd = !!mWidget->AsWindows()->GetCompositorHwnd(); #endif mAsyncImageManager = - new AsyncImagePipelineManager(std::move(clonedApis), useCompositorWnd); + new AsyncImagePipelineManager(api->Clone(), useCompositorWnd); RefPtr asyncMgr = mAsyncImageManager; RefPtr animStorage = GetAnimationStorage(); mWrBridge = new WebRenderBridgeParent(this, aPipelineId, mWidget, nullptr, - std::move(apis), std::move(asyncMgr), + std::move(api), std::move(asyncMgr), std::move(animStorage), mVsyncRate); mWrBridge.get()->AddRef(); // IPDL reference @@ -1970,8 +1962,7 @@ bool CompositorBridgeParent::DeallocPWebGPUParent( void CompositorBridgeParent::NotifyMemoryPressure() { if (mWrBridge) { - RefPtr api = - mWrBridge->GetWebRenderAPI(wr::RenderRoot::Default); + RefPtr api = mWrBridge->GetWebRenderAPI(); if (api) { api->NotifyMemoryPressure(); } @@ -1980,8 +1971,7 @@ void CompositorBridgeParent::NotifyMemoryPressure() { void CompositorBridgeParent::AccumulateMemoryReport(wr::MemoryReport* aReport) { if (mWrBridge) { - RefPtr api = - mWrBridge->GetWebRenderAPI(wr::RenderRoot::Default); + RefPtr api = mWrBridge->GetWebRenderAPI(); if (api) { api->AccumulateMemoryReport(aReport); } @@ -2528,8 +2518,7 @@ bool CompositorBridgeParent::IsSameProcess() const { void CompositorBridgeParent::NotifyWebRenderContextPurge() { MOZ_ASSERT(CompositorLoop() == MessageLoop::current()); - RefPtr api = - mWrBridge->GetWebRenderAPI(wr::RenderRoot::Default); + RefPtr api = mWrBridge->GetWebRenderAPI(); api->ClearAllCaches(); } diff --git a/gfx/layers/ipc/ContentCompositorBridgeParent.cpp b/gfx/layers/ipc/ContentCompositorBridgeParent.cpp index 130d84f3cf4d..2a22926230f8 100644 --- a/gfx/layers/ipc/ContentCompositorBridgeParent.cpp +++ b/gfx/layers/ipc/ContentCompositorBridgeParent.cpp @@ -227,13 +227,12 @@ ContentCompositorBridgeParent::AllocPWebRenderBridgeParent( } } - nsTArray> apis; - bool cloneSuccess = false; + RefPtr api; if (root) { - cloneSuccess = root->CloneWebRenderAPIs(apis); + api = root->GetWebRenderAPI(); } - if (!cloneSuccess) { + if (!root || !api) { // This could happen when this function is called after // CompositorBridgeParent destruction. This was observed during Tab move // between different windows. @@ -247,10 +246,11 @@ ContentCompositorBridgeParent::AllocPWebRenderBridgeParent( return parent; } + api = api->Clone(); RefPtr holder = root->AsyncImageManager(); RefPtr animStorage = cbp->GetAnimationStorage(); WebRenderBridgeParent* parent = new WebRenderBridgeParent( - this, aPipelineId, nullptr, root->CompositorScheduler(), std::move(apis), + this, aPipelineId, nullptr, root->CompositorScheduler(), std::move(api), std::move(holder), std::move(animStorage), cbp->GetVsyncInterval()); parent->AddRef(); // IPDL reference diff --git a/gfx/layers/wr/AsyncImagePipelineManager.cpp b/gfx/layers/wr/AsyncImagePipelineManager.cpp index b6ed84784626..abc24a7150bb 100644 --- a/gfx/layers/wr/AsyncImagePipelineManager.cpp +++ b/gfx/layers/wr/AsyncImagePipelineManager.cpp @@ -37,11 +37,11 @@ AsyncImagePipelineManager::AsyncImagePipeline::AsyncImagePipeline() mMixBlendMode(wr::MixBlendMode::Normal) {} AsyncImagePipelineManager::AsyncImagePipelineManager( - nsTArray>&& aApis, bool aUseCompositorWnd) - : mApis(std::move(aApis)), + RefPtr&& aApi, bool aUseCompositorWnd) + : mApi(aApi), mUseCompositorWnd(aUseCompositorWnd), - mIdNamespace(mApis[0]->GetNamespace()), - mUseTripleBuffering(mApis[0]->GetUseTripleBuffering()), + mIdNamespace(mApi->GetNamespace()), + mUseTripleBuffering(mApi->GetUseTripleBuffering()), mResourceId(0), mAsyncImageEpoch{0}, mWillGenerateFrame{}, @@ -57,7 +57,7 @@ AsyncImagePipelineManager::~AsyncImagePipelineManager() { void AsyncImagePipelineManager::Destroy() { MOZ_ASSERT(!mDestroyed); - mApis.Clear(); + mApi = nullptr; mPipelineTexturesHolders.Clear(); mDestroyed = true; } @@ -431,9 +431,8 @@ void AsyncImagePipelineManager::ApplyAsyncImageForPipeline( if (!pipeline) { return; } - wr::WebRenderAPI* api = mApis[(size_t)pipeline->mRenderRoot]; wr::TransactionBuilder fastTxn(/* aUseSceneBuilderThread */ false); - wr::AutoTransactionSender sender(api, &fastTxn); + wr::AutoTransactionSender sender(mApi, &fastTxn); // Transaction for async image pipeline that uses ImageBridge always need to // be non low priority. diff --git a/gfx/layers/wr/AsyncImagePipelineManager.h b/gfx/layers/wr/AsyncImagePipelineManager.h index cbe63e006f8e..51cc492b4211 100644 --- a/gfx/layers/wr/AsyncImagePipelineManager.h +++ b/gfx/layers/wr/AsyncImagePipelineManager.h @@ -36,7 +36,7 @@ class AsyncImagePipelineManager final { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AsyncImagePipelineManager) - explicit AsyncImagePipelineManager(nsTArray>&& aApis, + explicit AsyncImagePipelineManager(RefPtr&& aApi, bool aUseCompositorWnd); protected: @@ -219,7 +219,7 @@ class AsyncImagePipelineManager final { void CheckForTextureHostsNotUsedByGPU(); - nsTArray> mApis; + RefPtr mApi; bool mUseCompositorWnd; const wr::IdNamespace mIdNamespace; diff --git a/gfx/layers/wr/WebRenderBridgeParent.cpp b/gfx/layers/wr/WebRenderBridgeParent.cpp index db8fa974ede0..984237e5641f 100644 --- a/gfx/layers/wr/WebRenderBridgeParent.cpp +++ b/gfx/layers/wr/WebRenderBridgeParent.cpp @@ -328,13 +328,13 @@ class MOZ_STACK_CLASS AutoWebRenderBridgeParentAsyncMessageSender final { WebRenderBridgeParent::WebRenderBridgeParent( CompositorBridgeParentBase* aCompositorBridge, const wr::PipelineId& aPipelineId, widget::CompositorWidget* aWidget, - CompositorVsyncScheduler* aScheduler, - nsTArray>&& aApis, + CompositorVsyncScheduler* aScheduler, RefPtr&& aApi, RefPtr&& aImageMgr, RefPtr&& aAnimStorage, TimeDuration aVsyncRate) : mCompositorBridge(aCompositorBridge), mPipelineId(aPipelineId), mWidget(aWidget), + mApi(aApi), mAsyncImageManager(aImageMgr), mCompositorScheduler(aScheduler), mAnimStorage(aAnimStorage), @@ -342,7 +342,7 @@ WebRenderBridgeParent::WebRenderBridgeParent( mChildLayersObserverEpoch{0}, mParentLayersObserverEpoch{0}, mWrEpoch{0}, - mIdNamespace(aApis[0]->GetNamespace()), + mIdNamespace(aApi->GetNamespace()), mRenderRootRectMutex("WebRenderBridgeParent::mRenderRootRectMutex"), #if defined(MOZ_WIDGET_ANDROID) mScreenPixelsTarget(nullptr), @@ -364,11 +364,6 @@ WebRenderBridgeParent::WebRenderBridgeParent( mRenderRoot = Some(wr::RenderRoot::Default); - for (auto& api : aApis) { - MOZ_ASSERT(api); - mApis[api->GetRenderRoot()] = api; - } - UpdateDebugFlags(); UpdateQualitySettings(); } @@ -487,7 +482,7 @@ bool WebRenderBridgeParent::HandleDeferredPipelineData( return false; } - Api(wr::RenderRoot::Default)->SendTransaction(txn); + mApi->SendTransaction(txn); wr::IpcResourceUpdateQueue::ReleaseShmems(this, data.mSmallShmems); wr::IpcResourceUpdateQueue::ReleaseShmems(this, data.mLargeShmems); return true; @@ -500,7 +495,7 @@ bool WebRenderBridgeParent::HandleDeferredPipelineData( return false; } - Api(wr::RenderRoot::Default)->SendTransaction(txn); + mApi->SendTransaction(txn); return true; }, [&](FocusTarget& data) { @@ -998,7 +993,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvUpdateResources( return IPC_FAIL(this, "Invalid WebRender resource data shmem or address."); } - Api(aRenderRoot)->SendTransaction(txn); + mApi->SendTransaction(txn); return IPC_OK(); } @@ -1043,17 +1038,17 @@ bool WebRenderBridgeParent::IsRootWebRenderBridgeParent() const { void WebRenderBridgeParent::SetCompositionRecorder( UniquePtr aRecorder) { - Api(wr::RenderRoot::Default)->SetCompositionRecorder(std::move(aRecorder)); + mApi->SetCompositionRecorder(std::move(aRecorder)); } RefPtr WebRenderBridgeParent::WriteCollectedFrames() { - return Api(wr::RenderRoot::Default)->WriteCollectedFrames(); + return mApi->WriteCollectedFrames(); } RefPtr WebRenderBridgeParent::GetCollectedFrames() { - return Api(wr::RenderRoot::Default)->GetCollectedFrames(); + return mApi->GetCollectedFrames(); } void WebRenderBridgeParent::AddPendingScrollPayload( @@ -1217,7 +1212,7 @@ bool WebRenderBridgeParent::SetDisplayList( MakeUnique(this, aWrEpoch, aTxnStartTime)); } - Api(aRenderRoot)->SendTransaction(aTxn); + mApi->SendTransaction(aTxn); // We will schedule generating a frame after the scene // build is done, so we don't need to do it here. @@ -1248,7 +1243,7 @@ bool WebRenderBridgeParent::ProcessRenderRootDisplayListData( txn.SetLowPriority(!IsRootWebRenderBridgeParent()); if (aValidTransaction) { MOZ_ASSERT(aDisplayList.mIdNamespace == mIdNamespace); - sender.emplace(Api(renderRoot), &txn); + sender.emplace(mApi, &txn); } if (NS_WARN_IF(!ProcessWebRenderParentCommands(aDisplayList.mCommands, txn, @@ -1466,7 +1461,7 @@ bool WebRenderBridgeParent::ProcessEmptyTransactionUpdates( } if (!txn.IsEmpty()) { - Api(aUpdates.mRenderRoot)->SendTransaction(txn); + mApi->SendTransaction(txn); } if (*aScheduleComposite) { @@ -1602,7 +1597,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvParentCommands( return IPC_FAIL(this, "Invalid parent command found"); } - Api(aRenderRoot)->SendTransaction(txn); + mApi->SendTransaction(txn); return IPC_OK(); } @@ -1612,7 +1607,7 @@ bool WebRenderBridgeParent::ProcessWebRenderParentCommands( // Transaction for async image pipeline that uses ImageBridge always need to // be non low priority. wr::TransactionBuilder txnForImageBridge; - wr::AutoTransactionSender sender(Api(aRenderRoot), &txnForImageBridge); + wr::AutoTransactionSender sender(mApi, &txnForImageBridge); for (nsTArray::index_type i = 0; i < aCommands.Length(); ++i) { @@ -1700,7 +1695,7 @@ void WebRenderBridgeParent::FlushSceneBuilds() { // to block until all the inflight transactions have been processed. This // flush message blocks until all previously sent scenes have been built // and received by the render backend thread. - mApis[wr::RenderRoot::Default]->FlushSceneBuilder(); + mApi->FlushSceneBuilder(); // The post-swap hook for async-scene-building calls the // ScheduleRenderOnCompositorThread function from the scene builder thread, // which then triggers a call to ScheduleGenerateFrame() on the compositor @@ -1740,14 +1735,14 @@ void WebRenderBridgeParent::FlushFramePresentation() { // this effectively blocks on the render backend and renderer threads, // following the same codepath that WebRender takes to render and composite // a frame. - mApis[wr::RenderRoot::Default]->WaitFlushed(); + mApi->WaitFlushed(); } void WebRenderBridgeParent::DisableNativeCompositor() { // Make sure that SceneBuilder thread does not have a task. - mApis[wr::RenderRoot::Default]->FlushSceneBuilder(); + mApi->FlushSceneBuilder(); // Disable WebRender's native compositor usage - mApis[wr::RenderRoot::Default]->EnableNativeCompositor(false); + mApi->EnableNativeCompositor(false); // Ensure we generate and render a frame immediately. ScheduleForcedGenerateFrame(); @@ -1755,44 +1750,22 @@ void WebRenderBridgeParent::DisableNativeCompositor() { } void WebRenderBridgeParent::UpdateQualitySettings() { - for (auto& api : mApis) { - if (!api) { - continue; - } - wr::TransactionBuilder txn; - txn.UpdateQualitySettings(gfxVars::AllowSacrificingSubpixelAA()); - api->SendTransaction(txn); - } + wr::TransactionBuilder txn; + txn.UpdateQualitySettings(gfxVars::AllowSacrificingSubpixelAA()); + mApi->SendTransaction(txn); } void WebRenderBridgeParent::UpdateDebugFlags() { - auto flags = gfxVars::WebRenderDebugFlags(); - for (auto& api : mApis) { - if (!api) { - continue; - } - api->UpdateDebugFlags(flags); - } + mApi->UpdateDebugFlags(gfxVars::WebRenderDebugFlags()); } void WebRenderBridgeParent::UpdateMultithreading() { - bool multithreading = gfxVars::UseWebRenderMultithreading(); - for (auto& api : mApis) { - if (!api) { - continue; - } - api->EnableMultithreading(multithreading); - } + mApi->EnableMultithreading(gfxVars::UseWebRenderMultithreading()); } void WebRenderBridgeParent::UpdateBatchingParameters() { uint32_t count = gfxVars::WebRenderBatchingLookback(); - for (auto& api : mApis) { - if (!api) { - continue; - } - api->SetBatchingLookback(count); - } + mApi->SetBatchingLookback(count); } #if defined(MOZ_WIDGET_ANDROID) @@ -1827,9 +1800,8 @@ void WebRenderBridgeParent::MaybeCaptureScreenPixels() { IntSize size(client_size.width, client_size.height); - mApis[wr::RenderRoot::Default]->Readback( - TimeStamp::Now(), size, format, - Range(mem.get(), buffer_size)); + mApi->Readback(TimeStamp::Now(), size, format, + Range(mem.get(), buffer_size)); Unused << mScreenPixelsTarget->SendScreenPixels( std::move(mem), ScreenIntSize(client_size.width, client_size.height)); @@ -1890,9 +1862,8 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvGetSnapshot( FlushSceneBuilds(); FlushFrameGeneration(); - mApis[wr::RenderRoot::Default]->Readback(start, size, - bufferTexture->GetFormat(), - Range(buffer, buffer_size)); + mApi->Readback(start, size, bufferTexture->GetFormat(), + Range(buffer, buffer_size)); return IPC_OK(); } @@ -2028,7 +1999,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvClearCachedResources() { MakeUnique( mCompositorBridge, GetLayersId(), mChildLayersObserverEpoch, false)); - Api(renderRoot)->SendTransaction(txn); + mApi->SendTransaction(txn); } else { if (RefPtr root = GetRootWebRenderBridgeParent()) { @@ -2052,14 +2023,13 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvClearCachedResources() { } wr::Epoch WebRenderBridgeParent::UpdateWebRender( - CompositorVsyncScheduler* aScheduler, - nsTArray>&& aApis, + CompositorVsyncScheduler* aScheduler, RefPtr&& aApi, AsyncImagePipelineManager* aImageMgr, CompositorAnimationStorage* aAnimStorage, const TextureFactoryIdentifier& aTextureFactoryIdentifier) { MOZ_ASSERT(!IsRootWebRenderBridgeParent()); MOZ_ASSERT(aScheduler); - MOZ_ASSERT(!aApis.IsEmpty()); + MOZ_ASSERT(aApi); MOZ_ASSERT(aImageMgr); MOZ_ASSERT(aAnimStorage); @@ -2069,7 +2039,7 @@ wr::Epoch WebRenderBridgeParent::UpdateWebRender( // Update id name space to identify obsoleted keys. // Since usage of invalid keys could cause crash in webrender. - mIdNamespace = aApis[0]->GetNamespace(); + mIdNamespace = aApi->GetNamespace(); // XXX Remove it when webrender supports sharing/moving Keys between different // webrender instances. // XXX It requests client to update/reallocate webrender related resources, @@ -2087,9 +2057,7 @@ wr::Epoch WebRenderBridgeParent::UpdateWebRender( ClearResources(); mCompositorBridge = cBridge; mCompositorScheduler = aScheduler; - for (auto& api : aApis) { - mApis[api->GetRenderRoot()] = api; - } + mApi = aApi; mAsyncImageManager = aImageMgr; mAnimStorage = aAnimStorage; @@ -2123,7 +2091,7 @@ void WebRenderBridgeParent::InvalidateRenderedFrame() { if (renderRoot == wr::RenderRoot::Default) { wr::TransactionBuilder fastTxn(/* aUseSceneBuilderThread */ false); fastTxn.InvalidateRenderedFrame(); - Api(renderRoot)->SendTransaction(fastTxn); + mApi->SendTransaction(fastTxn); } } } @@ -2139,14 +2107,14 @@ void WebRenderBridgeParent::ScheduleForcedGenerateFrame() { mozilla::ipc::IPCResult WebRenderBridgeParent::RecvCapture() { if (!mDestroyed) { - mApis[wr::RenderRoot::Default]->Capture(); + mApi->Capture(); } return IPC_OK(); } mozilla::ipc::IPCResult WebRenderBridgeParent::RecvToggleCaptureSequence() { if (!mDestroyed) { - mApis[wr::RenderRoot::Default]->ToggleCaptureSequence(); + mApi->ToggleCaptureSequence(); } return IPC_OK(); } @@ -2154,7 +2122,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvToggleCaptureSequence() { mozilla::ipc::IPCResult WebRenderBridgeParent::RecvSetTransactionLogging( const bool& aValue) { if (!mDestroyed) { - mApis[wr::RenderRoot::Default]->SetTransactionLogging(aValue); + mApi->SetTransactionLogging(aValue); } return IPC_OK(); } @@ -2342,8 +2310,8 @@ void WebRenderBridgeParent::CompositeToTarget(VsyncId aId, return; } - if (mSkippedComposite || wr::RenderThread::Get()->TooManyPendingFrames( - mApis[wr::RenderRoot::Default]->GetId())) { + if (mSkippedComposite || + wr::RenderThread::Get()->TooManyPendingFrames(mApi->GetId())) { // Render thread is busy, try next time. mSkippedComposite = true; mSkippedCompositeId = aId; @@ -2394,8 +2362,7 @@ void WebRenderBridgeParent::MaybeGenerateFrame(VsyncId aId, wr::TransactionBuilder fastTxn(false /* useSceneBuilderThread */); // Handle transaction that is related to DisplayList. wr::TransactionBuilder sceneBuilderTxn; - wr::AutoTransactionSender senders(mApis[wr::RenderRoot::Default], - &sceneBuilderTxn); + wr::AutoTransactionSender sender(mApi, &sceneBuilderTxn); // Adding and updating wr::ImageKeys of ImageHosts that uses ImageBridge are // done without using transaction of scene builder thread. With it, updating @@ -2433,20 +2400,16 @@ void WebRenderBridgeParent::MaybeGenerateFrame(VsyncId aId, SetAPZSampleTime(); - wr::RenderThread::Get()->IncPendingFrameCount( - mApis[wr::RenderRoot::Default]->GetId(), aId, start); + wr::RenderThread::Get()->IncPendingFrameCount(mApi->GetId(), aId, start); #if defined(ENABLE_FRAME_LATENCY_LOG) auto startTime = TimeStamp::Now(); - mApis[wr::RenderRoot::Default]->SetFrameStartTime(startTime); + mApi->SetFrameStartTime(startTime); #endif MOZ_ASSERT(generateFrame); fastTxn.GenerateFrame(); - - wr::RenderRootArray generateFrameTxns; - generateFrameTxns[wr::RenderRoot::Default] = &fastTxn; - wr::WebRenderAPI::SendTransactions(mApis, generateFrameTxns); + mApi->SendTransaction(fastTxn); #if defined(MOZ_WIDGET_ANDROID) MaybeCaptureScreenPixels(); @@ -2479,12 +2442,6 @@ void WebRenderBridgeParent::HoldPendingTransactionId( aUseForTelemetry, std::move(aPayloads))); } -already_AddRefed -WebRenderBridgeParent::GetWebRenderAPIAtPoint(const ScreenPoint& aPoint) { - MutexAutoLock lock(mRenderRootRectMutex); - return do_AddRef(Api(wr::RenderRoot::Default)); -} - TransactionId WebRenderBridgeParent::LastPendingTransactionId() { TransactionId id{0}; if (!mPendingTransactionIds.empty()) { @@ -2675,7 +2632,7 @@ void WebRenderBridgeParent::Pause() { return; } - mApis[wr::RenderRoot::Default]->Pause(); + mApi->Pause(); mPaused = true; } @@ -2686,7 +2643,7 @@ bool WebRenderBridgeParent::Resume() { return false; } - if (!mApis[wr::RenderRoot::Default]->Resume()) { + if (!mApi->Resume()) { return false; } @@ -2698,7 +2655,7 @@ bool WebRenderBridgeParent::Resume() { } void WebRenderBridgeParent::ClearResources() { - if (!mApis[wr::RenderRoot::Default]) { + if (!mApi) { return; } @@ -2724,26 +2681,20 @@ void WebRenderBridgeParent::ClearResources() { mAsyncImageManager->RemovePipeline(mPipelineId, wrEpoch); - for (auto& api : mApis) { - if (!api) { - continue; - } - wr::TransactionBuilder txn; - txn.SetLowPriority(true); - txn.ClearDisplayList(wrEpoch, mPipelineId); + wr::TransactionBuilder txn; + txn.SetLowPriority(true); + txn.ClearDisplayList(wrEpoch, mPipelineId); - auto renderRoot = api->GetRenderRoot(); - for (const auto& entry : mAsyncCompositables) { - wr::PipelineId pipelineId = wr::AsPipelineId(entry.first); - RefPtr host = entry.second; - host->ClearWrBridge(pipelineId, this); - mAsyncImageManager->RemoveAsyncImagePipeline(pipelineId, txn); - txn.RemovePipeline(pipelineId); - } - mAsyncCompositables.clear(); - txn.RemovePipeline(mPipelineId); - api->SendTransaction(txn); + for (const auto& entry : mAsyncCompositables) { + wr::PipelineId pipelineId = wr::AsPipelineId(entry.first); + RefPtr host = entry.second; + host->ClearWrBridge(pipelineId, this); + mAsyncImageManager->RemoveAsyncImagePipeline(pipelineId, txn); + txn.RemovePipeline(pipelineId); } + mAsyncCompositables.clear(); + txn.RemovePipeline(mPipelineId); + mApi->SendTransaction(txn); for (const auto& id : mActiveAnimations) { mAnimStorage->ClearById(id.first); @@ -2759,9 +2710,7 @@ void WebRenderBridgeParent::ClearResources() { mAnimStorage = nullptr; mCompositorScheduler = nullptr; mAsyncImageManager = nullptr; - for (auto& api : mApis) { - api = nullptr; - } + mApi = nullptr; mCompositorBridge = nullptr; } @@ -2823,15 +2772,13 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvReleaseCompositable( } TextureFactoryIdentifier WebRenderBridgeParent::GetTextureFactoryIdentifier() { - MOZ_ASSERT(!!mApis[wr::RenderRoot::Default]); + MOZ_ASSERT(mApi); return TextureFactoryIdentifier( - LayersBackend::LAYERS_WR, XRE_GetProcessType(), - mApis[wr::RenderRoot::Default]->GetMaxTextureSize(), false, - mApis[wr::RenderRoot::Default]->GetUseANGLE(), - mApis[wr::RenderRoot::Default]->GetUseDComp(), + LayersBackend::LAYERS_WR, XRE_GetProcessType(), mApi->GetMaxTextureSize(), + false, mApi->GetUseANGLE(), mApi->GetUseDComp(), mAsyncImageManager->UseCompositorWnd(), false, false, false, - mApis[wr::RenderRoot::Default]->GetSyncHandle()); + mApi->GetSyncHandle()); } wr::Epoch WebRenderBridgeParent::GetNextWrEpoch() { diff --git a/gfx/layers/wr/WebRenderBridgeParent.h b/gfx/layers/wr/WebRenderBridgeParent.h index 199f8eac583a..f174818dfade 100644 --- a/gfx/layers/wr/WebRenderBridgeParent.h +++ b/gfx/layers/wr/WebRenderBridgeParent.h @@ -100,7 +100,7 @@ class WebRenderBridgeParent final const wr::PipelineId& aPipelineId, widget::CompositorWidget* aWidget, CompositorVsyncScheduler* aScheduler, - nsTArray>&& aApis, + RefPtr&& aApi, RefPtr&& aImageMgr, RefPtr&& aAnimStorage, TimeDuration aVsyncRate); @@ -109,27 +109,8 @@ class WebRenderBridgeParent final const wr::PipelineId& aPipelineId); wr::PipelineId PipelineId() { return mPipelineId; } - - bool CloneWebRenderAPIs(nsTArray>& aOutAPIs) { - for (auto& api : mApis) { - if (api) { - RefPtr clone = api->Clone(); - if (!clone) { - return false; - } - aOutAPIs.AppendElement(clone); - } - } - return true; - } - already_AddRefed GetWebRenderAPIAtPoint( - const ScreenPoint& aPoint); - already_AddRefed GetWebRenderAPI( - wr::RenderRoot aRenderRoot) { - if (aRenderRoot > wr::kHighestRenderRoot) { - return nullptr; - } - return do_AddRef(mApis[aRenderRoot]); + already_AddRefed GetWebRenderAPI() { + return do_AddRef(mApi); } AsyncImagePipelineManager* AsyncImageManager() { return mAsyncImageManager; } CompositorVsyncScheduler* CompositorScheduler() { @@ -304,8 +285,7 @@ class WebRenderBridgeParent final RefPtr aInfo); wr::Epoch UpdateWebRender( - CompositorVsyncScheduler* aScheduler, - nsTArray>&& aApis, + CompositorVsyncScheduler* aScheduler, RefPtr&& aApi, AsyncImagePipelineManager* aImageMgr, CompositorAnimationStorage* aAnimStorage, const TextureFactoryIdentifier& aTextureFactoryIdentifier); @@ -381,15 +361,6 @@ class WebRenderBridgeParent final explicit WebRenderBridgeParent(const wr::PipelineId& aPipelineId); virtual ~WebRenderBridgeParent(); - wr::WebRenderAPI* Api(wr::RenderRoot aRenderRoot) { - if (IsRootWebRenderBridgeParent()) { - return mApis[aRenderRoot]; - } else { - MOZ_ASSERT(aRenderRoot == wr::RenderRoot::Default); - return mApis[*mRenderRoot]; - } - } - // Within WebRenderBridgeParent, we can use wr::RenderRoot::Default to // refer to DefaultApi(), which can be the content API if this // WebRenderBridgeParent is for a content WebRenderBridgeChild. However, @@ -573,14 +544,7 @@ class WebRenderBridgeParent final CompositorBridgeParentBase* MOZ_NON_OWNING_REF mCompositorBridge; wr::PipelineId mPipelineId; RefPtr mWidget; - // The RenderRootArray means there will always be a fixed number of apis, - // one for each RenderRoot, even if renderroot splitting isn't enabled. - // In this case, the unused apis will be nullptrs. Also, if this is not - // the root WebRenderBridgeParent, there should only be one api in this - // list. We avoid using a dynamically sized array for this because we - // need to be able to null these out in a thread-safe way from - // ClearResources, and there's no way to do that with an nsTArray. - wr::RenderRootArray> mApis; + RefPtr mApi; // This is a map from pipeline id to render root, that tracks the render // roots of all subpipelines (including nested subpipelines, e.g. in the // Fission case) attached to this WebRenderBridgeParent. This is only