Bug 1410334 - Create correct animation properties based on WrAnimationProperty info, r?kats
MozReview-Commit-ID: 6LNbwQd9IfX
--- a/gfx/layers/wr/AsyncImagePipelineManager.cpp
+++ b/gfx/layers/wr/AsyncImagePipelineManager.cpp
@@ -284,17 +284,17 @@ AsyncImagePipelineManager::ApplyAsyncIma
wr::LayoutSize contentSize { pipeline->mScBounds.Width(), pipeline->mScBounds.Height() };
wr::DisplayListBuilder builder(pipelineId, contentSize);
MOZ_ASSERT(!keys.IsEmpty());
MOZ_ASSERT(pipeline->mCurrentTexture.get());
float opacity = 1.0f;
builder.PushStackingContext(wr::ToLayoutRect(pipeline->mScBounds),
- 0,
+ nullptr,
&opacity,
pipeline->mScTransform.IsIdentity() ? nullptr : &pipeline->mScTransform,
wr::TransformStyle::Flat,
nullptr,
pipeline->mMixBlendMode,
nsTArray<wr::WrFilterOp>(),
true);
--- a/gfx/layers/wr/StackingContextHelper.cpp
+++ b/gfx/layers/wr/StackingContextHelper.cpp
@@ -18,17 +18,17 @@ StackingContextHelper::StackingContextHe
{
// mOrigin remains at 0,0
}
StackingContextHelper::StackingContextHelper(const StackingContextHelper& aParentSC,
wr::DisplayListBuilder& aBuilder,
const nsTArray<wr::WrFilterOp>& aFilters,
const gfx::Matrix4x4* aBoundTransform,
- uint64_t aAnimationsId,
+ const wr::WrAnimationProperty* aAnimation,
float* aOpacityPtr,
gfx::Matrix4x4* aTransformPtr,
gfx::Matrix4x4* aPerspectivePtr,
const gfx::CompositionOp& aMixBlendMode,
bool aBackfaceVisible,
bool aIsPreserve3D)
: mBuilder(&aBuilder)
, mScale(1.0f, 1.0f)
@@ -39,17 +39,17 @@ StackingContextHelper::StackingContextHe
// Compute scale for fallback rendering.
gfx::Matrix transform2d;
if (aBoundTransform && aBoundTransform->CanDraw2D(&transform2d)) {
mScale = transform2d.ScaleFactors(true) * aParentSC.mScale;
}
mBuilder->PushStackingContext(wr::LayoutRect(),
- aAnimationsId,
+ aAnimation,
aOpacityPtr,
aTransformPtr,
aIsPreserve3D ? wr::TransformStyle::Preserve3D : wr::TransformStyle::Flat,
aPerspectivePtr,
wr::ToMixBlendMode(aMixBlendMode),
aFilters,
aBackfaceVisible);
}
--- a/gfx/layers/wr/StackingContextHelper.h
+++ b/gfx/layers/wr/StackingContextHelper.h
@@ -26,17 +26,17 @@ namespace layers {
*/
class MOZ_RAII StackingContextHelper
{
public:
StackingContextHelper(const StackingContextHelper& aParentSC,
wr::DisplayListBuilder& aBuilder,
const nsTArray<wr::WrFilterOp>& aFilters = nsTArray<wr::WrFilterOp>(),
const gfx::Matrix4x4* aBoundTransform = nullptr,
- uint64_t aAnimationsId = 0,
+ const wr::WrAnimationProperty* aAnimation = nullptr,
float* aOpacityPtr = nullptr,
gfx::Matrix4x4* aTransformPtr = nullptr,
gfx::Matrix4x4* aPerspectivePtr = nullptr,
const gfx::CompositionOp& aMixBlendMode = gfx::CompositionOp::OP_OVER,
bool aBackfaceVisible = true,
bool aIsPreserve3D = false);
// This version of the constructor should only be used at the root level
// of the tree, so that we have a StackingContextHelper to pass down into
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -681,17 +681,17 @@ DisplayListBuilder::Finalize(wr::LayoutS
wr_api_finalize_builder(mWrState,
&aOutContentSize,
&aOutDisplayList.dl_desc,
&aOutDisplayList.dl.inner);
}
void
DisplayListBuilder::PushStackingContext(const wr::LayoutRect& aBounds,
- const uint64_t& aAnimationId,
+ const WrAnimationProperty* aAnimation,
const float* aOpacity,
const gfx::Matrix4x4* aTransform,
wr::TransformStyle aTransformStyle,
const gfx::Matrix4x4* aPerspective,
const wr::MixBlendMode& aMixBlendMode,
const nsTArray<wr::WrFilterOp>& aFilters,
bool aIsBackfaceVisible)
{
@@ -702,17 +702,17 @@ DisplayListBuilder::PushStackingContext(
const wr::LayoutTransform* maybeTransform = aTransform ? &matrix : nullptr;
wr::LayoutTransform perspective;
if (aPerspective) {
perspective = ToLayoutTransform(*aPerspective);
}
const wr::LayoutTransform* maybePerspective = aPerspective ? &perspective : nullptr;
WRDL_LOG("PushStackingContext b=%s t=%s\n", mWrState, Stringify(aBounds).c_str(),
aTransform ? Stringify(*aTransform).c_str() : "none");
- wr_dp_push_stacking_context(mWrState, aBounds, aAnimationId, aOpacity,
+ wr_dp_push_stacking_context(mWrState, aBounds, aAnimation, aOpacity,
maybeTransform, aTransformStyle, maybePerspective,
aMixBlendMode, aFilters.Elements(), aFilters.Length(), aIsBackfaceVisible);
}
void
DisplayListBuilder::PopStackingContext()
{
WRDL_LOG("PopStackingContext\n", mWrState);
--- a/gfx/webrender_bindings/WebRenderAPI.h
+++ b/gfx/webrender_bindings/WebRenderAPI.h
@@ -223,17 +223,17 @@ public:
void Save();
void Restore();
void ClearSave();
void Finalize(wr::LayoutSize& aOutContentSize,
wr::BuiltDisplayList& aOutDisplayList);
void PushStackingContext(const wr::LayoutRect& aBounds, // TODO: We should work with strongly typed rects
- const uint64_t& aAnimationId,
+ const wr::WrAnimationProperty* aAnimation,
const float* aOpacity,
const gfx::Matrix4x4* aTransform,
wr::TransformStyle aTransformStyle,
const gfx::Matrix4x4* aPerspective,
const wr::MixBlendMode& aMixBlendMode,
const nsTArray<wr::WrFilterOp>& aFilters,
bool aIsBackfaceVisible);
void PopStackingContext();
--- a/gfx/webrender_bindings/src/bindings.rs
+++ b/gfx/webrender_bindings/src/bindings.rs
@@ -1257,36 +1257,38 @@ pub extern "C" fn wr_dp_push_stacking_co
WrFilterOpType::HueRotate => FilterOp::HueRotate(c_filter.argument),
WrFilterOpType::Invert => FilterOp::Invert(c_filter.argument),
WrFilterOpType::Opacity => FilterOp::Opacity(PropertyBinding::Value(c_filter.argument)),
WrFilterOpType::Saturate => FilterOp::Saturate(c_filter.argument),
WrFilterOpType::Sepia => FilterOp::Sepia(c_filter.argument),
}
}).collect();
- let opacity = unsafe { opacity.as_ref() };
- if let Some(opacity) = opacity {
+ let opacity_ref = unsafe { opacity.as_ref() };
+ if let Some(opacity) = opacity_ref {
if *opacity < 1.0 {
filters.push(FilterOp::Opacity(PropertyBinding::Value(*opacity)));
}
- } else {
- if animation_id > 0 {
- filters.push(FilterOp::Opacity(PropertyBinding::Binding(PropertyBindingKey::new(animation_id))));
- }
}
- let transform = unsafe { transform.as_ref() };
- let transform_binding = match animation_id {
- 0 => match transform {
- Some(transform) => Some(PropertyBinding::Value(transform.clone())),
- None => None,
- },
- _ => Some(PropertyBinding::Binding(PropertyBindingKey::new(animation_id))),
+ let transform_ref = unsafe { transform.as_ref() };
+ let mut transform_binding = match transform_ref {
+ Some(transform) => Some(PropertyBinding::Value(transform.clone())),
+ None => None,
};
+ let anim = unsafe { animation.as_ref() };
+ if let Some(anim) = anim {
+ debug_assert!(anim.id > 0);
+ match anim.effect_type {
+ WrAnimationType::Opacity => filters.push(FilterOp::Opacity(PropertyBinding::Binding(PropertyBindingKey::new(anim.id)))),
+ WrAnimationType::Transform => transform_binding = Some(PropertyBinding::Binding(PropertyBindingKey::new(anim.id))),
+ }
+ }
+
let perspective_ref = unsafe { perspective.as_ref() };
let perspective = match perspective_ref {
Some(perspective) => Some(perspective.clone()),
None => None,
};
let mut prim_info = LayoutPrimitiveInfo::new(bounds);
prim_info.is_backface_visible = is_backface_visible;
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6510,33 +6510,38 @@ nsDisplayOpacity::CreateWebRenderCommand
AddAnimationsForProperty(Frame(), aDisplayListBuilder,
this, eCSSProperty_opacity,
animationInfo, false);
animationInfo.StartPendingAnimations(aManager->GetAnimationReadyTime());
// Note that animationsId can be 0 (uninitialized in AnimationInfo) if there
// are no active animations.
uint64_t animationsId = animationInfo.GetCompositorAnimationsId();
+ wr::WrAnimationProperty prop;
if (!animationInfo.GetAnimations().IsEmpty()) {
opacityForSC = nullptr;
OptionalOpacity opacityForCompositor = mOpacity;
+ prop.id = animationsId;
+ prop.effect_type = wr::WrAnimationType::Opacity;
+
OpAddCompositorAnimations
anim(CompositorAnimations(animationInfo.GetAnimations(), animationsId),
void_t(), opacityForCompositor);
aManager->WrBridge()->AddWebRenderParentCommand(anim);
aManager->AddActiveCompositorAnimationId(animationsId);
} else if (animationsId) {
aManager->AddCompositorAnimationsIdForDiscard(animationsId);
animationsId = 0;
}
nsTArray<mozilla::wr::WrFilterOp> filters;
- StackingContextHelper sc(aSc, aBuilder, filters, nullptr, animationsId,
+ StackingContextHelper sc(aSc, aBuilder, filters, nullptr,
+ animationsId ? &prop : nullptr,
opacityForSC);
aManager->CommandBuilder().CreateWebRenderCommandsFromDisplayList(&mList,
aDisplayListBuilder,
sc,
aBuilder,
aResources);
return true;
@@ -6815,18 +6820,23 @@ nsDisplayOwnLayer::CreateWebRenderComman
// APZ is enabled and this is a scroll thumb, so we need to create and
// set an animation id. That way APZ can move this scrollthumb around as
// needed.
RefPtr<WebRenderAnimationData> animationData = aManager->CommandBuilder().CreateOrRecycleWebRenderUserData<WebRenderAnimationData>(this);
AnimationInfo& animationInfo = animationData->GetAnimationInfo();
animationInfo.EnsureAnimationsId();
mWrAnimationId = animationInfo.GetCompositorAnimationsId();
- StackingContextHelper sc(aSc, aBuilder, nsTArray<wr::WrFilterOp>(), nullptr,
- mWrAnimationId);
+
+ wr::WrAnimationProperty prop;
+ prop.id = mWrAnimationId;
+ prop.effect_type = wr::WrAnimationType::Transform;
+
+ StackingContextHelper sc(aSc, aBuilder, nsTArray<wr::WrFilterOp>(),
+ nullptr, &prop);
nsDisplayWrapList::CreateWebRenderCommands(aBuilder, aResources, sc,
aManager, aDisplayListBuilder);
return true;
}
bool
nsDisplayOwnLayer::UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
@@ -8324,23 +8334,26 @@ nsDisplayTransform::CreateWebRenderComma
AddAnimationsForProperty(Frame(), aDisplayListBuilder,
this, eCSSProperty_transform,
animationInfo, false);
animationInfo.StartPendingAnimations(aManager->GetAnimationReadyTime());
// Note that animationsId can be 0 (uninitialized in AnimationInfo) if there
// are no active animations.
uint64_t animationsId = animationInfo.GetCompositorAnimationsId();
-
+ wr::WrAnimationProperty prop;
if (!animationInfo.GetAnimations().IsEmpty()) {
// Update transfrom as nullptr in stacking context if there exists
// transform animation, the transform value will be resolved
// after animation sampling on the compositor
transformForSC = nullptr;
+ prop.id = animationsId;
+ prop.effect_type = wr::WrAnimationType::Transform;
+
// Pass default transform to compositor in case gecko fails to
// get animated value after animation sampling.
OptionalTransform transformForCompositor = newTransformMatrix;
OpAddCompositorAnimations
anim(CompositorAnimations(animationInfo.GetAnimations(), animationsId),
transformForCompositor, void_t());
aManager->WrBridge()->AddWebRenderParentCommand(anim);
@@ -8350,17 +8363,17 @@ nsDisplayTransform::CreateWebRenderComma
animationsId = 0;
}
nsTArray<mozilla::wr::WrFilterOp> filters;
StackingContextHelper sc(aSc,
aBuilder,
filters,
&newTransformMatrix,
- animationsId,
+ animationsId ? &prop : nullptr,
nullptr,
transformForSC,
nullptr,
gfx::CompositionOp::OP_OVER,
!BackfaceIsHidden(),
mFrame->Extend3DContext());
return mStoredList.CreateWebRenderCommands(aBuilder, aResources, sc,