layer_tree_host_unittest.cc revision 5b892326406927b709cdaf6c384d4ababf456332
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" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/output/compositor_frame_ack.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/quads/draw_quad.h" 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "cc/quads/io_surface_draw_quad.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h" 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer.h" 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer_impl.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h" 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h" 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_video_frame_provider.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h" 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h" 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {}; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest { 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {} 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!impl->active_tree()->source_frame_number()) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_LE(1, num_commits_); 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_LE(1, num_draws_); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest { 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {} 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (num_commits_) { 120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_commits_); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(1, num_draws_); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we pass property values in PushPropertiesTo. 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LayerTreeHostTestPushPropertiesTo : public LayerTreeHostTest { 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetupTree() OVERRIDE { 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<Layer> root = Layer::Create(); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root->SetBounds(gfx::Size(10, 10)); 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host()->SetRootLayer(root); 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostTest::SetupTree(); 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum Properties { 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch STARTUP, 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BOUNDS, 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HIDE_LAYER_AND_SUBTREE, 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DRAWS_CONTENT, 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DONE, 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void BeginTest() OVERRIDE { 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index_ = STARTUP; 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PostSetNeedsCommitToMainThread(); 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VerifyAfterValues(impl->active_tree()->root_layer()); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetBeforeValues(layer_tree_host()->root_layer()); 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VerifyBeforeValues(layer_tree_host()->root_layer()); 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++index_; 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (index_ == DONE) { 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EndTest(); 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetAfterValues(layer_tree_host()->root_layer()); 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void AfterTest() OVERRIDE {} 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void VerifyBeforeValues(Layer* layer) { 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(gfx::Size(10, 10).ToString(), layer->bounds().ToString()); 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(layer->hide_layer_and_subtree()); 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(layer->DrawsContent()); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetBeforeValues(Layer* layer) { 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetBounds(gfx::Size(10, 10)); 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(false); 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetIsDrawable(false); 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void VerifyAfterValues(LayerImpl* layer) { 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (static_cast<Properties>(index_)) { 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case STARTUP: 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DONE: 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case BOUNDS: 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(gfx::Size(20, 20).ToString(), layer->bounds().ToString()); 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case HIDE_LAYER_AND_SUBTREE: 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(layer->hide_layer_and_subtree()); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DRAWS_CONTENT: 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(layer->DrawsContent()); 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetAfterValues(Layer* layer) { 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (static_cast<Properties>(index_)) { 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case STARTUP: 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DONE: 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case BOUNDS: 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetBounds(gfx::Size(20, 20)); 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case HIDE_LAYER_AND_SUBTREE: 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(true); 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DRAWS_CONTENT: 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetIsDrawable(true); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int index_; 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesTo); 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw. 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest { 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {} 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redraw again to verify that the second redraw doesn't commit. 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_draws_); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(2, num_draws_); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw); 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect. 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest { 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedrawRect() 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_draws_(0), 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_(50, 50), 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalid_rect_(10, 10, 20, 20), 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_layer_(ContentLayer::Create(&client_)) {} 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(bounds_); 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(DRAW_SUCCESS, draw_result); 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF root_damage_rect; 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame_data->render_passes.empty()) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this is the first frame, expect full frame damage. 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_)); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that invalid_rect_ is indeed repainted. 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_)); 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawRectToMainThread(invalid_rect_); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(2, num_draws_); } 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Size bounds_; 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Rect invalid_rect_; 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest { 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_ = FakeContentLayer::Create(&client_); 343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->SetBounds(gfx::Size(1, 1)); 344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->AddChild(scaled_layer_); 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scaled_layer_|, which should not generate 362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 367bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(2, layer_tree_host()->source_frame_number()); 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(4, 4).ToString(), 373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->content_bounds().ToString()); 374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 379b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<FakeContentLayer> scaled_layer_; 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate); 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 388b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_ = FakePaintedScrollbarLayer::Create( 3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) paint_scrollbar, has_thumb, root_layer_->id()); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(scrollbar_); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 416bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 419b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scrollbar_|, which should not generate 420b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 421b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 425bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(2, layer_tree_host()->source_frame_number()); 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 429b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), 431b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scrollbar_->content_bounds().ToString()); 432b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 436b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetNextCommitForcesRedraw : public LayerTreeHostTest { 4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestSetNextCommitForcesRedraw() 4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : num_draws_(0), 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bounds_(50, 50), 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalid_rect_(10, 10, 20, 20), 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_layer_(ContentLayer::Create(&client_)) {} 4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetIsDrawable(true); 4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_layer_->SetBounds(bounds_); 4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (num_draws_ == 3 && host_impl->settings().impl_side_painting) 4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->SetNeedsRedrawRect(invalid_rect_); 4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(DRAW_SUCCESS, draw_result); 4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::RectF root_damage_rect; 4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!frame_data->render_passes.empty()) 4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (num_draws_) { 4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect); 4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root_damage_rect); 4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(invalid_rect_, root_damage_rect); 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(bounds_), root_damage_rect); 4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (num_draws_) { 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cycle through a couple of empty commits to ensure we're observing the 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // right behavior 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Should force full frame damage on the next commit 5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNextCommitForcesRedrawToMainThread(); 5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (host_impl->settings().impl_side_painting) 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->BlockNotifyReadyToActivateForTesting(true); 5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) else 5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) num_draws_++; 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->BlockNotifyReadyToActivateForTesting(false); 5144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) num_draws_++; 5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(5, num_draws_); } 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int num_draws_; 5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Size bounds_; 5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Rect invalid_rect_; 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNextCommitForcesRedraw); 5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent then 5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// its damage is preserved until the next time it is drawn. 5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersDamageLater : public LayerTreeHostTest { 5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LayerTreeHostTestUndrawnLayersDamageLater() 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : root_layer_(ContentLayer::Create(&client_)) {} 5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer_->SetIsDrawable(true); 5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(50, 50)); 5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The initially transparent layer has a larger child layer, which is 5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // not initially drawn because of the this (parent) layer. 5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_ = FakeContentLayer::Create(&client_); 5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetBounds(gfx::Size(15, 15)); 5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(0.0f); 5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_layer_->AddChild(parent_layer_); 5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) child_layer_ = FakeContentLayer::Create(&client_); 5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(25, 25)); 5551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->AddChild(child_layer_); 5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 5591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(DRAW_SUCCESS, draw_result); 5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::RectF root_damage_rect; 5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!frame_data->render_passes.empty()) 5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The first time, the whole view needs be drawn. 5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Afterwards, just the opacity of surface_layer1 is changed a few times, 5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // and each damage should be the bounding box of it and its child. If this 5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // was working improperly, the damage might not include its childs bounding 5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // box. 577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 0: 5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(root_layer_->bounds()), root_damage_rect); 5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 1: 5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2: 5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3: 5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(child_layer_->bounds()), root_damage_rect); 5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 5941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 5951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 1: 5961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Test not owning the surface. 5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(1.0f); 5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2: 6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(0.0f); 6011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 6021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3: 6031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Test owning the surface. 6041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetOpacity(0.5f); 6051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parent_layer_->SetForceRenderSurface(true); 6061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 6071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 4: 6081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EndTest(); 6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 6101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 6121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeContentLayerClient client_; 6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<FakeContentLayer> parent_layer_; 6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer_; 6221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 6231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestUndrawnLayersDamageLater); 6251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that if a layer is not drawn because of some reason in the parent, 627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// causing its content bounds to not be computed, then when it is later drawn, 628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// its content bounds get pushed. 629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestUndrawnLayersPushContentBoundsLater 630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostTest { 631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTestUndrawnLayersPushContentBoundsLater() 633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : root_layer_(Layer::Create()) {} 634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) root_layer_->SetIsDrawable(true); 637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(20, 20)); 638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_ = Layer::Create(); 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->SetBounds(gfx::Size(20, 20)); 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->SetOpacity(0.0f); 643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) root_layer_->AddChild(parent_layer_); 644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) child_layer_ = Layer::Create(); 646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(15, 15)); 647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->AddChild(child_layer_); 648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* root = host_impl->active_tree()->root_layer(); 656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* parent = root->children()[0]; 657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* child = parent->children()[0]; 658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 0: 661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0.f, parent->opacity()); 662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(gfx::SizeF(), child->content_bounds()); 663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1.f, parent->opacity()); 666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(gfx::SizeF(15.f, 15.f), child->content_bounds()); 667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED(); 671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_layer_->SetOpacity(1.0f); 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 2: 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED(); 683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> root_layer_; 690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> parent_layer_; 691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<Layer> child_layer_; 692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTestUndrawnLayersPushContentBoundsLater); 696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side. 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest { 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCommit() {} 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20), impl->DrawViewportSize()); 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color()); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree 72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure. 72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails 72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public LayerTreeHostTest { 72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 728424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails() 729424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : frame_count_with_pending_tree_(0) {} 73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE { 7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(frame_count_with_pending_tree_, 0); 7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) impl->BlockNotifyReadyToActivateForTesting(true); 7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void WillBeginImplFrameOnThread(LayerTreeHostImpl* impl, 744424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const BeginFrameArgs& args) OVERRIDE { 7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (impl->pending_tree()) 746424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) frame_count_with_pending_tree_++; 7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (frame_count_with_pending_tree_ == 1) { 7494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(first_frame_time_.ToInternalValue(), 0); 75003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) first_frame_time_ = impl->CurrentBeginFrameArgs().frame_time; 751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } else if (frame_count_with_pending_tree_ == 2) { 752a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch impl->BlockNotifyReadyToActivateForTesting(false); 7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 754424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 755424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (frame_count_with_pending_tree_ > 1) { 7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_NE(first_frame_time_.ToInternalValue(), 0); 759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_NE(first_frame_time_.ToInternalValue(), 76003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) impl->CurrentBeginFrameArgs().frame_time.ToInternalValue()); 76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(impl->settings().impl_side_painting); 76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 768424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (impl->settings().impl_side_painting) 770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_NE(frame_count_with_pending_tree_, 1); 77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 776424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int frame_count_with_pending_tree_; 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails); 78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame. 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest { 78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {} 78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 79290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame_++; 79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ == 1) { 79903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) first_frame_time_ = impl->CurrentBeginFrameArgs().frame_time; 80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) impl->SetNeedsRedraw(); 80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Since we might use a low-resolution clock on Windows, we need to 8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // make sure that the clock has incremented past first_frame_time_. 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (first_frame_time_ == gfx::FrameTime::Now()) { 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_NE(first_frame_time_, impl->CurrentBeginFrameArgs().frame_time); 81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure there isn't a commit between the two draws, to ensure that a 81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // commit isn't required for updating the current frame time. We can 81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // only check for this in the multi-threaded case, since in the single- 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // threaded case there will always be a commit between consecutive draws. 819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) 82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0, frame_); 82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int frame_; 82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw); 83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor. 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest { 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 8360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) LayerTreeHostTestStartPageScaleAnimation() {} 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 838a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 839a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 840a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 8410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) { 8420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scoped_refptr<FakePictureLayer> layer = 8430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FakePictureLayer::Create(&client_); 8440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) layer->set_always_update_resources(true); 8450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scroll_layer_ = layer; 8460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 8470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scroll_layer_ = FakeContentLayer::Create(&client_); 8480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 8490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Layer* root_layer = layer_tree_host()->root_layer(); 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetScrollClipLayerId(root_layer->id()); 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetIsContainerForFixedPositionLayers(true); 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_layer_->SetBounds(gfx::Size(2 * root_layer->bounds().width(), 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2 * root_layer->bounds().height())); 855a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(gfx::Vector2d()); 856a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer_); 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This test requires the page_scale and inner viewport layers to be 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // identified. 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->RegisterViewportLayers( 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_layer, scroll_layer_.get(), NULL); 8610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f); 862a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 863a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float scale, 8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float) OVERRIDE { 869a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d offset = scroll_layer_->scroll_offset(); 870a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(offset + scroll_delta); 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f); 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We get one commit before the first draw, and the animation doesn't happen 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // until the second draw. 877a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 878a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 0: 879a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 880a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We'll start an animation when we get back to the main thread. 881a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 882a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 883a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 884a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 885a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor()); 887a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 889a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 891a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 892a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 893a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 894a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 895bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 896a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 897a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->StartPageScaleAnimation( 898a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d(), false, 1.25f, base::TimeDelta()); 899a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FakeContentLayerClient client_; 9060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scoped_refptr<Layer> scroll_layer_; 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest { 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetVisible() : num_draws_(0) {} 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is suppressed while we're invisible. 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Triggers the redraw. 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(true); 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->visible()); 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); } 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient { 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate() : test_layer_(0) {} 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void PaintContents( 945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SkCanvas* canvas, 946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const gfx::Rect& clip, 947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE { 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set layer opacity to 0. 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (test_layer_) 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_->SetOpacity(0.f); 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 953effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool FillsBoundsCompletely() const OVERRIDE { return false; } 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* test_layer_; 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer { 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<ContentLayerWithUpdateTracking> Create( 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentLayerClient* client) { 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new ContentLayerWithUpdateTracking(client)); 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int PaintContentsCount() { return paint_contents_count_; } 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ResetPaintContentsCount() { paint_contents_count_ = 0; } 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Update(ResourceUpdateQueue* queue, 970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>* occlusion) OVERRIDE { 9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool updated = ContentLayer::Update(queue, occlusion); 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_contents_count_++; 9737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return updated; 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit ContentLayerWithUpdateTracking(ContentLayerClient* client) 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client), paint_contents_count_(0) { 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBounds(gfx::Size(10, 10)); 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsDrawable(true); 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ContentLayerWithUpdateTracking() {} 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_contents_count_; 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit. 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest { 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestOpacityChange() 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_opacity_change_delegate_(), 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) update_check_layer_(ContentLayerWithUpdateTracking::Create( 994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &test_opacity_change_delegate_)) { 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get()); 996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(update_check_layer_); 1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update() should have been called once. 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, update_check_layer_->PaintContentsCount()); 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate test_opacity_change_delegate_; 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_; 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange); 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer { 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) { 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new NoScaleContentLayer(client)); 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CalculateContentsScale(float ideal_contents_scale, 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_x, 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_y, 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size* contentBounds) OVERRIDE { 1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Skip over the ContentLayer's method to the base Layer class. 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::CalculateContentsScale(ideal_contents_scale, 1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_x, 1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_y, 1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentBounds); 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit NoScaleContentLayer(ContentLayerClient* client) 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client) {} 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~NoScaleContentLayer() {} 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers() 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(NoScaleContentLayer::Create(&client_)), 1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_(ContentLayer::Create(&client_)) {} 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(60, 60)); 1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(1.5); 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size()); 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer_); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(30, 30)); 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetIsDrawable(true); 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetPosition(gfx::Point(2, 2)); 1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetBounds(gfx::Size(10, 10)); 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should only do one commit. 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device scale factor should come over to impl. 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f); 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers are on impl. 1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size()); 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device viewport is scaled. 108058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), impl->DrawViewportSize()); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* child = impl->active_tree()->root_layer()->children()[0]; 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Positions remain in layout pixels. 1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(0, 0), root->position()); 1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(2, 2), child->position()); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Compute all the layer transforms for the frame. 1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData frame_data; 1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) impl->PrepareToDraw(&frame_data); 1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->DidDrawAllLayers(frame_data); 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list = 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *frame_data.render_surface_layer_list; 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers should be drawing into the root render surface. 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, render_surface_layer_list.size()); 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(root->render_surface(), 1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_surface_layer_list[0]->render_surface()); 1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, root->render_surface()->layer_list().size()); 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root render surface is the size of the viewport. 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60), 1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->render_surface()->content_rect()); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The content bounds of the child should be scaled. 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size child_bounds_scaled = 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5)); 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(child_bounds_scaled, child->content_bounds()); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform scale_transform; 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scale_transform.Scale(impl->device_scale_factor(), 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->device_scale_factor()); 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root layer is scaled by 2x. 1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_screen_space_transform = scale_transform; 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_draw_transform = scale_transform; 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_draw_transform, root->draw_transform()); 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_screen_space_transform, root->screen_space_transform()); 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The child is at position 2,2, which is transformed to 3,3 after the scale 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_screen_space_transform; 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_screen_space_transform.Translate(3.f, 3.f); 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_draw_transform = child_screen_space_transform; 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform, 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->draw_transform()); 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform, 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->screen_space_transform()); 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<NoScaleContentLayer> root_layer_; 1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> child_layer_; 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures. 11473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest { 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 11500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure partial texture updates are turned off. 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 0; 1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 1154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) settings->scrollbar_animator = LayerTreeSettings::NoAnimator; 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_ = FakeContentLayer::Create(&client_); 1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 11633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_ = FakePaintedScrollbarLayer::Create( 11643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) paint_scrollbar, has_thumb, layer_->id()); 1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->AddChild(scrollbar_); 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = -1; 117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates); 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used texture is correct. 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 11973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures should be one for scrollbar layer since it was 11983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // requested and deleted on the impl-thread, and double for the content 11993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // layer since its first texture is used by impl thread and cannot by 12003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // used for update. 12013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(3u, context->NumTextures()); 12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures used for commit should be one for each layer. 1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First textures should not have been used. 1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 12063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // New textures should have been used. 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (drew_frame_ == impl->active_tree()->source_frame_number()) { 122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_; 122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = impl->active_tree()->source_frame_number(); 122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We draw/ship one texture each frame for each layer. 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 123223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 123323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!TestEnded()) 123423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetNeedsDisplay(); 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected: 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 12473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_; 124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int drew_frame_; 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( 12523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerTreeHostTestDirectRendererAtomicCommit); 12533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LayerTreeHostTestDelegatingRendererAtomicCommit 12553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : public LayerTreeHostTestDirectRendererAtomicCommit { 12563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 12573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 12583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates); 12593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 12613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 12633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 0: 12643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures should be one for each layer 12653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 12663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures used for commit should be one for each layer. 12673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 12683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Verify that used texture is correct. 12693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 12703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 12713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) context->ResetUsedTextures(); 12723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 12733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 1: 12743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures should be doubled as the first context layer 12753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // texture is being used by the impl-thread and cannot be used for 12763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // update. The scrollbar behavior is different direct renderer because 12773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // UI resource deletion with delegating renderer occurs after tree 12783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // activation. 12793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 12803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Number of textures used for commit should still be 12813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // one for each layer. 12823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 12833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // First textures should not have been used. 12843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 12853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 12863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // New textures should have been used. 12873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 12883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 12893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) context->ResetUsedTextures(); 12903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 12913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 2: 12923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EndTest(); 12933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 12943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 12953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NOTREACHED(); 12963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 12973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 13003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 130123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)MULTI_THREAD_DELEGATING_RENDERER_NOIMPL_TEST_F( 130223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) LayerTreeHostTestDelegatingRendererAtomicCommit); 1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer, 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* parent, 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& transform, 130746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const gfx::Point3F& transform_origin, 13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& position, 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& bounds, 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool opaque) { 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->RemoveAllChildren(); 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent) 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent->AddChild(layer); 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(transform); 131546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) layer->SetTransformOrigin(transform_origin); 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetPosition(position); 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(bounds); 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetContentsOpaque(opaque); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate 1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 13250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Allow one partial texture update. 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 1; 1328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // No partial updates when impl side painting is enabled. 1329a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings->impl_side_painting = false; 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_ = FakeContentLayer::Create(&client_); 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->SetBounds(gfx::Size(10, 20)); 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetPosition(gfx::Point(0, 10)); 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetBounds(gfx::Size(3, 10)); 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(child_); 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 134890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1349bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 1: 135190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplay(); 135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 2: 135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Damage part of layers. 135690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 135790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 3: 136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 136190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 136390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 4: 136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 136590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 5: 136790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 136890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 136990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 1370bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED() << layer_tree_host()->source_frame_number(); 137190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 137290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 137390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates); 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer. 1383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used textures are correct. 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 13924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 13934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Number of textures should be two for each content layer. 13944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 13954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 13964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 13974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 13984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 13994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // layer. 1402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 14054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // First content textures should not have been used. 14064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 14074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 14084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // New textures should have been used. 14094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 14104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 14114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 14124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 14134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 14144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 14154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 14164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 14214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 14224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Number of textures should be two for each content layer. 14234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 14244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 14254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 14264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 14274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 14284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // layer. 1431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasImplThread()) { 14344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // One content layer does a partial update also. 14354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 14364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(3))); 14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 14384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In single thread we can always do partial updates, so the limit has 14394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no effect. 14404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 14414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 14424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No textures should be used for commit. 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()); 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Number of textures used for commit should be one, for the 1454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // content layer. 1455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1u, context->NumUsedTextures()); 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 146690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LT(impl->active_tree()->source_frame_number(), 5); 146790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for drawing should one per layer except for 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // frame 3 where the viewport only contains one layer. 147290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 3) { 1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, context->NumUsedTextures()); 147490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()) 14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "For frame " << impl->active_tree()->source_frame_number(); 147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer. 149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1492a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestAtomicCommitWithPartialUpdate); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 14967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 14977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 14987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_layer_ = FakeContentLayer::Create(&client_); 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 15007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer1_ = FakeContentLayer::Create(&client_); 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetBounds(gfx::Size(100, 100)); 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetForceRenderSurface(true); 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetOpacity(0.5f); 15057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_layer_->AddChild(surface_layer1_); 15067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer2_ = FakeContentLayer::Create(&client_); 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetBounds(gfx::Size(100, 100)); 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetForceRenderSurface(true); 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetOpacity(0.5f); 15117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer1_->AddChild(surface_layer2_); 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer1_ = FakeContentLayer::Create(&client_); 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetReplicaLayer(replica_layer1_.get()); 15157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer2_ = FakeContentLayer::Create(&client_); 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetReplicaLayer(replica_layer2_.get()); 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 15207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 15217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Renderer* renderer = host_impl->renderer(); 152703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId surface1_render_pass_id = host_impl->active_tree() 152803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->root_layer() 152903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->children()[0] 153003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->render_surface() 153103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->GetRenderPassId(); 153203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId surface2_render_pass_id = host_impl->active_tree() 153303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->root_layer() 153403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->children()[0] 153503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->children()[0] 153603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->render_surface() 153703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ->GetRenderPassId(); 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id)); 15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id)); 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reduce the memory limit to only fit the root layer and one render 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // surface. This prevents any contents drawing into surfaces 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from being allocated. 1549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) host_impl->SetMemoryPolicy(ManagedMemoryPolicy(100 * 100 * 4 * 2)); 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE( 15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface1_render_pass_id)); 15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE( 15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer->HasAllocatedResourcesForTesting(surface2_render_pass_id)); 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1563bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (layer_tree_host()->source_frame_number() < 2) 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetNeedsDisplay(); 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 15687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, root_layer_->update_count()); 15697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, surface_layer1_->update_count()); 15707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, surface_layer2_->update_count()); 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer1_; 1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer1_; 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer2_; 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer2_; 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Surfaces don't exist with a delegated renderer. 15828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit); 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer { 1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<EvictionTestLayer> Create() { 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new EvictionTestLayer()); 1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool Update(ResourceUpdateQueue*, 1592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>*) OVERRIDE; 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool DrawsContent() const OVERRIDE { return true; } 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE; 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE; 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE; 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HaveBackingTexture() const { 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return texture_.get() ? texture_->have_backing_texture() : false; 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayer() : Layer() {} 1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayer() {} 1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CreateTextureIfNeeded() { 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (texture_) 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_ = PrioritizedResource::Create( 1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()); 1613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) texture_->SetDimensions(gfx::Size(10, 10), RGBA_8888); 1614effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bitmap_.allocN32Pixels(10, 10); 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture_; 1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap bitmap_; 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl { 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl, 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id) { 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id)); 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayerImpl() {} 1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void AppendQuads(RenderPass* render_pass, 1630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const OcclusionTracker<LayerImpl>& occlusion_tracker, 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuadsData* append_quads_data) OVERRIDE { 1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(has_texture_); 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources()); 1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetHasTexture(bool has_texture) { has_texture_ = has_texture; } 1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id) 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerImpl(tree_impl, id), has_texture_(false) {} 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_texture_; 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) { 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_->set_request_priority(PriorityCalculator::UIPriority(true)); 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool EvictionTestLayer::Update(ResourceUpdateQueue* queue, 1653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>* occlusion) { 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 16567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect full_rect(0, 0, 10, 10); 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d()); 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->AppendFullUpload(upload); 16627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl( 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeImpl* tree_impl) { 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return EvictionTestLayerImpl::Create(tree_impl, layer_id_) 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .PassAs<LayerImpl>(); 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) { 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::PushPropertiesTo(layer_impl); 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl* test_layer_impl = 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<EvictionTestLayerImpl*>(layer_impl); 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_impl->SetHasTexture(texture_->have_backing_texture()); 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest { 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestEvictTextures() 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(EvictionTestLayer::Create()), 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_(0), 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform identity_matrix; 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetLayerPropertiesForTesting(layer_.get(), 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) identity_matrix, 169446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gfx::Point3F(0.f, 0.f, 0.f), 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size(10, 20), 1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PostEvictTextures() { 1703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 1704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread, 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void EvictTexturesOnImplThread() { 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(impl_for_evict_textures_); 1711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_for_evict_textures_->EvictTexturesForTesting(); 1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 1: Just commit and draw normally, then post an eviction at the end 1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that will trigger a commit. 1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 2: Triggered by the eviction, let it go through and then set 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // task, which will be handled before the commit. Don't set needsCommit, it 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should have been posted. A frame should not be drawn (note, 1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // didCommitAndDrawFrame may be called anyway). 1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 4: Triggered by the eviction, let it go through and then set 1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 5: Triggered by the setNeedsCommit, post an eviction task in 1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), a frame should not be drawn but a commit will be posted. 1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 6: Triggered by the eviction, post an eviction task in 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), which will be a noop, letting the commit (which recreates the 1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // textures) go through and draw a frame, then end the test. 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 1+2 test the eviction recovery path where eviction happens outside 1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the beginFrame/commit pair. 1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 3+4 test the eviction recovery path where eviction happens inside 1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the beginFrame/commit pair. 1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 5+6 test the path where an eviction happens during the eviction 1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // recovery path. 1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_ = impl; 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 3, 1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 5, 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<EvictionTestLayer> layer_; 1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* impl_for_evict_textures_; 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestEvictTextures); 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest { 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousInvalidate() 1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_ = ContentLayer::Create(&client_); 1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetBounds(gfx::Size(10, 10)); 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetPosition(gfx::PointF(0.f, 0.f)); 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetIsDrawable(true); 1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_layer_); 1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 182690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetNeedsDisplay(); 1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> content_layer_; 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestContinuousInvalidate); 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeferCommits() 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_deferred_(0), num_complete_commits_(0) {} 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_deferred_++; 1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_complete_commits_++; 1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_complete_commits_) { 1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_commits_deferred_); 1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_deferred_); 1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_complete_commits_); 1889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_deferred_; 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_complete_commits_; 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 189603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost { 1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, 1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerTreeSettings& settings, 1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy) 19031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : LayerTreeHost(client, NULL, settings) { 1904a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) proxy->SetLayerTreeHost(this); 19051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client->SetLayerTreeHost(this); 19065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeForTesting(proxy.PassAs<Proxy>()); 1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) { 1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are not allowed, max updates should be 0. 1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = false; 1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.OnCreateAndInitializeOutputSurfaceAttempted(true); 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, host.MaxPartialTextureUpdates()); 1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should be limited by the proxy. 1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.OnCreateAndInitializeOutputSurfaceAttempted(true); 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(5u, host.MaxPartialTextureUpdates()); 1944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should also be limited by the settings. 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(20); 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.OnCreateAndInitializeOutputSurfaceAttempted(true); 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(10u, host.MaxPartialTextureUpdates()); 1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) { 1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 197003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) settings.single_thread_proxy_scheduler = false; 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 197223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 197323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 19745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 19755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LayerTreeHost::CreateSingleThreaded(&client, 19765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &client, 19775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) shared_bitmap_manager.get(), 19785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings, 19795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current()); 19801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client.SetLayerTreeHost(host.get()); 1981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host->Composite(base::TimeTicks::Now()); 1982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) { 1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE); 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 199103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) settings.single_thread_proxy_scheduler = false; 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 199323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 199423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 19955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 19965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LayerTreeHost::CreateSingleThreaded(&client, 19975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &client, 19985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) shared_bitmap_manager.get(), 19995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings, 20005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current()); 20011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client.SetLayerTreeHost(host.get()); 2002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host->Composite(base::TimeTicks::Now()); 2003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) { 2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D); 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 201203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) settings.single_thread_proxy_scheduler = false; 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 201523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 20165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 20175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LayerTreeHost::CreateSingleThreaded(&client, 20185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &client, 20195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) shared_bitmap_manager.get(), 20205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings, 20215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current()); 20221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client.SetLayerTreeHost(host.get()); 2023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host->Composite(base::TimeTicks::Now()); 2024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, host->MaxPartialTextureUpdates()); 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, 2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PartialUpdatesWithDelegatingRendererAndSoftwareContent) { 2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE); 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 203403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) settings.single_thread_proxy_scheduler = false; 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 203623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager( 203723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new TestSharedBitmapManager()); 20385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 20395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LayerTreeHost::CreateSingleThreaded(&client, 20405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &client, 20415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) shared_bitmap_manager.get(), 20425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings, 20435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current()); 20441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client.SetLayerTreeHost(host.get()); 2045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host->Composite(base::TimeTicks::Now()); 2046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, host->MaxPartialTextureUpdates()); 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted 2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted() 2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(FakeContentLayer::Create(&client_)), 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_(FakeContentLayer::Create(&client_)), 2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_(FakeContentLayer::Create(&client_)), 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100)); 2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_->SetBounds(gfx::Size(100, 100)); 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_->SetBounds(gfx::Size(100, 100)); 2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer1_); 2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer2_); 2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl, 2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool visible) OVERRIDE { 20720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (visible) { 20730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // One backing should remain unevicted. 20740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ( 20750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 100u * 100u * 4u * 1u, 20760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 20770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 20780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ( 20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0u, layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 20800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 20810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that contents textures are marked as having been 2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // purged. 2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged()); 2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // End the test in this state. 2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All three backings should have memory. 2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 3u, 2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set a new policy that will kick out 1 of the 3 resources. 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because a resource was evicted, a commit will be kicked off. 2099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_impl->SetMemoryPolicy( 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy(100 * 100 * 4 * 2, 21011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING, 2102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1000)); 2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only two backings should have memory. 2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 2u, 2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Become backgrounded, which will cause 1 more resource to be 2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // evicted. 2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No further commits should happen because this is not visible 2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // anymore. 2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer1_; 2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer2_; 2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { 2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class NotificationClient : public ContentLayerClient { 2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient() 2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(0), paint_count_(0), lcd_notification_count_(0) {} 2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count() const { return paint_count_; } 2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count() const { return lcd_notification_count_; } 2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void PaintContents( 2146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SkCanvas* canvas, 2147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const gfx::Rect& clip, 2148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE { 2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++paint_count_; 2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE { 2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++lcd_notification_count_; 2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool FillsBoundsCompletely() const OVERRIDE { return false; } 2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count_; 2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count_; 2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<Layer> root_layer; 2165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) 2166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) root_layer = PictureLayer::Create(&client_); 2167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else 2168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) root_layer = ContentLayer::Create(&client_); 2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The expecations are based on the assumption that the default 2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD settings are: 2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); 2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->can_use_lcd_text()); 2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2187bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The first update consists of one LCD notification and one paint. 2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been enabled on the layer. 2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since nothing changed on layer, there should be no notification 2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or paint on the second update. 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must not have changed. 2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Change layer opacity that should trigger lcd notification. 2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetOpacity(.5f); 2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to request a commit - setting opacity will do it. 2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Verify that there is no extra commit due to layer invalidation. 2209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(3, layer_tree_host()->source_frame_number()); 2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD notification count should have incremented due to 2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // change in layer opacity. 2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.lcd_notification_count()); 2213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Paint count should be incremented due to invalidation. 2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.paint_count()); 2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been disabled on the layer due to opacity. 2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient client_; 2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLCDNotification); 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Verify that the BeginFrame notification is used to initiate rendering. 2229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 22325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu settings->begin_frame_scheduling_enabled = true; 2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // This will trigger a SetNeedsBeginFrame which will trigger a 2237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // BeginFrame. 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return DRAW_SUCCESS; 2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks frame_time_; 2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2255a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification); 2256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled 2258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) : public LayerTreeHostTest { 2259a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 2260a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 22615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu settings->begin_frame_scheduling_enabled = true; 226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->using_synchronous_renderer_compositor = true; 2263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The BeginFrame notification is turned off now but will get enabled 226990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // once we return. End test while it's enabled. 2270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 2271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 2272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&LayerTreeHostTestBeginFrameNotification::EndTest, 2273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 2274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2275a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2276a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 2278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 227990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F( 2280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled); 2281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStall : public LayerTreeHostTest { 228358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStall() 22855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : commit_count_(0), commit_abort_count_(0), commit_complete_count_(0) {} 228658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 228758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 22885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu settings->begin_frame_scheduling_enabled = true; 228958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 229058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 229158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 229258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 229358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 229458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) commit_count_++; 22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (commit_count_ == 4) { 22965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // After two aborted commits, request a real commit now to make sure a 229758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // real commit following an aborted commit will still complete and 229858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // end the test even when the Impl thread is idle. 229958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 230058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 230158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 230258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, 23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_handle) OVERRIDE { 23055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commit_abort_count_++; 23065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initiate another abortable commit. 23075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl->SetNeedsCommit(); 23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 231058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 231158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) commit_complete_count_++; 231258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (commit_complete_count_ == 1) { 23135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initiate an abortable commit after the first commit. 231458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_impl->SetNeedsCommit(); 231558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 231658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 231758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 231858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 231958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 232058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(commit_count_, 5); 23225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(commit_abort_count_, 3); 232358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(commit_complete_count_, 2); 232458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 232558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 232658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int commit_count_; 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int commit_abort_count_; 232858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int commit_complete_count_; 232958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 233058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor 23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTestAbortedCommitDoesntStall { 23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 23344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings); 23354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) settings->using_synchronous_renderer_compositor = true; 23364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 23374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 23384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 233958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F( 23404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor); 23414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 23424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync 23434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTestAbortedCommitDoesntStall { 23444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 23454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestAbortedCommitDoesntStall::InitializeSettings(settings); 23464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) settings->throttle_frame_production = false; 23474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 23484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 23494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 23504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync); 235158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation 2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->impl_side_painting = true; 2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> layer = PictureLayer::Create(&client_); 2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); 2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 2380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation); 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents 2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class SetBoundsClient : public ContentLayerClient { 2386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient() : layer_(0) {} 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void PaintContents( 2392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SkCanvas* canvas, 2393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const gfx::Rect& clip, 2394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE { 2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(2, 2)); 23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool FillsBoundsCompletely() const OVERRIDE { return false; } 2401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 2424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds()); 2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds()); 2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient client_; 2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents); 2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public TestWebGraphicsContext3D { 2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2443424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MockIOSurfaceWebGraphicsContext3D() { 24445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_capabilities_.gpu.iosurface = true; 24455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_capabilities_.gpu.texture_rectangle = true; 2446424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2447424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 24485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual GLuint createTexture() OVERRIDE { 2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 1; 2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 24515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(activeTexture, void(GLenum texture)); 24525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD2(bindTexture, void(GLenum target, 24535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint texture_id)); 24545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD3(texParameteri, void(GLenum target, 24555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLenum pname, 24565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint param)); 24575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(GLenum target, 24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint width, 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint height, 24605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint ioSurfaceId, 24615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint plane)); 24625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD4(drawElements, void(GLenum mode, 24635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLsizei count, 24645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLenum type, 24655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLintptr offset)); 24665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(deleteTexture, void(GLenum texture)); 2467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MOCK_METHOD2(produceTextureCHROMIUM, 2468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void(GLenum target, const GLbyte* mailbox)); 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest { 2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 24735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 2474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 24753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<MockIOSurfaceWebGraphicsContext3D> mock_context_owned( 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new MockIOSurfaceWebGraphicsContext3D); 24773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mock_context_ = mock_context_owned.get(); 24783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (delegating_renderer()) { 2480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return FakeOutputSurface::CreateDelegating3d( 2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mock_context_owned.PassAs<TestWebGraphicsContext3D>()); 2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 2483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return FakeOutputSurface::Create3d( 2484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mock_context_owned.PassAs<TestWebGraphicsContext3D>()); 2485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetIsDrawable(false); 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_id_ = 9; 2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_ = gfx::Size(6, 7); 2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create(); 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetBounds(gfx::Size(10, 10)); 2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIsDrawable(true); 2499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) io_surface_layer->SetContentsOpaque(true); 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_); 2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(io_surface_layer); 2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, host_impl->resource_provider()->num_resources()); 2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In WillDraw, the IOSurfaceLayer sets up the io surface texture. 2509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(_)).Times(0); 2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 25135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 25145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri( 25155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR)) 2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 25175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 25185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri( 25195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR)) 2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 25215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 25225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_TEXTURE_POOL_CHROMIUM, 2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_TEXTURE_POOL_UNMANAGED_CHROMIUM)).Times(1); 2525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*mock_context_, 2526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) texParameteri(GL_TEXTURE_RECTANGLE_ARB, 25275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_WRAP_S, 25285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_CLAMP_TO_EDGE)).Times(1); 25295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 25305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texParameteri(GL_TEXTURE_RECTANGLE_ARB, 25315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_TEXTURE_WRAP_T, 25325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_CLAMP_TO_EDGE)).Times(1); 25335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, 25355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) texImageIOSurface2DCHROMIUM(GL_TEXTURE_RECTANGLE_ARB, 25365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_surface_size_.width(), 25375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_surface_size_.height(), 25385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_surface_id_, 25395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0)).Times(1); 25405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(_, 0)).Times(AnyNumber()); 25425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 25435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 2548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 2549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResourceProvider* resource_provider = host_impl->resource_provider(); 2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1u, resource_provider->num_resources()); 2551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_EQ(1u, frame->render_passes.size()); 2552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_LE(1u, frame->render_passes[0]->quad_list.size()); 25531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DrawQuad* quad = frame->render_passes[0]->quad_list.front(); 2554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_EQ(DrawQuad::IO_SURFACE_CONTENT, quad->material); 2555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const IOSurfaceDrawQuad* io_surface_draw_quad = 2556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IOSurfaceDrawQuad::MaterialCast(quad); 2557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_SIZE_EQ(io_surface_size_, io_surface_draw_quad->io_surface_size); 2558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(0u, io_surface_draw_quad->io_surface_resource_id); 2559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), 2560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) resource_provider->TargetForTesting( 2561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) io_surface_draw_quad->io_surface_resource_id)); 2562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (delegating_renderer()) { 2566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The io surface layer's resource should be sent to the parent. 2567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*mock_context_, 2568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) produceTextureCHROMIUM(GL_TEXTURE_RECTANGLE_ARB, _)).Times(1); 2569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 2570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The io surface layer's texture is drawn. 2571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)).Times(AtLeast(1)); 2572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _)) 2573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(AtLeast(1)); 2574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 2577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 25813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*mock_context_, deleteTexture(1)).Times(AtLeast(1)); 2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int io_surface_id_; 2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIOSurfaceWebGraphicsContext3D* mock_context_; 2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size io_surface_size_; 2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestIOSurfaceDrawing); 2594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest { 2596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 2597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_ = 0; 2599a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2600b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2602b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1: commit + draw 2603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2: commit only (no draw/swap) 2604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3: draw only (no commit) 2605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2606b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2607bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int commit = layer_tree_host()->source_frame_number(); 2608b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (commit) { 2609b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2 done. 2611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, frame_); 2612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2614b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2615b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 2618bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int commit = layer_tree_host()->source_frame_number(); 2619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ++frame_; 2620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (frame_) { 2621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 1: 2622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1 done. 2623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, commit); 2624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3 done. 2628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, commit); 2629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EndTest(); 2630b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2634b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2635b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2636b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 2637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int frame_; 2638b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 2639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2640effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Flaky on all platforms: http://crbug.com/327498 2641effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_DelegatingRenderer) { 2642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 2643b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2644b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2645effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(LayerTreeHostTestNumFramesPending, DISABLED_GLRenderer) { 2646a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2647b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2648b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LayerTreeHostTestDeferredInitialize : public LayerTreeHostTest { 2650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 2651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // PictureLayer can only be used with impl side painting enabled. 2653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) settings->impl_side_painting = true; 2654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 2657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer_ = FakePictureLayer::Create(&client_); 2658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Force commits to not be aborted so new frames get drawn, otherwise 2659558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // the renderer gets deferred initialized but nothing new needs drawing. 2660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_->set_always_update_resources(true); 2661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 2662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 2663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 26667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_initialize_gl_ = false; 26677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_release_gl_ = false; 2668ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_source_frame_number_drawn_ = -1; // Never drawn. 2669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 2673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 2674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d( 2675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestWebGraphicsContext3D::Create()); 2676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return FakeOutputSurface::CreateDeferredGL( 2678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice), 2679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegating_renderer()); 2680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(host_impl->RootLayer()); 2684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakePictureLayerImpl* layer_impl = 2685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<FakePictureLayerImpl*>(host_impl->RootLayer()); 2686ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2687ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // The same frame can be draw multiple times if new visible tiles are 2688ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // rasterized. But we want to make sure we only post DeferredInitialize 2689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // and ReleaseGL once, so early out if the same frame is drawn again. 2690ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (last_source_frame_number_drawn_ == 2691ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_impl->active_tree()->source_frame_number()) 2692ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2693ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2694ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_source_frame_number_drawn_ = 2695ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_impl->active_tree()->source_frame_number(); 2696ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 26977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!did_initialize_gl_) { 2698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_LE(1u, layer_impl->append_quads_count()); 26997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ImplThreadTaskRunner()->PostTask( 27007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 27017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind( 27027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestDeferredInitialize::DeferredInitializeAndRedraw, 27037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this), 27047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(host_impl))); 27057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (did_initialize_gl_ && !did_release_gl_) { 2706ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_LE(2u, layer_impl->append_quads_count()); 27077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ImplThreadTaskRunner()->PostTask( 27087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 27095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostTestDeferredInitialize::ReleaseGLAndRedraw, 27105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 27115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(host_impl))); 27127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (did_initialize_gl_ && did_release_gl_) { 2713ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_LE(3u, layer_impl->append_quads_count()); 27147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 2715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DeferredInitializeAndRedraw(LayerTreeHostImpl* host_impl) { 27197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(did_initialize_gl_); 27207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // SetAndInitializeContext3D calls SetNeedsCommit. 27213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FakeOutputSurface* fake_output_surface = 27223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<FakeOutputSurface*>(host_impl->output_surface()); 27233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<TestContextProvider> context_provider = 27243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestContextProvider::Create(); // Not bound to thread. 27255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 27265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fake_output_surface->InitializeAndSetContext3d(context_provider)); 27277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_initialize_gl_ = true; 27287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 27297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 27307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ReleaseGLAndRedraw(LayerTreeHostImpl* host_impl) { 27317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_initialize_gl_); 27327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(did_release_gl_); 27337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // ReleaseGL calls SetNeedsCommit. 27347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<FakeOutputSurface*>(host_impl->output_surface())->ReleaseGL(); 27357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_release_gl_ = true; 2736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 2739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool result) OVERRIDE { 2740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(result); 2741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DelegatedFrameData* delegated_frame_data = 2742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) output_surface()->last_sent_frame().delegated_frame_data.get(); 2743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!delegated_frame_data) 2744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return all resources immediately. 2747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TransferableResourceArray resources_to_return = 2748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) output_surface()->resources_held_by_parent(); 2749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CompositorFrameAck ack; 2751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < resources_to_return.size(); ++i) 2752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) output_surface()->ReturnResource(resources_to_return[i].id, &ack); 2753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host_impl->ReclaimResources(&ack); 2754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 27577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_initialize_gl_); 27587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_release_gl_); 2759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 2762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakeContentLayerClient client_; 2763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<FakePictureLayer> layer_; 27647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_initialize_gl_; 27657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_release_gl_; 2766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int last_source_frame_number_drawn_; 2767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 2768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize); 2770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 27715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class LayerTreeHostTestDeferredInitializeWithGpuRasterization 27725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : public LayerTreeHostTestDeferredInitialize { 27735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 27745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // PictureLayer can only be used with impl side painting enabled. 27755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings->impl_side_painting = true; 27765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings->gpu_rasterization_enabled = true; 27775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) settings->gpu_rasterization_forced = true; 27785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 27795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 27805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitializeWithGpuRasterization); 27825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test for UI Resource management. 2784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUIResource : public LayerTreeHostTest { 2785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 27865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostTestUIResource() : num_ui_resources_(0) {} 2787a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 27890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 27900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 27910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 27955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame = layer_tree_host()->source_frame_number(); 2796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (frame) { 2797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 2798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 2799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 2800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 2803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Usually ScopedUIResource are deleted from the manager in their 2804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // destructor. Here we just want to test that a direct call to 2805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // DeleteUIResource works. 2806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(ui_resources_[0]->id()); 2807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2808a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 2810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // DeleteUIResource can be called with an invalid id. 2811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(ui_resources_[0]->id()); 2812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 2815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 2816a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateResource(); 2817a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 2820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ClearResources(); 2821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 2822a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2823a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void PerformTest(LayerTreeHostImpl* impl) { 28275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 2828a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 28295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame = impl->active_tree()->source_frame_number(); 2830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (frame) { 28315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0: 2832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 2833a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 28345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 2835a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Created two textures. 2836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 2837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 2839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // One texture left after one deletion. 2840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 2841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 28425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 2843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Resource manager state should not change when delete is called on an 2844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalid id. 2845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 2846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 28475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 2848a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Creation after deletion: two more creates should total up to 2849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // three textures. 2850a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(3u, context->NumTextures()); 2851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2852a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2856a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!layer_tree_host()->settings().impl_side_painting) 2857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PerformTest(impl); 2858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) 2862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PerformTest(impl); 2863a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2864a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2866a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2867a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 2868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Must clear all resources before exiting. 2869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void ClearResources() { 2870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int i = 0; i < num_ui_resources_; i++) 2871a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resources_[i].reset(); 2872a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2873a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2874a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CreateResource() { 2875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resources_[num_ui_resources_++] = 2876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FakeScopedUIResource::Create(layer_tree_host()); 2877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resources_[5]; 2880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int num_ui_resources_; 2881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 2882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2883a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUIResource); 2884a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PushPropertiesCountingLayerImpl : public LayerImpl { 28865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static scoped_ptr<PushPropertiesCountingLayerImpl> Create( 28885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeImpl* tree_impl, int id) { 28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return make_scoped_ptr(new PushPropertiesCountingLayerImpl(tree_impl, id)); 28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~PushPropertiesCountingLayerImpl() {} 28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE { 28955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerImpl::PushPropertiesTo(layer); 28965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) push_properties_count_++; 28975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Push state to the active tree because we can only access it from there. 28985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PushPropertiesCountingLayerImpl*>( 28995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer)->push_properties_count_ = push_properties_count_; 29005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 29015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 29035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 29045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PushPropertiesCountingLayerImpl::Create(tree_impl, id()). 29055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PassAs<LayerImpl>(); 29065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 29075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t push_properties_count() const { return push_properties_count_; } 29095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void reset_push_properties_count() { push_properties_count_ = 0; } 29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t push_properties_count_; 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl(LayerTreeImpl* tree_impl, int id) 29155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : LayerImpl(tree_impl, id), 29165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) push_properties_count_(0) { 29175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBounds(gfx::Size(1, 1)); 29185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 29195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 29205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PushPropertiesCountingLayer : public Layer { 29227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 29237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static scoped_refptr<PushPropertiesCountingLayer> Create() { 29247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new PushPropertiesCountingLayer(); 29257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE { 29287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Layer::PushPropertiesTo(layer); 29297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch push_properties_count_++; 29307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (persist_needs_push_properties_) 29317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch needs_push_properties_ = true; 29327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 29355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 29365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PushPropertiesCountingLayerImpl::Create(tree_impl, id()). 29375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PassAs<LayerImpl>(); 29385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 29395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void SetDrawsContent(bool draws_content) { SetIsDrawable(draws_content); } 29416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 29427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t push_properties_count() const { return push_properties_count_; } 29437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void reset_push_properties_count() { push_properties_count_ = 0; } 29447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_persist_needs_push_properties(bool persist) { 29467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch persist_needs_push_properties_ = persist; 29477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 29507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PushPropertiesCountingLayer() 29515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : push_properties_count_(0), persist_needs_push_properties_(false) { 29527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetBounds(gfx::Size(1, 1)); 29537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~PushPropertiesCountingLayer() {} 29557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t push_properties_count_; 29577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool persist_needs_push_properties_; 29587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 29597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestLayersPushProperties : public LayerTreeHostTest { 29617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 29627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 29637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_commits_ = 0; 29647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_root_ = 0; 29657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child_ = 0; 29667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild_ = 0; 29677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child2_ = 0; 29687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_other_root_ = 0; 29697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_leaf_layer_ = 0; 29707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 29717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 29747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = PushPropertiesCountingLayer::Create(); 29757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_ = PushPropertiesCountingLayer::Create(); 29767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_ = PushPropertiesCountingLayer::Create(); 29777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_ = PushPropertiesCountingLayer::Create(); 29784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_ = PushPropertiesCountingLayer::Create(); 29794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_->set_persist_needs_push_properties(true); 29807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 29827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child2_); 29837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild_); 29844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) child2_->AddChild(leaf_always_pushing_layer_); 29857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_root_ = PushPropertiesCountingLayer::Create(); 29877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Don't set the root layer here. 29897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 29907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 29937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++num_commits_; 29947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_root_, root_->push_properties_count()); 29967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_child_, child_->push_properties_count()); 29977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_grandchild_, 29987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->push_properties_count()); 29997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_child2_, 30007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->push_properties_count()); 30017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_other_root_, 30027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_root_->push_properties_count()); 30033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expected_push_properties_leaf_layer_, 30044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_->push_properties_count()); 30057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The scrollbar layer always needs to be pushed. 30077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (root_->layer_tree_host()) { 30087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 30097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 30107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (child2_->layer_tree_host()) { 30127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child2_->descendant_needs_push_properties()); 30137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child2_->needs_push_properties()); 30147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (leaf_always_pushing_layer_->layer_tree_host()) { 30164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 30174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leaf_always_pushing_layer_->descendant_needs_push_properties()); 30184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(leaf_always_pushing_layer_->needs_push_properties()); 30197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // child_ and grandchild_ don't persist their need to push properties. 30227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (child_->layer_tree_host()) { 30237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 30247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 30257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (grandchild_->layer_tree_host()) { 30277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild_->descendant_needs_push_properties()); 30287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild_->needs_push_properties()); 30297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (other_root_->layer_tree_host()) { 30327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(other_root_->descendant_needs_push_properties()); 30337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(other_root_->needs_push_properties()); 30347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (num_commits_) { 30377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 30387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 30397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 30407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_root_; 30417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 30427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 30437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 30447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 30467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 30477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 30487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 3: 30507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(other_root_); 30517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 30527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_other_root_; 30537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 4: 30557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 30567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 30577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_root_; 30587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 30597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 30607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 5: 30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 6: 30677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 30687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 7: 30717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 30727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 30737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 30757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 8: 30777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->RemoveFromParent(); 30787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 30797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 9: 30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild_); 30827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 30837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 30847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 10: 30867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 30877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 30887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 11: 30907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.8f, 1.1f); 30917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 30927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 12: 30947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 30957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 30967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 30977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 30987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 13: 30997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->SetPosition(gfx::Point(1, 1)); 31007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 31017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 31027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 31037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 14: 31047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 31057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 31067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 31077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 31087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 31097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 31107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 15: 31117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->SetPosition(gfx::Point(1, 1)); 31127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 31137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 31147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 31157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 16: 3116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // SetNeedsDisplay does not always set needs commit (so call it 3117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // explicitly), but is a property change. 31187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetNeedsDisplay(); 31197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 3120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 31217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 31227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 17: 31237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 31247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 31257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The leaf layer always pushes. 31284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (leaf_always_pushing_layer_->layer_tree_host()) 31297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_leaf_layer_; 31307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 31337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int num_commits_; 31357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 31367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> root_; 31377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child_; 31387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child2_; 31397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild_; 31407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> other_root_; 31414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<PushPropertiesCountingLayer> leaf_always_pushing_layer_; 31427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_root_; 31437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child_; 31447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child2_; 31457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild_; 31467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_other_root_; 31477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_leaf_layer_; 31487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 31497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31507dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestLayersPushProperties); 31517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestImplLayersPushProperties 31535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostTestLayersPushProperties { 31547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 31557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 31565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_root_impl_ = 0; 31575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child_impl_ = 0; 31585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild_impl_ = 0; 31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_ = 0; 31605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 31615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostTestLayersPushProperties::BeginTest(); 31627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 31655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // These commits are in response to the changes made in 31665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // LayerTreeHostTestLayersPushProperties::DidCommitAndDrawFrame() 31675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_commits_) { 31685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0: 31695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tree hasn't been setup yet don't bother to check anything. 31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 31715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 31725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Root gets set up, Everyone is initialized. 31735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_root_impl_; 31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child_impl_; 31755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 31765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 31775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 31785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 31805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tree doesn't change but the one leaf that always pushes is pushed. 31815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 31825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 31835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 31845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Root is swapped here. 31855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear the expected push properties the tree will be rebuilt. 31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_root_impl_ = 0; 31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child_impl_ = 0; 31885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild_impl_ = 0; 31895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_ = 0; 31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 31915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure the new root is pushed. 31935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1u, static_cast<PushPropertiesCountingLayerImpl*>( 31945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl->RootLayer())->push_properties_count()); 31955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 31965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 31975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Root is swapped back all of the layers in the tree get pushed. 31985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_root_impl_; 31995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child_impl_; 32005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 32025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 32035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 5: 32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tree doesn't change but the one leaf that always pushes is pushed. 32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 32075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 6: 32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First child is removed. Structure of the tree changes here so swap 32105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // some of the values. child_impl becomes child2_impl. 32115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child_impl_ = 32125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_; 32135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_child2_impl_ = 0; 32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // grandchild_impl becomes grandchild2_impl. 32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild_impl_ = 32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_; 32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // grandchild_impl is now the leaf that always pushes. It is pushed. 32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 7: 32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Child is added back. New layers are initialized. 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 8: 32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Leaf is removed. 32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_push_properties_grandchild2_impl_ = 0; 32335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Always pushing. 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 9: 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Leaf is added back 32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 10: 32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 11: 32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 12: 32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This child position was changed. 32575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 32585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 13: 32605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The position of this child was changed. 32615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child_impl_; 32625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 14: 32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second child is removed from tree. Don't discard counts because 32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // they are added back before commit. 32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second child added back. 32745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 32755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 32765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 15: 32795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The position of this child was changed. 32805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild2_impl_; 32815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushes is pushed. 32835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 16: 32865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second child is invalidated with SetNeedsDisplay 32875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_child2_impl_; 32885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The leaf that always pushed is pushed. 32905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++expected_push_properties_grandchild_impl_; 32915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 32925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* root_impl_ = NULL; 32955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* child_impl_ = NULL; 32965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* child2_impl_ = NULL; 32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* grandchild_impl_ = NULL; 32985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PushPropertiesCountingLayerImpl* leaf_always_pushing_layer_impl_ = NULL; 32995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Pull the layers that we need from the tree assuming the same structure 33015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // as LayerTreeHostTestLayersPushProperties 33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl->RootLayer()); 33045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (root_impl_ && root_impl_->children().size() > 0) { 33065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 33075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_->children()[0]); 33085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child_impl_ && child_impl_->children().size() > 0) 33105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) grandchild_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 33115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_impl_->children()[0]); 33125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (root_impl_ && root_impl_->children().size() > 1) { 33155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child2_impl_ = static_cast<PushPropertiesCountingLayerImpl*>( 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_->children()[1]); 33175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child2_impl_ && child2_impl_->children().size() > 0) 33195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leaf_always_pushing_layer_impl_ = 33205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PushPropertiesCountingLayerImpl*>( 33215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child2_impl_->children()[0]); 33225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (root_impl_) 33255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_root_impl_, 33265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_impl_->push_properties_count()); 33275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child_impl_) 33285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_child_impl_, 33295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_impl_->push_properties_count()); 33305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (grandchild_impl_) 33315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_grandchild_impl_, 33325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) grandchild_impl_->push_properties_count()); 33335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child2_impl_) 33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_child2_impl_, 33355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child2_impl_->push_properties_count()); 33365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (leaf_always_pushing_layer_impl_) 33375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_push_properties_grandchild2_impl_, 33385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leaf_always_pushing_layer_impl_->push_properties_count()); 33395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_root_impl_; 33425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_child_impl_; 33435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_child2_impl_; 33445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_grandchild_impl_; 33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_push_properties_grandchild2_impl_; 33465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 33475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(LayerTreeHostTestImplLayersPushProperties, DelegatingRenderer) { 33495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunTestWithImplSidePainting(); 33505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestPropertyChangesDuringUpdateArePushed 33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostTest { 33545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 33555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 33565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = Layer::Create(); 33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->SetBounds(gfx::Size(1, 1)); 33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool paint_scrollbar = true; 33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool has_thumb = false; 33633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_layer_ = FakePaintedScrollbarLayer::Create( 33643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) paint_scrollbar, has_thumb, root_->id()); 33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(scrollbar_layer_); 33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3373bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switch (layer_tree_host()->source_frame_number()) { 33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: { 33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // During update, the ignore_set_needs_commit_ bit is set to true to 33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // avoid causing a second commit to be scheduled. If a property change 33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // is made during this, however, it needs to be pushed in the upcoming 33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // commit. 33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<base::AutoReset<bool> > ignore = 33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->IgnoreSetNeedsCommit(); 33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->SetBounds(gfx::Size(30, 30)); 33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(scrollbar_layer_->needs_push_properties()); 33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->reset_push_properties_count(); 33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0u, scrollbar_layer_->push_properties_count()); 33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, scrollbar_layer_->push_properties_count()); 33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<Layer> root_; 34043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; 34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPropertyChangesDuringUpdateArePushed); 34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class LayerTreeHostTestSetDrawableCausesCommit : public LayerTreeHostTest { 34106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 34116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 34126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 34146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root_ = PushPropertiesCountingLayer::Create(); 34156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) child_ = PushPropertiesCountingLayer::Create(); 34166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root_->AddChild(child_); 34176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 34196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 34206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 34216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 34236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 34246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) case 0: 34256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) break; 34266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) case 1: { 34276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // During update, the ignore_set_needs_commit_ bit is set to true to 34286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // avoid causing a second commit to be scheduled. If a property change 34296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // is made during this, however, it needs to be pushed in the upcoming 34306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // commit. 34316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(root_->needs_push_properties()); 34326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(child_->needs_push_properties()); 34336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, root_->NumDescendantsThatDrawContent()); 34346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root_->reset_push_properties_count(); 34356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) child_->reset_push_properties_count(); 34366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) child_->SetDrawsContent(true); 34376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1, root_->NumDescendantsThatDrawContent()); 34386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0u, root_->push_properties_count()); 34396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0u, child_->push_properties_count()); 34406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(root_->needs_push_properties()); 34416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(child_->needs_push_properties()); 34426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) break; 34436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 34446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) case 2: 34456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1u, root_->push_properties_count()); 34466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1u, child_->push_properties_count()); 34476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(root_->needs_push_properties()); 34486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(child_->needs_push_properties()); 34496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EndTest(); 34506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) break; 34516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 34526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 34536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 34556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<PushPropertiesCountingLayer> root_; 34576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<PushPropertiesCountingLayer> child_; 34586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 34596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetDrawableCausesCommit); 34616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestCasePushPropertiesThreeGrandChildren 34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTest { 34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_root_ = 0; 34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child_ = 0; 34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild1_ = 0; 34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild2_ = 0; 34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild3_ = 0; 34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = PushPropertiesCountingLayer::Create(); 34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_ = PushPropertiesCountingLayer::Create(); 34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_ = PushPropertiesCountingLayer::Create(); 34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_ = PushPropertiesCountingLayer::Create(); 34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild3_ = PushPropertiesCountingLayer::Create(); 34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild1_); 34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild2_); 34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild3_); 34857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Don't set the root layer here. 34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 34917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 34937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> root_; 34947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child_; 34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild1_; 34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild2_; 34977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild3_; 34987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_root_; 34997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child_; 35007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild1_; 35017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild2_; 35027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild3_; 35037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 35047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush 35067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 35077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 35087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3509bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 35107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 35117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 35127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 35147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 35167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 35177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 35247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->needs_push_properties()); 35267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 35287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 35307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 35327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild3_->needs_push_properties()); 35347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 35367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 35377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 35387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 35397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 35407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 35417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 35427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35437dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush); 35447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion 35467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 35477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 35487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3549bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 35507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 35517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 35527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 35537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 35547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 35557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 35577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 35597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 35607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 35677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 35687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 35717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 35737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild1_); 35797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 35857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 35927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 35987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 36007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 36017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 36027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 36037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild2_ will still need a push properties. 36057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 36067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild3_ does not need a push properties, so recursing should 36137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no longer be needed. 36147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 36157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 36187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 36207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 36217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 36257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36267dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion); 36277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence 36297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 36307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 36317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3632bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 36337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 36347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 36357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 36367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->set_persist_needs_push_properties(true); 36377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->set_persist_needs_push_properties(true); 36387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 36407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 36457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 36467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 36477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 36487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 36497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 36507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild2_ will still need a push properties. 36527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 36537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild3_ does not need a push properties, so recursing should 36607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no longer be needed. 36617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 36627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 36657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 36677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 36687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 36727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36737dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 36747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence); 36757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree 36777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 36787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 36797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3680bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 36817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 36827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 36837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 36847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 36867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 36887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 36907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 36917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 36927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 36937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 36947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 36957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 36967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Change grandchildren while their parent is not in the tree. 36987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 36997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 37007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 37017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 37107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild3_->needs_push_properties()); 37127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 37157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 37227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild3_->RemoveFromParent(); 37297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 37367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 37407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37417dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 37427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree); 37437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild 37457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 37467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 37477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3748bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 37497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 37507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 37517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 37527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 37547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 37567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 37577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 37597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 37617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 37637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 37667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 37677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 37687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 37747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 37787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 37817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 37887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 37957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 38047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38057dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 38067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild); 38077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent 38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 38107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 38117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 3812bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int last_source_frame_number = layer_tree_host()->source_frame_number() - 1; 38137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 38147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 38157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 38167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 38187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 38207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 38217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 38227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 38237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 38247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 38257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 38307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 38317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 38327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 38367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 38387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 38397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 38407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 38417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 38427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 38437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 38457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 38497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 38527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 38567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 38577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 38597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 38627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 38647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 38687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38697dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 38707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent); 38717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// This test verifies that the tree activation callback is invoked correctly. 3873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass LayerTreeHostTestTreeActivationCallback : public LayerTreeHostTest { 3874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 3875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LayerTreeHostTestTreeActivationCallback() 3876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : num_commits_(0), callback_count_(0) {} 3877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void BeginTest() OVERRIDE { 3879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(HasImplThread()); 3880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PostSetNeedsCommitToMainThread(); 3881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 3882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 38845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 38855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 3886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 3887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++num_commits_; 3888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (num_commits_) { 3889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case 1: 3890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, callback_count_); 3891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback_count_ = 0; 3892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetCallback(true); 3893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PostSetNeedsCommitToMainThread(); 3894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 3895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case 2: 3896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1, callback_count_); 3897ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback_count_ = 0; 3898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetCallback(false); 3899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PostSetNeedsCommitToMainThread(); 3900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 3901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case 3: 3902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, callback_count_); 3903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback_count_ = 0; 3904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EndTest(); 3905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 3906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch default: 3907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ADD_FAILURE() << num_commits_; 3908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EndTest(); 3909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch break; 3910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 39115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return LayerTreeHostTest::PrepareToDrawOnThread( 39125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl, frame_data, draw_result); 3913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 3914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 39155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(3, num_commits_); } 3916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void SetCallback(bool enable) { 39185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_surface()->SetTreeActivationCallback( 39195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enable 39205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? base::Bind( 39215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &LayerTreeHostTestTreeActivationCallback::ActivationCallback, 39225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this)) 39235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : base::Closure()); 3924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 3925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 39265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ActivationCallback() { ++callback_count_; } 3927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3928ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int num_commits_; 3929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int callback_count_; 3930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 3931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DirectRenderer) { 3933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunTest(true, false, true); 3934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(LayerTreeHostTestTreeActivationCallback, DelegatingRenderer) { 3937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunTest(true, true, true); 3938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3939ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 39402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerInvalidateCausesDraw : public LayerTreeHostTest { 3941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 39422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerInvalidateCausesDraw() : num_commits_(0), num_draws_(0) {} 3943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 39451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(!!invalidate_layer_.get()) 39462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch << "Derived tests must set this in SetupTree"; 39472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3948a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // One initial commit. 3949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3952a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 39532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // After commit, invalidate the layer. This should cause a commit. 3954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (layer_tree_host()->source_frame_number() == 1) 39555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) invalidate_layer_->SetNeedsDisplay(); 3956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 3959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) num_draws_++; 3960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (impl->active_tree()->source_frame_number() == 1) 3961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 3962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 3965a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) num_commits_++; 3966a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3967a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 3969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_GE(2, num_commits_); 3970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_GE(2, num_draws_); 3971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 39732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected: 39742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<Layer> invalidate_layer_; 39752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 3977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int num_commits_; 3978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int num_draws_; 3979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 3980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 39812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// VideoLayer must support being invalidated and then passing that along 39822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in 39832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation. 39842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestVideoLayerInvalidate : public LayerInvalidateCausesDraw { 39852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 39862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual void SetupTree() OVERRIDE { 39872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerTreeHostTest::SetupTree(); 39886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<VideoLayer> video_layer = 39896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) VideoLayer::Create(&provider_, media::VIDEO_ROTATION_0); 39902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch video_layer->SetBounds(gfx::Size(10, 10)); 39912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch video_layer->SetIsDrawable(true); 39922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer_tree_host()->root_layer()->AddChild(video_layer); 39932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 39942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch invalidate_layer_ = video_layer; 39952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 39962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 39972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private: 39982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch FakeVideoFrameProvider provider_; 39992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 40002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestVideoLayerInvalidate); 4002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 40032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// IOSurfaceLayer must support being invalidated and then passing that along 40042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// to the compositor thread, even though no resources are updated in 40052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// response to that invalidation. 40062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LayerTreeHostTestIOSurfaceLayerInvalidate 40072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch : public LayerInvalidateCausesDraw { 40082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 40092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual void SetupTree() OVERRIDE { 40102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerTreeHostTest::SetupTree(); 40112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<IOSurfaceLayer> layer = IOSurfaceLayer::Create(); 40122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer->SetBounds(gfx::Size(10, 10)); 40132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch uint32_t fake_io_surface_id = 7; 40142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer->SetIOSurfaceProperties(fake_io_surface_id, layer->bounds()); 40152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer->SetIsDrawable(true); 40162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch layer_tree_host()->root_layer()->AddChild(layer); 40172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 40182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch invalidate_layer_ = layer; 40192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 40202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 40212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 40222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 40232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 40242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch LayerTreeHostTestIOSurfaceLayerInvalidate); 40252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4026a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestPushHiddenLayer : public LayerTreeHostTest { 4027a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 4028a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4029a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_ = Layer::Create(); 4030a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetPosition(gfx::Point()); 4031a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 10)); 4032a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4033a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_ = SolidColorLayer::Create(); 4034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetPosition(gfx::Point()); 4035a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetBounds(gfx::Size(10, 10)); 4036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetIsDrawable(true); 4037a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->AddChild(parent_layer_); 4038a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4039a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_ = SolidColorLayer::Create(); 4040a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetPosition(gfx::Point()); 4041a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(10, 10)); 4042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetIsDrawable(true); 4043a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->AddChild(child_layer_); 4044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 4046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4048a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4050a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 4052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 4053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 4054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The layer type used does not need to push properties every frame. 4055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(child_layer_->needs_push_properties()); 4056a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4057a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Change the bounds of the child layer, but make it skipped 4058a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // by CalculateDrawProperties. 4059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) parent_layer_->SetOpacity(0.f); 4060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) child_layer_->SetBounds(gfx::Size(5, 5)); 4061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 4062a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 4063a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The bounds of the child layer were pushed to the impl side. 4064a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(child_layer_->needs_push_properties()); 4065a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4066a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 4067a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 4068a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4069a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4070a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4071a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 4072a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 4073a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* parent = root->children()[0]; 4074a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* child = parent->children()[0]; 4075a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 4077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 4078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(gfx::Size(5, 5).ToString(), child->bounds().ToString()); 4079a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 4080a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4081a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4082a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4083a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4084a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4085a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<Layer> root_layer_; 4086a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<SolidColorLayer> parent_layer_; 4087a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<SolidColorLayer> child_layer_; 4088a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 4089a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4090a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushHiddenLayer); 4091a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4092a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class LayerTreeHostTestUpdateLayerInEmptyViewport : public LayerTreeHostTest { 4093a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 4094a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) settings->impl_side_painting = true; 4096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_ = FakePictureLayer::Create(&client_); 4100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 10)); 4101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 4103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 4107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The viewport is empty, but we still need to update layers on the main 4108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // thread. 4109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); 4110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 4111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 4114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The layer should be updated even though the viewport is empty, so we 4115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are capable of drawing it on the impl tree. 4116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_GT(root_layer_->update_count(), 0u); 4117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 4118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 4119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FakeContentLayerClient client_; 4123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<FakePictureLayer> root_layer_; 4124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 4125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestUpdateLayerInEmptyViewport); 4127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 41283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass LayerTreeHostTestAbortEvictedTextures : public LayerTreeHostTest { 41293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch public: 41303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch LayerTreeHostTestAbortEvictedTextures() 41311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : num_will_begin_main_frames_(0), num_impl_commits_(0) {} 41323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch protected: 41343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void SetupTree() OVERRIDE { 41353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<SolidColorLayer> root_layer = SolidColorLayer::Create(); 41363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch root_layer->SetBounds(gfx::Size(200, 200)); 41373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch root_layer->SetIsDrawable(true); 41383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch layer_tree_host()->SetRootLayer(root_layer); 41403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch LayerTreeHostTest::SetupTree(); 41413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 41443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 41461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) num_will_begin_main_frames_++; 41471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (num_will_begin_main_frames_) { 41483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch case 2: 41493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Send a redraw to the compositor thread. This will (wrongly) be 41503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // ignored unless aborting resets the texture state. 41513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch layer_tree_host()->SetNeedsRedraw(); 41523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch break; 41533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE { 41573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch num_impl_commits_++; 41583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 41613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch switch (impl->SourceAnimationFrameNumber()) { 41623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch case 1: 41633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Prevent draws until commit. 41643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch impl->active_tree()->SetContentsTexturesPurged(); 41653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_FALSE(impl->CanDraw()); 41663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Trigger an abortable commit. 41673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch impl->SetNeedsCommit(); 41683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch break; 41693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch case 2: 41703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EndTest(); 41713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch break; 41723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void AfterTest() OVERRIDE { 41763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Ensure that the commit was truly aborted. 41771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(2, num_will_begin_main_frames_); 41783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(1, num_impl_commits_); 41793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 41803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch private: 41821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int num_will_begin_main_frames_; 41833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int num_impl_commits_; 41843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}; 41853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 41863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Commits can only be aborted when using the thread proxy. 41873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestAbortEvictedTextures); 41883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 418958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostTestMaxTransferBufferUsageBytes : public LayerTreeHostTest { 419058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 419158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 419258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->impl_side_painting = true; 419358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 419458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 41955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 419658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OVERRIDE { 4197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<TestContextProvider> context_provider = 4198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TestContextProvider::Create(); 4199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) context_provider->SetMaxTransferBufferUsageBytes(1024 * 1024); 4200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (delegating_renderer()) 4201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return FakeOutputSurface::CreateDelegating3d(context_provider); 4202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 4203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return FakeOutputSurface::Create3d(context_provider); 420458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 420558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 420658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 42071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client_.set_fill_with_nonsolid_color(true); 420858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<FakePictureLayer> root_layer = 420958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FakePictureLayer::Create(&client_); 421058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) root_layer->SetBounds(gfx::Size(6000, 6000)); 421158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) root_layer->SetIsDrawable(true); 421258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 421358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 421458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 421558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 421658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 42175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 421858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 421958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 42205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 422158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 422258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect that the transfer buffer memory used is equal to the 422358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // MaxTransferBufferUsageBytes value set in CreateOutputSurface. 4224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1024 * 1024u, context->max_used_transfer_buffer_usage_bytes()); 422558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 422658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 422758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 422858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 422958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 423058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 423158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FakeContentLayerClient client_; 423258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 423358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 423458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Impl-side painting is a multi-threaded compositor feature. 423558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestMaxTransferBufferUsageBytes); 423658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 423768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Test ensuring that memory limits are sent to the prioritized resource 423868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// manager. 423968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class LayerTreeHostTestMemoryLimits : public LayerTreeHostTest { 424068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 424168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) LayerTreeHostTestMemoryLimits() : num_commits_(0) {} 424268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 424368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 424468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 42455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void WillCommit() OVERRIDE { 42465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Some commits are aborted, so increment number of attempted commits here. 42475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_commits_++; 42485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 42495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 42515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_commits_) { 42525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 425368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Verify default values. 42545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(), 42555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 42565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 42575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->MaxMemoryLimitBytes()); 42585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(), 42595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 42605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 42615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ExternalPriorityCutoff()); 426268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 426368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 42645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 426568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The values should remain the same until the commit after the policy 426668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // is changed. 42675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PrioritizedResourceManager::DefaultMemoryAllocationLimit(), 42685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 42695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 42705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->MaxMemoryLimitBytes()); 42715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PriorityCalculator::AllowEverythingCutoff(), 42725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 42735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 42745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ExternalPriorityCutoff()); 427568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 42765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 427768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Verify values were correctly passed. 42785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(16u * 1024u * 1024u, 42795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 42805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 42815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->MaxMemoryLimitBytes()); 42825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PriorityCalculator::AllowVisibleAndNearbyCutoff(), 42835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host() 42845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->contents_texture_manager() 42855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ExternalPriorityCutoff()); 428668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EndTest(); 428768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 42885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 428968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Make sure no extra commits happen. 429068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 429168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 429268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 429368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 429468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 429568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 42965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_commits_) { 429768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 1: 42985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 42995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 430068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This will trigger a commit because the priority cutoff has changed. 430168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) impl->SetMemoryPolicy(ManagedMemoryPolicy( 43025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16u * 1024u * 1024u, 43031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, 430468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1000)); 430568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 43065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 430768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This will not trigger a commit because the priority cutoff has not 430868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // changed, and there is already enough memory for all allocations. 430968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) impl->SetMemoryPolicy(ManagedMemoryPolicy( 43105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32u * 1024u * 1024u, 43111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, 431268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1000)); 431368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 43145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 431568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 431668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 431768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 431868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 431968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 432068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 432168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 432268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 432368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int num_commits_; 432468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 432568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostTestMemoryLimits); 432768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 43293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 43304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface 43314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostTest { 43324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 43334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface() 43344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : first_output_surface_memory_limit_(4321234), 43354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) second_output_surface_memory_limit_(1234321) {} 43364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 43384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OVERRIDE { 43391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!first_context_provider_.get()) { 43404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) first_context_provider_ = TestContextProvider::Create(); 43414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 43421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(second_context_provider_.get()); 43434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) second_context_provider_ = TestContextProvider::Create(); 43444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<TestContextProvider> provider(second_context_provider_.get() 4347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ? second_context_provider_ 4348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : first_context_provider_); 4349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<FakeOutputSurface> output_surface; 4350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (delegating_renderer()) 4351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output_surface = FakeOutputSurface::CreateDelegating3d(provider); 4352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 4353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output_surface = FakeOutputSurface::Create3d(provider); 43545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_surface->SetMemoryPolicyToSetAtBind( 43555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) make_scoped_ptr(new ManagedMemoryPolicy( 43561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci second_context_provider_.get() ? second_output_surface_memory_limit_ 43571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : first_output_surface_memory_limit_, 43581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, 43591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ManagedMemoryPolicy::kDefaultNumResourcesLimit))); 43605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return output_surface.Pass(); 43614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 43644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 43654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_->SetBounds(gfx::Size(20, 20)); 43664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 43674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 43684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 43714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 43734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Lost context sometimes takes two frames to recreate. The third frame 43744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is sometimes aborted, so wait until the fourth frame to verify that 43754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // the memory has been set, and the fifth frame to end the test. 43764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (layer_tree_host()->source_frame_number() < 5) { 43774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 43784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else if (layer_tree_host()->source_frame_number() == 5) { 43794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 43804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* impl, 43845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool result) OVERRIDE { 43854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 43864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 43874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(first_output_surface_memory_limit_, 43884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) impl->memory_allocation_limit_bytes()); 43894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Lose the output surface. 43904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) first_context_provider_->TestContext3d()->loseContextCHROMIUM( 43915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); 43924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 43934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 43944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(second_output_surface_memory_limit_, 43954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) impl->memory_allocation_limit_bytes()); 43964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 43974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 43994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 44004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 44014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 44024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestContextProvider> first_context_provider_; 44034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestContextProvider> second_context_provider_; 44044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t first_output_surface_memory_limit_; 44054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t second_output_surface_memory_limit_; 44064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 44074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 44084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 44094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 44104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// No output to copy for delegated renderers. 44114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 44124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostTestSetMemoryPolicyOnLostOutputSurface); 44134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct TestSwapPromiseResult { 44155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSwapPromiseResult() 44165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : did_swap_called(false), 44175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_not_swap_called(false), 44185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dtor_called(false), 44195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reason(SwapPromise::DID_NOT_SWAP_UNKNOWN) {} 4420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool did_swap_called; 4422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool did_not_swap_called; 4423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool dtor_called; 4424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SwapPromise::DidNotSwapReason reason; 4425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Lock lock; 4426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 4427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestSwapPromise : public SwapPromise { 4429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 44305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit TestSwapPromise(TestSwapPromiseResult* result) : result_(result) {} 4431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~TestSwapPromise() { 4433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(result_->lock); 4434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->dtor_called = true; 4435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DidSwap(CompositorFrameMetadata* metadata) OVERRIDE { 4438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(result_->lock); 4439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_swap_called); 4440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_not_swap_called); 4441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->did_swap_called = true; 4442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidNotSwap(DidNotSwapReason reason) OVERRIDE { 4445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(result_->lock); 4446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_swap_called); 4447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(result_->did_not_swap_called); 4448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->did_not_swap_called = true; 4449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_->reason = reason; 4450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 44526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual int64 TraceId() const OVERRIDE { return 0; } 44536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 4455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Not owned. 4456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestSwapPromiseResult* result_; 4457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 4458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 44595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { 4460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 4461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostTestBreakSwapPromise() 44625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : commit_count_(0), commit_complete_count_(0) {} 4463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 4465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_LE(commit_count_, 2); 44665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SwapPromise> swap_promise( 44675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new TestSwapPromise(&swap_promise_result_[commit_count_])); 4468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 4469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 4474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) commit_count_++; 4475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (commit_count_ == 2) { 4476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This commit will finish. 4477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) commit_complete_count_++; 4483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (commit_complete_count_ == 1) { 4484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This commit will be aborted because no actual update. 4485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PostSetNeedsUpdateLayersToMainThread(); 4486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 4487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EndTest(); 4488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 4492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 3 commits are scheduled. 2 completes. 1 is aborted. 4493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(commit_count_, 3); 4494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(commit_complete_count_, 2); 4495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 4497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The first commit completes and causes swap buffer which finishes 4498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the promise. 4499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(swap_promise_result_[0].lock); 4500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[0].did_swap_called); 4501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); 4502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[0].dtor_called); 4503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 45065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The second commit is aborted since it contains no updates. 4507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(swap_promise_result_[1].lock); 4508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_[1].did_swap_called); 4509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); 45105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(SwapPromise::COMMIT_NO_UPDATE, swap_promise_result_[1].reason); 4511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[1].dtor_called); 4512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 4515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The last commit completes but it does not cause swap buffer because 4516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // there is no damage in the frame data. 4517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock lock(swap_promise_result_[2].lock); 4518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_[2].did_swap_called); 4519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); 4520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); 4521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_[2].dtor_called); 4522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int commit_count_; 4526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int commit_complete_count_; 4527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestSwapPromiseResult swap_promise_result_[3]; 4528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 4529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 45306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBreakSwapPromise); 4531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 45326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit 45335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : public LayerTreeHostTest { 45345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 45355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 45365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 45376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 45385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 45395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 45405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 45415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 45425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 45435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host()->SetVisible(false); 45446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<SwapPromise> swap_promise( 45456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new TestSwapPromise(&swap_promise_result_)); 45466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 45475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 45486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 45496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 45506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, 45516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool did_handle) OVERRIDE { 45526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EndTest(); 45536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 45546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 45556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 45566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 45576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::AutoLock lock(swap_promise_result_.lock); 45586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(swap_promise_result_.did_swap_called); 45596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(swap_promise_result_.did_not_swap_called); 45606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); 45616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(swap_promise_result_.dtor_called); 45626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 45636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 45646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 45656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSwapPromiseResult swap_promise_result_; 45666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 45676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 456803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 45696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit); 45706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 45716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit 45726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : public LayerTreeHostTest { 45736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 45746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 45755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 45766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 45776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (TestEnded()) 45786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 45796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 45806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 45816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 45826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 45836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 45846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->DidLoseOutputSurface(); 45855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<SwapPromise> swap_promise( 45865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new TestSwapPromise(&swap_promise_result_)); 45875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 45886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 45895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 45905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 45915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, 45925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool did_handle) OVERRIDE { 45935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EndTest(); 45946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // This lets the test finally commit and exit. 45956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MainThreadTaskRunner()->PostTask( 45966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FROM_HERE, 45976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit:: 45986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FindOutputSurface, 45996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Unretained(this))); 46006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 46016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 46026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void FindOutputSurface() { 46036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->OnCreateAndInitializeOutputSurfaceAttempted(true); 46045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 46055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 46065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 46075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 46085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::AutoLock lock(swap_promise_result_.lock); 46095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(swap_promise_result_.did_swap_called); 46105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_.did_not_swap_called); 46115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); 46125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(swap_promise_result_.dtor_called); 46135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 46145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 46155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 46165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestSwapPromiseResult swap_promise_result_; 46175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 46185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 461903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 462003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit); 46215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { 4623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 4624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, 4625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl, 4626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_commit_count, 4627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_redraw_count) 4628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), 46296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) set_needs_commit_count_(set_needs_commit_count) {} 4630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~SimpleSwapPromiseMonitor() {} 4632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnSetNeedsCommitOnMain() OVERRIDE { 4634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*set_needs_commit_count_)++; 4635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnSetNeedsRedrawOnImpl() OVERRIDE { 46386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ADD_FAILURE() << "Should not get called on main thread."; 46396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 46406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 46416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnForwardScrollUpdateToMainThreadOnImpl() OVERRIDE { 46426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ADD_FAILURE() << "Should not get called on main thread."; 4643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 4646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* set_needs_commit_count_; 4647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 4648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 46495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostTestSimpleSwapPromiseMonitor : public LayerTreeHostTest { 46505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 46546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (TestEnded()) 46556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 46566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int set_needs_commit_count = 0; 4658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int set_needs_redraw_count = 0; 4659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 4661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( 4662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new SimpleSwapPromiseMonitor(layer_tree_host(), 4663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 4664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_commit_count, 4665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_redraw_count)); 4666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1, set_needs_commit_count); 4668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Now the monitor is destroyed, SetNeedsCommit() is no longer being 4672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // monitored. 4673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1, set_needs_commit_count); 4675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 4678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( 4679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new SimpleSwapPromiseMonitor(layer_tree_host(), 4680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 4681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_commit_count, 4682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_redraw_count)); 4683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsUpdateLayers(); 4684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(2, set_needs_commit_count); 4685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 4689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( 4690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new SimpleSwapPromiseMonitor(layer_tree_host(), 4691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 4692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_commit_count, 4693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &set_needs_redraw_count)); 4694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host()->SetNeedsAnimate(); 4695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(3, set_needs_commit_count); 4696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, set_needs_redraw_count); 4697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EndTest(); 4700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 4701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 4704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 470503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSimpleSwapPromiseMonitor); 4706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerTreeHostTestHighResRequiredAfterEvictingUIResources 4708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LayerTreeHostTest { 4709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 4710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->impl_side_painting = true; 4712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 4717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_impl->EvictAllUIResources(); 4723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Existence of evicted UI resources will trigger NEW_CONTENT_TAKES_PRIORITY 4724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // mode. Active tree should require high-res to draw after entering this 4725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // mode to ensure that high-res tiles are also required for a pending tree 4726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to be activated. 4727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->RequiresHighResToDraw()); 4728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 4731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int frame = layer_tree_host()->source_frame_number(); 4732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (frame) { 4733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 4734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 4735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 4736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 2: 4737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui_resource_.reset(); 4738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 4739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 4740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeContentLayerClient client_; 4746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resource_; 4747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 4748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4749f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This test is flaky, see http://crbug.com/386199 4750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// MULTI_THREAD_TEST_F(LayerTreeHostTestHighResRequiredAfterEvictingUIResources) 4751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeHostTestGpuRasterizationDefault : public LayerTreeHostTest { 4753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 4754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->impl_side_painting = true; 4756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(settings->gpu_rasterization_enabled); 4758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(settings->gpu_rasterization_forced); 4759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<PictureLayer> layer = PictureLayer::Create(&layer_client_); 4765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 4766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetIsDrawable(true); 4767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 4768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 4771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Layer* root = layer_tree_host()->root_layer(); 4772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PictureLayer* layer = static_cast<PictureLayer*>(root->child_at(0)); 4773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PicturePile* pile = layer->GetPicturePileForTesting(); 4774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify default values. 4776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(root->IsSuitableForGpuRasterization()); 4777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer->IsSuitableForGpuRasterization()); 4778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(pile->is_suitable_for_gpu_rasterization()); 4779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->has_gpu_rasterization_trigger()); 4780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->UseGpuRasterization()); 4781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Setting gpu rasterization trigger does not enable gpu rasterization. 478346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) layer_tree_host()->SetHasGpuRasterizationTrigger(true); 4784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->has_gpu_rasterization_trigger()); 4785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->UseGpuRasterization()); 4786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->pending_tree()->use_gpu_rasterization()); 4792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->use_gpu_rasterization()); 4793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->active_tree()->use_gpu_rasterization()); 4797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->use_gpu_rasterization()); 4798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 4799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FakeContentLayerClient layer_client_; 4804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 4805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationDefault); 4807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeHostTestGpuRasterizationEnabled : public LayerTreeHostTest { 4809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 4810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) settings->impl_side_painting = true; 4812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(settings->gpu_rasterization_enabled); 4814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings->gpu_rasterization_enabled = true; 4815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 4818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 4819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<PictureLayer> layer = PictureLayer::Create(&layer_client_); 4821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 4822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetIsDrawable(true); 4823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 4824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 4827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Layer* root = layer_tree_host()->root_layer(); 4828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PictureLayer* layer = static_cast<PictureLayer*>(root->child_at(0)); 4829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PicturePile* pile = layer->GetPicturePileForTesting(); 4830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify default values. 4832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(root->IsSuitableForGpuRasterization()); 4833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer->IsSuitableForGpuRasterization()); 4834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(pile->is_suitable_for_gpu_rasterization()); 4835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->has_gpu_rasterization_trigger()); 4836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->UseGpuRasterization()); 4837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Gpu rasterization trigger is relevant. 483946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) layer_tree_host()->SetHasGpuRasterizationTrigger(true); 4840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->has_gpu_rasterization_trigger()); 4841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->UseGpuRasterization()); 4842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Content-based veto is relevant as well. 4844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pile->SetUnsuitableForGpuRasterizationForTesting(); 4845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(pile->is_suitable_for_gpu_rasterization()); 4846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer->IsSuitableForGpuRasterization()); 4847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Veto will take effect when layers are updated. 4848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The results will be verified after commit is completed below. 4849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Since we are manually marking picture pile as unsuitable, 4850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // make sure that the layer gets a chance to update. 4851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetNeedsDisplay(); 4852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->pending_tree()->use_gpu_rasterization()); 4857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->use_gpu_rasterization()); 4858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->active_tree()->use_gpu_rasterization()); 4862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(host_impl->use_gpu_rasterization()); 4863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EndTest(); 4864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FakeContentLayerClient layer_client_; 4869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 4870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationEnabled); 4872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeHostTestGpuRasterizationForced : public LayerTreeHostTest { 4874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected: 4875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 4876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings->impl_side_painting = true; 4877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(settings->gpu_rasterization_forced); 4879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings->gpu_rasterization_forced = true; 4880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 4883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 4884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<PictureLayer> layer = PictureLayer::Create(&layer_client_); 4886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 4887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetIsDrawable(true); 4888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 4889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 4892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Layer* root = layer_tree_host()->root_layer(); 4893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PictureLayer* layer = static_cast<PictureLayer*>(root->child_at(0)); 4894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PicturePile* pile = layer->GetPicturePileForTesting(); 4895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify default values. 4897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(root->IsSuitableForGpuRasterization()); 4898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer->IsSuitableForGpuRasterization()); 4899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(pile->is_suitable_for_gpu_rasterization()); 4900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->has_gpu_rasterization_trigger()); 4901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // With gpu rasterization forced, gpu rasterization trigger is irrelevant. 4903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->UseGpuRasterization()); 490446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) layer_tree_host()->SetHasGpuRasterizationTrigger(true); 4905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->has_gpu_rasterization_trigger()); 4906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->UseGpuRasterization()); 4907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Content-based veto is irrelevant as well. 4909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pile->SetUnsuitableForGpuRasterizationForTesting(); 4910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(pile->is_suitable_for_gpu_rasterization()); 4911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(layer->IsSuitableForGpuRasterization()); 4912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Veto will take effect when layers are updated. 4913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The results will be verified after commit is completed below. 4914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Since we are manually marking picture pile as unsuitable, 4915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // make sure that the layer gets a chance to update. 4916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layer->SetNeedsDisplay(); 4917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(host_impl->pending_tree()->use_gpu_rasterization()); 4922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(host_impl->use_gpu_rasterization()); 4923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->use_gpu_rasterization()); 4927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(host_impl->use_gpu_rasterization()); 4928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EndTest(); 4929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4932a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FakeContentLayerClient layer_client_; 4934a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 4935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestGpuRasterizationForced); 4937a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass LayerTreeHostTestContinuousPainting : public LayerTreeHostTest { 4939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 4940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LayerTreeHostTestContinuousPainting() 4941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : num_commits_(0), num_draws_(0), bounds_(20, 20), child_layer_(NULL) {} 4942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected: 4944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enum { kExpectedNumCommits = 10 }; 4945c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetupTree() OVERRIDE { 4947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<Layer> root_layer = Layer::Create(); 4948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch root_layer->SetBounds(bounds_); 4949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (layer_tree_host()->settings().impl_side_painting) { 4951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch picture_layer_ = FakePictureLayer::Create(&client_); 4952c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_ = picture_layer_.get(); 4953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 4954c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_layer_ = ContentLayerWithUpdateTracking::Create(&client_); 4955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_ = content_layer_.get(); 4956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 4957c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_->SetBounds(bounds_); 4958c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_->SetIsDrawable(true); 4959c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch root_layer->AddChild(child_layer_); 4960c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4961c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer_tree_host()->SetRootLayer(root_layer); 4962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer_tree_host()->SetViewportSize(bounds_); 4963c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LayerTreeHostTest::SetupTree(); 4964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 4965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4966c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void BeginTest() OVERRIDE { 4967c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MainThreadTaskRunner()->PostTask( 4968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FROM_HERE, 4969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind( 4970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &LayerTreeHostTestContinuousPainting::EnableContinuousPainting, 4971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this))); 49726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Wait 50x longer than expected. 49736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) double milliseconds_per_frame = 49746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1000.0 / layer_tree_host()->settings().refresh_rate; 49756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MainThreadTaskRunner()->PostDelayedTask( 49766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FROM_HERE, 49776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind( 49786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &LayerTreeHostTestContinuousPainting::DisableContinuousPainting, 49796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Unretained(this)), 49806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeDelta::FromMilliseconds(50 * kExpectedNumCommits * 49816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) milliseconds_per_frame)); 4982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 4983c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 498403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 4985c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch child_layer_->SetNeedsDisplay(); 4986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 4987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void AfterTest() OVERRIDE { 4989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_LE(kExpectedNumCommits, num_commits_); 4990c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_LE(kExpectedNumCommits, num_draws_); 49911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int update_count = content_layer_.get() 49921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? content_layer_->PaintContentsCount() 49931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : picture_layer_->update_count(); 4994c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_LE(kExpectedNumCommits, update_count); 4995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 4996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 4998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (++num_draws_ == kExpectedNumCommits) 4999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EndTest(); 5000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5002c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 5003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++num_commits_; 5004c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5005c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 5007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void EnableContinuousPainting() { 5008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LayerTreeDebugState debug_state = layer_tree_host()->debug_state(); 5009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_state.continuous_painting = true; 5010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer_tree_host()->SetDebugState(debug_state); 5011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 50136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void DisableContinuousPainting() { 50146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LayerTreeDebugState debug_state = layer_tree_host()->debug_state(); 50156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) debug_state.continuous_painting = false; 50166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host()->SetDebugState(debug_state); 50176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EndTest(); 50186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 50196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 5020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int num_commits_; 5021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int num_draws_; 5022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Size bounds_; 5023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FakeContentLayerClient client_; 5024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<ContentLayerWithUpdateTracking> content_layer_; 5025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<FakePictureLayer> picture_layer_; 5026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Layer* child_layer_; 5027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 5028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5029c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestContinuousPainting); 5030c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 50311675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochclass LayerTreeHostTestActivateOnInvisible : public LayerTreeHostTest { 50321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 50331675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch LayerTreeHostTestActivateOnInvisible() 50341675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch : activation_count_(0), visible_(true) {} 50351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 50371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci settings->impl_side_painting = true; 50381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BeginTest() OVERRIDE { 50411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Kick off the test with a commit. 50421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PostSetNeedsCommitToMainThread(); 50431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 50461675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // Make sure we don't activate using the notify signal from tile manager. 50471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->BlockNotifyReadyToActivateForTesting(true); 50481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void DidCommit() OVERRIDE { layer_tree_host()->SetVisible(false); } 50511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl, 50531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool visible) OVERRIDE { 50541675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch visible_ = visible; 50551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch 50561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Once invisible, we can go visible again. 50571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!visible) { 50581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PostSetVisibleToMainThread(true); 50591675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch } else { 50601675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch EXPECT_TRUE(host_impl->active_tree()->RequiresHighResToDraw()); 50611675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch EndTest(); 50621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 50661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++activation_count_; 50671675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch EXPECT_FALSE(visible_); 50681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AfterTest() OVERRIDE { 50711675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // Ensure we activated even though the signal was blocked. 50721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, activation_count_); 50731675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch EXPECT_TRUE(visible_); 50741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 50771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int activation_count_; 50781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch bool visible_; 50791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeContentLayerClient client_; 50811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FakePictureLayer> picture_layer_; 50821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 50831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(vmpstr): Enable with single thread impl-side painting. 50851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestActivateOnInvisible); 50861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50875b892326406927b709cdaf6c384d4ababf456332Ben Murdoch// Make sure page scale and top control deltas are applied to the client even 50885b892326406927b709cdaf6c384d4ababf456332Ben Murdoch// when the LayerTreeHost doesn't have a root layer. 50895b892326406927b709cdaf6c384d4ababf456332Ben Murdochclass LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer 50905b892326406927b709cdaf6c384d4ababf456332Ben Murdoch : public LayerTreeHostTest { 50915b892326406927b709cdaf6c384d4ababf456332Ben Murdoch public: 50925b892326406927b709cdaf6c384d4ababf456332Ben Murdoch LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() 50935b892326406927b709cdaf6c384d4ababf456332Ben Murdoch : deltas_sent_to_client_(false) {} 50945b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 50955b892326406927b709cdaf6c384d4ababf456332Ben Murdoch virtual void BeginTest() OVERRIDE { 50965b892326406927b709cdaf6c384d4ababf456332Ben Murdoch layer_tree_host()->SetRootLayer(nullptr); 50975b892326406927b709cdaf6c384d4ababf456332Ben Murdoch info_.page_scale_delta = 3.14f; 50985b892326406927b709cdaf6c384d4ababf456332Ben Murdoch info_.top_controls_delta = 2.73f; 50995b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51005b892326406927b709cdaf6c384d4ababf456332Ben Murdoch PostSetNeedsCommitToMainThread(); 51015b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } 51025b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51035b892326406927b709cdaf6c384d4ababf456332Ben Murdoch virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { 51045b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EXPECT_EQ(nullptr, layer_tree_host()->root_layer()); 51055b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51065b892326406927b709cdaf6c384d4ababf456332Ben Murdoch layer_tree_host()->ApplyScrollAndScale(&info_); 51075b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EndTest(); 51085b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } 51095b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51105b892326406927b709cdaf6c384d4ababf456332Ben Murdoch virtual void ApplyViewportDeltas( 51115b892326406927b709cdaf6c384d4ababf456332Ben Murdoch const gfx::Vector2d& scroll, 51125b892326406927b709cdaf6c384d4ababf456332Ben Murdoch float scale_delta, 51135b892326406927b709cdaf6c384d4ababf456332Ben Murdoch float top_controls_delta) OVERRIDE { 51145b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EXPECT_EQ(info_.page_scale_delta, scale_delta); 51155b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EXPECT_EQ(info_.top_controls_delta, top_controls_delta); 51165b892326406927b709cdaf6c384d4ababf456332Ben Murdoch deltas_sent_to_client_ = true; 51175b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } 51185b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51195b892326406927b709cdaf6c384d4ababf456332Ben Murdoch virtual void AfterTest() OVERRIDE { 51205b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EXPECT_TRUE(deltas_sent_to_client_); 51215b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } 51225b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51235b892326406927b709cdaf6c384d4ababf456332Ben Murdoch ScrollAndScaleSet info_; 51245b892326406927b709cdaf6c384d4ababf456332Ben Murdoch bool deltas_sent_to_client_; 51255b892326406927b709cdaf6c384d4ababf456332Ben Murdoch}; 51265b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 51275b892326406927b709cdaf6c384d4ababf456332Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer); 51282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 5129