Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(696)

Side by Side Diff: cc/trees/layer_tree_host_unittest.cc

Issue 684653004: Plumb can_use_lcd_text, contents_opaque directly to ContentLayerClient. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/layer_tree_host.h" 5 #include "cc/trees/layer_tree_host.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 936
937 class TestOpacityChangeLayerDelegate : public ContentLayerClient { 937 class TestOpacityChangeLayerDelegate : public ContentLayerClient {
938 public: 938 public:
939 TestOpacityChangeLayerDelegate() : test_layer_(0) {} 939 TestOpacityChangeLayerDelegate() : test_layer_(0) {}
940 940
941 void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } 941 void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; }
942 942
943 void PaintContents( 943 void PaintContents(
944 SkCanvas* canvas, 944 SkCanvas* canvas,
945 const gfx::Rect& clip, 945 const gfx::Rect& clip,
946 bool can_use_lcd_text,
947 bool contents_opaque,
946 ContentLayerClient::GraphicsContextStatus gc_status) override { 948 ContentLayerClient::GraphicsContextStatus gc_status) override {
947 // Set layer opacity to 0. 949 // Set layer opacity to 0.
948 if (test_layer_) 950 if (test_layer_)
949 test_layer_->SetOpacity(0.f); 951 test_layer_->SetOpacity(0.f);
950 } 952 }
951 void DidChangeLayerCanUseLCDText() override {}
952 bool FillsBoundsCompletely() const override { return false; } 953 bool FillsBoundsCompletely() const override { return false; }
953 954
954 private: 955 private:
955 Layer* test_layer_; 956 Layer* test_layer_;
956 }; 957 };
957 958
958 class ContentLayerWithUpdateTracking : public ContentLayer { 959 class ContentLayerWithUpdateTracking : public ContentLayer {
959 public: 960 public:
960 static scoped_refptr<ContentLayerWithUpdateTracking> Create( 961 static scoped_refptr<ContentLayerWithUpdateTracking> Create(
961 ContentLayerClient* client) { 962 ContentLayerClient* client) {
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 FakeContentLayerClient client_; 2123 FakeContentLayerClient client_;
2123 scoped_refptr<FakeContentLayer> root_layer_; 2124 scoped_refptr<FakeContentLayer> root_layer_;
2124 scoped_refptr<FakeContentLayer> child_layer1_; 2125 scoped_refptr<FakeContentLayer> child_layer1_;
2125 scoped_refptr<FakeContentLayer> child_layer2_; 2126 scoped_refptr<FakeContentLayer> child_layer2_;
2126 int num_commits_; 2127 int num_commits_;
2127 }; 2128 };
2128 2129
2129 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 2130 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(
2130 LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); 2131 LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted);
2131 2132
2132 class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { 2133 class LayerTreeHostTestLCDText : public LayerTreeHostTest {
2133 public: 2134 public:
2134 class NotificationClient : public ContentLayerClient { 2135 class TextClient : public ContentLayerClient {
2135 public: 2136 public:
2136 NotificationClient() 2137 TextClient() : layer_(0), paint_count_(0), last_can_use_lcd_text_(false) {}
2137 : layer_(0), paint_count_(0), lcd_notification_count_(0) {}
2138 2138
2139 void set_layer(Layer* layer) { layer_ = layer; } 2139 void set_layer(Layer* layer) { layer_ = layer; }
2140 int paint_count() const { return paint_count_; } 2140 int paint_count() const { return paint_count_; }
2141 int lcd_notification_count() const { return lcd_notification_count_; } 2141 int last_can_use_lcd_text() const { return last_can_use_lcd_text_; }
2142 gfx::Rect last_paint_rect() const { return last_paint_rect_; }
2142 2143
2143 void PaintContents( 2144 void PaintContents(
2144 SkCanvas* canvas, 2145 SkCanvas* canvas,
2145 const gfx::Rect& clip, 2146 const gfx::Rect& paint_rect,
2147 bool can_use_lcd_text,
2148 bool contents_opaque,
2146 ContentLayerClient::GraphicsContextStatus gc_status) override { 2149 ContentLayerClient::GraphicsContextStatus gc_status) override {
2147 ++paint_count_; 2150 ++paint_count_;
2148 } 2151 last_can_use_lcd_text_ = can_use_lcd_text;
2149 void DidChangeLayerCanUseLCDText() override { 2152 last_paint_rect_ = paint_rect;
2150 ++lcd_notification_count_;
2151 layer_->SetNeedsDisplay();
2152 } 2153 }
2153 bool FillsBoundsCompletely() const override { return false; } 2154 bool FillsBoundsCompletely() const override { return false; }
2154 2155
2155 private: 2156 private:
2156 Layer* layer_; 2157 Layer* layer_;
2157 int paint_count_; 2158 int paint_count_;
2158 int lcd_notification_count_; 2159 bool last_can_use_lcd_text_;
2160 gfx::Rect last_paint_rect_;
2159 }; 2161 };
2160 2162
2161 void SetupTree() override { 2163 void SetupTree() override {
2162 scoped_refptr<Layer> root_layer; 2164 scoped_refptr<Layer> root_layer;
2163 if (layer_tree_host()->settings().impl_side_painting) 2165 if (layer_tree_host()->settings().impl_side_painting)
2164 root_layer = PictureLayer::Create(&client_); 2166 root_layer = PictureLayer::Create(&client_);
2165 else 2167 else
2166 root_layer = ContentLayer::Create(&client_); 2168 root_layer = ContentLayer::Create(&client_);
2167 root_layer->SetIsDrawable(true); 2169 root_layer->SetIsDrawable(true);
2168 root_layer->SetBounds(gfx::Size(1, 1)); 2170 root_layer->SetBounds(gfx::Size(10, 10));
2169 2171
2170 layer_tree_host()->SetRootLayer(root_layer); 2172 layer_tree_host()->SetRootLayer(root_layer);
2171 client_.set_layer(root_layer.get()); 2173 client_.set_layer(root_layer.get());
2172 2174
2173 // The expecations are based on the assumption that the default 2175 // The expecations are based on the assumption that the default
2174 // LCD settings are: 2176 // LCD settings are:
2175 EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); 2177 EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text);
2176 EXPECT_FALSE(root_layer->can_use_lcd_text()); 2178 EXPECT_FALSE(root_layer->can_use_lcd_text());
2177 2179
2178 LayerTreeHostTest::SetupTree(); 2180 LayerTreeHostTest::SetupTree();
2179 } 2181 }
2180 2182
2181 void BeginTest() override { PostSetNeedsCommitToMainThread(); } 2183 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
2182 void AfterTest() override {} 2184 void AfterTest() override {}
2183 2185
2184 void DidCommit() override { 2186 void DidCommit() override {
2185 switch (layer_tree_host()->source_frame_number()) { 2187 switch (layer_tree_host()->source_frame_number()) {
2186 case 1: 2188 case 1:
2187 // The first update consists of one LCD notification and one paint. 2189 // The first update was the whole layer, and with lcd text.
2188 EXPECT_EQ(1, client_.lcd_notification_count());
2189 EXPECT_EQ(1, client_.paint_count()); 2190 EXPECT_EQ(1, client_.paint_count());
2191 EXPECT_TRUE(client_.last_can_use_lcd_text());
2192 EXPECT_TRUE(client_.last_paint_rect().Contains(gfx::Rect(10, 10)));
2190 // LCD text must have been enabled on the layer. 2193 // LCD text must have been enabled on the layer.
2191 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2194 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
2192 PostSetNeedsCommitToMainThread(); 2195 layer_tree_host()->SetNeedsCommit();
2193 break; 2196 break;
2194 case 2: 2197 case 2:
2195 // Since nothing changed on layer, there should be no notification 2198 // Since nothing changed on layer, there should be no paint on the
2196 // or paint on the second update. 2199 // second update.
2197 EXPECT_EQ(1, client_.lcd_notification_count());
2198 EXPECT_EQ(1, client_.paint_count()); 2200 EXPECT_EQ(1, client_.paint_count());
2199 // LCD text must not have changed. 2201 // LCD text must not have changed.
2200 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2202 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
2201 // Change layer opacity that should trigger lcd notification. 2203 // Change layer opacity that should trigger lcd notification, but would
2204 // not normally invalidate causing a paint.
2202 layer_tree_host()->root_layer()->SetOpacity(.5f); 2205 layer_tree_host()->root_layer()->SetOpacity(.5f);
2203 // No need to request a commit - setting opacity will do it. 2206 // No need to request a commit - setting opacity will do it.
2204 break; 2207 break;
2205 default: 2208 case 3:
2206 // Verify that there is no extra commit due to layer invalidation. 2209 // Paint count should be incremented due to the LCD change.
2207 EXPECT_EQ(3, layer_tree_host()->source_frame_number());
2208 // LCD notification count should have incremented due to
2209 // change in layer opacity.
2210 EXPECT_EQ(2, client_.lcd_notification_count());
2211 // Paint count should be incremented due to invalidation.
2212 EXPECT_EQ(2, client_.paint_count()); 2210 EXPECT_EQ(2, client_.paint_count());
2211 // The paint was not done with LCD text enabled.
2212 EXPECT_FALSE(client_.last_can_use_lcd_text());
2213 // And the whole layer was invalidated and repainted.
2214 EXPECT_TRUE(client_.last_paint_rect().Contains(gfx::Rect(10, 10)));
2213 // LCD text must have been disabled on the layer due to opacity. 2215 // LCD text must have been disabled on the layer due to opacity.
2214 EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2216 EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text());
2215 EndTest(); 2217 EndTest();
2216 break; 2218 break;
2219 case 4:
2220 // Verify that there is no extra commit due to layer invalidation.
2221 EXPECT_TRUE(false);
2222 break;
2217 } 2223 }
2218 } 2224 }
2219 2225
2220 private: 2226 private:
2221 NotificationClient client_; 2227 TextClient client_;
2222 }; 2228 };
2223 2229
2224 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLCDNotification); 2230 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLCDText);
2225 2231
2226 // Verify that the BeginFrame notification is used to initiate rendering. 2232 // Verify that the BeginFrame notification is used to initiate rendering.
2227 class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { 2233 class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest {
2228 public: 2234 public:
2229 void InitializeSettings(LayerTreeSettings* settings) override { 2235 void InitializeSettings(LayerTreeSettings* settings) override {
2230 settings->begin_frame_scheduling_enabled = true; 2236 settings->begin_frame_scheduling_enabled = true;
2231 } 2237 }
2232 2238
2233 void BeginTest() override { 2239 void BeginTest() override {
2234 // This will trigger a SetNeedsBeginFrame which will trigger a 2240 // This will trigger a SetNeedsBeginFrame which will trigger a
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2381 public: 2387 public:
2382 class SetBoundsClient : public ContentLayerClient { 2388 class SetBoundsClient : public ContentLayerClient {
2383 public: 2389 public:
2384 SetBoundsClient() : layer_(0) {} 2390 SetBoundsClient() : layer_(0) {}
2385 2391
2386 void set_layer(Layer* layer) { layer_ = layer; } 2392 void set_layer(Layer* layer) { layer_ = layer; }
2387 2393
2388 void PaintContents( 2394 void PaintContents(
2389 SkCanvas* canvas, 2395 SkCanvas* canvas,
2390 const gfx::Rect& clip, 2396 const gfx::Rect& clip,
2397 bool can_use_lcd_text,
2398 bool contents_opaque,
2391 ContentLayerClient::GraphicsContextStatus gc_status) override { 2399 ContentLayerClient::GraphicsContextStatus gc_status) override {
2392 layer_->SetBounds(gfx::Size(2, 2)); 2400 layer_->SetBounds(gfx::Size(2, 2));
2393 } 2401 }
2394 2402
2395 void DidChangeLayerCanUseLCDText() override {}
2396
2397 bool FillsBoundsCompletely() const override { return false; } 2403 bool FillsBoundsCompletely() const override { return false; }
2398 2404
2399 private: 2405 private:
2400 Layer* layer_; 2406 Layer* layer_;
2401 }; 2407 };
2402 2408
2403 LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} 2409 LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {}
2404 2410
2405 void SetupTree() override { 2411 void SetupTree() override {
2406 if (layer_tree_host()->settings().impl_side_painting) { 2412 if (layer_tree_host()->settings().impl_side_painting) {
(...skipping 2792 matching lines...) Expand 10 before | Expand all | Expand 10 after
5199 void AfterTest() override { 5205 void AfterTest() override {
5200 EXPECT_TRUE(deltas_sent_to_client_); 5206 EXPECT_TRUE(deltas_sent_to_client_);
5201 } 5207 }
5202 5208
5203 ScrollAndScaleSet info_; 5209 ScrollAndScaleSet info_;
5204 bool deltas_sent_to_client_; 5210 bool deltas_sent_to_client_;
5205 }; 5211 };
5206 5212
5207 MULTI_THREAD_TEST_F(LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer); 5213 MULTI_THREAD_TEST_F(LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer);
5208 } // namespace cc 5214 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698