Bug 1312059 - Extract a CompositorController interface for the APZ code to request composites and do other compositor-related things. r?botond
MozReview-Commit-ID: 8TLUOjRYafF
new file mode 100644
--- /dev/null
+++ b/gfx/layers/apz/public/CompositorController.h
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=4 ts=8 et 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/. */
+
+#ifndef mozilla_layers_CompositorController_h
+#define mozilla_layers_CompositorController_h
+
+#include "mozilla/RefCountType.h"
+
+namespace mozilla {
+namespace layers {
+
+class CompositorController
+{
+public:
+ NS_IMETHOD_(MozExternalRefCountType) AddRef() = 0;
+ NS_IMETHOD_(MozExternalRefCountType) Release() = 0;
+
+ virtual void ScheduleComposite() = 0;
+ virtual void ScheduleHideAllPluginWindows() = 0;
+ virtual void ScheduleShowAllPluginWindows() = 0;
+
+protected:
+ virtual ~CompositorController() {}
+};
+
+} // namespace layers
+} // namespace mozilla
+
+#endif // mozilla_layers_CompositorController_h
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -542,16 +542,17 @@ APZCTreeManager::PrepareNodeForLayer(con
// The APZC we get off the layer may have been destroyed previously if the
// layer was inactive or omitted from the layer tree for whatever reason
// from a layers update. If it later comes back it will have a reference to
// a destroyed APZC and so we need to throw that out and make a new one.
bool newApzc = (apzc == nullptr || apzc->IsDestroyed());
if (newApzc) {
apzc = NewAPZCInstance(aLayersId, state->mController);
+ apzc->SetCompositorController(aState.mCompositor);
apzc->SetCompositorBridgeParent(aState.mCompositor);
if (state->mCrossProcessParent != nullptr) {
apzc->ShareFrameMetricsAcrossProcesses();
}
MOZ_ASSERT(node == nullptr);
node = new HitTestingTreeNode(apzc, true, aLayersId);
} else {
// If we are re-using a node for this layer clear the tree pointers
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -49,16 +49,17 @@
#include "mozilla/gfx/Rect.h" // for RoundedIn
#include "mozilla/gfx/ScaleFactor.h" // for ScaleFactor
#include "mozilla/layers/APZCTreeManager.h" // for ScrollableLayerGuid
#include "mozilla/layers/APZThreadUtils.h" // for AssertOnControllerThread, etc
#include "mozilla/layers/AsyncCompositionManager.h" // for ViewTransform
#include "mozilla/layers/AxisPhysicsModel.h" // for AxisPhysicsModel
#include "mozilla/layers/AxisPhysicsMSDModel.h" // for AxisPhysicsMSDModel
#include "mozilla/layers/CompositorBridgeParent.h" // for CompositorBridgeParent
+#include "mozilla/layers/CompositorController.h" // for CompositorController
#include "mozilla/layers/LayerTransactionParent.h" // for LayerTransactionParent
#include "mozilla/layers/ScrollInputMethods.h" // for ScrollInputMethod
#include "mozilla/mozalloc.h" // for operator new, etc
#include "mozilla/Unused.h" // for unused
#include "mozilla/FloatingPoint.h" // for FuzzyEquals*
#include "nsAlgorithm.h" // for clamped
#include "nsCOMPtr.h" // for already_AddRefed
#include "nsDebug.h" // for NS_WARNING
@@ -2649,16 +2650,21 @@ void AsyncPanZoomController::CancelAnima
}
void AsyncPanZoomController::ClearOverscroll() {
ReentrantMonitorAutoEnter lock(mMonitor);
mX.ClearOverscroll();
mY.ClearOverscroll();
}
+void AsyncPanZoomController::SetCompositorController(CompositorController* aCompositorController)
+{
+ mCompositorController = aCompositorController;
+}
+
void AsyncPanZoomController::SetCompositorBridgeParent(CompositorBridgeParent* aCompositorBridgeParent) {
mCompositorBridgeParent = aCompositorBridgeParent;
}
void AsyncPanZoomController::ShareFrameMetricsAcrossProcesses() {
mSharingFrameMetricsAcrossProcesses = true;
}
@@ -2821,18 +2827,18 @@ const ScreenMargin AsyncPanZoomControlle
cssMargins.top = -displayPort.y;
cssMargins.right = displayPort.width - compositionSize.width - cssMargins.left;
cssMargins.bottom = displayPort.height - compositionSize.height - cssMargins.top;
return cssMargins * aFrameMetrics.DisplayportPixelsPerCSSPixel();
}
void AsyncPanZoomController::ScheduleComposite() {
- if (mCompositorBridgeParent) {
- mCompositorBridgeParent->ScheduleRenderOnCompositorThread();
+ if (mCompositorController) {
+ mCompositorController->ScheduleComposite();
}
}
void AsyncPanZoomController::ScheduleCompositeAndMaybeRepaint() {
ScheduleComposite();
RequestContentRepaint();
}
@@ -3768,26 +3774,26 @@ void AsyncPanZoomController::DispatchSta
if (RefPtr<GeckoContentController> controller = GetGeckoContentController()) {
if (!IsTransformingState(aOldState) && IsTransformingState(aNewState)) {
controller->NotifyAPZStateChange(
GetGuid(), APZStateChange::eTransformBegin);
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
// Let the compositor know about scroll state changes so it can manage
// windowed plugins.
- if (gfxPrefs::HidePluginsForScroll() && mCompositorBridgeParent) {
- mCompositorBridgeParent->ScheduleHideAllPluginWindows();
+ if (gfxPrefs::HidePluginsForScroll() && mCompositorController) {
+ mCompositorController->ScheduleHideAllPluginWindows();
}
#endif
} else if (IsTransformingState(aOldState) && !IsTransformingState(aNewState)) {
controller->NotifyAPZStateChange(
GetGuid(), APZStateChange::eTransformEnd);
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
- if (gfxPrefs::HidePluginsForScroll() && mCompositorBridgeParent) {
- mCompositorBridgeParent->ScheduleShowAllPluginWindows();
+ if (gfxPrefs::HidePluginsForScroll() && mCompositorController) {
+ mCompositorController->ScheduleShowAllPluginWindows();
}
#endif
}
}
}
bool AsyncPanZoomController::IsTransformingState(PanZoomState aState) {
return !(aState == NOTHING || aState == TOUCHING);
--- a/gfx/layers/apz/src/AsyncPanZoomController.h
+++ b/gfx/layers/apz/src/AsyncPanZoomController.h
@@ -40,16 +40,17 @@ class SharedMemoryBasic;
} // namespace ipc
namespace layers {
class AsyncDragMetrics;
struct ScrollableLayerGuid;
class CompositorBridgeParent;
+class CompositorController;
class GestureEventListener;
class PCompositorBridgeParent;
struct AsyncTransform;
class AsyncPanZoomAnimation;
class AndroidFlingAnimation;
class GenericFlingAnimation;
class InputBlockState;
class TouchBlockState;
@@ -182,19 +183,21 @@ public:
* |aIsFirstPaint| is a flag passed from the shadow
* layers code indicating that the scroll metadata being sent with this call are
* the initial metadata and the initial paint of the frame has just happened.
*/
void NotifyLayersUpdated(const ScrollMetadata& aScrollMetadata, bool aIsFirstPaint,
bool aThisLayerTreeUpdated);
/**
- * The platform implementation must set the compositor parent so that we can
+ * The platform implementation must set the compositor controller so that we can
* request composites.
*/
+ void SetCompositorController(CompositorController* aCompositorController);
+
void SetCompositorBridgeParent(CompositorBridgeParent* aCompositorBridgeParent);
/**
* Inform this APZC that it will be sharing its FrameMetrics with a cross-process
* compositor so that the associated content process can access it. This is only
* relevant when progressive painting is enabled.
*/
void ShareFrameMetricsAcrossProcesses();
@@ -509,18 +512,17 @@ protected:
* Scales the viewport by an amount (note that it multiplies this scale in to
* the current scale, it doesn't set it to |aScale|). Also considers a focus
* point so that the page zooms inward/outward from that point.
*/
void ScaleWithFocus(float aScale,
const CSSPoint& aFocus);
/**
- * Schedules a composite on the compositor thread. Wrapper for
- * CompositorBridgeParent::ScheduleRenderOnCompositorThread().
+ * Schedules a composite on the compositor thread.
*/
void ScheduleComposite();
/**
* Schedules a composite, and if enough time has elapsed since the last
* paint, a paint.
*/
void ScheduleCompositeAndMaybeRepaint();
@@ -642,16 +644,17 @@ protected:
nsEventStatus GenerateSingleTap(GeckoContentController::TapType aType,
const ScreenIntPoint& aPoint,
mozilla::Modifiers aModifiers);
// Common processing at the end of a touch block.
void OnTouchEndOrCancel();
uint64_t mLayersId;
+ RefPtr<CompositorController> mCompositorController;
RefPtr<CompositorBridgeParent> mCompositorBridgeParent;
/* Access to the following two fields is protected by the mRefPtrMonitor,
since they are accessed on the UI thread but can be cleared on the
compositor thread. */
RefPtr<GeckoContentController> mGeckoContentController;
RefPtr<GestureEventListener> mGestureEventListener;
mutable Monitor mRefPtrMonitor;
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -1002,16 +1002,21 @@ CompositorBridgeParent::ActorDestroy(Act
// after this function returns while some ipdl code still needs to run on
// this thread.
// We must keep the compositor parent alive untill the code handling message
// reception is finished on this thread.
mSelfRef = this;
MessageLoop::current()->PostTask(NewRunnableMethod(this, &CompositorBridgeParent::DeferredDestroy));
}
+void
+CompositorBridgeParent::ScheduleComposite()
+{
+ ScheduleRenderOnCompositorThread();
+}
void
CompositorBridgeParent::ScheduleRenderOnCompositorThread()
{
MOZ_ASSERT(CompositorLoop());
CompositorLoop()->PostTask(NewRunnableMethod(this, &CompositorBridgeParent::ScheduleComposition));
}
--- a/gfx/layers/ipc/CompositorBridgeParent.h
+++ b/gfx/layers/ipc/CompositorBridgeParent.h
@@ -22,16 +22,17 @@
#include "mozilla/Maybe.h"
#include "mozilla/Monitor.h" // for Monitor
#include "mozilla/RefPtr.h" // for RefPtr
#include "mozilla/TimeStamp.h" // for TimeStamp
#include "mozilla/dom/ipc/IdType.h"
#include "mozilla/gfx/Point.h" // for IntSize
#include "mozilla/ipc/ProtocolUtils.h"
#include "mozilla/ipc/SharedMemory.h"
+#include "mozilla/layers/CompositorController.h"
#include "mozilla/layers/GeckoContentController.h"
#include "mozilla/layers/ISurfaceAllocator.h" // for ShmemAllocator
#include "mozilla/layers/LayersMessages.h" // for TargetConfig
#include "mozilla/layers/PCompositorBridgeParent.h"
#include "mozilla/layers/APZTestData.h"
#include "mozilla/widget/CompositorWidget.h"
#include "nsISupportsImpl.h"
#include "ThreadSafeRefcountingWithMainThreadDestruction.h"
@@ -240,24 +241,28 @@ public:
mozilla::ipc::Shmem* aShmem) override;
virtual void DeallocShmem(mozilla::ipc::Shmem& aShmem) override;
virtual bool RecvSyncWithCompositor() override { return true; }
};
class CompositorBridgeParent final : public CompositorBridgeParentBase
+ , public CompositorController
{
friend class CompositorVsyncScheduler;
friend class CompositorThreadHolder;
friend class InProcessCompositorSession;
friend class gfx::GPUProcessManager;
friend class gfx::GPUParent;
public:
+ NS_IMETHOD_(MozExternalRefCountType) AddRef() override { return CompositorBridgeParentBase::AddRef(); }
+ NS_IMETHOD_(MozExternalRefCountType) Release() override { return CompositorBridgeParentBase::Release(); }
+
explicit CompositorBridgeParent(CSSToLayoutDeviceScale aScale,
const TimeDuration& aVsyncRate,
bool aUseExternalSurfaceSize,
const gfx::IntSize& aSurfaceSize);
// Must only be called by CompositorBridgeChild. After invoking this, the
// IPC channel is active and RecvWillStop/ActorDestroy must be called to
// free the compositor.
@@ -370,16 +375,17 @@ public:
static void SetShadowProperties(Layer* aLayer);
void NotifyChildCreated(uint64_t aChild);
void AsyncRender();
// Can be called from any thread
+ void ScheduleComposite() override;
void ScheduleRenderOnCompositorThread();
void SchedulePauseOnCompositorThread();
void InvalidateOnCompositorThread();
/**
* Returns true if a surface was obtained and the resume succeeded; false
* otherwise.
*/
bool ScheduleResumeOnCompositorThread();
@@ -496,20 +502,23 @@ public:
* and visibility via ipc.
*/
bool UpdatePluginWindowState(uint64_t aId);
/**
* Plugin visibility helpers for the apz (main thread) and compositor
* thread.
*/
- void ScheduleShowAllPluginWindows();
- void ScheduleHideAllPluginWindows();
+ void ScheduleShowAllPluginWindows() override;
+ void ScheduleHideAllPluginWindows() override;
void ShowAllPluginWindows();
void HideAllPluginWindows();
+#else
+ void ScheduleShowAllPluginWindows() override {}
+ void ScheduleHideAllPluginWindows() override {}
#endif
/**
* Main thread response for a plugin visibility request made by the
* compositor thread.
*/
virtual bool RecvRemotePluginsReady() override;
--- a/gfx/layers/moz.build
+++ b/gfx/layers/moz.build
@@ -93,16 +93,17 @@ EXPORTS.gfxipc += [
'ipc/ShadowLayerUtils.h',
]
EXPORTS.mozilla.dom += [
'apz/util/CheckerboardReportService.h',
]
EXPORTS.mozilla.layers += [
+ 'apz/public/CompositorController.h',
'apz/public/GeckoContentController.h',
'apz/public/IAPZCTreeManager.h',
# exporting things from apz/src is temporary until we extract a
# proper interface for the code there
'apz/src/APZCTreeManager.h',
'apz/src/APZUtils.h',
'apz/src/AsyncDragMetrics.h',
'apz/src/AsyncPanZoomAnimation.h',