Commit 724c6674 authored by Philip Rogers's avatar Philip Rogers Committed by Commit Bot

Remove the DoNotCompositeTrivial3D experiment

After collecting data on Android canary/dev, we are going to fold this
project into "reducing compositing under memory pressure" so we only
stop compositing trivial 3D transforms when under memory pressure. This
achieves the majority of the OOM benefits with minimal user impact. This
experiment resulted in interesting data about the effects of memory
savings on OOM crash rates. On canary/dev Android, the experiment showed
a decrease in GPU tile memory (-2.4% @ 50th, -4.4% @ 99th) resulted in a
decrease in peak GPU memory usage (-1.95% during scroll), a decrease in
memory pressure signals (-6% critical), and a decrease in crashes
(-8.25% visible renderer foreground OOM). These benefits came at a cost
of additional raster which could be seen in
Scheduling.Renderer.DrawIntervalWithMainThreadAnimations2 which
increased 4.66% at the 99th. More information can be found in:
https://docs.google.com/document/d/1yFSWUhHjneEnjx_vf9SBpYAQOoce8JMbtTvAiHhGD-o

Bug: 1012775
Change-Id: I9ce1c4f47860d9ab0dbd7cbae68662cf4d657885
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1981804
Auto-Submit: Philip Rogers <pdr@chromium.org>
Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Reviewed-by: default avatarXianzhu Wang <wangxianzhu@chromium.org>
Commit-Queue: Philip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#727972}
parent 82c1416b
...@@ -48,10 +48,6 @@ const base::Feature kFreezePurgeMemoryAllPagesFrozen{ ...@@ -48,10 +48,6 @@ const base::Feature kFreezePurgeMemoryAllPagesFrozen{
const base::Feature kFreezeUserAgent{"FreezeUserAgent", const base::Feature kFreezeUserAgent{"FreezeUserAgent",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, the compositing of trivial 3D transforms is disabled.
const base::Feature kDoNotCompositeTrivial3D{"DoNotCompositeTrivial3D",
base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, enter assumed-overlap mode in compositing overlap testing // When enabled, enter assumed-overlap mode in compositing overlap testing
// anytime a fixed or sticky position element is encountered. // anytime a fixed or sticky position element is encountered.
const base::Feature kAssumeOverlapAfterFixedOrStickyPosition{ const base::Feature kAssumeOverlapAfterFixedOrStickyPosition{
......
...@@ -28,7 +28,6 @@ BLINK_COMMON_EXPORT extern const base::Feature kFreezeUserAgent; ...@@ -28,7 +28,6 @@ BLINK_COMMON_EXPORT extern const base::Feature kFreezeUserAgent;
BLINK_COMMON_EXPORT extern const base::Feature kImplicitRootScroller; BLINK_COMMON_EXPORT extern const base::Feature kImplicitRootScroller;
BLINK_COMMON_EXPORT extern const base::Feature kCSSOMViewScrollCoordinates; BLINK_COMMON_EXPORT extern const base::Feature kCSSOMViewScrollCoordinates;
BLINK_COMMON_EXPORT extern const base::Feature kDisplayLocking; BLINK_COMMON_EXPORT extern const base::Feature kDisplayLocking;
BLINK_COMMON_EXPORT extern const base::Feature kDoNotCompositeTrivial3D;
BLINK_COMMON_EXPORT extern const base::Feature BLINK_COMMON_EXPORT extern const base::Feature
kAssumeOverlapAfterFixedOrStickyPosition; kAssumeOverlapAfterFixedOrStickyPosition;
BLINK_COMMON_EXPORT extern const base::Feature kFastBorderRadius; BLINK_COMMON_EXPORT extern const base::Feature kFastBorderRadius;
......
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" #include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h"
#include "base/feature_list.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/css/css_property_names.h"
#include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/dom/node.h"
...@@ -165,10 +163,8 @@ bool CompositingReasonFinder::RequiresCompositingFor3DTransform( ...@@ -165,10 +163,8 @@ bool CompositingReasonFinder::RequiresCompositingFor3DTransform(
return false; return false;
// Don't composite "trivial" 3D transforms such as translateZ(0). // Don't composite "trivial" 3D transforms such as translateZ(0).
if (Platform::Current()->IsLowEndDevice() || if (Platform::Current()->IsLowEndDevice())
base::FeatureList::IsEnabled(blink::features::kDoNotCompositeTrivial3D)) {
return layout_object.StyleRef().HasNonTrivial3DTransformOperation(); return layout_object.StyleRef().HasNonTrivial3DTransformOperation();
}
return layout_object.StyleRef().Has3DTransformOperation(); return layout_object.StyleRef().Has3DTransformOperation();
} }
......
...@@ -40,42 +40,7 @@ TEST_F(CompositingReasonFinderTest, CompositingReasonDependencies) { ...@@ -40,42 +40,7 @@ TEST_F(CompositingReasonFinderTest, CompositingReasonDependencies) {
CompositingReason::kComboAllStyleDeterminedReasons); CompositingReason::kComboAllStyleDeterminedReasons);
} }
class CompositingReasonFinderTestWithDoNotCompositeTrivial3D TEST_F(CompositingReasonFinderTest, PromoteTrivial3D) {
: public CompositingReasonFinderTest {
public:
CompositingReasonFinderTestWithDoNotCompositeTrivial3D() {
scoped_feature_list_.InitAndEnableFeature(
blink::features::kDoNotCompositeTrivial3D);
}
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(CompositingReasonFinderTestWithDoNotCompositeTrivial3D,
DontPromoteTrivial3D) {
SetBodyInnerHTML(R"HTML(
<div id='target'
style='width: 100px; height: 100px; transform: translateZ(0)'></div>
)HTML");
Element* target = GetDocument().getElementById("target");
PaintLayer* paint_layer =
ToLayoutBoxModelObject(target->GetLayoutObject())->Layer();
EXPECT_EQ(kNotComposited, paint_layer->GetCompositingState());
}
class CompositingReasonFinderTestWithCompositeTrivial3D
: public CompositingReasonFinderTest {
public:
CompositingReasonFinderTestWithCompositeTrivial3D() {
scoped_feature_list_.InitAndDisableFeature(
blink::features::kDoNotCompositeTrivial3D);
}
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(CompositingReasonFinderTestWithCompositeTrivial3D, PromoteTrivial3D) {
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
<div id='target' <div id='target'
style='width: 100px; height: 100px; transform: translateZ(0)'></div> style='width: 100px; height: 100px; transform: translateZ(0)'></div>
......
...@@ -4,13 +4,12 @@ ...@@ -4,13 +4,12 @@
#include "third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.h" #include "third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.h"
#include "base/test/scoped_feature_list.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer.h"
#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
#include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
namespace blink { namespace blink {
...@@ -128,19 +127,7 @@ TEST_F(CompositingRequirementsUpdaterTest, ...@@ -128,19 +127,7 @@ TEST_F(CompositingRequirementsUpdaterTest,
EXPECT_EQ(IntRect(0, 0, 100, 100), tracking->Invalidations()[0].rect); EXPECT_EQ(IntRect(0, 0, 100, 100), tracking->Invalidations()[0].rect);
} }
class CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D TEST_F(CompositingRequirementsUpdaterTest, NonTrivial3DTransforms) {
: public CompositingRequirementsUpdaterTest {
public:
CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D() {
scoped_feature_list_.InitAndEnableFeature(
blink::features::kDoNotCompositeTrivial3D);
}
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
NonTrivial3DTransforms) {
ScopedCSSIndependentTransformPropertiesForTest feature_scope(true); ScopedCSSIndependentTransformPropertiesForTest feature_scope(true);
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
...@@ -169,7 +156,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D, ...@@ -169,7 +156,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
ToLayoutBox(transform_3d)->Layer()->GetCompositingReasons()); ToLayoutBox(transform_3d)->Layer()->GetCompositingReasons());
const auto* transform_2d = GetLayoutObjectByElementId("2d-transform"); const auto* transform_2d = GetLayoutObjectByElementId("2d-transform");
EXPECT_FALSE(transform_2d->StyleRef().HasNonTrivial3DTransformOperation()); EXPECT_FALSE(transform_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(transform_2d)->Layer()->GetCompositingReasons()); EXPECT_TRUE(ToLayoutBox(transform_2d)->Layer()->GetCompositingReasons());
const auto* transform_3d_translate_z = const auto* transform_3d_translate_z =
GetLayoutObjectByElementId("3d-transform-translate-z"); GetLayoutObjectByElementId("3d-transform-translate-z");
...@@ -182,7 +169,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D, ...@@ -182,7 +169,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
GetLayoutObjectByElementId("2d-transform-translate-z"); GetLayoutObjectByElementId("2d-transform-translate-z");
EXPECT_FALSE( EXPECT_FALSE(
transform_2d_translate_z->StyleRef().HasNonTrivial3DTransformOperation()); transform_2d_translate_z->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE( EXPECT_TRUE(
ToLayoutBox(transform_2d_translate_z)->Layer()->GetCompositingReasons()); ToLayoutBox(transform_2d_translate_z)->Layer()->GetCompositingReasons());
const auto* transform_2d_translate_x = const auto* transform_2d_translate_x =
GetLayoutObjectByElementId("2d-transform-translate-x"); GetLayoutObjectByElementId("2d-transform-translate-x");
...@@ -197,7 +184,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D, ...@@ -197,7 +184,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
ToLayoutBox(xform_rot_x_3d)->Layer()->GetCompositingReasons()); ToLayoutBox(xform_rot_x_3d)->Layer()->GetCompositingReasons());
const auto* xform_rot_x_2d = GetLayoutObjectByElementId("2d-transform-rot-x"); const auto* xform_rot_x_2d = GetLayoutObjectByElementId("2d-transform-rot-x");
EXPECT_FALSE(xform_rot_x_2d->StyleRef().HasNonTrivial3DTransformOperation()); EXPECT_FALSE(xform_rot_x_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(xform_rot_x_2d)->Layer()->GetCompositingReasons()); EXPECT_TRUE(ToLayoutBox(xform_rot_x_2d)->Layer()->GetCompositingReasons());
const auto* xform_rot_z_2d = GetLayoutObjectByElementId("2d-transform-rot-z"); const auto* xform_rot_z_2d = GetLayoutObjectByElementId("2d-transform-rot-z");
EXPECT_FALSE(xform_rot_z_2d->StyleRef().HasNonTrivial3DTransformOperation()); EXPECT_FALSE(xform_rot_z_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(xform_rot_z_2d)->Layer()->GetCompositingReasons()); EXPECT_FALSE(ToLayoutBox(xform_rot_z_2d)->Layer()->GetCompositingReasons());
...@@ -208,7 +195,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D, ...@@ -208,7 +195,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
ToLayoutBox(rotation_y_3d)->Layer()->GetCompositingReasons()); ToLayoutBox(rotation_y_3d)->Layer()->GetCompositingReasons());
const auto* rotation_y_2d = GetLayoutObjectByElementId("2d-rotation-y"); const auto* rotation_y_2d = GetLayoutObjectByElementId("2d-rotation-y");
EXPECT_FALSE(rotation_y_2d->StyleRef().HasNonTrivial3DTransformOperation()); EXPECT_FALSE(rotation_y_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(rotation_y_2d)->Layer()->GetCompositingReasons()); EXPECT_TRUE(ToLayoutBox(rotation_y_2d)->Layer()->GetCompositingReasons());
const auto* rotation_z_2d = GetLayoutObjectByElementId("2d-rotation-z"); const auto* rotation_z_2d = GetLayoutObjectByElementId("2d-rotation-z");
EXPECT_FALSE(rotation_z_2d->StyleRef().HasNonTrivial3DTransformOperation()); EXPECT_FALSE(rotation_z_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(rotation_z_2d)->Layer()->GetCompositingReasons()); EXPECT_FALSE(ToLayoutBox(rotation_z_2d)->Layer()->GetCompositingReasons());
......
...@@ -1362,28 +1362,40 @@ TEST_P(PaintLayerScrollableAreaTest, ...@@ -1362,28 +1362,40 @@ TEST_P(PaintLayerScrollableAreaTest,
EXPECT_EQ(ScrollOffset(0, 50), scrollable_area->GetScrollOffset()); EXPECT_EQ(ScrollOffset(0, 50), scrollable_area->GetScrollOffset());
} }
class PaintLayerScrollableAreaCompositingTest // Test that a trivial 3D transform results in composited scrolling.
: public PaintLayerScrollableAreaTest { TEST_P(PaintLayerScrollableAreaTest, CompositeWithTrivial3D) {
public: SetBodyInnerHTML(R"HTML(
PaintLayerScrollableAreaCompositingTest() { <style>
if (GetParam() & kDoNotCompositeTrivial3D) { #scroller {
scoped_feature_list_.InitAndEnableFeature( width: 100px;
blink::features::kDoNotCompositeTrivial3D); height: 100px;
} else { overflow: scroll;
scoped_feature_list_.InitAndDisableFeature( transform: translateZ(0);
blink::features::kDoNotCompositeTrivial3D); }
} #scrolled {
} width: 200px;
height: 200px;
}
</style>
<div id="scroller">
<div id="scrolled"></div>
</div>
)HTML");
private: EXPECT_TRUE(UsesCompositedScrolling(GetLayoutObjectByElementId("scroller")));
base::test::ScopedFeatureList scoped_feature_list_; }
};
INSTANTIATE_DO_NOT_COMPOSITE_TRIVIAL_3D_P( class PaintLayerScrollableAreaTestLowEndPlatform
PaintLayerScrollableAreaCompositingTest); : public TestingPlatformSupport {
public:
bool IsLowEndDevice() override { return true; }
};
// Test that a trivial 3D transform results in composited scrolling. // Test that a trivial 3D transform results in composited scrolling even on
TEST_P(PaintLayerScrollableAreaCompositingTest, CompositeWithTrivial3D) { // low-end devices that may not composite trivial 3D transforms.
TEST_P(PaintLayerScrollableAreaTest, LowEndCompositeWithTrivial3D) {
ScopedTestingPlatformSupport<PaintLayerScrollableAreaTestLowEndPlatform>
platform;
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
<style> <style>
#scroller { #scroller {
......
...@@ -14,8 +14,7 @@ namespace blink { ...@@ -14,8 +14,7 @@ namespace blink {
enum { enum {
kCompositeAfterPaint = 1 << 0, kCompositeAfterPaint = 1 << 0,
kUnderInvalidationChecking = 1 << 1, kUnderInvalidationChecking = 1 << 1,
kFastBorderRadius = 1 << 2, kFastBorderRadius = 1 << 2
kDoNotCompositeTrivial3D = 1 << 3,
}; };
class PaintTestConfigurations class PaintTestConfigurations
...@@ -52,12 +51,6 @@ class PaintTestConfigurations ...@@ -52,12 +51,6 @@ class PaintTestConfigurations
INSTANTIATE_TEST_SUITE_P(All, test_class, \ INSTANTIATE_TEST_SUITE_P(All, test_class, \
::testing::Values(0, kCompositeAfterPaint)) ::testing::Values(0, kCompositeAfterPaint))
#define INSTANTIATE_DO_NOT_COMPOSITE_TRIVIAL_3D_P(test_class) \
INSTANTIATE_TEST_SUITE_P( \
All, test_class, \
::testing::Values(0, kCompositeAfterPaint, kDoNotCompositeTrivial3D, \
kCompositeAfterPaint | kDoNotCompositeTrivial3D))
} // namespace blink } // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_PAINT_TEST_CONFIGURATIONS_H_ #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_PAINT_TEST_CONFIGURATIONS_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment