layer_tree_host_unittest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/auto_reset.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/base/swap_promise.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/io_surface_layer.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/layers/solid_color_layer.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/layers/video_layer.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h" 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer.h" 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer_impl.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h" 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h" 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_video_frame_provider.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h" 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h" 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {}; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {} 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!impl->active_tree()->source_frame_number()) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(1, num_commits_); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(1, num_draws_); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest { 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {} 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (num_commits_) { 118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_commits_); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(1, num_draws_); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we pass property values in PushPropertiesTo. 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LayerTreeHostTestPushPropertiesTo : public LayerTreeHostTest { 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetupTree() OVERRIDE { 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<Layer> root = Layer::Create(); 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root->SetBounds(gfx::Size(10, 10)); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host()->SetRootLayer(root); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostTest::SetupTree(); 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum Properties { 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch STARTUP, 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BOUNDS, 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HIDE_LAYER_AND_SUBTREE, 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DRAWS_CONTENT, 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DONE, 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void BeginTest() OVERRIDE { 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index_ = STARTUP; 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PostSetNeedsCommitToMainThread(); 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VerifyAfterValues(impl->active_tree()->root_layer()); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetBeforeValues(layer_tree_host()->root_layer()); 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VerifyBeforeValues(layer_tree_host()->root_layer()); 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++index_; 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (index_ == DONE) { 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EndTest(); 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetAfterValues(layer_tree_host()->root_layer()); 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void AfterTest() OVERRIDE {} 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void VerifyBeforeValues(Layer* layer) { 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(gfx::Size(10, 10).ToString(), layer->bounds().ToString()); 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(layer->hide_layer_and_subtree()); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(layer->DrawsContent()); 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetBeforeValues(Layer* layer) { 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetBounds(gfx::Size(10, 10)); 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(false); 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetIsDrawable(false); 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void VerifyAfterValues(LayerImpl* layer) { 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (static_cast<Properties>(index_)) { 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case STARTUP: 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DONE: 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case BOUNDS: 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(gfx::Size(20, 20).ToString(), layer->bounds().ToString()); 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case HIDE_LAYER_AND_SUBTREE: 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(layer->hide_layer_and_subtree()); 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DRAWS_CONTENT: 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(layer->DrawsContent()); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetAfterValues(Layer* layer) { 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (static_cast<Properties>(index_)) { 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case STARTUP: 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DONE: 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case BOUNDS: 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetBounds(gfx::Size(20, 20)); 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case HIDE_LAYER_AND_SUBTREE: 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(true); 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DRAWS_CONTENT: 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetIsDrawable(true); 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int index_; 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesTo); 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {} 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redraw again to verify that the second redraw doesn't commit. 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_draws_); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(2, num_draws_); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_); 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect. 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest { 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedrawRect() 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_draws_(0), 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_(50, 50), 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalid_rect_(10, 10, 20, 20), 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_layer_(ContentLayer::Create(&client_)) {} 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(bounds_); 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF root_damage_rect; 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame_data->render_passes.empty()) 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this is the first frame, expect full frame damage. 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_)); 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that invalid_rect_ is indeed repainted. 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_)); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawRectToMainThread(invalid_rect_); 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(2, num_draws_); } 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Size bounds_; 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Rect invalid_rect_; 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest { 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_ = FakeContentLayer::Create(&client_); 341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->SetBounds(gfx::Size(1, 1)); 342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->AddChild(scaled_layer_); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 345b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 356bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 359b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scaled_layer_|, which should not generate 360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 365bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(2, layer_tree_host()->source_frame_number()); 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(4, 4).ToString(), 371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->content_bounds().ToString()); 372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<FakeContentLayer> scaled_layer_; 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 385b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_ = FakePaintedScrollbarLayer::Create( 3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) paint_scrollbar, has_thumb, root_layer_->id()); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(scrollbar_); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 414bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 416b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 417b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scrollbar_|, which should not generate 418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 419b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 423bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(2, layer_tree_host()->source_frame_number()); 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 427b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 428b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), 429b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scrollbar_->content_bounds().ToString()); 430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 434b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadback : public LayerTreeHostTest { 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadback() : num_commits_(0) {} 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadback); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws() 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_(0) {} 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 4) { 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackDuringForcedDraw 50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : public LayerTreeHostTest { 50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kFirstCommitSourceFrameNumber = 0; 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackSourceFrameNumber = 1; 50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackReplacementAndForcedDrawSourceFrameNumber = 2; 50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackDuringForcedDraw() 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : did_post_readback_(false) {} 51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This enables forced draws after a single prepare to draw failure. 51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = true; 51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kFirstCommitSourceFrameNumber || 52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber || 52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackReplacementAndForcedDrawSourceFrameNumber) 52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Before we react to the failed draw by initiating the forced draw 53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // sequence, start a readback on the main thread. 53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (sfn == kFirstCommitSourceFrameNumber && !did_post_readback_) { 53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) did_post_readback_ = true; 53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostReadbackToMainThread(); 53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Aborting for checkerboarding animations will result in a forced draw. 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only draw for the readback and the forced draw. 54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kReadbackSourceFrameNumber || 54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackReplacementAndForcedDrawSourceFrameNumber) 54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only swap for the forced draw. 55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kReadbackReplacementAndForcedDrawSourceFrameNumber) 55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool did_post_readback_; 56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackDuringForcedDraw); 56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackAfterForcedDraw 56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : public LayerTreeHostTest { 56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kFirstCommitSourceFrameNumber = 0; 56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kForcedDrawSourceFrameNumber = 1; 57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackSourceFrameNumber = 2; 57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackReplacementSourceFrameNumber = 3; 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This enables forced draws after a single prepare to draw failure. 57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = true; 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kFirstCommitSourceFrameNumber || 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kForcedDrawSourceFrameNumber || 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber || 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackReplacementSourceFrameNumber) 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Aborting for checkerboarding animations will result in a forced draw. 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host()->source_frame_number() == 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kForcedDrawSourceFrameNumber) { 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Avoid aborting the forced draw commit so source_frame_number 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // increments. 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else if (layer_tree_host()->source_frame_number() == 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kReadbackSourceFrameNumber) { 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Perform a readback immediately after the forced draw's commit. 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) char pixels[4]; 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only draw for the the forced draw, readback, and 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // replacement commit. 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kForcedDrawSourceFrameNumber || 61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber || 61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackReplacementSourceFrameNumber) 61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only swap for the forced draw and replacement commit. 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kForcedDrawSourceFrameNumber || 62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackReplacementSourceFrameNumber) 62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (sfn == kReadbackReplacementSourceFrameNumber) 62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackAfterForcedDraw); 63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetNextCommitForcesRedraw : public LayerTreeHostTest { 6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestSetNextCommitForcesRedraw() 6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : num_draws_(0), 6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bounds_(50, 50), 6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalid_rect_(10, 10, 20, 20), 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_layer_(ContentLayer::Create(&client_)) {} 6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetIsDrawable(true); 6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetBounds(bounds_); 6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (num_draws_ == 3 && host_impl->settings().impl_side_painting) 6554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->SetNeedsRedrawRect(invalid_rect_); 6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result); 6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::RectF root_damage_rect; 6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!frame_data->render_passes.empty()) 6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (num_draws_) { 6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect); 6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root_damage_rect); 6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(invalid_rect_, root_damage_rect); 6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect); 6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (num_draws_) { 6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cycle through a couple of empty commits to ensure we're observing the 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // right behavior 6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Should force full frame damage on the next commit 6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNextCommitForcesRedrawToMainThread(); 7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (host_impl->settings().impl_side_painting) 7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->BlockNotifyReadyToActivateForTesting(true); 7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) else 7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) num_draws_++; 7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->BlockNotifyReadyToActivateForTesting(false); 7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) num_draws_++; 7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 7154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(5, num_draws_); } 7174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int num_draws_; 7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Size bounds_; 7214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Rect invalid_rect_; 7224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 7234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 7244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 7254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNextCommitForcesRedraw); 7274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent then 7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// its damage is preserved until the next time it is drawn. 7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersDamageLater : public LayerTreeHostTest { 7311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 7321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LayerTreeHostTestUndrawnLayersDamageLater() 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : root_layer_(ContentLayer::Create(&client_)) {} 7341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 7361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer_->SetIsDrawable(true); 7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(50, 50)); 7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The initially transparent layer has a larger child layer, which is 7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // not initially drawn because of the this (parent) layer. 7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_ = FakeContentLayer::Create(&client_); 7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetBounds(gfx::Size(15, 15)); 7441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(0.0f); 7451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer_->AddChild(parent_layer_); 7461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) child_layer_ = FakeContentLayer::Create(&client_); 7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(25, 25)); 7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->AddChild(child_layer_); 7501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 7521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result); 7611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::RectF root_damage_rect; 7631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!frame_data->render_passes.empty()) 7641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 7651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The first time, the whole view needs be drawn. 7671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Afterwards, just the opacity of surface_layer1 is changed a few times, 7681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // and each damage should be the bounding box of it and its child. If this 7691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // was working improperly, the damage might not include its childs bounding 7701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // box. 7711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 7721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 1: 7731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(root_layer_->bounds()), root_damage_rect); 7741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 7751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2: 7761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3: 7771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 4: 7781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(child_layer_->bounds()), root_damage_rect); 7791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 7801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 7811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 7821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 7851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 7881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 7891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 1: 7901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Test not owning the surface. 7911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(1.0f); 7921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 7931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2: 7941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(0.0f); 7951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 7961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3: 7971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Test owning the surface. 7981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(0.5f); 7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetForceRenderSurface(true); 8001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 8011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 4: 8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EndTest(); 8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 8041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 8051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 8061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 8071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 8081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 8101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 8121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeContentLayerClient client_; 8131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 8141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<FakeContentLayer> parent_layer_; 8151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer_; 8161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 8171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestUndrawnLayersDamageLater); 8191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent, 821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// causing its content bounds to not be computed, then when it is later drawn, 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// its content bounds get pushed. 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersPushContentBoundsLater 824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostTest { 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTestUndrawnLayersPushContentBoundsLater() 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : root_layer_(Layer::Create()) {} 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) root_layer_->SetIsDrawable(true); 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(20, 20)); 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_ = Layer::Create(); 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->SetBounds(gfx::Size(20, 20)); 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->SetOpacity(0.0f); 837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) root_layer_->AddChild(parent_layer_); 838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) child_layer_ = Layer::Create(); 840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(15, 15)); 841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->AddChild(child_layer_); 842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 849a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* root = host_impl->active_tree()->root_layer(); 850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* parent = root->children()[0]; 851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* child = parent->children()[0]; 852a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 853a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 0: 855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0.f, parent->opacity()); 856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(gfx::SizeF(), child->content_bounds()); 857a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1.f, parent->opacity()); 860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(gfx::SizeF(15.f, 15.f), child->content_bounds()); 861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED(); 865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 870a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->SetOpacity(1.0f); 872a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 873a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 2: 874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 875a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 876a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED(); 877a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 878a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 879a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 882a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> root_layer_; 884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> parent_layer_; 885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> child_layer_; 886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTestUndrawnLayersPushContentBoundsLater); 890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the layerTreeHost says it can't draw, Then we should not try to draw. 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest { 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostTestCanDrawBlocksDrawing() : done_(false) {} 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (done_) 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only the initial draw should bring us here. 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (done_) 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (LastCommittedSourceFrameNumber(impl) >= 1) { 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // After the first commit, we should not be able to draw. 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make the viewport empty so the host says it can't draw. 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); 9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: { 9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char pixels[4]; 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Let it draw so we go idle and end the test. 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(1, 1)); 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) done_ = true; 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool done_; 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assertion. 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackWhileInvisible() : num_commits_(0) {} 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest { 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestAbortFrameWhenInvisible() {} 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request a commit (from the main thread), Which will trigger the commit 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // flow from the impl side. 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Then mark ourselves as not visible before processing any more messages 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // on the main thread. 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we make it without kicking a frame, we pass! 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTestAfterDelay(1); 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(true); 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side. 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest { 1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCommit() {} 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 101258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20), impl->DrawViewportSize()); 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color()); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree 102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure. 102690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails 102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public LayerTreeHostTest { 102890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 1029424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails() 1030424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : frame_count_with_pending_tree_(0) {} 103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 103690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE { 10404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(frame_count_with_pending_tree_, 0); 10414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) impl->BlockNotifyReadyToActivateForTesting(true); 10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void WillBeginImplFrameOnThread(LayerTreeHostImpl* impl, 1045424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const BeginFrameArgs& args) OVERRIDE { 10464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (impl->pending_tree()) 1047424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) frame_count_with_pending_tree_++; 10484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (frame_count_with_pending_tree_ == 1) { 10504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(first_frame_time_.ToInternalValue(), 0); 10514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) first_frame_time_ = impl->CurrentFrameTimeTicks(); 1052a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } else if (frame_count_with_pending_tree_ == 2) { 1053a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch impl->BlockNotifyReadyToActivateForTesting(false); 10544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1055424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1056424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1058424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (frame_count_with_pending_tree_ > 1) { 10594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_NE(first_frame_time_.ToInternalValue(), 0); 1060424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_NE(first_frame_time_.ToInternalValue(), 1061424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) impl->CurrentFrameTimeTicks().ToInternalValue()); 106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 106390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(impl->settings().impl_side_painting); 106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1069424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1070424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (impl->settings().impl_side_painting) 1071424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_NE(frame_count_with_pending_tree_, 1); 107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 1077424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int frame_count_with_pending_tree_; 107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails); 108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame. 108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest { 108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {} 108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame_++; 109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ == 1) { 110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_frame_time_ = impl->CurrentFrameTimeTicks(); 110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) impl->SetNeedsRedraw(); 110290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Since we might use a low-resolution clock on Windows, we need to 11041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // make sure that the clock has incremented past first_frame_time_. 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (first_frame_time_ == gfx::FrameTime::Now()) { 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 110790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks()); 111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure there isn't a commit between the two draws, to ensure that a 111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // commit isn't required for updating the current frame time. We can 111890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // only check for this in the multi-threaded case, since in the single- 111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // threaded case there will always be a commit between consecutive draws. 1120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) 112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0, frame_); 112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int frame_; 112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 113090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw); 113290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor. 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest { 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 11370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) LayerTreeHostTestStartPageScaleAnimation() {} 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 11420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) { 11430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scoped_refptr<FakePictureLayer> layer = 11440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FakePictureLayer::Create(&client_); 11450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) layer->set_always_update_resources(true); 11460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scroll_layer_ = layer; 11470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 11480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scroll_layer_ = FakeContentLayer::Create(&client_); 11490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 11500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Layer* root_layer = layer_tree_host()->root_layer(); 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetScrollClipLayerId(root_layer->id()); 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetIsContainerForFixedPositionLayers(true); 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetBounds(gfx::Size(2 * root_layer->bounds().width(), 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2 * root_layer->bounds().height())); 1156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(gfx::Vector2d()); 1157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer_); 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This test requires the page_scale and inner viewport layers to be 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // identified. 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->RegisterViewportLayers( 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_layer, scroll_layer_.get(), NULL); 11620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f); 1163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ApplyScrollAndScale(const gfx::Vector2d& scroll_delta, 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float scale) OVERRIDE { 1169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d offset = scroll_layer_->scroll_offset(); 1170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(offset + scroll_delta); 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f); 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We get one commit before the first draw, and the animation doesn't happen 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // until the second draw. 1177a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 0: 1179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 1180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We'll start an animation when we get back to the main thread. 1181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 1182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 1183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 1184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 1185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 1186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor()); 1187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 1188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 1189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 1190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 1191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1195bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 1196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 1197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->StartPageScaleAnimation( 1198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d(), false, 1.25f, base::TimeDelta()); 1199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1205a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FakeContentLayerClient client_; 12060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scoped_refptr<Layer> scroll_layer_; 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation); 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest { 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetVisible() : num_draws_(0) {} 1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is suppressed while we're invisible. 1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Triggers the redraw. 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(true); 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->visible()); 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); } 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible); 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient { 1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate() : test_layer_(0) {} 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void PaintContents(SkCanvas*, const gfx::Rect&, 12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::RectF*) OVERRIDE { 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set layer opacity to 0. 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (test_layer_) 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_->SetOpacity(0.f); 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 1251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool FillsBoundsCompletely() const OVERRIDE { return false; } 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* test_layer_; 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer { 1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<ContentLayerWithUpdateTracking> Create( 1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentLayerClient* client) { 1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new ContentLayerWithUpdateTracking(client)); 1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int PaintContentsCount() { return paint_contents_count_; } 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ResetPaintContentsCount() { paint_contents_count_ = 0; } 1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Update(ResourceUpdateQueue* queue, 1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>* occlusion) OVERRIDE { 12697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool updated = ContentLayer::Update(queue, occlusion); 1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_contents_count_++; 12717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return updated; 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit ContentLayerWithUpdateTracking(ContentLayerClient* client) 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client), paint_contents_count_(0) { 1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetAnchorPoint(gfx::PointF(0.f, 0.f)); 1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBounds(gfx::Size(10, 10)); 1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsDrawable(true); 1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ContentLayerWithUpdateTracking() {} 1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_contents_count_; 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources 1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit. 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest { 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestOpacityChange() 1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_opacity_change_delegate_(), 1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) update_check_layer_(ContentLayerWithUpdateTracking::Create( 1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &test_opacity_change_delegate_)) { 1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get()); 1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(update_check_layer_); 1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update() should have been called once. 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, update_check_layer_->PaintContentsCount()); 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate test_opacity_change_delegate_; 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_; 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer { 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) { 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new NoScaleContentLayer(client)); 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CalculateContentsScale(float ideal_contents_scale, 1327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float device_scale_factor, 1328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float page_scale_factor, 1329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch float maximum_animation_contents_scale, 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animating_transform_to_screen, 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_x, 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_y, 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size* contentBounds) OVERRIDE { 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Skip over the ContentLayer's method to the base Layer class. 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::CalculateContentsScale(ideal_contents_scale, 1336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) device_scale_factor, 1337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) page_scale_factor, 1338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch maximum_animation_contents_scale, 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) animating_transform_to_screen, 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_x, 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_y, 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentBounds); 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit NoScaleContentLayer(ContentLayerClient* client) 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client) {} 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~NoScaleContentLayer() {} 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers() 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(NoScaleContentLayer::Create(&client_)), 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_(ContentLayer::Create(&client_)) {} 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(60, 60)); 1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(1.5); 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size()); 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer_); 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(30, 30)); 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetIsDrawable(true); 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetPosition(gfx::Point(2, 2)); 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetBounds(gfx::Size(10, 10)); 1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should only do one commit. 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device scale factor should come over to impl. 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers are on impl. 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size()); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device viewport is scaled. 138958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), impl->DrawViewportSize()); 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* child = impl->active_tree()->root_layer()->children()[0]; 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Positions remain in layout pixels. 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(0, 0), root->position()); 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(2, 2), child->position()); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Compute all the layer transforms for the frame. 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData frame_data; 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->PrepareToDraw(&frame_data, gfx::Rect()); 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->DidDrawAllLayers(frame_data); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list = 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *frame_data.render_surface_layer_list; 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers should be drawing into the root render surface. 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, render_surface_layer_list.size()); 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(root->render_surface(), 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_surface_layer_list[0]->render_surface()); 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, root->render_surface()->layer_list().size()); 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root render surface is the size of the viewport. 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60), 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->render_surface()->content_rect()); 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The content bounds of the child should be scaled. 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size child_bounds_scaled = 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5)); 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(child_bounds_scaled, child->content_bounds()); 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform scale_transform; 1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scale_transform.Scale(impl->device_scale_factor(), 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->device_scale_factor()); 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root layer is scaled by 2x. 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_screen_space_transform = scale_transform; 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_draw_transform = scale_transform; 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_draw_transform, root->draw_transform()); 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_screen_space_transform, root->screen_space_transform()); 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The child is at position 2,2, which is transformed to 3,3 after the scale 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_screen_space_transform; 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_screen_space_transform.Translate(3.f, 3.f); 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_draw_transform = child_screen_space_transform; 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform, 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->draw_transform()); 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform, 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->screen_space_transform()); 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<NoScaleContentLayer> root_layer_; 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> child_layer_; 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers); 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures. 14563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest { 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 14590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure partial texture updates are turned off. 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 0; 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 1463424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) settings->scrollbar_animator = LayerTreeSettings::NoAnimator; 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_ = FakeContentLayer::Create(&client_); 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 14723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_ = FakePaintedScrollbarLayer::Create( 14733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) paint_scrollbar, has_thumb, layer_->id()); 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->AddChild(scrollbar_); 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 148390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 148490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = -1; 148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 148690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates); 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used texture is correct. 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 15063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures should be one for scrollbar layer since it was 15073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // requested and deleted on the impl-thread, and double for the content 15083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // layer since its first texture is used by impl thread and cannot by 15093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // used for update. 15103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(3u, context->NumTextures()); 15113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures used for commit should be one for each layer. 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First textures should not have been used. 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 15153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // New textures should have been used. 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (drew_frame_ == impl->active_tree()->source_frame_number()) { 153390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_; 153490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 153590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 153690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = impl->active_tree()->source_frame_number(); 153790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We draw/ship one texture each frame for each layer. 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 154123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 154223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!TestEnded()) 154323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetNeedsDisplay(); 1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected: 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 15563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_; 155790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int drew_frame_; 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( 15613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerTreeHostTestDirectRendererAtomicCommit); 15623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDelegatingRendererAtomicCommit 15643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : public LayerTreeHostTestDirectRendererAtomicCommit { 15653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 15663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 15673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates); 15683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 15703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 15723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 0: 15733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures should be one for each layer 15743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 15753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures used for commit should be one for each layer. 15763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 15773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Verify that used texture is correct. 15783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 15793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 15803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) context->ResetUsedTextures(); 15813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 15823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 1: 15833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures should be doubled as the first context layer 15843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // texture is being used by the impl-thread and cannot be used for 15853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // update. The scrollbar behavior is different direct renderer because 15863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // UI resource deletion with delegating renderer occurs after tree 15873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // activation. 15883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 15893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures used for commit should still be 15903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // one for each layer. 15913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 15923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // First textures should not have been used. 15933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 15943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 15953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // New textures should have been used. 15963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 15973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 15983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) context->ResetUsedTextures(); 15993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 16003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 2: 16013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EndTest(); 16023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 16033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 16043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NOTREACHED(); 16053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 16063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 16073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 16083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 16093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 161023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)MULTI_THREAD_DELEGATING_RENDERER_NOIMPL_TEST_F( 161123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) LayerTreeHostTestDelegatingRendererAtomicCommit); 1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer, 1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* parent, 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& transform, 16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& anchor, 16175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& position, 16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& bounds, 1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool opaque) { 1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->RemoveAllChildren(); 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent) 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent->AddChild(layer); 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(transform); 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetAnchorPoint(anchor); 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetPosition(position); 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(bounds); 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetContentsOpaque(opaque); 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 16340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Allow one partial texture update. 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 1; 1637a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // No partial updates when impl side painting is enabled. 1638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings->impl_side_painting = false; 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_ = FakeContentLayer::Create(&client_); 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->SetBounds(gfx::Size(10, 20)); 1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetPosition(gfx::Point(0, 10)); 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetBounds(gfx::Size(3, 10)); 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(child_); 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 165690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 165790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1658bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 165990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 1: 166090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplay(); 166190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 166290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 166390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 2: 166490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Damage part of layers. 166590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 166690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 166790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 166890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 3: 166990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 167090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 167190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 167290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 4: 167390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 167490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 167590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 5: 167690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 167790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 167890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 1679bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED() << layer_tree_host()->source_frame_number(); 168090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 168190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 168290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates); 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer. 1692a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1694a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used textures are correct. 1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 17014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 17024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Number of textures should be two for each content layer. 17034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 17044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 17054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 17064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 17074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 17084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // layer. 1711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 17144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // First content textures should not have been used. 17154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 17164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 17174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // New textures should have been used. 17184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 17194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 17204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 17214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 17224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 17234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 17244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 17254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 17304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 17314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Number of textures should be two for each content layer. 17324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 17334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 17344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 17354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 17364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 17374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // layer. 1740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 17434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // One content layer does a partial update also. 17444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 17454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(3))); 17464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 17474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 17484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 17494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 17504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 17514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No textures should be used for commit. 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Number of textures used for commit should be one, for the 1763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // content layer. 1764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1u, context->NumUsedTextures()); 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 177590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LT(impl->active_tree()->source_frame_number(), 5); 177690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for drawing should one per layer except for 1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // frame 3 where the viewport only contains one layer. 178190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 3) { 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, context->NumUsedTextures()); 178390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 17845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()) 17855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "For frame " << impl->active_tree()->source_frame_number(); 178690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1799a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer. 180090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1801a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestAtomicCommitWithPartialUpdate); 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest { 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestFinishAllRendering() : once_(false), draw_count_(0) {} 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (once_) 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) once_ = true; 1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) draw_count_ = 0; 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->FinishAllRendering(); 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, draw_count_); 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++draw_count_; 1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool once_; 1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Lock lock_; 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int draw_count_; 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering); 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest { 1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* root_layer = layer_tree_host()->root_layer(); 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels), 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect(0, 0, 1, 1)); 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->render_surface()); 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup); 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit 1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 18647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 18657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 18667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_layer_ = FakeContentLayer::Create(&client_); 1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 18687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 18697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer1_ = FakeContentLayer::Create(&client_); 1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetBounds(gfx::Size(100, 100)); 1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetForceRenderSurface(true); 1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetOpacity(0.5f); 18737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_layer_->AddChild(surface_layer1_); 18747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 18757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer2_ = FakeContentLayer::Create(&client_); 1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetBounds(gfx::Size(100, 100)); 1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetForceRenderSurface(true); 1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetOpacity(0.5f); 18797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer1_->AddChild(surface_layer2_); 1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer1_ = FakeContentLayer::Create(&client_); 1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetReplicaLayer(replica_layer1_.get()); 18837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 18847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer2_ = FakeContentLayer::Create(&client_); 1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetReplicaLayer(replica_layer2_.get()); 1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 18887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 18897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Renderer* renderer = host_impl->renderer(); 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderPass::Id surface1_render_pass_id = host_impl->active_tree() 18965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->root_layer() 18975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->children()[0] 18985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->render_surface() 18995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->RenderPassId(); 19005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderPass::Id surface2_render_pass_id = host_impl->active_tree() 19015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->root_layer() 19025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->children()[0] 19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->children()[0] 19045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->render_surface() 19055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->RenderPassId(); 1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 19095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 19105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id)); 19115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 19125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id)); 1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reduce the memory limit to only fit the root layer and one render 1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // surface. This prevents any contents drawing into surfaces 1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from being allocated. 1917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) host_impl->SetMemoryPolicy(ManagedMemoryPolicy(100 * 100 * 4 * 2)); 1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE( 19215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id)); 19225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE( 19235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id)); 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1931bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (layer_tree_host()->source_frame_number() < 2) 1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetNeedsDisplay(); 1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 19367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, root_layer_->update_count()); 19377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, surface_layer1_->update_count()); 19387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, surface_layer2_->update_count()); 1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 1943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer1_; 1944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer1_; 1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer2_; 1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer2_; 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Surfaces don't exist with a delegated renderer. 19508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( 1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit); 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer { 1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<EvictionTestLayer> Create() { 1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new EvictionTestLayer()); 1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool Update(ResourceUpdateQueue*, 1960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>*) OVERRIDE; 1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool DrawsContent() const OVERRIDE { return true; } 1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE; 1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE; 1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE; 1967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HaveBackingTexture() const { 1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return texture_.get() ? texture_->have_backing_texture() : false; 1970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayer() : Layer() {} 1974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayer() {} 1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CreateTextureIfNeeded() { 1977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (texture_) 1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_ = PrioritizedResource::Create( 1980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()); 1981d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) texture_->SetDimensions(gfx::Size(10, 10), RGBA_8888); 1982effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bitmap_.allocN32Pixels(10, 10); 1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture_; 1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap bitmap_; 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl { 1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl, 1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id) { 1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id)); 1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayerImpl() {} 1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AppendQuads(QuadSink* quad_sink, 1998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuadsData* append_quads_data) OVERRIDE { 1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(has_texture_); 2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources()); 2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetHasTexture(bool has_texture) { has_texture_ = has_texture; } 2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id) 2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerImpl(tree_impl, id), has_texture_(false) {} 2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_texture_; 2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) { 2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_->set_request_priority(PriorityCalculator::UIPriority(true)); 2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool EvictionTestLayer::Update(ResourceUpdateQueue* queue, 2020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>* occlusion) { 2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 20237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect full_rect(0, 0, 10, 10); 2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d()); 2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->AppendFullUpload(upload); 20297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl( 2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeImpl* tree_impl) { 2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return EvictionTestLayerImpl::Create(tree_impl, layer_id_) 2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .PassAs<LayerImpl>(); 2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) { 2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::PushPropertiesTo(layer_impl); 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl* test_layer_impl = 2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<EvictionTestLayerImpl*>(layer_impl); 2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_impl->SetHasTexture(texture_->have_backing_texture()); 2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest { 2047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestEvictTextures() 2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(EvictionTestLayer::Create()), 2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_(0), 2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform identity_matrix; 2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetLayerPropertiesForTesting(layer_.get(), 2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) identity_matrix, 2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size(10, 20), 2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PostEvictTextures() { 2070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 2071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread, 2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void EvictTexturesOnImplThread() { 2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(impl_for_evict_textures_); 2078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_for_evict_textures_->EvictTexturesForTesting(); 2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 1: Just commit and draw normally, then post an eviction at the end 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that will trigger a commit. 2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 2: Triggered by the eviction, let it go through and then set 2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction 2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // task, which will be handled before the commit. Don't set needsCommit, it 2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should have been posted. A frame should not be drawn (note, 2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // didCommitAndDrawFrame may be called anyway). 2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 4: Triggered by the eviction, let it go through and then set 2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 5: Triggered by the setNeedsCommit, post an eviction task in 2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), a frame should not be drawn but a commit will be posted. 2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 6: Triggered by the eviction, post an eviction task in 2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), which will be a noop, letting the commit (which recreates the 2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // textures) go through and draw a frame, then end the test. 2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 1+2 test the eviction recovery path where eviction happens outside 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the beginFrame/commit pair. 2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 3+4 test the eviction recovery path where eviction happens inside 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the beginFrame/commit pair. 2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 5+6 test the path where an eviction happens during the eviction 2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // recovery path. 2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_ = impl; 2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 3, 2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 5, 2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<EvictionTestLayer> layer_; 2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* impl_for_evict_textures_; 2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestEvictTextures); 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest { 2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousCommit() 2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit); 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest { 2217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousInvalidate() 2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_ = ContentLayer::Create(&client_); 2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetBounds(gfx::Size(10, 10)); 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetPosition(gfx::PointF(0.f, 0.f)); 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetIsDrawable(true); 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_layer_); 2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetNeedsDisplay(); 2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 2244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 2254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 2255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> content_layer_; 2260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 2261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestContinuousInvalidate); 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { 2267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeferCommits() 2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_deferred_(0), num_complete_commits_(0) {} 2270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_deferred_++; 2275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 2276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_complete_commits_++; 2280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_complete_commits_) { 2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_commits_deferred_); 2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_deferred_); 2297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_complete_commits_); 2298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_deferred_; 2302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_complete_commits_; 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost { 2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, 2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerTreeSettings& settings, 2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy) 23121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : LayerTreeHost(client, NULL, settings) { 2313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) proxy->SetLayerTreeHost(this); 23145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeForTesting(proxy.PassAs<Proxy>()); 2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) { 2319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are not allowed, max updates should be 0. 2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 2324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = false; 2325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, host.MaxPartialTextureUpdates()); 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should be limited by the proxy. 2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(5u, host.MaxPartialTextureUpdates()); 2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should also be limited by the settings. 2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(20); 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(10u, host.MaxPartialTextureUpdates()); 2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) { 2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 237923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 238023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 238123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded( 238223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &client, &client, shared_bitmap_manager.get(), settings); 2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) { 2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE); 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 239323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 239423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 239523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded( 239623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &client, &client, shared_bitmap_manager.get(), settings); 2397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 2398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) { 2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D); 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 240723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 240823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 240923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded( 241023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &client, &client, shared_bitmap_manager.get(), settings); 2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 24124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, host->MaxPartialTextureUpdates()); 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PartialUpdatesWithDelegatingRendererAndSoftwareContent) { 2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE); 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 242323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 242423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::CreateSingleThreaded( 242523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &client, &client, shared_bitmap_manager.get(), settings); 2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 24274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, host->MaxPartialTextureUpdates()); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted 2431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted() 2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(FakeContentLayer::Create(&client_)), 2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_(FakeContentLayer::Create(&client_)), 2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_(FakeContentLayer::Create(&client_)), 2437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 2438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100)); 2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_->SetBounds(gfx::Size(100, 100)); 2443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_->SetBounds(gfx::Size(100, 100)); 2444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer1_); 2445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer2_); 2446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 2447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl, 2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool visible) OVERRIDE { 24520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (visible) { 24530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // One backing should remain unevicted. 24540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ( 24550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 100u * 100u * 4u * 1u, 24560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 24570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 24580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ( 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0u, layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 24600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 24610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that contents textures are marked as having been 2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // purged. 2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged()); 2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // End the test in this state. 2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All three backings should have memory. 2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 3u, 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set a new policy that will kick out 1 of the 3 resources. 2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because a resource was evicted, a commit will be kicked off. 2479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_impl->SetMemoryPolicy( 2480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy(100 * 100 * 4 * 2, 24811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING, 2482a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1000)); 2483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only two backings should have memory. 2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 2u, 2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Become backgrounded, which will cause 1 more resource to be 2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // evicted. 2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No further commits should happen because this is not visible 2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // anymore. 2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 2506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer1_; 2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer2_; 2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { 2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class NotificationClient : public ContentLayerClient { 2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient() 2519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(0), paint_count_(0), lcd_notification_count_(0) {} 2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count() const { return paint_count_; } 2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count() const { return lcd_notification_count_; } 2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 25265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& clip, 2527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 2528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++paint_count_; 2529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE { 2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++lcd_notification_count_; 2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool FillsBoundsCompletely() const OVERRIDE { return false; } 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count_; 2539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count_; 2540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 2541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 2546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 2549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The expecations are based on the assumption that the default 2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD settings are: 2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); 2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->can_use_lcd_text()); 2554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2562bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The first update consists one LCD notification and one paint. 2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been enabled on the layer. 2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since nothing changed on layer, there should be no notification 2573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or paint on the second update. 2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must not have changed. 2577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Change layer opacity that should trigger lcd notification. 2579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetOpacity(.5f); 2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to request a commit - setting opacity will do it. 2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that there is not extra commit due to layer invalidation. 2584bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(3, layer_tree_host()->source_frame_number()); 2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD notification count should have incremented due to 2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // change in layer opacity. 2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.lcd_notification_count()); 2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Paint count should be incremented due to invalidation. 2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.paint_count()); 2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been disabled on the layer due to opacity. 2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient client_; 2599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification); 2602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Verify that the BeginFrame notification is used to initiate rendering. 2604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { 2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 26071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) settings->begin_impl_frame_scheduling_enabled = true; 2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // This will trigger a SetNeedsBeginFrame which will trigger a 2612a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // BeginFrame. 2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 2617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 26195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 26215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DrawSwapReadbackResult::DRAW_SUCCESS; 2622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks frame_time_; 2628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2630a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification); 2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2632a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled 2633a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) : public LayerTreeHostTest { 2634a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 2635a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 26361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) settings->begin_impl_frame_scheduling_enabled = true; 263790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->using_synchronous_renderer_compositor = true; 2638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2640a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2643a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The BeginFrame notification is turned off now but will get enabled 264490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // once we return. End test while it's enabled. 2645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 2646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 2647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&LayerTreeHostTestBeginFrameNotification::EndTest, 2648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 2649a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2652a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 2653a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 265490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F( 2655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled); 2656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 26574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStall : public LayerTreeHostTest { 265858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 26594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStall() 26605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : commit_count_(0), commit_abort_count_(0), commit_complete_count_(0) {} 266158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 266258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 26631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) settings->begin_impl_frame_scheduling_enabled = true; 266458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 266558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 266658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 266758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 266858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 266958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) commit_count_++; 26705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (commit_count_ == 4) { 26715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // After two aborted commits, request a real commit now to make sure a 267258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // real commit following an aborted commit will still complete and 267358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // end the test even when the Impl thread is idle. 267458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 267558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 267658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 267758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, 26795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_handle) OVERRIDE { 26805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commit_abort_count_++; 26815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initiate another abortable commit. 26825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl->SetNeedsCommit(); 26835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 26845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 268558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 268658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) commit_complete_count_++; 268758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (commit_complete_count_ == 1) { 26885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initiate an abortable commit after the first commit. 268958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_impl->SetNeedsCommit(); 269058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 269158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 269258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 269358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 269458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 269558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 26965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(commit_count_, 5); 26975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(commit_abort_count_, 3); 269858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(commit_complete_count_, 2); 269958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 270058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 270158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int commit_count_; 27025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int commit_abort_count_; 270358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int commit_complete_count_; 270458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 270558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor 27074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTestAbortedCommitDoesntStall { 27084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 27094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings); 27104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) settings->using_synchronous_renderer_compositor = true; 27114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 27124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 27134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 271458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F( 27154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor); 27164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 27174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync 27184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTestAbortedCommitDoesntStall { 27194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 27204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings); 27214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) settings->throttle_frame_production = false; 27224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 27234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 27244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 27254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync); 272658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation 2728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->impl_side_painting = true; 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 27362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> layer = PictureLayer::Create(&client_); 2738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); 2739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 2740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 2741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 2755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation); 27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents 2758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class SetBoundsClient : public ContentLayerClient { 2761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient() : layer_(0) {} 27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 27675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& clip, 2768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 2769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(2, 2)); 27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool FillsBoundsCompletely() const OVERRIDE { return false; } 2775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 2798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 2799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds()); 2801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds()); 2804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient client_; 2810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents); 2814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public TestWebGraphicsContext3D { 2816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2817424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MockIOSurfaceWebGraphicsContext3D() { 28185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_capabilities_.gpu.iosurface = true; 28195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_capabilities_.gpu.texture_rectangle = true; 2820424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2821424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 28225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual GLuint createTexture() OVERRIDE { 2823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 1; 2824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 28255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(activeTexture, void(GLenum texture)); 28265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD2(bindTexture, void(GLenum target, 28275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint texture_id)); 28285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD3(texParameteri, void(GLenum target, 28295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLenum pname, 28305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint param)); 28315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(GLenum target, 28325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint width, 28335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint height, 28345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint ioSurfaceId, 28355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint plane)); 28365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD4(drawElements, void(GLenum mode, 28375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLsizei count, 28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLenum type, 28395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLintptr offset)); 28405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(deleteTexture, void(GLenum texture)); 2841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest { 2844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 28455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 2846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 28473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<MockIOSurfaceWebGraphicsContext3D> mock_context_owned( 2848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new MockIOSurfaceWebGraphicsContext3D); 28493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mock_context_ = mock_context_owned.get(); 28503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 28515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::Create3d( 28525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_context_owned.PassAs<TestWebGraphicsContext3D>()); 2853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetIsDrawable(false); 2859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_id_ = 9; 2861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_ = gfx::Size(6, 7); 2862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create(); 2864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetBounds(gfx::Size(10, 10)); 2865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetAnchorPoint(gfx::PointF()); 2866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIsDrawable(true); 2867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_); 2868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(io_surface_layer); 2869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In WillDraw, the IOSurfaceLayer sets up the io surface texture. 2875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(_)).Times(0); 2877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 28795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 28805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri( 28815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR)) 2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 28835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 28845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri( 28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR)) 2886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 28885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri(GL_TEXTURE_RECTANGLE_ARB, 28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_WRAP_S, 28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_CLAMP_TO_EDGE)).Times(1); 28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri(GL_TEXTURE_RECTANGLE_ARB, 28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_WRAP_T, 28945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_CLAMP_TO_EDGE)).Times(1); 28955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 28975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texImageIOSurface2DCHROMIUM(GL_TEXTURE_RECTANGLE_ARB, 28985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_surface_size_.width(), 28995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_surface_size_.height(), 29005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_surface_id_, 29015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0)).Times(1); 29025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(_, 0)).Times(AnyNumber()); 29045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 29055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 2907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 29095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 2910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 2911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The io surface layer's texture is drawn. 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)).Times(AtLeast(1)); 2914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _)) 2917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 2920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 29243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 29253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*mock_context_, deleteTexture(1)).Times(1); 2926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int io_surface_id_; 2932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIOSurfaceWebGraphicsContext3D* mock_context_; 2933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size io_surface_size_; 2934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 29352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2936a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 2937a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 2938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestIOSurfaceDrawing); 2939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2940b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest { 2941b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 2942a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2943a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_ = 0; 2944a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2945b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2946b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2947b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1: commit + draw 2948b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2: commit only (no draw/swap) 2949b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3: draw only (no commit) 2950b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 4: composite & readback (2 commits, no draw/swap) 2951b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 5: commit + draw 2952b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2953b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2954bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int commit = layer_tree_host()->source_frame_number(); 2955b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (commit) { 2956b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2957b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2 done. 2958b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, frame_); 2959b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2960b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2961b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 3: 2962b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // CompositeAndReadback in Round 4, first commit. 2963b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, frame_); 2964b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2965b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 4: 2966b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 4 done. 2967b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, frame_); 2968b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2970b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2971b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2972b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2973b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2974b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 2975bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int commit = layer_tree_host()->source_frame_number(); 2976b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ++frame_; 2977b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) char pixels[4] = {0}; 2978b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (frame_) { 2979b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 1: 2980b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1 done. 2981b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, commit); 2982b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2983b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2984b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2985b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3 done. 2986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, commit); 2987b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(0, 0, 1, 1)); 2988b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2989b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 3: 2990b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 5 done. 2991b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(5, commit); 2992b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EndTest(); 2993b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2995b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2996b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2998b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2999b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 3000b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int frame_; 3001b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 3002b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3003effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Flaky on all platforms: http://crbug.com/327498 3004effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_DelegatingRenderer) { 3005a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 3006b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 3007b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3008effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_GLRenderer) { 3009a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 3010b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 3011b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LayerTreeHostTestDeferredInitialize : public LayerTreeHostTest { 3013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 3014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 3015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // PictureLayer can only be used with impl side painting enabled. 3016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) settings->impl_side_painting = true; 3017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 3020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer_ = FakePictureLayer::Create(&client_); 3021558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Force commits to not be aborted so new frames get drawn, otherwise 3022558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // the renderer gets deferred initialized but nothing new needs drawing. 3023558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_->set_always_update_resources(true); 3024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 3025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 3026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 30297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_initialize_gl_ = false; 30307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_release_gl_ = false; 3031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_source_frame_number_drawn_ = -1; // Never drawn. 3032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 3036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 3037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d( 3038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestWebGraphicsContext3D::Create()); 3039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return FakeOutputSurface::CreateDeferredGL( 30415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice)); 3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(host_impl->RootLayer()); 3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakePictureLayerImpl* layer_impl = 3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<FakePictureLayerImpl*>(host_impl->RootLayer()); 3048ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3049ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // The same frame can be draw multiple times if new visible tiles are 3050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // rasterized. But we want to make sure we only post DeferredInitialize 3051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // and ReleaseGL once, so early out if the same frame is drawn again. 3052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (last_source_frame_number_drawn_ == 3053ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_impl->active_tree()->source_frame_number()) 3054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 3055ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3056ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_source_frame_number_drawn_ = 3057ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_impl->active_tree()->source_frame_number(); 3058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 30597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!did_initialize_gl_) { 3060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_LE(1u, layer_impl->append_quads_count()); 30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ImplThreadTaskRunner()->PostTask( 30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind( 30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestDeferredInitialize::DeferredInitializeAndRedraw, 30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this), 30667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(host_impl))); 30677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (did_initialize_gl_ && !did_release_gl_) { 3068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_LE(2u, layer_impl->append_quads_count()); 30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ImplThreadTaskRunner()->PostTask( 30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 30715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostTestDeferredInitialize::ReleaseGLAndRedraw, 30725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 30735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(host_impl))); 30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (did_initialize_gl_ && did_release_gl_) { 3075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_LE(3u, layer_impl->append_quads_count()); 30767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 3077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DeferredInitializeAndRedraw(LayerTreeHostImpl* host_impl) { 30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(did_initialize_gl_); 30827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // SetAndInitializeContext3D calls SetNeedsCommit. 30833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FakeOutputSurface* fake_output_surface = 30843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<FakeOutputSurface*>(host_impl->output_surface()); 30853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<TestContextProvider> context_provider = 30863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestContextProvider::Create(); // Not bound to thread. 30875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 30885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fake_output_surface->InitializeAndSetContext3d(context_provider, NULL)); 30897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_initialize_gl_ = true; 30907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ReleaseGLAndRedraw(LayerTreeHostImpl* host_impl) { 30937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_initialize_gl_); 30947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(did_release_gl_); 30957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // ReleaseGL calls SetNeedsCommit. 30967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<FakeOutputSurface*>(host_impl->output_surface())->ReleaseGL(); 30977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_release_gl_ = true; 3098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 31017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_initialize_gl_); 31027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_release_gl_); 3103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 3106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakeContentLayerClient client_; 3107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<FakePictureLayer> layer_; 31087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_initialize_gl_; 31097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_release_gl_; 3110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int last_source_frame_number_drawn_; 3111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 3112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize); 3114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test for UI Resource management. 3116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUIResource : public LayerTreeHostTest { 3117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 31185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostTestUIResource() : num_ui_resources_(0) {} 3119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 31200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 31210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 31220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 31230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 3125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 31275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame = layer_tree_host()->source_frame_number(); 3128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (frame) { 3129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 3130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 3131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 3132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 3134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 3135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Usually ScopedUIResource are deleted from the manager in their 3136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // destructor. Here we just want to test that a direct call to 3137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // DeleteUIResource works. 3138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(ui_resources_[0]->id()); 3139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 3141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 3142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // DeleteUIResource can be called with an invalid id. 3143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(ui_resources_[0]->id()); 3144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 3146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 3147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 3148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 3149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 3151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 3152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ClearResources(); 3153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 3154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 3155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void PerformTest(LayerTreeHostImpl* impl) { 31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 3160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 31615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame = impl->active_tree()->source_frame_number(); 3162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (frame) { 31635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0: 3164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 3165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 31665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 3167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Created two textures. 3168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 3169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 3171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // One texture left after one deletion. 3172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 3173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 3175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Resource manager state should not change when delete is called on an 3176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalid id. 3177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 3178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 3180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Creation after deletion: two more creates should total up to 3181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // three textures. 3182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(3u, context->NumTextures()); 3183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 3184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 3188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!layer_tree_host()->settings().impl_side_painting) 3189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PerformTest(impl); 3190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 3193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) 3194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PerformTest(impl); 3195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 3198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 3200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Must clear all resources before exiting. 3201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void ClearResources() { 3202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int i = 0; i < num_ui_resources_; i++) 3203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resources_[i].reset(); 3204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CreateResource() { 3207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resources_[num_ui_resources_++] = 3208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FakeScopedUIResource::Create(layer_tree_host()); 3209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resources_[5]; 3212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int num_ui_resources_; 3213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 3214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUIResource); 3216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PushPropertiesCountingLayerImpl : public LayerImpl { 32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static scoped_ptr<PushPropertiesCountingLayerImpl> Create( 32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeImpl* tree_impl, int id) { 32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return make_scoped_ptr(new PushPropertiesCountingLayerImpl(tree_impl, id)); 32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~PushPropertiesCountingLayerImpl() {} 32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE { 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerImpl::PushPropertiesTo(layer); 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) push_properties_count_++; 32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Push state to the active tree because we can only access it from there. 32305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PushPropertiesCountingLayerImpl*>( 32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer)->push_properties_count_ = push_properties_count_; 32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PushPropertiesCountingLayerImpl::Create(tree_impl, id()). 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PassAs<LayerImpl>(); 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t push_properties_count() const { return push_properties_count_; } 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void reset_push_properties_count() { push_properties_count_ = 0; } 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t push_properties_count_; 32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl(LayerTreeImpl* tree_impl, int id) 32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : LayerImpl(tree_impl, id), 32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) push_properties_count_(0) { 32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetAnchorPoint(gfx::PointF()); 32505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBounds(gfx::Size(1, 1)); 32515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PushPropertiesCountingLayer : public Layer { 32557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 32567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static scoped_refptr<PushPropertiesCountingLayer> Create() { 32577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new PushPropertiesCountingLayer(); 32587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE { 32617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Layer::PushPropertiesTo(layer); 32627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch push_properties_count_++; 32637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (persist_needs_push_properties_) 32647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch needs_push_properties_ = true; 32657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PushPropertiesCountingLayerImpl::Create(tree_impl, id()). 32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PassAs<LayerImpl>(); 32715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t push_properties_count() const { return push_properties_count_; } 32747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void reset_push_properties_count() { push_properties_count_ = 0; } 32757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_persist_needs_push_properties(bool persist) { 32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch persist_needs_push_properties_ = persist; 32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 32817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PushPropertiesCountingLayer() 32825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : push_properties_count_(0), persist_needs_push_properties_(false) { 32837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetAnchorPoint(gfx::PointF()); 32847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetBounds(gfx::Size(1, 1)); 32857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetIsDrawable(true); 32867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~PushPropertiesCountingLayer() {} 32887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t push_properties_count_; 32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool persist_needs_push_properties_; 32917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 32927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestLayersPushProperties : public LayerTreeHostTest { 32947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 32957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 32967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_commits_ = 0; 32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_root_ = 0; 32987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child_ = 0; 32997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild_ = 0; 33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child2_ = 0; 33017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_other_root_ = 0; 33027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_leaf_layer_ = 0; 33037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 33047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 33077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = PushPropertiesCountingLayer::Create(); 33087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_ = PushPropertiesCountingLayer::Create(); 33097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_ = PushPropertiesCountingLayer::Create(); 33107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_ = PushPropertiesCountingLayer::Create(); 33114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_ = PushPropertiesCountingLayer::Create(); 33124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_->set_persist_needs_push_properties(true); 33137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 33157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child2_); 33167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild_); 33174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) child2_->AddChild(leaf_always_pushing_layer_); 33187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_root_ = PushPropertiesCountingLayer::Create(); 33207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Don't set the root layer here. 33227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 33267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++num_commits_; 33277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_root_, root_->push_properties_count()); 33297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_child_, child_->push_properties_count()); 33307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_grandchild_, 33317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->push_properties_count()); 33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_child2_, 33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->push_properties_count()); 33347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_other_root_, 33357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_root_->push_properties_count()); 33363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expected_push_properties_leaf_layer_, 33374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_->push_properties_count()); 33387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The scrollbar layer always needs to be pushed. 33407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (root_->layer_tree_host()) { 33417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 33427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 33437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (child2_->layer_tree_host()) { 33457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child2_->descendant_needs_push_properties()); 33467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child2_->needs_push_properties()); 33477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (leaf_always_pushing_layer_->layer_tree_host()) { 33494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 33504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_->descendant_needs_push_properties()); 33514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(leaf_always_pushing_layer_->needs_push_properties()); 33527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // child_ and grandchild_ don't persist their need to push properties. 33557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (child_->layer_tree_host()) { 33567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (grandchild_->layer_tree_host()) { 33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild_->descendant_needs_push_properties()); 33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild_->needs_push_properties()); 33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (other_root_->layer_tree_host()) { 33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(other_root_->descendant_needs_push_properties()); 33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(other_root_->needs_push_properties()); 33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (num_commits_) { 33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 33737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_root_; 33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 3: 33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(other_root_); 33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_other_root_; 33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 4: 33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_root_; 33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 5: 33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 6: 34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 7: 34047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 8: 34107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->RemoveFromParent(); 34117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 34127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 9: 34147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild_); 34157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 34167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 34177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 10: 34197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 34207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 34217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 11: 34237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.8f, 1.1f); 34247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 34257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 12: 34277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 34287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 34297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 34307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 13: 34327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->SetPosition(gfx::Point(1, 1)); 34337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 34347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 34357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 14: 34377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 34387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 34397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 34407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 34417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 34427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 15: 34447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->SetPosition(gfx::Point(1, 1)); 34457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 34467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 34477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 16: 3449558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // SetNeedsDisplay does not always set needs commit (so call it 3450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // explicitly), but is a property change. 34517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetNeedsDisplay(); 34527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 3453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 34547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 17: 34567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 34577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The leaf layer always pushes. 34614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (leaf_always_pushing_layer_->layer_tree_host()) 34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_leaf_layer_; 34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int num_commits_; 34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> root_; 34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child_; 34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child2_; 34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild_; 34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> other_root_; 34744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<PushPropertiesCountingLayer> leaf_always_pushing_layer_; 34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_root_; 34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child_; 34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child2_; 34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild_; 34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_other_root_; 34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_leaf_layer_; 34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestLayersPushProperties); 34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestImplLayersPushProperties 34865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostTestLayersPushProperties { 34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 34895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_root_impl_ = 0; 34905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child_impl_ = 0; 34915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild_impl_ = 0; 34925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_ = 0; 34935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 34945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostTestLayersPushProperties::BeginTest(); 34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 34985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // These commits are in response to the changes made in 34995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // LayerTreeHostTestLayersPushProperties::DidCommitAndDrawFrame() 35005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_commits_) { 35015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0: 35025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tree hasn't been setup yet don't bother to check anything. 35035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 35045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 35055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Root gets set up, Everyone is initialized. 35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_root_impl_; 35075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child_impl_; 35085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 35105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 35115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 35135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tree doesn't change but the one leaf that always pushes is pushed. 35145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 35155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 35175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Root is swapped here. 35185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear the expected push properties the tree will be rebuilt. 35195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_root_impl_ = 0; 35205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child_impl_ = 0; 35215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild_impl_ = 0; 35225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_ = 0; 35235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 35245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure the new root is pushed. 35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1u, static_cast<PushPropertiesCountingLayerImpl*>( 35275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl->RootLayer())->push_properties_count()); 35285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 35295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 35305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Root is swapped back all of the layers in the tree get pushed. 35315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_root_impl_; 35325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child_impl_; 35335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 35355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 35365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 5: 35385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tree doesn't change but the one leaf that always pushes is pushed. 35395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 35405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 6: 35425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First child is removed. Structure of the tree changes here so swap 35435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // some of the values. child_impl becomes child2_impl. 35445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child_impl_ = 35455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_; 35465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_ = 0; 35475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // grandchild_impl becomes grandchild2_impl. 35485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild_impl_ = 35495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_; 35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 35515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // grandchild_impl is now the leaf that always pushes. It is pushed. 35535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 7: 35565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 35575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Child is added back. New layers are initialized. 35605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 35615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 35625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 8: 35645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Leaf is removed. 35655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 35665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Always pushing. 35685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 9: 35715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Leaf is added back 35725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 35735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 35755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 10: 35785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 35795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 11: 35825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 35835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 12: 35865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 35875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This child position was changed. 35905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 35915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 13: 35935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The position of this child was changed. 35945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child_impl_; 35955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 35975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 35985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 35995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 14: 36005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second child is removed from tree. Don't discard counts because 36015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // they are added back before commit. 36025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 36045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 36055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second child added back. 36075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 36085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 36095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 36115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 15: 36125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The position of this child was changed. 36135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 36145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 36165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 36175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 36185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 16: 36195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second child is invalidated with SetNeedsDisplay 36205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 36215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushed is pushed. 36235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 36245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 36255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 36265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* root_impl_ = NULL; 36285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* child_impl_ = NULL; 36295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* child2_impl_ = NULL; 36305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* grandchild_impl_ = NULL; 36315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* leaf_always_pushing_layer_impl_ = NULL; 36325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Pull the layers that we need from the tree assuming the same structure 36345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // as LayerTreeHostTestLayersPushProperties 36355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 36365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl->RootLayer()); 36375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (root_impl_ && root_impl_->children().size() > 0) { 36395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 36405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_->children()[0]); 36415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child_impl_ && child_impl_->children().size() > 0) 36435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) grandchild_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 36445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_impl_->children()[0]); 36455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 36465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (root_impl_ && root_impl_->children().size() > 1) { 36485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child2_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 36495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_->children()[1]); 36505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child2_impl_ && child2_impl_->children().size() > 0) 36525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leaf_always_pushing_layer_impl_ = 36535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PushPropertiesCountingLayerImpl*>( 36545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child2_impl_->children()[0]); 36555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 36565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (root_impl_) 36585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_root_impl_, 36595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_->push_properties_count()); 36605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child_impl_) 36615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_child_impl_, 36625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_impl_->push_properties_count()); 36635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (grandchild_impl_) 36645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_grandchild_impl_, 36655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) grandchild_impl_->push_properties_count()); 36665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child2_impl_) 36675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_child2_impl_, 36685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child2_impl_->push_properties_count()); 36695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (leaf_always_pushing_layer_impl_) 36705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_grandchild2_impl_, 36715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leaf_always_pushing_layer_impl_->push_properties_count()); 36725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 36735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_root_impl_; 36755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_child_impl_; 36765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_child2_impl_; 36775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_grandchild_impl_; 36785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_grandchild2_impl_; 36795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 36805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(LayerTreeHostTestImplLayersPushProperties, DelegatingRenderer) { 36825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunTestWithImplSidePainting(); 36835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 36845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestPropertyChangesDuringUpdateArePushed 36865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostTest { 36875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 36885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 36895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 36917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = Layer::Create(); 36927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->SetBounds(gfx::Size(1, 1)); 36937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool paint_scrollbar = true; 36957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool has_thumb = false; 36963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_layer_ = FakePaintedScrollbarLayer::Create( 36973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) paint_scrollbar, has_thumb, root_->id()); 36987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(scrollbar_layer_); 37007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3706bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 37077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: { 37107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // During update, the ignore_set_needs_commit_ bit is set to true to 37117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // avoid causing a second commit to be scheduled. If a property change 37127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // is made during this, however, it needs to be pushed in the upcoming 37137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // commit. 37147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<base::AutoReset<bool> > ignore = 37157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->IgnoreSetNeedsCommit(); 37167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->SetBounds(gfx::Size(30, 30)); 37187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(scrollbar_layer_->needs_push_properties()); 37207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 37227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->reset_push_properties_count(); 37247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0u, scrollbar_layer_->push_properties_count()); 37257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 37287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, scrollbar_layer_->push_properties_count()); 37297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 37307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 37357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<Layer> root_; 37373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; 37387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 37397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37407dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPropertyChangesDuringUpdateArePushed); 37417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestCasePushPropertiesThreeGrandChildren 37437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTest { 37447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 37457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 37467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_root_ = 0; 37477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child_ = 0; 37487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild1_ = 0; 37497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild2_ = 0; 37507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild3_ = 0; 37517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 37527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 37557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = PushPropertiesCountingLayer::Create(); 37567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_ = PushPropertiesCountingLayer::Create(); 37577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_ = PushPropertiesCountingLayer::Create(); 37587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_ = PushPropertiesCountingLayer::Create(); 37597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild3_ = PushPropertiesCountingLayer::Create(); 37607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 37627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild1_); 37637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild2_); 37647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild3_); 37657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Don't set the root layer here. 37677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 37687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 37717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 37737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> root_; 37747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child_; 37757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild1_; 37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild2_; 37777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild3_; 37787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_root_; 37797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child_; 37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild1_; 37817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild2_; 37827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild3_; 37837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 37847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush 37867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 37877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 37887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3789bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 37907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 37917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 37927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 37947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 37957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 37977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 38047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->needs_push_properties()); 38067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 38107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 38117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 38127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild3_->needs_push_properties()); 38147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 38177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 38187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 38227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush); 38247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion 38267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 38277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 38287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3829bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 38307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 38317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 38327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 38337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 38357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 38377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 38397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 38407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 38417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 38427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 38477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 38487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 38517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 38537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 38547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild1_); 38597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 38657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 38667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 38677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 38727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 38787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 38797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 38807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild2_ will still need a push properties. 38857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 38867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild3_ does not need a push properties, so recursing should 38937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no longer be needed. 38947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 38957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 38987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 39007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 39017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 39027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 39037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 39047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 39057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39067dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion); 39077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence 39097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 39107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 39117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3912bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 39137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 39147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 39157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 39167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->set_persist_needs_push_properties(true); 39177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->set_persist_needs_push_properties(true); 39187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 39197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 39207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 39217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 39227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 39237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 39247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 39257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 39267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 39277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 39287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 39297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 39307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild2_ will still need a push properties. 39327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 39337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 39357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 39367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 39377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 39387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild3_ does not need a push properties, so recursing should 39407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no longer be needed. 39417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 39427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 39447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 39457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 39467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 39477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 39487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 39497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 39507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 39517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 39527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39537dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 39547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence); 39557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree 39577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 39587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 39597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3960bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 39617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 39627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 39637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 39647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 39657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 39667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 39677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 39687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 39697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 39707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 39717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 39727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 39737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 39747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 39757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 39767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Change grandchildren while their parent is not in the tree. 39787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 39797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 39807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 39817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 39827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 39847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 39857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 39867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 39877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 39887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 39897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 39907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 39917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild3_->needs_push_properties()); 39927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 39937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 39957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 39967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 39977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 39987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 39997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 40007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 40027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 40057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 40067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 40077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild3_->RemoveFromParent(); 40097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 40127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 40137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 40147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 40167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 40177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 40187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 40197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 40207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40217dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 40227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree); 40237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild 40257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 40267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 40277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 4028bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 40297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 40307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 40317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 40327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 40337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 40347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 40367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 40377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 40387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 40397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 40407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 40417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 40427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 40437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 40447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 40467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 40477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 40487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 40517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 40527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 40537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 40547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 40557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 40567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 40577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 40587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 40597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 40617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 40647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 40657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 40667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 40687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 40717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 40727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 40737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 40757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 40787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 40807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 40817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 40827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 40837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 40847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 40867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild); 40877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent 40897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 40907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 40917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 4092bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 40937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 40947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 40957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 40967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 40977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 40987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 40997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 41007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 41017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 41027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 41037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 41047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 41057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 41067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 41077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 41087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 41107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 41117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 41127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 41147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 41157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 41167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 41177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 41187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 41197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 41207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 41217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 41227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 41237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 41257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 41277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 41287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 41297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 41307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 41327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 41347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 41357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 41367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 41377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 41397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 41417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 41427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 41447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 41457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 41467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 41477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 41487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 41497dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 41507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent); 41517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// This test verifies that the tree activation callback is invoked correctly. 4153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass LayerTreeHostTestTreeActivationCallback : public LayerTreeHostTest { 4154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 4155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LayerTreeHostTestTreeActivationCallback() 4156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : num_commits_(0), callback_count_(0) {} 4157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void BeginTest() OVERRIDE { 4159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(HasImplThread()); 4160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PostSetNeedsCommitToMainThread(); 4161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 41635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( 41645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 41655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 41665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { 4167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++num_commits_; 4168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (num_commits_) { 4169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case 1: 4170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, callback_count_); 4171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback_count_ = 0; 4172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetCallback(true); 4173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PostSetNeedsCommitToMainThread(); 4174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 4175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case 2: 4176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1, callback_count_); 4177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback_count_ = 0; 4178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetCallback(false); 4179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PostSetNeedsCommitToMainThread(); 4180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 4181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case 3: 4182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, callback_count_); 4183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback_count_ = 0; 4184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EndTest(); 4185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 4186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch default: 4187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ADD_FAILURE() << num_commits_; 4188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EndTest(); 4189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 4190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 41915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return LayerTreeHostTest::PrepareToDrawOnThread( 41925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl, frame_data, draw_result); 4193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 41955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(3, num_commits_); } 4196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void SetCallback(bool enable) { 41985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_surface()->SetTreeActivationCallback( 41995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enable 42005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? base::Bind( 42015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &LayerTreeHostTestTreeActivationCallback::ActivationCallback, 42025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this)) 42035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : base::Closure()); 4204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 42065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ActivationCallback() { ++callback_count_; } 4207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int num_commits_; 4209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int callback_count_; 4210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 4211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DirectRenderer) { 4213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunTest(true, false, true); 4214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DelegatingRenderer) { 4217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunTest(true, true, true); 4218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 42202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerInvalidateCausesDraw : public LayerTreeHostTest { 4221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 42222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerInvalidateCausesDraw() : num_commits_(0), num_draws_(0) {} 4223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 42252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASSERT_TRUE(!!invalidate_layer_) 42262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch << "Derived tests must set this in SetupTree"; 42272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // One initial commit. 4229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 4230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 42332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // After commit, invalidate the layer. This should cause a commit. 4234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (layer_tree_host()->source_frame_number() == 1) 42355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) invalidate_layer_->SetNeedsDisplay(); 4236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 4239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) num_draws_++; 4240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (impl->active_tree()->source_frame_number() == 1) 4241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 4242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 4245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) num_commits_++; 4246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 4249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_GE(2, num_commits_); 4250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_GE(2, num_draws_); 4251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 42532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected: 42542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<Layer> invalidate_layer_; 42552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 4257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int num_commits_; 4258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int num_draws_; 4259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 4260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 42612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// VideoLayer must support being invalidated and then passing that along 42622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in 42632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation. 42642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestVideoLayerInvalidate : public LayerInvalidateCausesDraw { 42652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 42662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual void SetupTree() OVERRIDE { 42672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerTreeHostTest::SetupTree(); 42682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<VideoLayer> video_layer = VideoLayer::Create(&provider_); 42692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch video_layer->SetBounds(gfx::Size(10, 10)); 42702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch video_layer->SetIsDrawable(true); 42712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer_tree_host()->root_layer()->AddChild(video_layer); 42722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 42732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch invalidate_layer_ = video_layer; 42742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 42752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 42762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private: 42772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch FakeVideoFrameProvider provider_; 42782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 42792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestVideoLayerInvalidate); 4281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 42822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// IOSurfaceLayer must support being invalidated and then passing that along 42832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in 42842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation. 42852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestIOSurfaceLayerInvalidate 42862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch : public LayerInvalidateCausesDraw { 42872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 42882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual void SetupTree() OVERRIDE { 42892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerTreeHostTest::SetupTree(); 42902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<IOSurfaceLayer> layer = IOSurfaceLayer::Create(); 42912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer->SetBounds(gfx::Size(10, 10)); 42922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch uint32_t fake_io_surface_id = 7; 42932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer->SetIOSurfaceProperties(fake_io_surface_id, layer->bounds()); 42942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer->SetIsDrawable(true); 42952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer_tree_host()->root_layer()->AddChild(layer); 42962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 42972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch invalidate_layer_ = layer; 42982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 42992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 43002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 43012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 43022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 43032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerTreeHostTestIOSurfaceLayerInvalidate); 43042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestPushHiddenLayer : public LayerTreeHostTest { 4306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 4307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_ = Layer::Create(); 4309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetAnchorPoint(gfx::PointF()); 4310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetPosition(gfx::Point()); 4311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 10)); 4312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_ = SolidColorLayer::Create(); 4314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetAnchorPoint(gfx::PointF()); 4315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetPosition(gfx::Point()); 4316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetBounds(gfx::Size(10, 10)); 4317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetIsDrawable(true); 4318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->AddChild(parent_layer_); 4319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_ = SolidColorLayer::Create(); 4321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetAnchorPoint(gfx::PointF()); 4322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetPosition(gfx::Point()); 4323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(10, 10)); 4324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetIsDrawable(true); 4325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->AddChild(child_layer_); 4326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 4328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 4334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 4335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 4336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The layer type used does not need to push properties every frame. 4337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(child_layer_->needs_push_properties()); 4338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Change the bounds of the child layer, but make it skipped 4340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // by CalculateDrawProperties. 4341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetOpacity(0.f); 4342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(5, 5)); 4343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 4344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 4345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The bounds of the child layer were pushed to the impl side. 4346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(child_layer_->needs_push_properties()); 4347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 4349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 4350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 4354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 4355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* parent = root->children()[0]; 4356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* child = parent->children()[0]; 4357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 4359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 4360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(gfx::Size(5, 5).ToString(), child->bounds().ToString()); 4361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 4362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<Layer> root_layer_; 4368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<SolidColorLayer> parent_layer_; 4369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<SolidColorLayer> child_layer_; 4370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 4371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushHiddenLayer); 4373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUpdateLayerInEmptyViewport : public LayerTreeHostTest { 4375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 4376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) settings->impl_side_painting = true; 4378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_ = FakePictureLayer::Create(&client_); 4382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetAnchorPoint(gfx::PointF()); 4383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 10)); 4384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 4386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 4390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The viewport is empty, but we still need to update layers on the main 4391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // thread. 4392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); 4393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 4394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 4397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The layer should be updated even though the viewport is empty, so we 4398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are capable of drawing it on the impl tree. 4399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_GT(root_layer_->update_count(), 0u); 4400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 4401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FakeContentLayerClient client_; 4406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<FakePictureLayer> root_layer_; 4407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 4408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUpdateLayerInEmptyViewport); 4410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 44113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass LayerTreeHostTestAbortEvictedTextures : public LayerTreeHostTest { 44123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch public: 44133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch LayerTreeHostTestAbortEvictedTextures() 44141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : num_will_begin_main_frames_(0), num_impl_commits_(0) {} 44153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch protected: 44173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void SetupTree() OVERRIDE { 44183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<SolidColorLayer> root_layer = SolidColorLayer::Create(); 44193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch root_layer->SetBounds(gfx::Size(200, 200)); 44203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch root_layer->SetIsDrawable(true); 44213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch layer_tree_host()->SetRootLayer(root_layer); 44233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch LayerTreeHostTest::SetupTree(); 44243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 44273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 44291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) num_will_begin_main_frames_++; 44301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (num_will_begin_main_frames_) { 44313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch case 2: 44323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Send a redraw to the compositor thread. This will (wrongly) be 44333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // ignored unless aborting resets the texture state. 44343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch layer_tree_host()->SetNeedsRedraw(); 44353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch break; 44363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE { 44403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch num_impl_commits_++; 44413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 44443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch switch (impl->SourceAnimationFrameNumber()) { 44453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch case 1: 44463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Prevent draws until commit. 44473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch impl->active_tree()->SetContentsTexturesPurged(); 44483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_FALSE(impl->CanDraw()); 44493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Trigger an abortable commit. 44503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch impl->SetNeedsCommit(); 44513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch break; 44523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch case 2: 44533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EndTest(); 44543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch break; 44553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void AfterTest() OVERRIDE { 44593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Ensure that the commit was truly aborted. 44601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(2, num_will_begin_main_frames_); 44613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(1, num_impl_commits_); 44623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch private: 44651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int num_will_begin_main_frames_; 44663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int num_impl_commits_; 44673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}; 44683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 44693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Commits can only be aborted when using the thread proxy. 44703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestAbortEvictedTextures); 44713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 447258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestMaxTransferBufferUsageBytes : public LayerTreeHostTest { 447358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 447458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 447558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->impl_side_painting = true; 4476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings->default_tile_size = gfx::Size(128, 128); 447758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 447858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 448058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OVERRIDE { 4481d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<TestContextProvider> context_provider = 4482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TestContextProvider::Create(); 4483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) context_provider->SetMaxTransferBufferUsageBytes(1024 * 1024); 44845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::Create3d(context_provider); 448558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 448658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 448758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 448858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<FakePictureLayer> root_layer = 448958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FakePictureLayer::Create(&client_); 449058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) root_layer->SetBounds(gfx::Size(6000, 6000)); 449158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) root_layer->SetIsDrawable(true); 449258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 449358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 449458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 449558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 449658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 449858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 449958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 45005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 450158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 450258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect that the transfer buffer memory used is equal to the 450358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // MaxTransferBufferUsageBytes value set in CreateOutputSurface. 4504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NOTE: This is now 1/2 due to raster memory limit in TileManager. 4505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Only half the limit will be reached unless the task set 4506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // thrashes to a completly new set of tiles. 45075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(512 * 1024u, context->GetPeakTransferBufferMemoryUsedBytes()); 450858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 450958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 451058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 451158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 451258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 451358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 451458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FakeContentLayerClient client_; 451558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 451658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 451758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Impl-side painting is a multi-threaded compositor feature. 451858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestMaxTransferBufferUsageBytes); 451958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 452068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Test ensuring that memory limits are sent to the prioritized resource 452168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// manager. 452268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class LayerTreeHostTestMemoryLimits : public LayerTreeHostTest { 452368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 452468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) LayerTreeHostTestMemoryLimits() : num_commits_(0) {} 452568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 452668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 452768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 45285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void WillCommit() OVERRIDE { 45295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Some commits are aborted, so increment number of attempted commits here. 45305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_commits_++; 45315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 45325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 453368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 45345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_commits_) { 45355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 453668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Verify default values. 45375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(), 45385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 45395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 45405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->MaxMemoryLimitBytes()); 45415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(), 45425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 45435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 45445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ExternalPriorityCutoff()); 454568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 454668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 45475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 454868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The values should remain the same until the commit after the policy 454968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // is changed. 45505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(), 45515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 45525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 45535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->MaxMemoryLimitBytes()); 45545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(), 45555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 45565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 45575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ExternalPriorityCutoff()); 455868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 45595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 456068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Verify values were correctly passed. 45615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(16u * 1024u * 1024u, 45625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 45635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 45645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->MaxMemoryLimitBytes()); 45655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PriorityCalculator::AllowVisibleAndNearbyCutoff(), 45665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 45675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 45685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ExternalPriorityCutoff()); 456968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EndTest(); 457068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 45715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 457268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Make sure no extra commits happen. 457368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 457468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 457568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 457668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 457768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 457868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 45795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_commits_) { 458068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 1: 45815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 45825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 458368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This will trigger a commit because the priority cutoff has changed. 458468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) impl->SetMemoryPolicy(ManagedMemoryPolicy( 45855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16u * 1024u * 1024u, 45861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, 458768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1000)); 458868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 45895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 459068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This will not trigger a commit because the priority cutoff has not 459168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // changed, and there is already enough memory for all allocations. 459268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) impl->SetMemoryPolicy(ManagedMemoryPolicy( 45935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32u * 1024u * 1024u, 45941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, 459568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1000)); 459668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 45975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 459868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 459968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 460068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 460168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 460268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 460368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 460468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 460568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 460668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int num_commits_; 460768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 460868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 46098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestMemoryLimits); 461068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 46114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerSetsNeedsFilterContext : public Layer { 46124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 46134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static scoped_refptr<LayerSetsNeedsFilterContext> Create() { 46144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return make_scoped_refptr(new LayerSetsNeedsFilterContext()); 46154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 46164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool Update(ResourceUpdateQueue* queue, 4618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>* occlusion) OVERRIDE { 46194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool updated = Layer::Update(queue, occlusion); 46204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (needs_context_) { 46214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->set_needs_filter_context(); 46224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 46234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 46244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return updated; 46254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 46264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void set_needs_context(bool need) { needs_context_ = need; } 46284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 46304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerSetsNeedsFilterContext() : needs_context_(false) {} 46314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~LayerSetsNeedsFilterContext() {} 46324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool needs_context_; 46344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 46354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestOffscreenContext : public LayerTreeHostTest { 46374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 46384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 46394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<LayerSetsNeedsFilterContext> root = 46404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerSetsNeedsFilterContext::Create(); 46414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->SetIsDrawable(true); 46424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->SetAnchorPoint(gfx::PointF()); 46434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 46444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->set_needs_context(with_context_); 46454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 46464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 46474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 46484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 46504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 46524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool expect_context = with_context_; 46534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (delegating_renderer()) 46544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expect_context = false; 46554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider()); 46564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 46574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 46584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 46604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool with_context_; 46624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 46634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestOffscreenContext_NoContext 46654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTestOffscreenContext { 46664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 46674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestOffscreenContext_NoContext() { with_context_ = false; } 46684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 46694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestOffscreenContext_NoContext); 46714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestOffscreenContext_WithContext 46734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTestOffscreenContext { 46744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 46754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestOffscreenContext_WithContext() { with_context_ = true; } 46764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 46774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestOffscreenContext_WithContext); 46794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestNoQuadsForEmptyLayer : public LayerTreeHostTest { 46814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 46824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 46834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 46844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_ = FakeContentLayer::Create(&client_); 46854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 10)); 46864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetIsDrawable(false); 46874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetHaveWheelEventHandlers(true); 46884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 46894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 46904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 46914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 46934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 46954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerImpl* layer_impl = 46965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<FakeContentLayerImpl*>(impl->RootLayer()); 46974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(layer_impl->DrawsContent()); 46984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, layer_impl->append_quads_count()); 46994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 47024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The layer is not drawable, so it should not be updated. 47034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, root_layer_->update_count()); 47044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 47054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 47074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 47094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 47104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 47114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 47124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoQuadsForEmptyLayer); 47144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 47163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 47174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface 47184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTest { 47194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 47204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface() 47214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : first_output_surface_memory_limit_(4321234), 47224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) second_output_surface_memory_limit_(1234321) {} 47234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 47254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OVERRIDE { 47264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!first_context_provider_) { 47274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) first_context_provider_ = TestContextProvider::Create(); 47284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 47294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(second_context_provider_); 47304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) second_context_provider_ = TestContextProvider::Create(); 47314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FakeOutputSurface> output_surface(FakeOutputSurface::Create3d( 47345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) second_context_provider_ ? second_context_provider_ 47355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : first_context_provider_)); 47365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_surface->SetMemoryPolicyToSetAtBind( 47375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) make_scoped_ptr(new ManagedMemoryPolicy( 47385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) second_context_provider_ ? second_output_surface_memory_limit_ 47395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : first_output_surface_memory_limit_, 47401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, 47411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ManagedMemoryPolicy::kDefaultNumResourcesLimit))); 47425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return output_surface.Pass(); 47434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 47464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 47474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_->SetBounds(gfx::Size(20, 20)); 47484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 47494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 47504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 47534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 47554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Lost context sometimes takes two frames to recreate. The third frame 47564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is sometimes aborted, so wait until the fourth frame to verify that 47574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // the memory has been set, and the fifth frame to end the test. 47584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (layer_tree_host()->source_frame_number() < 5) { 47594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 47604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else if (layer_tree_host()->source_frame_number() == 5) { 47614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 47624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* impl, 47665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool result) OVERRIDE { 47674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 47684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 47694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(first_output_surface_memory_limit_, 47704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) impl->memory_allocation_limit_bytes()); 47714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Lose the output surface. 47724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) first_context_provider_->TestContext3d()->loseContextCHROMIUM( 47735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); 47744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 47754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 47764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(second_output_surface_memory_limit_, 47774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) impl->memory_allocation_limit_bytes()); 47784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 47794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 47814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 47834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestContextProvider> first_context_provider_; 47854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestContextProvider> second_context_provider_; 47864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t first_output_surface_memory_limit_; 47874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t second_output_surface_memory_limit_; 47884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 47894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 47904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 47914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 47924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// No output to copy for delegated renderers. 47934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 47944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface); 47954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct TestSwapPromiseResult { 47975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSwapPromiseResult() 47985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : did_swap_called(false), 47995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_not_swap_called(false), 48005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dtor_called(false), 48015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reason(SwapPromise::DID_NOT_SWAP_UNKNOWN) {} 4802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool did_swap_called; 4804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool did_not_swap_called; 4805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool dtor_called; 4806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SwapPromise::DidNotSwapReason reason; 4807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Lock lock; 4808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 4809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestSwapPromise : public SwapPromise { 4811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 48125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit TestSwapPromise(TestSwapPromiseResult* result) : result_(result) {} 4813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~TestSwapPromise() { 4815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(result_->lock); 4816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->dtor_called = true; 4817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DidSwap(CompositorFrameMetadata* metadata) OVERRIDE { 4820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(result_->lock); 4821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_swap_called); 4822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_not_swap_called); 4823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->did_swap_called = true; 4824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidNotSwap(DidNotSwapReason reason) OVERRIDE { 4827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(result_->lock); 4828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_swap_called); 4829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_not_swap_called); 4830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->did_not_swap_called = true; 4831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->reason = reason; 4832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 4835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Not owned. 4836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestSwapPromiseResult* result_; 4837f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 4838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { 4840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 4841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostTestBreakSwapPromise() 48425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : commit_count_(0), commit_complete_count_(0) {} 4843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 4845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_LE(commit_count_, 2); 48465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SwapPromise> swap_promise( 48475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new TestSwapPromise(&swap_promise_result_[commit_count_])); 4848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 4849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 4854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) commit_count_++; 4855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (commit_count_ == 2) { 4856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This commit will finish. 4857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) commit_complete_count_++; 4863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (commit_complete_count_ == 1) { 4864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This commit will be aborted because no actual update. 4865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PostSetNeedsUpdateLayersToMainThread(); 4866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 4867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EndTest(); 4868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 4872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 3 commits are scheduled. 2 completes. 1 is aborted. 4873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(commit_count_, 3); 4874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(commit_complete_count_, 2); 4875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 4877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The first commit completes and causes swap buffer which finishes 4878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the promise. 4879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(swap_promise_result_[0].lock); 4880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[0].did_swap_called); 4881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); 4882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[0].dtor_called); 4883f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 4886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The second commit aborts. 4887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(swap_promise_result_[1].lock); 4888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_[1].did_swap_called); 4889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); 4890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_[1].reason); 4891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[1].dtor_called); 4892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 4895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The last commit completes but it does not cause swap buffer because 4896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // there is no damage in the frame data. 4897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(swap_promise_result_[2].lock); 4898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_[2].did_swap_called); 4899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); 4900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); 4901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[2].dtor_called); 4902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int commit_count_; 4906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int commit_complete_count_; 4907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestSwapPromiseResult swap_promise_result_[3]; 4908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 4909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBreakSwapPromise); 4911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { 4913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 4914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, 4915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl, 4916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_commit_count, 4917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_redraw_count) 4918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), 4919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_needs_commit_count_(set_needs_commit_count), 4920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_needs_redraw_count_(set_needs_redraw_count) {} 4921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~SimpleSwapPromiseMonitor() {} 4923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnSetNeedsCommitOnMain() OVERRIDE { 4925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*set_needs_commit_count_)++; 4926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnSetNeedsRedrawOnImpl() OVERRIDE { 4929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*set_needs_redraw_count_)++; 4930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 4933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_commit_count_; 4934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_redraw_count_; 4935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 4936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 49375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestSimpleSwapPromiseMonitor : public LayerTreeHostTest { 49385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 4942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int set_needs_commit_count = 0; 4943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int set_needs_redraw_count = 0; 4944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 4946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( 4947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new SimpleSwapPromiseMonitor(layer_tree_host(), 4948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 4949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_commit_count, 4950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_redraw_count)); 4951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1, set_needs_commit_count); 4953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Now the monitor is destroyed, SetNeedsCommit() is no longer being 4957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // monitored. 4958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1, set_needs_commit_count); 4960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 4963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( 4964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new SimpleSwapPromiseMonitor(layer_tree_host(), 4965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 4966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_commit_count, 4967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_redraw_count)); 4968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsUpdateLayers(); 4969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(2, set_needs_commit_count); 4970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 4974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( 4975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new SimpleSwapPromiseMonitor(layer_tree_host(), 4976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 4977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_commit_count, 4978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_redraw_count)); 4979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 4980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(3, set_needs_commit_count); 4981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EndTest(); 4985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 4989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSimpleSwapPromiseMonitor); 4991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4992a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestHighResRequiredAfterEvictingUIResources 4993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostTest { 4994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 4995a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4996a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->impl_side_painting = true; 4997a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 5000a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 5001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 5002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_impl->EvictAllUIResources(); 5008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Existence of evicted UI resources will trigger NEW_CONTENT_TAKES_PRIORITY 5009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // mode. Active tree should require high-res to draw after entering this 5010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // mode to ensure that high-res tiles are also required for a pending tree 5011a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to be activated. 5012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->RequiresHighResToDraw()); 5013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 5016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int frame = layer_tree_host()->source_frame_number(); 5017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (frame) { 5018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 5019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 5020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 5021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 2: 5022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui_resource_.reset(); 5023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 5024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 5025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeContentLayerClient client_; 5031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resource_; 5032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 5033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestHighResRequiredAfterEvictingUIResources); 5035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestHybridRasterizationSetting : public LayerTreeHostTest { 5037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 5038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 5039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->impl_side_painting = true; 5040a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->rasterization_site = LayerTreeSettings::HybridRasterization; 5041a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5043a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 5044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 5045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<PictureLayer> parent = PictureLayer::Create(&client_); 5047a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->SetBounds(gfx::Size(10, 10)); 5048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->root_layer()->AddChild(parent); 5049a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5050a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> child = PictureLayer::Create(&client_); 5051a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) child->SetBounds(gfx::Size(10, 10)); 5052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->AddChild(child); 5053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5054a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->SetHasGpuRasterizationHint(true); 5055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5056a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5057a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5058a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* root = host_impl->pending_tree()->root_layer(); 5061a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* parent = 5062a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(root->children()[0]); 5063a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* child = 5064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(parent->children()[0]); 5065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5066a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Only layers with a GPU rasterization hint should use GPU rasterization. 5067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(parent->ShouldUseGpuRasterization()); 5068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(child->ShouldUseGpuRasterization()); 5069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* root = host_impl->active_tree()->root_layer(); 5073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* parent = 5074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(root->children()[0]); 5075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* child = 5076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(parent->children()[0]); 5077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Only layers with a GPU rasterization hint should use GPU rasterization. 5079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(parent->ShouldUseGpuRasterization()); 5080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(child->ShouldUseGpuRasterization()); 5081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 5082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeContentLayerClient client_; 5087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 5088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestHybridRasterizationSetting); 5090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestGpuRasterizationSetting : public LayerTreeHostTest { 5092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 5093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 5094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->impl_side_painting = true; 5095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->rasterization_site = LayerTreeSettings::GpuRasterization; 5096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 5099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 5100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<PictureLayer> parent = PictureLayer::Create(&client_); 5102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->SetBounds(gfx::Size(10, 10)); 5103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->root_layer()->AddChild(parent); 5104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> child = PictureLayer::Create(&client_); 5106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) child->SetBounds(gfx::Size(10, 10)); 5107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->AddChild(child); 5108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->SetHasGpuRasterizationHint(true); 5110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* root = host_impl->pending_tree()->root_layer(); 5116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* parent = 5117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(root->children()[0]); 5118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* child = 5119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(parent->children()[0]); 5120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // All layers should use GPU rasterization, regardless of whether a GPU 5122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // rasterization hint has been set. 5123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(parent->ShouldUseGpuRasterization()); 5124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(child->ShouldUseGpuRasterization()); 5125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* root = host_impl->active_tree()->root_layer(); 5129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* parent = 5130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(root->children()[0]); 5131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PictureLayerImpl* child = 5132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<PictureLayerImpl*>(parent->children()[0]); 5133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // All layers should use GPU rasterization, regardless of whether a GPU 5135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // rasterization hint has been set. 5136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(parent->ShouldUseGpuRasterization()); 5137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(child->ShouldUseGpuRasterization()); 5138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 5139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeContentLayerClient client_; 5144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 5145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationSetting); 5147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass LayerTreeHostTestContinuousPainting : public LayerTreeHostTest { 5149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 5150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LayerTreeHostTestContinuousPainting() 5151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : num_commits_(0), num_draws_(0), bounds_(20, 20), child_layer_(NULL) {} 5152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected: 5154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enum { kExpectedNumCommits = 10 }; 5155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetupTree() OVERRIDE { 5157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<Layer> root_layer = Layer::Create(); 5158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch root_layer->SetBounds(bounds_); 5159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (layer_tree_host()->settings().impl_side_painting) { 5161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch picture_layer_ = FakePictureLayer::Create(&client_); 5162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_ = picture_layer_.get(); 5163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 5164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_layer_ = ContentLayerWithUpdateTracking::Create(&client_); 5165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_ = content_layer_.get(); 5166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_->SetBounds(bounds_); 5168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_->SetIsDrawable(true); 5169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch root_layer->AddChild(child_layer_); 5170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer_tree_host()->SetRootLayer(root_layer); 5172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer_tree_host()->SetViewportSize(bounds_); 5173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LayerTreeHostTest::SetupTree(); 5174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void BeginTest() OVERRIDE { 5177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Wait 50x longer than expected. 5178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch double milliseconds_per_frame = 5179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1000 / layer_tree_host()->settings().refresh_rate; 5180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EndTestAfterDelay(50 * kExpectedNumCommits * milliseconds_per_frame); 5181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MainThreadTaskRunner()->PostTask( 5182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FROM_HERE, 5183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind( 5184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &LayerTreeHostTestContinuousPainting::EnableContinuousPainting, 5185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this))); 5186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void Animate(base::TimeTicks monotonic_time) OVERRIDE { 5189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_->SetNeedsDisplay(); 5190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void AfterTest() OVERRIDE { 5193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_LE(kExpectedNumCommits, num_commits_); 5194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_LE(kExpectedNumCommits, num_draws_); 5195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int update_count = content_layer_ ? content_layer_->PaintContentsCount() 5196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : picture_layer_->update_count(); 5197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_LE(kExpectedNumCommits, update_count); 5198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 5201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (++num_draws_ == kExpectedNumCommits) 5202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EndTest(); 5203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 5206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++num_commits_; 5207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 5210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void EnableContinuousPainting() { 5211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LayerTreeDebugState debug_state = layer_tree_host()->debug_state(); 5212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_state.continuous_painting = true; 5213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer_tree_host()->SetDebugState(debug_state); 5214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int num_commits_; 5217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int num_draws_; 5218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Size bounds_; 5219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FakeContentLayerClient client_; 5220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<ContentLayerWithUpdateTracking> content_layer_; 5221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<FakePictureLayer> picture_layer_; 5222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Layer* child_layer_; 5223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 5224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestContinuousPainting); 5226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 52272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 5228