| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/compositor/layer.h" | 5 #include "ui/compositor/layer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 DrawFadedStringLayerDelegate* delegate) { | 181 DrawFadedStringLayerDelegate* delegate) { |
| 182 std::unique_ptr<Layer> layer(new Layer(LAYER_TEXTURED)); | 182 std::unique_ptr<Layer> layer(new Layer(LAYER_TEXTURED)); |
| 183 layer->SetBounds(bounds); | 183 layer->SetBounds(bounds); |
| 184 layer->set_delegate(delegate); | 184 layer->set_delegate(delegate); |
| 185 return layer; | 185 return layer; |
| 186 } | 186 } |
| 187 | 187 |
| 188 void DrawTree(Layer* root) { | 188 void DrawTree(Layer* root) { |
| 189 GetCompositor()->SetRootLayer(root); | 189 GetCompositor()->SetRootLayer(root); |
| 190 GetCompositor()->ScheduleDraw(); | 190 GetCompositor()->ScheduleDraw(); |
| 191 WaitForSwap(); | 191 WaitForDraw(); |
| 192 } | 192 } |
| 193 | 193 |
| 194 void ReadPixels(SkBitmap* bitmap) { | 194 void ReadPixels(SkBitmap* bitmap) { |
| 195 ReadPixels(bitmap, gfx::Rect(GetCompositor()->size())); | 195 ReadPixels(bitmap, gfx::Rect(GetCompositor()->size())); |
| 196 } | 196 } |
| 197 | 197 |
| 198 void ReadPixels(SkBitmap* bitmap, gfx::Rect source_rect) { | 198 void ReadPixels(SkBitmap* bitmap, gfx::Rect source_rect) { |
| 199 scoped_refptr<ReadbackHolder> holder(new ReadbackHolder); | 199 scoped_refptr<ReadbackHolder> holder(new ReadbackHolder); |
| 200 std::unique_ptr<cc::CopyOutputRequest> request = | 200 std::unique_ptr<cc::CopyOutputRequest> request = |
| 201 cc::CopyOutputRequest::CreateBitmapRequest( | 201 cc::CopyOutputRequest::CreateBitmapRequest( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 215 // Waits for the callback to finish run and return result. | 215 // Waits for the callback to finish run and return result. |
| 216 holder->WaitForReadback(); | 216 holder->WaitForReadback(); |
| 217 | 217 |
| 218 *bitmap = holder->result(); | 218 *bitmap = holder->result(); |
| 219 } | 219 } |
| 220 | 220 |
| 221 void WaitForDraw() { | 221 void WaitForDraw() { |
| 222 ui::DrawWaiterForTest::WaitForCompositingStarted(GetCompositor()); | 222 ui::DrawWaiterForTest::WaitForCompositingStarted(GetCompositor()); |
| 223 } | 223 } |
| 224 | 224 |
| 225 void WaitForSwap() { | |
| 226 DrawWaiterForTest::WaitForCompositingEnded(GetCompositor()); | |
| 227 } | |
| 228 | |
| 229 void WaitForCommit() { | 225 void WaitForCommit() { |
| 230 ui::DrawWaiterForTest::WaitForCommit(GetCompositor()); | 226 ui::DrawWaiterForTest::WaitForCommit(GetCompositor()); |
| 231 } | 227 } |
| 232 | 228 |
| 233 // Invalidates the entire contents of the layer. | 229 // Invalidates the entire contents of the layer. |
| 234 void SchedulePaintForLayer(Layer* layer) { | 230 void SchedulePaintForLayer(Layer* layer) { |
| 235 layer->SchedulePaint( | 231 layer->SchedulePaint( |
| 236 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 232 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
| 237 } | 233 } |
| 238 | 234 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 | 357 |
| 362 DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate); | 358 DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate); |
| 363 }; | 359 }; |
| 364 | 360 |
| 365 // Remembers if it has been notified. | 361 // Remembers if it has been notified. |
| 366 class TestCompositorObserver : public CompositorObserver { | 362 class TestCompositorObserver : public CompositorObserver { |
| 367 public: | 363 public: |
| 368 TestCompositorObserver() = default; | 364 TestCompositorObserver() = default; |
| 369 | 365 |
| 370 bool committed() const { return committed_; } | 366 bool committed() const { return committed_; } |
| 371 bool notified() const { return started_ && ended_; } | 367 bool started() const { return started_; } |
| 372 | 368 |
| 373 void Reset() { | 369 void Reset() { |
| 374 committed_ = false; | 370 committed_ = false; |
| 375 started_ = false; | 371 started_ = false; |
| 376 ended_ = false; | |
| 377 } | 372 } |
| 378 | 373 |
| 379 private: | 374 private: |
| 380 void OnCompositingDidCommit(Compositor* compositor) override { | 375 void OnCompositingDidCommit(Compositor* compositor) override { |
| 381 committed_ = true; | 376 committed_ = true; |
| 382 } | 377 } |
| 383 | 378 |
| 384 void OnCompositingStarted(Compositor* compositor, | 379 void OnCompositingStarted(Compositor* compositor, |
| 385 base::TimeTicks start_time) override { | 380 base::TimeTicks start_time) override { |
| 386 started_ = true; | 381 started_ = true; |
| 387 } | 382 } |
| 388 | 383 |
| 389 void OnCompositingEnded(Compositor* compositor) override { ended_ = true; } | |
| 390 | |
| 391 void OnCompositingLockStateChanged(Compositor* compositor) override {} | 384 void OnCompositingLockStateChanged(Compositor* compositor) override {} |
| 392 | 385 |
| 393 void OnCompositingShuttingDown(Compositor* compositor) override {} | 386 void OnCompositingShuttingDown(Compositor* compositor) override {} |
| 394 | 387 |
| 395 bool committed_ = false; | 388 bool committed_ = false; |
| 396 bool started_ = false; | 389 bool started_ = false; |
| 397 bool ended_ = false; | |
| 398 | 390 |
| 399 DISALLOW_COPY_AND_ASSIGN(TestCompositorObserver); | 391 DISALLOW_COPY_AND_ASSIGN(TestCompositorObserver); |
| 400 }; | 392 }; |
| 401 | 393 |
| 402 class TestCompositorAnimationObserver : public CompositorAnimationObserver { | 394 class TestCompositorAnimationObserver : public CompositorAnimationObserver { |
| 403 public: | 395 public: |
| 404 explicit TestCompositorAnimationObserver(ui::Compositor* compositor) | 396 explicit TestCompositorAnimationObserver(ui::Compositor* compositor) |
| 405 : compositor_(compositor), | 397 : compositor_(compositor), |
| 406 animation_step_count_(0), | 398 animation_step_count_(0), |
| 407 shutdown_(false) { | 399 shutdown_(false) { |
| (...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 CreateColorLayer(SK_ColorRED, gfx::Rect(20, 20, 400, 400))); | 1302 CreateColorLayer(SK_ColorRED, gfx::Rect(20, 20, 400, 400))); |
| 1311 std::unique_ptr<Layer> l2( | 1303 std::unique_ptr<Layer> l2( |
| 1312 CreateColorLayer(SK_ColorBLUE, gfx::Rect(10, 10, 350, 350))); | 1304 CreateColorLayer(SK_ColorBLUE, gfx::Rect(10, 10, 350, 350))); |
| 1313 l1->Add(l2.get()); | 1305 l1->Add(l2.get()); |
| 1314 TestCompositorObserver observer; | 1306 TestCompositorObserver observer; |
| 1315 GetCompositor()->AddObserver(&observer); | 1307 GetCompositor()->AddObserver(&observer); |
| 1316 | 1308 |
| 1317 // Explicitly called DrawTree should cause the observers to be notified. | 1309 // Explicitly called DrawTree should cause the observers to be notified. |
| 1318 // NOTE: this call to DrawTree sets l1 to be the compositor's root layer. | 1310 // NOTE: this call to DrawTree sets l1 to be the compositor's root layer. |
| 1319 DrawTree(l1.get()); | 1311 DrawTree(l1.get()); |
| 1320 EXPECT_TRUE(observer.notified()); | 1312 EXPECT_TRUE(observer.started()); |
| 1321 | 1313 |
| 1322 // ScheduleDraw without any visible change should cause a commit. | 1314 // ScheduleDraw without any visible change should cause a commit. |
| 1323 observer.Reset(); | 1315 observer.Reset(); |
| 1324 l1->ScheduleDraw(); | 1316 l1->ScheduleDraw(); |
| 1325 WaitForCommit(); | 1317 WaitForCommit(); |
| 1326 EXPECT_TRUE(observer.committed()); | 1318 EXPECT_TRUE(observer.committed()); |
| 1327 | 1319 |
| 1328 // Moving, but not resizing, a layer should alert the observers. | 1320 // Moving, but not resizing, a layer should alert the observers. |
| 1329 observer.Reset(); | 1321 observer.Reset(); |
| 1330 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); | 1322 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); |
| 1331 WaitForSwap(); | 1323 WaitForDraw(); |
| 1332 EXPECT_TRUE(observer.notified()); | 1324 EXPECT_TRUE(observer.started()); |
| 1333 | 1325 |
| 1334 // So should resizing a layer. | 1326 // So should resizing a layer. |
| 1335 observer.Reset(); | 1327 observer.Reset(); |
| 1336 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); | 1328 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 1337 WaitForSwap(); | 1329 WaitForDraw(); |
| 1338 EXPECT_TRUE(observer.notified()); | 1330 EXPECT_TRUE(observer.started()); |
| 1339 | 1331 |
| 1340 // Opacity changes should alert the observers. | 1332 // Opacity changes should alert the observers. |
| 1341 observer.Reset(); | 1333 observer.Reset(); |
| 1342 l2->SetOpacity(0.5f); | 1334 l2->SetOpacity(0.5f); |
| 1343 WaitForSwap(); | 1335 WaitForDraw(); |
| 1344 EXPECT_TRUE(observer.notified()); | 1336 EXPECT_TRUE(observer.started()); |
| 1345 | 1337 |
| 1346 // So should setting the opacity back. | 1338 // So should setting the opacity back. |
| 1347 observer.Reset(); | 1339 observer.Reset(); |
| 1348 l2->SetOpacity(1.0f); | 1340 l2->SetOpacity(1.0f); |
| 1349 WaitForSwap(); | 1341 WaitForDraw(); |
| 1350 EXPECT_TRUE(observer.notified()); | 1342 EXPECT_TRUE(observer.started()); |
| 1351 | 1343 |
| 1352 // Setting the transform of a layer should alert the observers. | 1344 // Setting the transform of a layer should alert the observers. |
| 1353 observer.Reset(); | 1345 observer.Reset(); |
| 1354 gfx::Transform transform; | 1346 gfx::Transform transform; |
| 1355 transform.Translate(200.0, 200.0); | 1347 transform.Translate(200.0, 200.0); |
| 1356 transform.Rotate(90.0); | 1348 transform.Rotate(90.0); |
| 1357 transform.Translate(-200.0, -200.0); | 1349 transform.Translate(-200.0, -200.0); |
| 1358 l2->SetTransform(transform); | 1350 l2->SetTransform(transform); |
| 1359 WaitForSwap(); | 1351 WaitForDraw(); |
| 1360 EXPECT_TRUE(observer.notified()); | 1352 EXPECT_TRUE(observer.started()); |
| 1361 | 1353 |
| 1362 GetCompositor()->RemoveObserver(&observer); | 1354 GetCompositor()->RemoveObserver(&observer); |
| 1363 | 1355 |
| 1364 // Opacity changes should no longer alert the removed observer. | 1356 // Opacity changes should no longer alert the removed observer. |
| 1365 observer.Reset(); | 1357 observer.Reset(); |
| 1366 l2->SetOpacity(0.5f); | 1358 l2->SetOpacity(0.5f); |
| 1367 WaitForSwap(); | 1359 WaitForDraw(); |
| 1368 | 1360 |
| 1369 EXPECT_FALSE(observer.notified()); | 1361 EXPECT_FALSE(observer.started()); |
| 1370 } | 1362 } |
| 1371 | 1363 |
| 1372 // Checks that modifying the hierarchy correctly affects final composite. | 1364 // Checks that modifying the hierarchy correctly affects final composite. |
| 1373 TEST_F(LayerWithRealCompositorTest, ModifyHierarchy) { | 1365 TEST_F(LayerWithRealCompositorTest, ModifyHierarchy) { |
| 1374 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); | 1366 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); |
| 1375 | 1367 |
| 1376 // l0 | 1368 // l0 |
| 1377 // +-l11 | 1369 // +-l11 |
| 1378 // | +-l21 | 1370 // | +-l21 |
| 1379 // +-l12 | 1371 // +-l12 |
| (...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2172 | 2164 |
| 2173 TEST_F(LayerWithRealCompositorTest, CompositorAnimationObserverTest) { | 2165 TEST_F(LayerWithRealCompositorTest, CompositorAnimationObserverTest) { |
| 2174 std::unique_ptr<Layer> root(CreateLayer(LAYER_TEXTURED)); | 2166 std::unique_ptr<Layer> root(CreateLayer(LAYER_TEXTURED)); |
| 2175 | 2167 |
| 2176 root->SetAnimator(LayerAnimator::CreateImplicitAnimator()); | 2168 root->SetAnimator(LayerAnimator::CreateImplicitAnimator()); |
| 2177 | 2169 |
| 2178 TestCompositorAnimationObserver animation_observer(GetCompositor()); | 2170 TestCompositorAnimationObserver animation_observer(GetCompositor()); |
| 2179 EXPECT_EQ(0u, animation_observer.animation_step_count()); | 2171 EXPECT_EQ(0u, animation_observer.animation_step_count()); |
| 2180 | 2172 |
| 2181 root->SetOpacity(0.5f); | 2173 root->SetOpacity(0.5f); |
| 2182 WaitForSwap(); | 2174 WaitForDraw(); |
| 2183 EXPECT_EQ(1u, animation_observer.animation_step_count()); | 2175 EXPECT_EQ(1u, animation_observer.animation_step_count()); |
| 2184 | 2176 |
| 2185 EXPECT_FALSE(animation_observer.shutdown()); | 2177 EXPECT_FALSE(animation_observer.shutdown()); |
| 2186 ResetCompositor(); | 2178 ResetCompositor(); |
| 2187 EXPECT_TRUE(animation_observer.shutdown()); | 2179 EXPECT_TRUE(animation_observer.shutdown()); |
| 2188 } | 2180 } |
| 2189 | 2181 |
| 2190 // A simple AnimationMetricsReporter class that remembers smoothness metric | 2182 // A simple AnimationMetricsReporter class that remembers smoothness metric |
| 2191 // when animation completes. | 2183 // when animation completes. |
| 2192 class TestMetricsReporter : public ui::AnimationMetricsReporter { | 2184 class TestMetricsReporter : public ui::AnimationMetricsReporter { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2218 LayerAnimator* animator = root->GetAnimator(); | 2210 LayerAnimator* animator = root->GetAnimator(); |
| 2219 std::unique_ptr<ui::LayerAnimationElement> animation_element = | 2211 std::unique_ptr<ui::LayerAnimationElement> animation_element = |
| 2220 ui::LayerAnimationElement::CreateColorElement( | 2212 ui::LayerAnimationElement::CreateColorElement( |
| 2221 SK_ColorRED, base::TimeDelta::FromMilliseconds(100)); | 2213 SK_ColorRED, base::TimeDelta::FromMilliseconds(100)); |
| 2222 ui::LayerAnimationSequence* animation_sequence = | 2214 ui::LayerAnimationSequence* animation_sequence = |
| 2223 new ui::LayerAnimationSequence(std::move(animation_element)); | 2215 new ui::LayerAnimationSequence(std::move(animation_element)); |
| 2224 TestMetricsReporter reporter; | 2216 TestMetricsReporter reporter; |
| 2225 animation_sequence->SetAnimationMetricsReporter(&reporter); | 2217 animation_sequence->SetAnimationMetricsReporter(&reporter); |
| 2226 animator->StartAnimation(animation_sequence); | 2218 animator->StartAnimation(animation_sequence); |
| 2227 while (!reporter.report_called()) | 2219 while (!reporter.report_called()) |
| 2228 WaitForSwap(); | 2220 WaitForDraw(); |
| 2229 ResetCompositor(); | 2221 ResetCompositor(); |
| 2230 // Even though most of the time 100% smooth animations are expected, on the | 2222 // Even though most of the time 100% smooth animations are expected, on the |
| 2231 // test bots this cannot be guaranteed. Therefore simply check that some | 2223 // test bots this cannot be guaranteed. Therefore simply check that some |
| 2232 // value was reported. | 2224 // value was reported. |
| 2233 EXPECT_GT(reporter.value(), 0); | 2225 EXPECT_GT(reporter.value(), 0); |
| 2234 } | 2226 } |
| 2235 | 2227 |
| 2236 TEST(LayerDebugInfoTest, LayerNameDoesNotClobber) { | 2228 TEST(LayerDebugInfoTest, LayerNameDoesNotClobber) { |
| 2237 Layer layer(LAYER_NOT_DRAWN); | 2229 Layer layer(LAYER_NOT_DRAWN); |
| 2238 layer.set_name("foo"); | 2230 layer.set_name("foo"); |
| 2239 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info = | 2231 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info = |
| 2240 layer.TakeDebugInfo(nullptr); | 2232 layer.TakeDebugInfo(nullptr); |
| 2241 std::string trace_format("bar,"); | 2233 std::string trace_format("bar,"); |
| 2242 debug_info->AppendAsTraceFormat(&trace_format); | 2234 debug_info->AppendAsTraceFormat(&trace_format); |
| 2243 std::string expected("bar,{\"layer_name\":\"foo\"}"); | 2235 std::string expected("bar,{\"layer_name\":\"foo\"}"); |
| 2244 EXPECT_EQ(expected, trace_format); | 2236 EXPECT_EQ(expected, trace_format); |
| 2245 } | 2237 } |
| 2246 | 2238 |
| 2247 } // namespace ui | 2239 } // namespace ui |
| OLD | NEW |