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{
const base::Feature kFreezeUserAgent{"FreezeUserAgent",
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
// anytime a fixed or sticky position element is encountered.
const base::Feature kAssumeOverlapAfterFixedOrStickyPosition{
......
......@@ -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 kCSSOMViewScrollCoordinates;
BLINK_COMMON_EXPORT extern const base::Feature kDisplayLocking;
BLINK_COMMON_EXPORT extern const base::Feature kDoNotCompositeTrivial3D;
BLINK_COMMON_EXPORT extern const base::Feature
kAssumeOverlapAfterFixedOrStickyPosition;
BLINK_COMMON_EXPORT extern const base::Feature kFastBorderRadius;
......
......@@ -4,8 +4,6 @@
#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/dom/document.h"
#include "third_party/blink/renderer/core/dom/node.h"
......@@ -165,10 +163,8 @@ bool CompositingReasonFinder::RequiresCompositingFor3DTransform(
return false;
// Don't composite "trivial" 3D transforms such as translateZ(0).
if (Platform::Current()->IsLowEndDevice() ||
base::FeatureList::IsEnabled(blink::features::kDoNotCompositeTrivial3D)) {
if (Platform::Current()->IsLowEndDevice())
return layout_object.StyleRef().HasNonTrivial3DTransformOperation();
}
return layout_object.StyleRef().Has3DTransformOperation();
}
......
......@@ -40,42 +40,7 @@ TEST_F(CompositingReasonFinderTest, CompositingReasonDependencies) {
CompositingReason::kComboAllStyleDeterminedReasons);
}
class CompositingReasonFinderTestWithDoNotCompositeTrivial3D
: 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) {
TEST_F(CompositingReasonFinderTest, PromoteTrivial3D) {
SetBodyInnerHTML(R"HTML(
<div id='target'
style='width: 100px; height: 100px; transform: translateZ(0)'></div>
......
......@@ -4,13 +4,12 @@
#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 "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_scrollable_area.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/testing/testing_platform_support.h"
namespace blink {
......@@ -128,19 +127,7 @@ TEST_F(CompositingRequirementsUpdaterTest,
EXPECT_EQ(IntRect(0, 0, 100, 100), tracking->Invalidations()[0].rect);
}
class CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D
: public CompositingRequirementsUpdaterTest {
public:
CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D() {
scoped_feature_list_.InitAndEnableFeature(
blink::features::kDoNotCompositeTrivial3D);
}
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
NonTrivial3DTransforms) {
TEST_F(CompositingRequirementsUpdaterTest, NonTrivial3DTransforms) {
ScopedCSSIndependentTransformPropertiesForTest feature_scope(true);
SetBodyInnerHTML(R"HTML(
......@@ -169,7 +156,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
ToLayoutBox(transform_3d)->Layer()->GetCompositingReasons());
const auto* transform_2d = GetLayoutObjectByElementId("2d-transform");
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 =
GetLayoutObjectByElementId("3d-transform-translate-z");
......@@ -182,7 +169,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
GetLayoutObjectByElementId("2d-transform-translate-z");
EXPECT_FALSE(
transform_2d_translate_z->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(
EXPECT_TRUE(
ToLayoutBox(transform_2d_translate_z)->Layer()->GetCompositingReasons());
const auto* transform_2d_translate_x =
GetLayoutObjectByElementId("2d-transform-translate-x");
......@@ -197,7 +184,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
ToLayoutBox(xform_rot_x_3d)->Layer()->GetCompositingReasons());
const auto* xform_rot_x_2d = GetLayoutObjectByElementId("2d-transform-rot-x");
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");
EXPECT_FALSE(xform_rot_z_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(xform_rot_z_2d)->Layer()->GetCompositingReasons());
......@@ -208,7 +195,7 @@ TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
ToLayoutBox(rotation_y_3d)->Layer()->GetCompositingReasons());
const auto* rotation_y_2d = GetLayoutObjectByElementId("2d-rotation-y");
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");
EXPECT_FALSE(rotation_z_2d->StyleRef().HasNonTrivial3DTransformOperation());
EXPECT_FALSE(ToLayoutBox(rotation_z_2d)->Layer()->GetCompositingReasons());
......
......@@ -1362,28 +1362,40 @@ TEST_P(PaintLayerScrollableAreaTest,
EXPECT_EQ(ScrollOffset(0, 50), scrollable_area->GetScrollOffset());
}
class PaintLayerScrollableAreaCompositingTest
: public PaintLayerScrollableAreaTest {
public:
PaintLayerScrollableAreaCompositingTest() {
if (GetParam() & kDoNotCompositeTrivial3D) {
scoped_feature_list_.InitAndEnableFeature(
blink::features::kDoNotCompositeTrivial3D);
} else {
scoped_feature_list_.InitAndDisableFeature(
blink::features::kDoNotCompositeTrivial3D);
// Test that a trivial 3D transform results in composited scrolling.
TEST_P(PaintLayerScrollableAreaTest, CompositeWithTrivial3D) {
SetBodyInnerHTML(R"HTML(
<style>
#scroller {
width: 100px;
height: 100px;
overflow: scroll;
transform: translateZ(0);
}
#scrolled {
width: 200px;
height: 200px;
}
</style>
<div id="scroller">
<div id="scrolled"></div>
</div>
)HTML");
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
EXPECT_TRUE(UsesCompositedScrolling(GetLayoutObjectByElementId("scroller")));
}
INSTANTIATE_DO_NOT_COMPOSITE_TRIVIAL_3D_P(
PaintLayerScrollableAreaCompositingTest);
class PaintLayerScrollableAreaTestLowEndPlatform
: public TestingPlatformSupport {
public:
bool IsLowEndDevice() override { return true; }
};
// Test that a trivial 3D transform results in composited scrolling.
TEST_P(PaintLayerScrollableAreaCompositingTest, CompositeWithTrivial3D) {
// Test that a trivial 3D transform results in composited scrolling even on
// low-end devices that may not composite trivial 3D transforms.
TEST_P(PaintLayerScrollableAreaTest, LowEndCompositeWithTrivial3D) {
ScopedTestingPlatformSupport<PaintLayerScrollableAreaTestLowEndPlatform>
platform;
SetBodyInnerHTML(R"HTML(
<style>
#scroller {
......
......@@ -14,8 +14,7 @@ namespace blink {
enum {
kCompositeAfterPaint = 1 << 0,
kUnderInvalidationChecking = 1 << 1,
kFastBorderRadius = 1 << 2,
kDoNotCompositeTrivial3D = 1 << 3,
kFastBorderRadius = 1 << 2
};
class PaintTestConfigurations
......@@ -52,12 +51,6 @@ class PaintTestConfigurations
INSTANTIATE_TEST_SUITE_P(All, test_class, \
::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
#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