Bug 1375497 - Implement some more PLayerTransaction testing APIs in PWebRenderBridge. r?pchang
MozReview-Commit-ID: Em4VROmcUx0
--- a/gfx/layers/ipc/LayersMessages.ipdlh
+++ b/gfx/layers/ipc/LayersMessages.ipdlh
@@ -48,16 +48,17 @@ using mozilla::gfx::Glyph from "Layers.h
using mozilla::layers::BorderColors from "mozilla/layers/LayersTypes.h";
using mozilla::layers::BorderCorners from "mozilla/layers/LayersTypes.h";
using mozilla::layers::BorderWidths from "mozilla/layers/LayersTypes.h";
using mozilla::layers::LayerHandle from "mozilla/layers/LayersTypes.h";
using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h";
using mozilla::layers::ReadLockHandle from "mozilla/layers/LayersTypes.h";
using mozilla::layers::SimpleLayerAttributes from "mozilla/layers/LayerAttributes.h";
using mozilla::CrossProcessSemaphoreHandle from "mozilla/ipc/CrossProcessSemaphore.h";
+using struct mozilla::void_t from "ipc/IPCMessageUtils.h";
namespace mozilla {
namespace layers {
struct TargetConfig {
IntRect naturalBounds;
ScreenRotation rotation;
ScreenOrientationInternal orientation;
@@ -570,10 +571,15 @@ struct TransactionInfo
PluginWindowData[] plugins;
bool isFirstPaint;
bool scheduleComposite;
uint32_t paintSequenceNumber;
bool isRepeatTransaction;
TimeStamp transactionStart;
};
+union MaybeTransform {
+ Matrix4x4;
+ void_t;
+};
+
} // namespace
} // namespace
--- a/gfx/layers/ipc/PLayerTransaction.ipdl
+++ b/gfx/layers/ipc/PLayerTransaction.ipdl
@@ -30,21 +30,16 @@ using mozilla::layers::CompositableHandl
* layer subtrees to a "shadow" thread context (which grafts the
* subtree into its own tree), and atomically updating a published
* subtree. ("Atomic" in this sense is wrt painting.)
*/
namespace mozilla {
namespace layers {
-union MaybeTransform {
- Matrix4x4;
- void_t;
-};
-
/**
* The PLayerTransaction protocol manages the layer tree for a single "browser".
* The "browser" can be a top-level browser window, in which case the PLayer-
* TransactionChild exists in the UI process. The "browser" can also be a content
* tab, in which case the PLayerTransactionChild exists in the content process.
* In either case, the PLayerTransactionParent exists in the GPU process (if
* there is one) or the UI process otherwise.
*/
--- a/gfx/layers/ipc/PWebRenderBridge.ipdl
+++ b/gfx/layers/ipc/PWebRenderBridge.ipdl
@@ -70,16 +70,21 @@ parent:
async ClearCachedResources();
// Schedule a composite if one isn't already scheduled.
async ForceComposite();
// These correspond exactly to the equivalent APIs in PLayerTransaction -
// see those for documentation.
async SetConfirmedTargetAPZC(uint64_t aInputBlockId, ScrollableLayerGuid[] aTargets);
// More copied from PLayerTransaction, but these are only used for testing.
+ sync SetTestSampleTime(TimeStamp sampleTime);
+ sync LeaveTestMode();
+ sync GetAnimationOpacity(uint64_t aCompositorAnimationsId) returns (float opacity,
+ bool hasAnimationOpacity);
+ sync GetAnimationTransform(uint64_t aCompositorAnimationId) returns (MaybeTransform transform);
sync SetAsyncScrollOffset(ViewID scrollId, float x, float y);
sync SetAsyncZoom(ViewID scrollId, float zoom);
async FlushApzRepaints();
sync GetAPZTestData() returns (APZTestData data);
async Shutdown();
child:
async __delete__();
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -781,16 +781,74 @@ WebRenderBridgeParent::RecvSetConfirmedT
if (mDestroyed) {
return IPC_OK();
}
mCompositorBridge->SetConfirmedTargetAPZC(GetLayersId(), aBlockId, aTargets);
return IPC_OK();
}
mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvSetTestSampleTime(const TimeStamp& aTime)
+{
+ if (!mCompositorBridge->SetTestSampleTime(GetLayersId(), aTime)) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvLeaveTestMode()
+{
+ mCompositorBridge->LeaveTestMode(GetLayersId());
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvGetAnimationOpacity(const uint64_t& aCompositorAnimationsId,
+ float* aOpacity,
+ bool* aHasAnimationOpacity)
+{
+ if (mDestroyed) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+
+ MOZ_ASSERT(mAnimStorage);
+ AdvanceAnimations();
+
+ Maybe<float> opacity = mAnimStorage->GetAnimationOpacity(aCompositorAnimationsId);
+ if (opacity) {
+ *aOpacity = *opacity;
+ *aHasAnimationOpacity = true;
+ } else {
+ *aHasAnimationOpacity = false;
+ }
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvGetAnimationTransform(const uint64_t& aCompositorAnimationsId,
+ MaybeTransform* aTransform)
+{
+ if (mDestroyed) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+
+ MOZ_ASSERT(mAnimStorage);
+ AdvanceAnimations();
+
+ Maybe<Matrix4x4> transform = mAnimStorage->GetAnimationTransform(aCompositorAnimationsId);
+ if (transform) {
+ *aTransform = *transform;
+ } else {
+ *aTransform = mozilla::void_t();
+ }
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
WebRenderBridgeParent::RecvSetAsyncScrollOffset(const FrameMetrics::ViewID& aScrollId,
const float& aX,
const float& aY)
{
if (mDestroyed) {
return IPC_OK();
}
RefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(aScrollId);
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -120,16 +120,24 @@ public:
mozilla::ipc::IPCResult RecvRemoveExternalImageId(const ExternalImageId& aImageId) override;
mozilla::ipc::IPCResult RecvSetLayerObserverEpoch(const uint64_t& aLayerObserverEpoch) override;
mozilla::ipc::IPCResult RecvClearCachedResources() override;
mozilla::ipc::IPCResult RecvForceComposite() override;
mozilla::ipc::IPCResult RecvSetConfirmedTargetAPZC(const uint64_t& aBlockId,
nsTArray<ScrollableLayerGuid>&& aTargets) override;
+
+ mozilla::ipc::IPCResult RecvSetTestSampleTime(const TimeStamp& aTime) override;
+ mozilla::ipc::IPCResult RecvLeaveTestMode() override;
+ mozilla::ipc::IPCResult RecvGetAnimationOpacity(const uint64_t& aCompositorAnimationsId,
+ float* aOpacity,
+ bool* aHasAnimationOpacity) override;
+ mozilla::ipc::IPCResult RecvGetAnimationTransform(const uint64_t& aCompositorAnimationsId,
+ MaybeTransform* aTransform) override;
mozilla::ipc::IPCResult RecvSetAsyncScrollOffset(const FrameMetrics::ViewID& aScrollId,
const float& aX,
const float& aY) override;
mozilla::ipc::IPCResult RecvSetAsyncZoom(const FrameMetrics::ViewID& aScrollId,
const float& aZoom) override;
mozilla::ipc::IPCResult RecvFlushApzRepaints() override;
mozilla::ipc::IPCResult RecvGetAPZTestData(APZTestData* data) override;