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

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

Issue 1056793009: Reconcile property tree and CDP layer skipping logic (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 5 years, 7 months 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_common.h" 5 #include "cc/trees/layer_tree_host_common.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "cc/animation/layer_animation_controller.h" 10 #include "cc/animation/layer_animation_controller.h"
11 #include "cc/animation/transform_operations.h" 11 #include "cc/animation/transform_operations.h"
12 #include "cc/base/math_util.h" 12 #include "cc/base/math_util.h"
13 #include "cc/layers/content_layer.h" 13 #include "cc/layers/content_layer.h"
14 #include "cc/layers/content_layer_client.h" 14 #include "cc/layers/content_layer_client.h"
15 #include "cc/layers/layer.h" 15 #include "cc/layers/layer.h"
16 #include "cc/layers/layer_client.h" 16 #include "cc/layers/layer_client.h"
17 #include "cc/layers/layer_impl.h" 17 #include "cc/layers/layer_impl.h"
18 #include "cc/layers/layer_iterator.h" 18 #include "cc/layers/layer_iterator.h"
19 #include "cc/layers/render_surface.h" 19 #include "cc/layers/render_surface.h"
20 #include "cc/layers/render_surface_impl.h" 20 #include "cc/layers/render_surface_impl.h"
21 #include "cc/output/copy_output_request.h" 21 #include "cc/output/copy_output_request.h"
22 #include "cc/output/copy_output_result.h" 22 #include "cc/output/copy_output_result.h"
23 #include "cc/test/animation_test_common.h" 23 #include "cc/test/animation_test_common.h"
24 #include "cc/test/fake_content_layer.h"
25 #include "cc/test/fake_content_layer_client.h"
26 #include "cc/test/fake_content_layer_impl.h"
24 #include "cc/test/fake_impl_proxy.h" 27 #include "cc/test/fake_impl_proxy.h"
25 #include "cc/test/fake_layer_tree_host.h" 28 #include "cc/test/fake_layer_tree_host.h"
26 #include "cc/test/fake_layer_tree_host_impl.h" 29 #include "cc/test/fake_layer_tree_host_impl.h"
27 #include "cc/test/fake_picture_layer.h" 30 #include "cc/test/fake_picture_layer.h"
28 #include "cc/test/fake_picture_layer_impl.h" 31 #include "cc/test/fake_picture_layer_impl.h"
29 #include "cc/test/geometry_test_utils.h" 32 #include "cc/test/geometry_test_utils.h"
30 #include "cc/test/layer_tree_host_common_test.h" 33 #include "cc/test/layer_tree_host_common_test.h"
31 #include "cc/test/test_task_graph_runner.h" 34 #include "cc/test/test_task_graph_runner.h"
32 #include "cc/trees/layer_tree_impl.h" 35 #include "cc/trees/layer_tree_impl.h"
33 #include "cc/trees/proxy.h" 36 #include "cc/trees/proxy.h"
(...skipping 9217 matching lines...) Expand 10 before | Expand all | Expand 10 after
9251 EXPECT_EQ(gfx::Rect(25, 25), 9254 EXPECT_EQ(gfx::Rect(25, 25),
9252 scroll_child->visible_rect_from_property_trees()); 9255 scroll_child->visible_rect_from_property_trees());
9253 9256
9254 scroll_child->SetPosition(gfx::PointF(0, -10.f)); 9257 scroll_child->SetPosition(gfx::PointF(0, -10.f));
9255 scroll_parent->SetScrollOffset(gfx::ScrollOffset(0.f, 10.f)); 9258 scroll_parent->SetScrollOffset(gfx::ScrollOffset(0.f, 10.f));
9256 ExecuteCalculateDrawProperties(root.get()); 9259 ExecuteCalculateDrawProperties(root.get());
9257 EXPECT_EQ(gfx::Rect(0, 5, 25, 25), 9260 EXPECT_EQ(gfx::Rect(0, 5, 25, 25),
9258 scroll_child->visible_rect_from_property_trees()); 9261 scroll_child->visible_rect_from_property_trees());
9259 } 9262 }
9260 9263
9264 static void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
9265 }
9266
9267 TEST_F(LayerTreeHostCommonTest, SkippingSubtreeMain) {
9268 gfx::Transform identity;
9269 FakeContentLayerClient client;
9270 scoped_refptr<Layer> root = Layer::Create();
9271 scoped_refptr<LayerWithForcedDrawsContent> child =
9272 make_scoped_refptr(new LayerWithForcedDrawsContent());
9273 scoped_refptr<LayerWithForcedDrawsContent> grandchild =
9274 make_scoped_refptr(new LayerWithForcedDrawsContent());
9275 scoped_refptr<FakeContentLayer> greatgrandchild(
9276 FakeContentLayer::Create(&client));
9277 SetLayerPropertiesForTesting(root.get(), identity, gfx::Point3F(),
9278 gfx::PointF(), gfx::Size(100, 100), true, false);
9279 SetLayerPropertiesForTesting(child.get(), identity, gfx::Point3F(),
9280 gfx::PointF(), gfx::Size(10, 10), true, false);
9281 SetLayerPropertiesForTesting(grandchild.get(), identity, gfx::Point3F(),
9282 gfx::PointF(), gfx::Size(10, 10), true, false);
9283 SetLayerPropertiesForTesting(greatgrandchild.get(), identity, gfx::Point3F(),
9284 gfx::PointF(), gfx::Size(10, 10), true, false);
9285
9286 root->AddChild(child);
9287 child->AddChild(grandchild);
9288 grandchild->AddChild(greatgrandchild);
9289
9290 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
9291 host->SetRootLayer(root);
9292
9293 // Check the non-skipped case.
9294 ExecuteCalculateDrawProperties(root.get());
9295 EXPECT_EQ(gfx::Rect(10, 10), grandchild->visible_rect_from_property_trees());
9296
9297 // Now we will reset the visible rect from property trees for the grandchild,
9298 // and we will configure |child| in several ways that should force the subtree
9299 // to be skipped. The visible content rect for |grandchild| should, therefore,
9300 // remain empty.
9301 grandchild->set_visible_rect_from_property_trees(gfx::Rect());
9302 gfx::Transform singular;
9303 singular.matrix().set(0, 0, 0);
9304
9305 child->SetTransform(singular);
9306 ExecuteCalculateDrawProperties(root.get());
9307 EXPECT_EQ(gfx::Rect(0, 0), grandchild->visible_rect_from_property_trees());
9308 child->SetTransform(identity);
9309
9310 child->SetHideLayerAndSubtree(true);
9311 ExecuteCalculateDrawProperties(root.get());
9312 EXPECT_EQ(gfx::Rect(0, 0), grandchild->visible_rect_from_property_trees());
9313 child->SetHideLayerAndSubtree(false);
9314
9315 child->SetOpacity(0.f);
9316 ExecuteCalculateDrawProperties(root.get());
9317 EXPECT_EQ(gfx::Rect(0, 0), grandchild->visible_rect_from_property_trees());
9318
9319 // Now, even though child has zero opacity, we will configure _grandchild_ in
ajuma 2015/04/27 19:54:22 s/_grandchild_/|grandchild| (also below in the imp
Ian Vollick 2015/04/27 20:13:05 Done.
9320 // several ways that should force the subtree to be processed anyhow.
9321 grandchild->SetTouchEventHandlerRegion(Region(gfx::Rect(0, 0, 10, 10)));
9322 ExecuteCalculateDrawProperties(root.get());
9323 EXPECT_EQ(gfx::Rect(10, 10), grandchild->visible_rect_from_property_trees());
9324 grandchild->set_visible_rect_from_property_trees(gfx::Rect());
9325 grandchild->SetTouchEventHandlerRegion(Region());
9326 ExecuteCalculateDrawProperties(root.get());
9327 EXPECT_EQ(gfx::Rect(0, 0), grandchild->visible_rect_from_property_trees());
9328 grandchild->set_visible_rect_from_property_trees(gfx::Rect());
9329
9330 greatgrandchild->RequestCopyOfOutput(
9331 CopyOutputRequest::CreateBitmapRequest(base::Bind(&CopyOutputCallback)));
9332 ExecuteCalculateDrawProperties(root.get());
9333 EXPECT_EQ(gfx::Rect(10, 10), grandchild->visible_rect_from_property_trees());
9334 }
9335
9336 TEST_F(LayerTreeHostCommonTest, SkippingSubtreeImpl) {
9337 FakeImplProxy proxy;
9338 TestSharedBitmapManager shared_bitmap_manager;
9339 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
9340
9341 gfx::Transform identity;
9342 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
9343 scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.active_tree(), 2);
9344 scoped_ptr<LayerImpl> grandchild =
9345 LayerImpl::Create(host_impl.active_tree(), 3);
9346
9347 scoped_ptr<FakeContentLayerImpl> greatgrandchild(
9348 FakeContentLayerImpl::Create(host_impl.active_tree(), 4));
9349
9350 child->SetDrawsContent(true);
9351 grandchild->SetDrawsContent(true);
9352 greatgrandchild->SetDrawsContent(true);
9353
9354 SetLayerPropertiesForTesting(root.get(), identity, gfx::Point3F(),
9355 gfx::PointF(), gfx::Size(100, 100), true, false,
9356 true);
9357 SetLayerPropertiesForTesting(child.get(), identity, gfx::Point3F(),
9358 gfx::PointF(), gfx::Size(10, 10), true, false,
9359 false);
9360 SetLayerPropertiesForTesting(grandchild.get(), identity, gfx::Point3F(),
9361 gfx::PointF(), gfx::Size(10, 10), true, false,
9362 false);
9363 SetLayerPropertiesForTesting(greatgrandchild.get(), identity, gfx::Point3F(),
9364 gfx::PointF(), gfx::Size(10, 10), true, false,
9365 true);
9366
9367 LayerImpl* child_ptr = child.get();
9368 LayerImpl* grandchild_ptr = grandchild.get();
9369 LayerImpl* greatgrandchild_ptr = greatgrandchild.get();
9370
9371 grandchild->AddChild(greatgrandchild.Pass());
9372 child->AddChild(grandchild.Pass());
9373 root->AddChild(child.Pass());
9374
9375 // Check the non-skipped case.
9376 ExecuteCalculateDrawProperties(root.get());
9377 EXPECT_EQ(gfx::Rect(10, 10),
9378 grandchild_ptr->visible_rect_from_property_trees());
9379
9380 // Now we will reset the visible rect from property trees for the grandchild,
9381 // and we will configure |child| in several ways that should force the subtree
9382 // to be skipped. The visible content rect for |grandchild| should, therefore,
9383 // remain empty.
9384 grandchild_ptr->set_visible_rect_from_property_trees(gfx::Rect());
9385 gfx::Transform singular;
9386 singular.matrix().set(0, 0, 0);
9387
9388 child_ptr->SetTransform(singular);
9389 ExecuteCalculateDrawProperties(root.get());
9390 EXPECT_EQ(gfx::Rect(0, 0),
9391 grandchild_ptr->visible_rect_from_property_trees());
9392 child_ptr->SetTransform(identity);
9393
9394 child_ptr->SetHideLayerAndSubtree(true);
9395 ExecuteCalculateDrawProperties(root.get());
9396 EXPECT_EQ(gfx::Rect(0, 0),
9397 grandchild_ptr->visible_rect_from_property_trees());
9398 child_ptr->SetHideLayerAndSubtree(false);
9399
9400 child_ptr->SetOpacity(0.f);
9401 ExecuteCalculateDrawProperties(root.get());
9402 EXPECT_EQ(gfx::Rect(0, 0),
9403 grandchild_ptr->visible_rect_from_property_trees());
9404
9405 // Now, even though child has zero opacity, we will configure _grandchild_ in
9406 // several ways that should force the subtree to be processed anyhow.
9407 grandchild_ptr->SetTouchEventHandlerRegion(Region(gfx::Rect(0, 0, 10, 10)));
9408 ExecuteCalculateDrawProperties(root.get());
9409 EXPECT_EQ(gfx::Rect(10, 10),
9410 grandchild_ptr->visible_rect_from_property_trees());
9411 grandchild_ptr->set_visible_rect_from_property_trees(gfx::Rect());
9412 grandchild_ptr->SetTouchEventHandlerRegion(Region());
9413 ExecuteCalculateDrawProperties(root.get());
9414 EXPECT_EQ(gfx::Rect(0, 0),
9415 grandchild_ptr->visible_rect_from_property_trees());
9416 grandchild_ptr->set_visible_rect_from_property_trees(gfx::Rect());
9417
9418 ScopedPtrVector<CopyOutputRequest> requests;
9419 requests.push_back(CopyOutputRequest::CreateEmptyRequest());
9420
9421 greatgrandchild_ptr->PassCopyRequests(&requests);
9422 ExecuteCalculateDrawProperties(root.get());
9423 EXPECT_EQ(gfx::Rect(10, 10),
9424 grandchild_ptr->visible_rect_from_property_trees());
9425 }
9426
9427 TEST_F(LayerTreeHostCommonTest, SkippingLayer) {
9428 gfx::Transform identity;
9429 FakeContentLayerClient client;
9430 scoped_refptr<Layer> root = Layer::Create();
9431 scoped_refptr<LayerWithForcedDrawsContent> child =
9432 make_scoped_refptr(new LayerWithForcedDrawsContent());
9433 SetLayerPropertiesForTesting(root.get(), identity, gfx::Point3F(),
9434 gfx::PointF(), gfx::Size(100, 100), true, false);
9435 SetLayerPropertiesForTesting(child.get(), identity, gfx::Point3F(),
9436 gfx::PointF(), gfx::Size(10, 10), true, false);
9437 root->AddChild(child);
9438
9439 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
9440 host->SetRootLayer(root);
9441
9442 ExecuteCalculateDrawProperties(root.get());
9443 EXPECT_EQ(gfx::Rect(10, 10), child->visible_rect_from_property_trees());
9444 child->set_visible_rect_from_property_trees(gfx::Rect());
9445
9446 child->SetHideLayerAndSubtree(true);
9447 ExecuteCalculateDrawProperties(root.get());
9448 EXPECT_EQ(gfx::Rect(0, 0), child->visible_rect_from_property_trees());
9449 child->SetHideLayerAndSubtree(false);
9450
9451 child->SetBounds(gfx::Size());
9452 ExecuteCalculateDrawProperties(root.get());
9453 EXPECT_EQ(gfx::Rect(0, 0), child->visible_rect_from_property_trees());
9454 child->SetBounds(gfx::Size(10, 10));
9455
9456 gfx::Transform rotate;
9457 child->SetDoubleSided(false);
9458 rotate.RotateAboutXAxis(180.f);
9459 child->SetTransform(rotate);
9460 ExecuteCalculateDrawProperties(root.get());
9461 EXPECT_EQ(gfx::Rect(0, 0), child->visible_rect_from_property_trees());
9462 child->SetDoubleSided(true);
9463 child->SetTransform(identity);
9464
9465 child->SetOpacity(0.f);
9466 ExecuteCalculateDrawProperties(root.get());
9467 EXPECT_EQ(gfx::Rect(0, 0), child->visible_rect_from_property_trees());
9468 }
9469
9261 } // namespace 9470 } // namespace
9262 } // namespace cc 9471 } // namespace cc
OLDNEW
« cc/trees/draw_property_utils.cc ('K') | « cc/trees/draw_property_utils.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698