Bug 1454430 - Ensure the ClearTree task runs before we shut down webrender. r?nical
MozReview-Commit-ID: BCc0zuZvktj
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -445,16 +445,28 @@ CompositorBridgeParent::StopAndClearReso
{
if (mForceCompositionTask) {
mForceCompositionTask->Cancel();
mForceCompositionTask = nullptr;
}
mPaused = true;
+ // We need to clear the APZ tree before we destroy the WebRender API below,
+ // because in the case of async scene building that will shut down the updater
+ // thread and we need to run the task before that happens.
+ MOZ_ASSERT((mApzSampler != nullptr) == (mApzcTreeManager != nullptr));
+ MOZ_ASSERT((mApzUpdater != nullptr) == (mApzcTreeManager != nullptr));
+ if (mApzUpdater) {
+ mApzSampler = nullptr;
+ mApzUpdater->ClearTree(mRootLayerTreeID);
+ mApzUpdater = nullptr;
+ mApzcTreeManager = nullptr;
+ }
+
// Ensure that the layer manager is destroyed before CompositorBridgeChild.
if (mLayerManager) {
MonitorAutoLock lock(*sIndirectLayerTreesLock);
ForEachIndirectLayerTree([this] (LayerTreeState* lts, LayersId) -> void {
mLayerManager->ClearCachedResources(lts->mRoot);
lts->mLayerManager = nullptr;
lts->mParent = nullptr;
});
@@ -634,25 +646,16 @@ CompositorBridgeParent::ActorDestroy(Act
mCanSend = false;
StopAndClearResources();
RemoveCompositor(mCompositorBridgeID);
mCompositionManager = nullptr;
- MOZ_ASSERT((mApzSampler != nullptr) == (mApzcTreeManager != nullptr));
- MOZ_ASSERT((mApzUpdater != nullptr) == (mApzcTreeManager != nullptr));
- if (mApzUpdater) {
- mApzSampler = nullptr;
- mApzUpdater->ClearTree(mRootLayerTreeID);
- mApzUpdater = nullptr;
- mApzcTreeManager = nullptr;
- }
-
{ // scope lock
MonitorAutoLock lock(*sIndirectLayerTreesLock);
sIndirectLayerTrees.erase(mRootLayerTreeID);
}
// There are chances that the ref count reaches zero on the main thread shortly
// after this function returns while some ipdl code still needs to run on
// this thread.