Bug 1447299 - Have the APZCTreeManagerParent store a reference to the APZSampler. r?botond
MozReview-Commit-ID: BNhkhFAmYP8
--- a/gfx/layers/apz/public/APZSampler.h
+++ b/gfx/layers/apz/public/APZSampler.h
@@ -38,16 +38,18 @@ class WebRenderScrollData;
* in the case where the two threads are not the same.
*/
class APZSampler {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(APZSampler)
public:
explicit APZSampler(const RefPtr<APZCTreeManager>& aApz);
+ bool HasTreeManager(const RefPtr<APZCTreeManager>& aApz);
+
void ClearTree();
void UpdateFocusState(LayersId aRootLayerTreeId,
LayersId aOriginatingLayersId,
const FocusTarget& aFocusTarget);
void UpdateHitTestingTree(LayersId aRootLayerTreeId,
Layer* aRoot,
bool aIsFirstPaint,
LayersId aOriginatingLayersId,
--- a/gfx/layers/apz/src/APZSampler.cpp
+++ b/gfx/layers/apz/src/APZSampler.cpp
@@ -23,16 +23,22 @@ APZSampler::APZSampler(const RefPtr<APZC
mApz->SetSampler(this);
}
APZSampler::~APZSampler()
{
mApz->SetSampler(nullptr);
}
+bool
+APZSampler::HasTreeManager(const RefPtr<APZCTreeManager>& aApz)
+{
+ return aApz.get() == mApz.get();
+}
+
void
APZSampler::ClearTree()
{
MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
mApz->ClearTree();
}
void
--- a/gfx/layers/ipc/APZCTreeManagerParent.cpp
+++ b/gfx/layers/ipc/APZCTreeManagerParent.cpp
@@ -2,37 +2,47 @@
/* 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/. */
#include "mozilla/layers/APZCTreeManagerParent.h"
#include "apz/src/APZCTreeManager.h"
+#include "mozilla/layers/APZSampler.h"
#include "mozilla/layers/APZThreadUtils.h"
namespace mozilla {
namespace layers {
-APZCTreeManagerParent::APZCTreeManagerParent(LayersId aLayersId, RefPtr<APZCTreeManager> aAPZCTreeManager)
+APZCTreeManagerParent::APZCTreeManagerParent(LayersId aLayersId,
+ RefPtr<APZCTreeManager> aAPZCTreeManager,
+ RefPtr<APZSampler> aAPZSampler)
: mLayersId(aLayersId)
- , mTreeManager(aAPZCTreeManager)
+ , mTreeManager(Move(aAPZCTreeManager))
+ , mSampler(Move(aAPZSampler))
{
- MOZ_ASSERT(aAPZCTreeManager != nullptr);
+ MOZ_ASSERT(mTreeManager != nullptr);
+ MOZ_ASSERT(mSampler != nullptr);
+ MOZ_ASSERT(mSampler->HasTreeManager(mTreeManager));
}
APZCTreeManagerParent::~APZCTreeManagerParent()
{
}
void
-APZCTreeManagerParent::ChildAdopted(RefPtr<APZCTreeManager> aAPZCTreeManager)
+APZCTreeManagerParent::ChildAdopted(RefPtr<APZCTreeManager> aAPZCTreeManager,
+ RefPtr<APZSampler> aAPZSampler)
{
MOZ_ASSERT(aAPZCTreeManager != nullptr);
- mTreeManager = aAPZCTreeManager;
+ MOZ_ASSERT(aAPZSampler != nullptr);
+ MOZ_ASSERT(aAPZSampler->HasTreeManager(aAPZCTreeManager));
+ mTreeManager = Move(aAPZCTreeManager);
+ mSampler = Move(aAPZSampler);
}
mozilla::ipc::IPCResult
APZCTreeManagerParent::RecvSetKeyboardMap(const KeyboardMap& aKeyboardMap)
{
APZThreadUtils::RunOnControllerThread(NewRunnableMethod<KeyboardMap>(
"layers::IAPZCTreeManager::SetKeyboardMap",
mTreeManager,
--- a/gfx/layers/ipc/APZCTreeManagerParent.h
+++ b/gfx/layers/ipc/APZCTreeManagerParent.h
@@ -8,32 +8,36 @@
#define mozilla_layers_APZCTreeManagerParent_h
#include "mozilla/layers/PAPZCTreeManagerParent.h"
namespace mozilla {
namespace layers {
class APZCTreeManager;
+class APZSampler;
class APZCTreeManagerParent
: public PAPZCTreeManagerParent
{
public:
- explicit APZCTreeManagerParent(LayersId aLayersId, RefPtr<APZCTreeManager> aAPZCTreeManager);
+ APZCTreeManagerParent(LayersId aLayersId,
+ RefPtr<APZCTreeManager> aAPZCTreeManager,
+ RefPtr<APZSampler> mAPZSampler);
virtual ~APZCTreeManagerParent();
LayersId GetLayersId() const { return mLayersId; }
/**
* Called when the layer tree that this protocol is connected to
* is adopted by another compositor, and we need to switch APZCTreeManagers.
*/
- void ChildAdopted(RefPtr<APZCTreeManager> aAPZCTreeManager);
+ void ChildAdopted(RefPtr<APZCTreeManager> aAPZCTreeManager,
+ RefPtr<APZSampler> aAPZSampler);
mozilla::ipc::IPCResult
RecvSetKeyboardMap(const KeyboardMap& aKeyboardMap) override;
mozilla::ipc::IPCResult
RecvZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
@@ -79,14 +83,15 @@ public:
RecvSetLongTapEnabled(const bool& aTapGestureEnabled) override;
void
ActorDestroy(ActorDestroyReason aWhy) override { }
private:
LayersId mLayersId;
RefPtr<APZCTreeManager> mTreeManager;
+ RefPtr<APZSampler> mSampler;
};
} // namespace layers
} // namespace mozilla
#endif // mozilla_layers_APZCTreeManagerParent_h
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -1091,26 +1091,27 @@ CompositorBridgeParent::ForceComposeToTa
PAPZCTreeManagerParent*
CompositorBridgeParent::AllocPAPZCTreeManagerParent(const LayersId& aLayersId)
{
// This should only ever get called in the GPU process.
MOZ_ASSERT(XRE_IsGPUProcess());
// We should only ever get this if APZ is enabled in this compositor.
MOZ_ASSERT(mOptions.UseAPZ());
- // The mApzcTreeManager should have been created via RecvInitialize()
+ // The mApzcTreeManager and mApzSampler should have been created via RecvInitialize()
MOZ_ASSERT(mApzcTreeManager);
+ MOZ_ASSERT(mApzSampler);
// The main process should pass in 0 because we assume mRootLayerTreeID
MOZ_ASSERT(!aLayersId.IsValid());
MonitorAutoLock lock(*sIndirectLayerTreesLock);
CompositorBridgeParent::LayerTreeState& state = sIndirectLayerTrees[mRootLayerTreeID];
MOZ_ASSERT(state.mParent.get() == this);
MOZ_ASSERT(!state.mApzcTreeManagerParent);
- state.mApzcTreeManagerParent = new APZCTreeManagerParent(mRootLayerTreeID, mApzcTreeManager);
+ state.mApzcTreeManagerParent = new APZCTreeManagerParent(mRootLayerTreeID, mApzcTreeManager, mApzSampler);
return state.mApzcTreeManagerParent;
}
bool
CompositorBridgeParent::DeallocPAPZCTreeManagerParent(PAPZCTreeManagerParent* aActor)
{
delete aActor;
@@ -1119,18 +1120,19 @@ CompositorBridgeParent::DeallocPAPZCTree
void
CompositorBridgeParent::AllocateAPZCTreeManagerParent(const MonitorAutoLock& aProofOfLayerTreeStateLock,
const LayersId& aLayersId,
LayerTreeState& aState)
{
MOZ_ASSERT(aState.mParent == this);
MOZ_ASSERT(mApzcTreeManager);
+ MOZ_ASSERT(mApzSampler);
MOZ_ASSERT(!aState.mApzcTreeManagerParent);
- aState.mApzcTreeManagerParent = new APZCTreeManagerParent(aLayersId, mApzcTreeManager);
+ aState.mApzcTreeManagerParent = new APZCTreeManagerParent(aLayersId, mApzcTreeManager, mApzSampler);
}
PAPZParent*
CompositorBridgeParent::AllocPAPZParent(const LayersId& aLayersId)
{
// The main process should pass in 0 because we assume mRootLayerTreeID
MOZ_ASSERT(!aLayersId.IsValid());
@@ -1722,17 +1724,17 @@ CompositorBridgeParent::RecvAdoptChild(c
// however it is possible for mApzSampler to be non-null here with
// oldApzSampler null, because the child may not have been previously
// composited.
MOZ_ASSERT(mApzSampler);
}
if (mApzSampler) {
if (parent) {
MOZ_ASSERT(mApzcTreeManager);
- parent->ChildAdopted(mApzcTreeManager);
+ parent->ChildAdopted(mApzcTreeManager, mApzSampler);
}
mApzSampler->NotifyLayerTreeAdopted(child, oldApzSampler);
}
return IPC_OK();
}
PWebRenderBridgeParent*
CompositorBridgeParent::AllocPWebRenderBridgeParent(const wr::PipelineId& aPipelineId,
--- a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp
@@ -14,16 +14,17 @@
#include "base/task.h" // for CancelableTask, etc
#include "base/thread.h" // for Thread
#ifdef XP_WIN
#include "mozilla/gfx/DeviceManagerDx.h" // for DeviceManagerDx
#endif
#include "mozilla/ipc/Transport.h" // for Transport
#include "mozilla/layers/AnimationHelper.h" // for CompositorAnimationStorage
#include "mozilla/layers/APZCTreeManagerParent.h" // for APZCTreeManagerParent
+#include "mozilla/layers/APZSampler.h" // for APZSampler
#include "mozilla/layers/AsyncCompositionManager.h"
#include "mozilla/layers/CompositorOptions.h"
#include "mozilla/layers/CompositorThread.h"
#include "mozilla/layers/LayerManagerComposite.h"
#include "mozilla/layers/LayerTreeOwnerTracker.h"
#include "mozilla/layers/PLayerTransactionParent.h"
#include "mozilla/layers/RemoteContentController.h"
#include "mozilla/layers/WebRenderBridgeParent.h"
@@ -128,18 +129,19 @@ CrossProcessCompositorBridgeParent::Allo
// If the widget has shutdown its compositor, we may not have had a chance yet
// to unmap our layers id, and we could get here without a parent compositor.
// In this case return an empty APZCTM.
if (!state.mParent) {
// Note: we immediately call ClearTree since otherwise the APZCTM will
// retain a reference to itself, through the checkerboard observer.
RefPtr<APZCTreeManager> temp = new APZCTreeManager(LayersId{0});
- temp->ClearTree();
- return new APZCTreeManagerParent(aLayersId, temp);
+ RefPtr<APZSampler> tempSampler = new APZSampler(temp);
+ tempSampler->ClearTree();
+ return new APZCTreeManagerParent(aLayersId, temp, tempSampler);
}
state.mParent->AllocateAPZCTreeManagerParent(lock, aLayersId, state);
return state.mApzcTreeManagerParent;
}
bool
CrossProcessCompositorBridgeParent::DeallocPAPZCTreeManagerParent(PAPZCTreeManagerParent* aActor)
{