Bug 1443792 - Move the SampleAPZAnimations function into APZSampler. r?botond
MozReview-Commit-ID: 2KIQ5A2J7m9
--- a/gfx/layers/apz/public/APZSampler.h
+++ b/gfx/layers/apz/public/APZSampler.h
@@ -20,16 +20,17 @@ class TransactionBuilder;
struct WrTransformProperty;
} // namespace wr
namespace layers {
class APZCTreeManager;
class FocusTarget;
class Layer;
+class LayerMetricsWrapper;
class WebRenderScrollData;
/**
* This interface is used to interact with the APZ code from the compositor
* thread. It internally redispatches the functions to the sampler thread
* in the case where the two threads are not the same.
*/
class APZSampler {
@@ -65,16 +66,19 @@ public:
void SetTestAsyncScrollOffset(uint64_t aLayersId,
const FrameMetrics::ViewID& aScrollId,
const CSSPoint& aOffset);
void SetTestAsyncZoom(uint64_t aLayersId,
const FrameMetrics::ViewID& aScrollId,
const LayerToParentLayerScale& aZoom);
+ bool SampleAnimations(const LayerMetricsWrapper& aLayer,
+ const TimeStamp& aSampleTime);
+
protected:
virtual ~APZSampler();
private:
RefPtr<APZCTreeManager> mApz;
};
} // namespace layers
--- a/gfx/layers/apz/src/APZSampler.cpp
+++ b/gfx/layers/apz/src/APZSampler.cpp
@@ -2,17 +2,20 @@
/* 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/APZSampler.h"
#include "APZCTreeManager.h"
+#include "AsyncPanZoomController.h"
#include "mozilla/layers/CompositorThread.h"
+#include "mozilla/layers/LayerMetricsWrapper.h"
+#include "TreeTraversal.h"
namespace mozilla {
namespace layers {
APZSampler::APZSampler(const RefPtr<APZCTreeManager>& aApz)
: mApz(aApz)
{
}
@@ -117,10 +120,34 @@ APZSampler::SetTestAsyncZoom(uint64_t aL
RefPtr<AsyncPanZoomController> apzc = mApz->GetTargetAPZC(aLayersId, aScrollId);
if (apzc) {
apzc->SetTestAsyncZoom(aZoom);
} else {
NS_WARNING("Unable to find APZC in SetTestAsyncZoom");
}
}
+bool
+APZSampler::SampleAnimations(const LayerMetricsWrapper& aLayer,
+ const TimeStamp& aSampleTime)
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+
+ // TODO: eventually we can drop the aLayer argument and just walk the APZ
+ // tree directly in mApz.
+
+ bool activeAnimations = false;
+
+ ForEachNodePostOrder<ForwardIterator>(aLayer,
+ [&activeAnimations, &aSampleTime](LayerMetricsWrapper aLayerMetrics)
+ {
+ if (AsyncPanZoomController* apzc = aLayerMetrics.GetApzc()) {
+ apzc->ReportCheckerboard(aSampleTime);
+ activeAnimations |= apzc->AdvanceAnimations(aSampleTime);
+ }
+ }
+ );
+
+ return activeAnimations;
+}
+
} // namespace layers
} // namespace mozilla
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -14,16 +14,17 @@
#include "gfxPrefs.h" // for gfxPrefs
#include "mozilla/StyleAnimationValue.h" // for StyleAnimationValue, etc
#include "mozilla/WidgetUtils.h" // for ComputeTransformForRotation
#include "mozilla/gfx/BaseRect.h" // for BaseRect
#include "mozilla/gfx/Point.h" // for RoundedToInt, PointTyped
#include "mozilla/gfx/Rect.h" // for RoundedToInt, RectTyped
#include "mozilla/gfx/ScaleFactor.h" // for ScaleFactor
#include "mozilla/layers/AnimationHelper.h"
+#include "mozilla/layers/APZSampler.h" // for APZSampler
#include "mozilla/layers/APZUtils.h" // for CompleteAsyncTransform
#include "mozilla/layers/Compositor.h" // for Compositor
#include "mozilla/layers/CompositorBridgeParent.h" // for CompositorBridgeParent, etc
#include "mozilla/layers/CompositorThread.h"
#include "mozilla/layers/LayerAnimationUtils.h" // for TimingFunctionToComputedTimingFunction
#include "mozilla/layers/LayerMetricsWrapper.h" // for LayerMetricsWrapper
#include "nsCoord.h" // for NSAppUnitsToFloatPixels, etc
#include "nsDebug.h" // for NS_ASSERTION, etc
@@ -63,24 +64,25 @@ IsSameDimension(dom::ScreenOrientationIn
}
static bool
ContentMightReflowOnOrientationChange(const IntRect& rect)
{
return rect.Width() != rect.Height();
}
- AsyncCompositionManager::AsyncCompositionManager(CompositorBridgeParent* aParent,
- HostLayerManager* aManager)
+AsyncCompositionManager::AsyncCompositionManager(CompositorBridgeParent* aParent,
+ HostLayerManager* aManager)
: mLayerManager(aManager)
, mIsFirstPaint(true)
, mLayersUpdated(false)
, mReadyForCompose(true)
, mCompositorBridge(aParent)
{
+ MOZ_ASSERT(mCompositorBridge);
}
AsyncCompositionManager::~AsyncCompositionManager()
{
}
void
AsyncCompositionManager::ResolveRefLayers(CompositorBridgeParent* aCompositor,
@@ -690,34 +692,16 @@ SampleAnimations(Layer* aLayer,
if (ancestorRefLayer && aLayer->AsRefLayer() == ancestorRefLayer) {
ancestorRefLayer = nullptr;
}
});
return animProcess;
}
-static bool
-SampleAPZAnimations(const LayerMetricsWrapper& aLayer, TimeStamp aSampleTime)
-{
- bool activeAnimations = false;
-
- ForEachNodePostOrder<ForwardIterator>(aLayer,
- [&activeAnimations, &aSampleTime](LayerMetricsWrapper aLayerMetrics)
- {
- if (AsyncPanZoomController* apzc = aLayerMetrics.GetApzc()) {
- apzc->ReportCheckerboard(aSampleTime);
- activeAnimations |= apzc->AdvanceAnimations(aSampleTime);
- }
- }
- );
-
- return activeAnimations;
-}
-
void
AsyncCompositionManager::RecordShadowTransforms(Layer* aLayer)
{
MOZ_ASSERT(gfxPrefs::CollectScrollTransforms());
MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
ForEachNodePostOrder<ForwardIterator>(
aLayer,
@@ -1434,17 +1418,20 @@ AsyncCompositionManager::TransformShadow
#if defined(MOZ_WIDGET_ANDROID)
MOZ_ASSERT(foundRoot);
if (foundRoot && mFixedLayerMargins != ScreenMargin()) {
MoveScrollbarForLayerMargin(root, mRootScrollableId, mFixedLayerMargins);
}
#endif
}
- bool apzAnimating = SampleAPZAnimations(LayerMetricsWrapper(root), nextFrame);
+ bool apzAnimating = false;
+ if (RefPtr<APZSampler> apz = mCompositorBridge->GetAPZSampler()) {
+ apzAnimating = apz->SampleAnimations(LayerMetricsWrapper(root), nextFrame);
+ }
mAnimationMetricsTracker.UpdateApzAnimationInProgress(apzAnimating, aVsyncRate);
wantNextFrame |= apzAnimating;
}
HostLayer* rootComposite = root->AsHostLayer();
gfx::Matrix4x4 trans = rootComposite->GetShadowBaseTransform();
trans *= gfx::Matrix4x4::From2D(mWorldTransform);
--- a/gfx/layers/composite/AsyncCompositionManager.h
+++ b/gfx/layers/composite/AsyncCompositionManager.h
@@ -251,17 +251,17 @@ private:
bool mReadyForCompose;
gfx::Matrix mWorldTransform;
LayerTransformRecorder mLayerTransformRecorder;
TimeStamp mPreviousFrameTimeStamp;
AnimationMetricsTracker mAnimationMetricsTracker;
- CompositorBridgeParent* mCompositorBridge;
+ MOZ_NON_OWNING_REF CompositorBridgeParent* mCompositorBridge;
#ifdef MOZ_WIDGET_ANDROID
public:
void SetFixedLayerMargins(ScreenIntCoord aTop, ScreenIntCoord aBottom);
private:
// The following two fields are only needed on Fennec with C++ APZ, because
// then we need to reposition the gecko scrollbar to deal with the
// dynamic toolbar shifting content around.