layer_tree_host_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/io_surface_layer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer.h" 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/test/fake_picture_layer_impl.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h" 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {} 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!impl->active_tree()->source_frame_number()) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(1, num_commits_); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(1, num_draws_); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest { 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {} 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (num_commits_) { 111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_commits_); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(1, num_draws_); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we pass property values in PushPropertiesTo. 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LayerTreeHostTestPushPropertiesTo : public LayerTreeHostTest { 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetupTree() OVERRIDE { 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<Layer> root = Layer::Create(); 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root->SetBounds(gfx::Size(10, 10)); 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host()->SetRootLayer(root); 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostTest::SetupTree(); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum Properties { 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch STARTUP, 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BOUNDS, 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HIDE_LAYER_AND_SUBTREE, 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DRAWS_CONTENT, 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DONE, 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void BeginTest() OVERRIDE { 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index_ = STARTUP; 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PostSetNeedsCommitToMainThread(); 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VerifyAfterValues(impl->active_tree()->root_layer()); 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetBeforeValues(layer_tree_host()->root_layer()); 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VerifyBeforeValues(layer_tree_host()->root_layer()); 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++index_; 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (index_ == DONE) { 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EndTest(); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetAfterValues(layer_tree_host()->root_layer()); 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void AfterTest() OVERRIDE {} 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void VerifyBeforeValues(Layer* layer) { 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(gfx::Size(10, 10).ToString(), layer->bounds().ToString()); 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(layer->hide_layer_and_subtree()); 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(layer->DrawsContent()); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetBeforeValues(Layer* layer) { 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetBounds(gfx::Size(10, 10)); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(false); 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetIsDrawable(false); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void VerifyAfterValues(LayerImpl* layer) { 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (static_cast<Properties>(index_)) { 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case STARTUP: 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DONE: 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case BOUNDS: 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(gfx::Size(20, 20).ToString(), layer->bounds().ToString()); 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case HIDE_LAYER_AND_SUBTREE: 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(layer->hide_layer_and_subtree()); 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DRAWS_CONTENT: 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(layer->DrawsContent()); 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetAfterValues(Layer* layer) { 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (static_cast<Properties>(index_)) { 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case STARTUP: 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DONE: 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case BOUNDS: 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetBounds(gfx::Size(20, 20)); 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case HIDE_LAYER_AND_SUBTREE: 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(true); 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case DRAWS_CONTENT: 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetIsDrawable(true); 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int index_; 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesTo); 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest { 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {} 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redraw again to verify that the second redraw doesn't commit. 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_draws_); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(2, num_draws_); 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect. 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest { 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedrawRect() 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_draws_(0), 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_(50, 50), 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalid_rect_(10, 10, 20, 20), 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_(ContentLayer::Create(&client_)) { 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(bounds_); 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(result); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF root_damage_rect; 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame_data->render_passes.empty()) 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this is the first frame, expect full frame damage. 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_)); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that invalid_rect_ is indeed repainted. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_)); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawRectToMainThread(invalid_rect_); 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_draws_); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Size bounds_; 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Rect invalid_rect_; 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest { 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_ = FakeContentLayer::Create(&client_); 336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->SetBounds(gfx::Size(1, 1)); 337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->AddChild(scaled_layer_); 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scaled_layer_|, which should not generate 357b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, layer_tree_host()->commit_number()); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(4, 4).ToString(), 368b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->content_bounds().ToString()); 369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<FakeContentLayer> scaled_layer_; 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate); 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 382b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 383b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 384b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_ = FakeScrollbarLayer::Create(paint_scrollbar, 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) has_thumb, 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->id()); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(scrollbar_); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 416b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 417b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scrollbar_|, which should not generate 418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 419b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, layer_tree_host()->commit_number()); 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 427b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 428b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), 429b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scrollbar_->content_bounds().ToString()); 430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 434b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadback : public LayerTreeHostTest { 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadback() : num_commits_(0) {} 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadback); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws() 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_(0) {} 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 4) { 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the layerTreeHost says it can't draw, Then we should not try to draw. 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest { 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCanDrawBlocksDrawing() : num_commits_(0), done_(false) {} 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (done_) 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only the initial draw should bring us here. 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (done_) 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ >= 1) { 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // After the first commit, we should not be able to draw. 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make the viewport empty so the host says it can't draw. 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Let it draw so we go idle and end the test. 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(1, 1)); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) done_ = true; 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool done_; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// beginLayerWrite should prevent draws from executing until a commit occurs 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersRedraw : public LayerTreeHostTest { 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestWriteLayersRedraw() : num_commits_(0), num_draws_(0) {} 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostAcquireLayerTextures(); 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); // should be inhibited without blocking 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(num_draws_, num_commits_); 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_commits_); } 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersRedraw); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that when resuming visibility, Requesting layer write permission 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will not deadlock the main thread even though there are not yet any 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled redraws. This behavior is critical for reliably surviving tab 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// switching. There are no failure conditions to this test, it just passes 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by not timing out. 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersAfterVisible : public LayerTreeHostTest { 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestWriteLayersAfterVisible() : num_commits_(0) {} 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 2) 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (num_commits_ < 2) { 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(true); 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostAcquireLayerTextures(); 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersAfterVisible); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assertion. 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackWhileInvisible() : num_commits_(0) {} 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest { 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestAbortFrameWhenInvisible() {} 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request a commit (from the main thread), Which will trigger the commit 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // flow from the impl side. 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Then mark ourselves as not visible before processing any more messages 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // on the main thread. 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we make it without kicking a frame, we pass! 654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTestAfterDelay(1); 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(true); 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side. 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest { 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCommit() {} 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(5.f, 5.f, 5.f); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20), impl->device_viewport_size()); 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color()); 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5.f, impl->active_tree()->page_scale_factor()); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree 69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure. 69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public LayerTreeHostTest { 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails() : frame_(0) {} 70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ >= 1) { 71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks()); 71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(impl->settings().impl_side_painting); 71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool CanActivatePendingTree(LayerTreeHostImpl* impl) OVERRIDE { 723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (frame_ >= 1) 724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool CanActivatePendingTreeIfNeeded(LayerTreeHostImpl* impl) 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OVERRIDE { 73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame_++; 73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ == 1) { 73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_frame_time_ = impl->CurrentFrameTimeTicks(); 73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Since base::TimeTicks::Now() uses a low-resolution clock on 73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Windows, we need to make sure that the clock has incremented past 73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // first_frame_time_. 73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) while (first_frame_time_ == base::TimeTicks::Now()) {} 73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int frame_; 75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails); 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame. 75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest { 75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {} 76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame_++; 77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ == 1) { 77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_frame_time_ = impl->CurrentFrameTimeTicks(); 77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) impl->SetNeedsRedraw(); 77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Since base::TimeTicks::Now() uses a low-resolution clock on 77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Windows, we need to make sure that the clock has incremented past 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // first_frame_time_. 77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) while (first_frame_time_ == base::TimeTicks::Now()) {} 77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks()); 78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure there isn't a commit between the two draws, to ensure that a 78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // commit isn't required for updating the current frame time. We can 79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // only check for this in the multi-threaded case, since in the single- 79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // threaded case there will always be a commit between consecutive draws. 792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) 79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0, frame_); 79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int frame_; 80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw); 80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor. 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest { 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestStartPageScaleAnimation() {} 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 811a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 812a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 813a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 814a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_ = FakeContentLayer::Create(&client_); 815a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollable(true); 816a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(gfx::Vector2d()); 817a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer_); 818a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 819a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE { 826a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d offset = scroll_layer_->scroll_offset(); 827a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(offset + scroll_delta); 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f); 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->ProcessScrollDeltas(); 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We get one commit before the first draw, and the animation doesn't happen 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // until the second draw. 835a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 836a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 0: 837a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 838a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We'll start an animation when we get back to the main thread. 839a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 840a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 841a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 842a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 843a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 844a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 845a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor()); 846a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 847a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 848a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 849a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 850a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 851a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 852a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 853a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 854a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 855a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 856a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f); 857a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->StartPageScaleAnimation( 858a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d(), false, 1.25f, base::TimeDelta()); 859a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 864a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 865a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FakeContentLayerClient client_; 866a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_refptr<FakeContentLayer> scroll_layer_; 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest { 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetVisible() : num_draws_(0) {} 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is suppressed while we're invisible. 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Triggers the redraw. 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(true); 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->visible()); 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); } 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient { 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate() : test_layer_(0) {} 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas*, gfx::Rect, gfx::RectF*) OVERRIDE { 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set layer opacity to 0. 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (test_layer_) 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_->SetOpacity(0.f); 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* test_layer_; 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer { 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<ContentLayerWithUpdateTracking> Create( 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentLayerClient* client) { 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new ContentLayerWithUpdateTracking(client)); 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int PaintContentsCount() { return paint_contents_count_; } 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ResetPaintContentsCount() { paint_contents_count_ = 0; } 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Update(ResourceUpdateQueue* queue, 926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OcclusionTracker* occlusion) OVERRIDE { 9277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool updated = ContentLayer::Update(queue, occlusion); 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_contents_count_++; 9297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return updated; 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit ContentLayerWithUpdateTracking(ContentLayerClient* client) 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client), paint_contents_count_(0) { 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetAnchorPoint(gfx::PointF(0.f, 0.f)); 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBounds(gfx::Size(10, 10)); 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsDrawable(true); 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ContentLayerWithUpdateTracking() {} 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_contents_count_; 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit. 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest { 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestOpacityChange() 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_opacity_change_delegate_(), 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) update_check_layer_(ContentLayerWithUpdateTracking::Create( 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &test_opacity_change_delegate_)) { 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get()); 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(update_check_layer_); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update() should have been called once. 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, update_check_layer_->PaintContentsCount()); 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate test_opacity_change_delegate_; 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_; 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange); 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer { 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) { 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new NoScaleContentLayer(client)); 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CalculateContentsScale(float ideal_contents_scale, 985b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float device_scale_factor, 986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float page_scale_factor, 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animating_transform_to_screen, 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_x, 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_y, 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size* contentBounds) OVERRIDE { 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Skip over the ContentLayer's method to the base Layer class. 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::CalculateContentsScale(ideal_contents_scale, 993b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) device_scale_factor, 994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) page_scale_factor, 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) animating_transform_to_screen, 996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_x, 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_y, 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentBounds); 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit NoScaleContentLayer(ContentLayerClient* client) 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client) {} 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~NoScaleContentLayer() {} 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers() 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(NoScaleContentLayer::Create(&client_)), 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_(ContentLayer::Create(&client_)) {} 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(60, 60)); 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(1.5); 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size()); 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer_); 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(30, 30)); 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetIsDrawable(true); 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetPosition(gfx::Point(2, 2)); 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetBounds(gfx::Size(10, 10)); 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should only do one commit. 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device scale factor should come over to impl. 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers are on impl. 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size()); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device viewport is scaled. 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), impl->device_viewport_size()); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* child = impl->active_tree()->root_layer()->children()[0]; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Positions remain in layout pixels. 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(0, 0), root->position()); 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(2, 2), child->position()); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Compute all the layer transforms for the frame. 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData frame_data; 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->PrepareToDraw(&frame_data, gfx::Rect()); 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->DidDrawAllLayers(frame_data); 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list = 1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *frame_data.render_surface_layer_list; 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers should be drawing into the root render surface. 1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, render_surface_layer_list.size()); 1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(root->render_surface(), 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_surface_layer_list[0]->render_surface()); 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, root->render_surface()->layer_list().size()); 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root render surface is the size of the viewport. 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60), 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->render_surface()->content_rect()); 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The content bounds of the child should be scaled. 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size child_bounds_scaled = 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5)); 1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(child_bounds_scaled, child->content_bounds()); 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform scale_transform; 1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scale_transform.Scale(impl->device_scale_factor(), 1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->device_scale_factor()); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root layer is scaled by 2x. 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_screen_space_transform = scale_transform; 1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_draw_transform = scale_transform; 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_draw_transform, root->draw_transform()); 1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_screen_space_transform, root->screen_space_transform()); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The child is at position 2,2, which is transformed to 3,3 after the scale 1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_screen_space_transform; 1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_screen_space_transform.Translate(3.f, 3.f); 1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_draw_transform = child_screen_space_transform; 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform, 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->draw_transform()); 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform, 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->screen_space_transform()); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<NoScaleContentLayer> root_layer_; 1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> child_layer_; 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers); 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures. 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest { 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure partial texture updates are turned off. 1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 0; 1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->use_linear_fade_scrollbar_animator = false; 1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_ = FakeContentLayer::Create(&client_); 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_ = 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, layer_->id()); 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->AddChild(scrollbar_); 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 113890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 113990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = -1; 114090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 114190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates); 1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used texture is correct. 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be doubled as the first textures 1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // are used by impl thread and cannot by used for update. 1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should still be 1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // one for each layer. 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First textures should not have been used. 1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // New textures should have been used. 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (drew_frame_ == impl->active_tree()->source_frame_number()) { 119390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_; 119490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 119590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 119690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = impl->active_tree()->source_frame_number(); 119790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We draw/ship one texture each frame for each layer. 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetNeedsDisplay(); 1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_; 121490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int drew_frame_; 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommit); 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer, 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* parent, 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& transform, 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF anchor, 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF position, 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size bounds, 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool opaque) { 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->RemoveAllChildren(); 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent) 1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent->AddChild(layer); 1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(transform); 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetAnchorPoint(anchor); 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetPosition(position); 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(bounds); 1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetContentsOpaque(opaque); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate 1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Allow one partial texture update. 1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 1; 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->use_linear_fade_scrollbar_animator = false; 1244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // No partial updates when impl side painting is enabled. 1245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings->impl_side_painting = false; 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_ = FakeContentLayer::Create(&client_); 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->SetBounds(gfx::Size(10, 20)); 1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetPosition(gfx::Point(0, 10)); 1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetBounds(gfx::Size(3, 10)); 1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_with_paints_ = 1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, parent_->id()); 1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_with_paints_->SetPosition(gfx::Point(3, 10)); 1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_with_paints_->SetBounds(gfx::Size(3, 10)); 1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_scrollbar = false; 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_without_paints_ = 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, parent_->id()); 1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_without_paints_->SetPosition(gfx::Point(6, 10)); 1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_without_paints_->SetBounds(gfx::Size(3, 10)); 1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(child_); 1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(scrollbar_with_paints_); 1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(scrollbar_without_paints_); 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 127990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 128090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 128190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 128290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 1: 128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplay(); 128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_with_paints_->SetNeedsDisplay(); 128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_without_paints_->SetNeedsDisplay(); 128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 2: 129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Damage part of layers. 129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 129390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_with_paints_->SetNeedsDisplayRect( 129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::RectF(0.f, 0.f, 5.f, 5.f)); 129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_without_paints_->SetNeedsDisplayRect( 129690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::RectF(0.f, 0.f, 5.f, 5.f)); 129790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 129890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 3: 129990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 130090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_with_paints_->SetNeedsDisplay(); 130190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_without_paints_->SetNeedsDisplay(); 130290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 130390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 130490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 4: 130590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 130690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 130790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 5: 130890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 130990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 131090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 131190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED() << layer_tree_host()->commit_number(); 131290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 131390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 131490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates); 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer. 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, context->NumUsedTextures()); 1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used textures are correct. 1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be two for each content layer and one 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // for each scrollbar, since they always do a partial update. 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(6u, context->NumTextures()); 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // layer, and one for the scrollbar layer that paints. 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, context->NumUsedTextures()); 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First content textures should not have been used. 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The non-painting scrollbar's texture wasn't updated. 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(2))); 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The painting scrollbar's partial update texture was used. 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // New textures should have been used. 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(4))); 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(5))); 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be two for each content layer and one 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // for each scrollbar, since they always do a partial update. 1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(6u, context->NumTextures()); 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // layer, and one for the scrollbar layer that paints. 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, context->NumUsedTextures()); 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The non-painting scrollbar's texture wasn't updated. 1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(2))); 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The painting scrollbar does a partial update. 1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // One content layer does a partial update also. 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(4))); 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(5))); 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No textures should be used for commit. 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be two. One for the 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // content layer, and one for the painting scrollbar. The 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // non-painting scrollbar doesn't update its texture. 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 139690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LT(impl->active_tree()->source_frame_number(), 5); 139790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for drawing should one per layer except for 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // frame 3 where the viewport only contains one layer. 140390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 3) { 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, context->NumUsedTextures()); 140590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 140690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(4u, context->NumUsedTextures()) << 140790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "For frame " << impl->active_tree()->source_frame_number(); 140890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_with_paints_; 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_without_paints_; 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer. 142490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestAtomicCommitWithPartialUpdate); 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest { 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestFinishAllRendering() : once_(false), draw_count_(0) {} 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (once_) 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) once_ = true; 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->AcquireLayerTextures(); 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) draw_count_ = 0; 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->FinishAllRendering(); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, draw_count_); 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++draw_count_; 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool once_; 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Lock lock_; 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int draw_count_; 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest { 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* root_layer = layer_tree_host()->root_layer(); 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels), 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect(0, 0, 1, 1)); 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->render_surface()); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup); 1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 14897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->cache_render_pass_contents = true; 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 14957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_layer_ = FakeContentLayer::Create(&client_); 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 14977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 14987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer1_ = FakeContentLayer::Create(&client_); 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetBounds(gfx::Size(100, 100)); 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetForceRenderSurface(true); 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetOpacity(0.5f); 15027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_layer_->AddChild(surface_layer1_); 15037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer2_ = FakeContentLayer::Create(&client_); 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetBounds(gfx::Size(100, 100)); 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetForceRenderSurface(true); 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetOpacity(0.5f); 15087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface_layer1_->AddChild(surface_layer2_); 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer1_ = FakeContentLayer::Create(&client_); 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetReplicaLayer(replica_layer1_.get()); 15127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer2_ = FakeContentLayer::Create(&client_); 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetReplicaLayer(replica_layer2_.get()); 1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 15177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 15187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Renderer* renderer = host_impl->renderer(); 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderPass::Id surface1_render_pass_id = host_impl->active_tree() 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->root_layer()->children()[0]->render_surface()->RenderPassId(); 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderPass::Id surface2_render_pass_id = 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[0]->children()[0] 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->render_surface()->RenderPassId(); 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId( 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface1_render_pass_id)); 1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId( 1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface2_render_pass_id)); 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reduce the memory limit to only fit the root layer and one render 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // surface. This prevents any contents drawing into surfaces 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from being allocated. 1542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_impl->SetMemoryPolicy( 1543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ManagedMemoryPolicy(100 * 100 * 4 * 2), true); 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId( 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface1_render_pass_id)); 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId( 1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface2_render_pass_id)); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 15577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (layer_tree_host()->commit_number() < 2) 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetNeedsDisplay(); 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 15627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, root_layer_->update_count()); 15637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, surface_layer1_->update_count()); 15647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_LE(2u, surface_layer2_->update_count()); 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer1_; 1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer1_; 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer2_; 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer2_; 1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Surfaces don't exist with a delegated renderer. 1576a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit); 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer { 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<EvictionTestLayer> Create() { 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new EvictionTestLayer()); 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool Update(ResourceUpdateQueue*, 1586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OcclusionTracker*) OVERRIDE; 1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool DrawsContent() const OVERRIDE { return true; } 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE; 1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE; 1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE; 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HaveBackingTexture() const { 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return texture_.get() ? texture_->have_backing_texture() : false; 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayer() : Layer() {} 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayer() {} 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CreateTextureIfNeeded() { 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (texture_) 1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_ = PrioritizedResource::Create( 1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()); 1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_->SetDimensions(gfx::Size(10, 10), GL_RGBA); 1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap_.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture_; 1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap bitmap_; 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl { 1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl, 1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id) { 1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id)); 1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayerImpl() {} 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AppendQuads(QuadSink* quad_sink, 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuadsData* append_quads_data) OVERRIDE { 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(has_texture_); 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources()); 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetHasTexture(bool has_texture) { has_texture_ = has_texture; } 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id) 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerImpl(tree_impl, id), has_texture_(false) {} 1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_texture_; 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) { 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_->set_request_priority(PriorityCalculator::UIPriority(true)); 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool EvictionTestLayer::Update(ResourceUpdateQueue* queue, 1646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OcclusionTracker*) { 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 16497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect full_rect(0, 0, 10, 10); 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d()); 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->AppendFullUpload(upload); 16557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl( 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeImpl* tree_impl) { 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return EvictionTestLayerImpl::Create(tree_impl, layer_id_) 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .PassAs<LayerImpl>(); 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) { 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::PushPropertiesTo(layer_impl); 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl* test_layer_impl = 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<EvictionTestLayerImpl*>(layer_impl); 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_impl->SetHasTexture(texture_->have_backing_texture()); 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest { 1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestEvictTextures() 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(EvictionTestLayer::Create()), 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_(0), 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform identity_matrix; 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetLayerPropertiesForTesting(layer_.get(), 1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) identity_matrix, 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size(10, 20), 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PostEvictTextures() { 1696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(HasImplThread()); 1697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 1698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread, 1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void EvictTexturesOnImplThread() { 1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(impl_for_evict_textures_); 1705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_for_evict_textures_->EvictTexturesForTesting(); 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 1: Just commit and draw normally, then post an eviction at the end 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that will trigger a commit. 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 2: Triggered by the eviction, let it go through and then set 1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction 1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // task, which will be handled before the commit. Don't set needsCommit, it 1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should have been posted. A frame should not be drawn (note, 1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // didCommitAndDrawFrame may be called anyway). 1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 4: Triggered by the eviction, let it go through and then set 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 5: Triggered by the setNeedsCommit, post an eviction task in 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), a frame should not be drawn but a commit will be posted. 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 6: Triggered by the eviction, post an eviction task in 1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), which will be a noop, letting the commit (which recreates the 1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // textures) go through and draw a frame, then end the test. 1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 1+2 test the eviction recovery path where eviction happens outside 1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the beginFrame/commit pair. 1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 3+4 test the eviction recovery path where eviction happens inside 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the beginFrame/commit pair. 1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 5+6 test the path where an eviction happens during the eviction 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // recovery path. 1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_ = impl; 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 3, 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 5, 1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<EvictionTestLayer> layer_; 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* impl_for_evict_textures_; 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestEvictTextures); 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest { 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousCommit() 1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 1833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit); 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest { 1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousInvalidate() 1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_ = ContentLayer::Create(&client_); 1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetBounds(gfx::Size(10, 10)); 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetPosition(gfx::PointF(0.f, 0.f)); 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetIsDrawable(true); 1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_layer_); 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetNeedsDisplay(); 1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 1875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> content_layer_; 1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeferCommits() 1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_deferred_(0), num_complete_commits_(0) {} 1897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_deferred_++; 1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 1903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_complete_commits_++; 1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_complete_commits_) { 1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_commits_deferred_); 1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_deferred_); 1924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_complete_commits_); 1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_deferred_; 1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_complete_commits_; 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost { 1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, 1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerTreeSettings& settings, 1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy) 1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerTreeHost(client, settings) { 1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetLayerTreeHost(this); 1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InitializeForTesting(proxy.PassAs<Proxy>())); 1942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) { 1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are not allowed, max updates should be 0. 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = false; 1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, host.settings().max_partial_texture_updates); 1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should be limited by the proxy. 1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 1970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5u, host.settings().max_partial_texture_updates); 1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should also be limited by the settings. 1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeProxy> proxy(new FakeProxy); 1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 1988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(20); 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(10u, host.settings().max_partial_texture_updates); 1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) { 2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 2007eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHost::Create(&client, settings, NULL); 2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) { 2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE); 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 2019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHost::Create(&client, settings, NULL); 2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) { 2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D); 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 2031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHost::Create(&client, settings, NULL); 2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, host->settings().max_partial_texture_updates); 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, 2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PartialUpdatesWithDelegatingRendererAndSoftwareContent) { 2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE); 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 2044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHost::Create(&client, settings, NULL); 2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, host->settings().max_partial_texture_updates); 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted 2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted() 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(FakeContentLayer::Create(&client_)), 2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_(FakeContentLayer::Create(&client_)), 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_(FakeContentLayer::Create(&client_)), 2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100)); 2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_->SetBounds(gfx::Size(100, 100)); 2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_->SetBounds(gfx::Size(100, 100)); 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer1_); 2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer2_); 2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl, 2070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool visible) OVERRIDE { 2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // One backing should remain unevicted. 2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(100u * 100u * 4u * 1u, 2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that contents textures are marked as having been 2075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // purged. 2076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged()); 2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // End the test in this state. 2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All three backings should have memory. 2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 3u, 2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set a new policy that will kick out 1 of the 3 resources. 2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because a resource was evicted, a commit will be kicked off. 2091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_impl->SetMemoryPolicy( 2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy(100 * 100 * 4 * 2, 2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, 2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100 * 100 * 4 * 1, 2095eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING), 2096eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch true); 2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only two backings should have memory. 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 2u, 2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Become backgrounded, which will cause 1 more resource to be 2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // evicted. 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No further commits should happen because this is not visible 2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // anymore. 2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer1_; 2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer2_; 2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { 2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class NotificationClient : public ContentLayerClient { 2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient() 2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(0), paint_count_(0), lcd_notification_count_(0) {} 2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count() const { return paint_count_; } 2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count() const { return lcd_notification_count_; } 2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect clip, 2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++paint_count_; 2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE { 2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++lcd_notification_count_; 2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count_; 2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count_; 2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The expecations are based on the assumption that the default 2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD settings are: 2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); 2166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->can_use_lcd_text()); 2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The first update consists one LCD notification and one paint. 2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been enabled on the layer. 2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since nothing changed on layer, there should be no notification 2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or paint on the second update. 2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must not have changed. 2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Change layer opacity that should trigger lcd notification. 2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetOpacity(.5f); 2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to request a commit - setting opacity will do it. 2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that there is not extra commit due to layer invalidation. 2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, layer_tree_host()->commit_number()); 2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD notification count should have incremented due to 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // change in layer opacity. 2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.lcd_notification_count()); 2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Paint count should be incremented due to invalidation. 2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.paint_count()); 2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been disabled on the layer due to opacity. 2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient client_; 2212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification); 2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verify that the BeginFrame notification is used to initiate rendering. 221790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { 2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) settings->begin_frame_scheduling_enabled = true; 2221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 22247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // This will trigger a SetNeedsBeginFrame which will trigger a BeginFrame. 2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread( 2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 2232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks frame_time_; 2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 224290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification); 2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled 2245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) : public LayerTreeHostTest { 2246a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 2247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) settings->begin_frame_scheduling_enabled = true; 224990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->using_synchronous_renderer_compositor = true; 2250a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2251a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2252a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 225590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The BeginFrame notification is turned off now but will get enabled 225690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // once we return. End test while it's enabled. 2257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 2258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 2259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&LayerTreeHostTestBeginFrameNotification::EndTest, 2260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 2261a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 2265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 226690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F( 226790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled); 2268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation 2270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->impl_side_painting = true; 2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> layer = PictureLayer::Create(&client_); 2280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); 2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 2300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation); 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents 2303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class SetBoundsClient : public ContentLayerClient { 2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient() : layer_(0) {} 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect clip, 2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(2, 2)); 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 2341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds()); 2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds()); 2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient client_; 2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents); 2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public FakeWebGraphicsContext3D { 2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIOSurfaceWebGraphicsContext3D() 2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : FakeWebGraphicsContext3D() {} 2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual WebKit::WebGLId createTexture() OVERRIDE { 2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 1; 2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual WebKit::WebString getString(WebKit::WGC3Denum name) OVERRIDE { 2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (name == GL_EXTENSIONS) { 2369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebString( 2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "GL_CHROMIUM_iosurface GL_ARB_texture_rectangle"); 2371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebString(); 2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD1(activeTexture, void(WebKit::WGC3Denum texture)); 2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD2(bindTexture, void(WebKit::WGC3Denum target, 2377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebGLId texture_id)); 2378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD3(texParameteri, void(WebKit::WGC3Denum target, 2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Denum pname, 2380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dint param)); 2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(WebKit::WGC3Denum target, 2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dint width, 2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dint height, 2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Duint ioSurfaceId, 2385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Duint plane)); 2386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD4(drawElements, void(WebKit::WGC3Denum mode, 2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dsizei count, 2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Denum type, 2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dintptr offset)); 2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest { 2394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 2396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<MockIOSurfaceWebGraphicsContext3D> context( 2397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new MockIOSurfaceWebGraphicsContext3D); 2398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_context_ = context.get(); 2399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface = FakeOutputSurface::Create3d( 2400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context.PassAs<WebKit::WebGraphicsContext3D>()).PassAs<OutputSurface>(); 2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return output_surface.Pass(); 2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetIsDrawable(false); 2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_id_ = 9; 2410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_ = gfx::Size(6, 7); 2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create(); 2413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetBounds(gfx::Size(10, 10)); 2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetAnchorPoint(gfx::PointF()); 2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIsDrawable(true); 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_); 2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(io_surface_layer); 2418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In WillDraw, the IOSurfaceLayer sets up the io surface texture. 2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(_)) 2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(0); 2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_MIN_FILTER, 2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_LINEAR)) 2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_MAG_FILTER, 2437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_LINEAR)) 2438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_WRAP_S, 2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_CLAMP_TO_EDGE)) 2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_WRAP_T, 2445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_CLAMP_TO_EDGE)) 2446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texImageIOSurface2DCHROMIUM( 2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_RECTANGLE_ARB, 2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_.width(), 2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_.height(), 2452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_id_, 2453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0)) 2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(_, 0)) 2457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AnyNumber()); 2458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread( 2461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The io surface layer's texture is drawn. 2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)) 2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _)) 2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 2479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int io_surface_id_; 2485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIOSurfaceWebGraphicsContext3D* mock_context_; 2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size io_surface_size_; 2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 2490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 2491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestIOSurfaceDrawing); 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAsyncReadback : public LayerTreeHostTest { 2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root = FakeContentLayer::Create(&client_); 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->SetBounds(gfx::Size(20, 20)); 2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child = FakeContentLayer::Create(&client_); 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->SetBounds(gfx::Size(10, 10)); 2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->AddChild(child); 2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 2504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForCallback(); 2513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitForCallback() { 2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind( 2519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &LayerTreeHostTestAsyncReadback::NextStep, 2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 2521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void NextStep() { 2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int frame = layer_tree_host()->commit_number(); 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (frame) { 2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 252790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 25287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback, 252990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, callbacks_.size()); 2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (callbacks_.size() < 1u) { 2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForCallback(); 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, callbacks_.size()); 2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[0].ToString()); 2539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 254090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 25417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback, 254290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 254390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) root->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 25447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback, 254590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 254690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 25477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback, 254890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 2549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, callbacks_.size()); 2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (callbacks_.size() < 4u) { 2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForCallback(); 2554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, callbacks_.size()); 2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The child was copied to a bitmap and passed back twice. 2558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[1].ToString()); 2559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[2].ToString()); 2560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root was copied to a bitmap and passed back also. 2561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20).ToString(), callbacks_[3].ToString()); 2562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { 2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 25697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(result->HasBitmap()); 25707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<SkBitmap> bitmap = result->TakeBitmap().Pass(); 25717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(result->size().ToString(), 25727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Size(bitmap->width(), bitmap->height()).ToString()); 25737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callbacks_.push_back(result->size()); 2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, callbacks_.size()); 2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (use_gl_renderer_) 2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FakeOutputSurface::Create3d().PassAs<OutputSurface>(); 2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FakeOutputSurface::CreateSoftware( 2584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_ptr(new SoftwareOutputDevice)).PassAs<OutputSurface>(); 2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool use_gl_renderer_; 2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<gfx::Size> callbacks_; 2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root; 2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child; 2592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Readback can't be done with a delegating renderer. 2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, GLRenderer_RunSingleThread) { 2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = true; 2597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 2598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 2599a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2600a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2601a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GLRenderer_RunMultiThread_MainThreadPainting) { 2602a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_gl_renderer_ = true; 2603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2606a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2607a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GLRenderer_RunMultiThread_ImplSidePainting) { 2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = true; 2609a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, SoftwareRenderer_RunSingleThread) { 2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = false; 2614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 2615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SoftwareRenderer_RunMultiThread_MainThreadPainting) { 2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = false; 2620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 2621a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 2622a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2623a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2624a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SoftwareRenderer_RunMultiThread_ImplSidePainting) { 2625a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_gl_renderer_ = false; 2626a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAsyncReadbackLayerDestroyed : public LayerTreeHostTest { 2630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 2633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_->SetBounds(gfx::Size(20, 20)); 2634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_ = FakeContentLayer::Create(&client_); 2636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_->SetBounds(gfx::Size(15, 15)); 2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_->AddChild(main_destroyed_); 2638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_ = FakeContentLayer::Create(&client_); 2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_->SetBounds(gfx::Size(10, 10)); 2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_->AddChild(impl_destroyed_); 2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 2644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_count_ = 0; 2649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int frame = layer_tree_host()->commit_number(); 2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (frame) { 2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 265690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) main_destroyed_->RequestCopyOfOutput( 265790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CopyOutputRequest::CreateBitmapRequest(base::Bind( 26587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &LayerTreeHostTestAsyncReadbackLayerDestroyed:: 26597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CopyOutputCallback, 266090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 266190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) impl_destroyed_->RequestCopyOfOutput( 266290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CopyOutputRequest::CreateBitmapRequest(base::Bind( 26637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &LayerTreeHostTestAsyncReadbackLayerDestroyed:: 26647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CopyOutputCallback, 266590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, callback_count_); 2667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Destroy the main thread layer right away. 2669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_->RemoveFromParent(); 2670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_ = NULL; 2671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should callback with a NULL bitmap. 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, callback_count_); 2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Prevent drawing so we can't make a copy of the impl_destroyed layer. 2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size()); 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Flush the message loops and make sure the callbacks run. 2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 2683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No drawing means no readback yet. 2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, callback_count_); 2685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Destroy the impl thread layer. 2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_->RemoveFromParent(); 2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_ = NULL; 2689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No callback yet because it's on the impl side. 2691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, callback_count_); 2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 2694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Flush the message loops and make sure the callbacks run. 2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We should get another callback with a NULL bitmap. 2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, callback_count_); 2700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { 2706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 27077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(result->IsEmpty()); 2708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++callback_count_; 2709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int callback_count_; 2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> main_destroyed_; 2717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> impl_destroyed_; 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestAsyncReadbackLayerDestroyed); 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestAsyncReadbackInHiddenSubtree : public LayerTreeHostTest { 27237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 27247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 27257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = FakeContentLayer::Create(&client_); 27267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->SetBounds(gfx::Size(20, 20)); 27277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_ = FakeContentLayer::Create(&client_); 27297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetBounds(gfx::Size(15, 15)); 27307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(grand_parent_layer_); 27317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // parent_layer_ owns a render surface. 27337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_ = FakeContentLayer::Create(&client_); 27347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetBounds(gfx::Size(15, 15)); 27357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetForceRenderSurface(true); 27367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->AddChild(parent_layer_); 27377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_ = FakeContentLayer::Create(&client_); 27397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetBounds(gfx::Size(10, 10)); 27407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->AddChild(copy_layer_); 27417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 27437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 27447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 27457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void AddCopyRequest(Layer* layer) { 27477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->RequestCopyOfOutput( 27487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CopyOutputRequest::CreateBitmapRequest(base::Bind( 27497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestAsyncReadbackInHiddenSubtree::CopyOutputCallback, 27507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this)))); 27517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 27527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 27547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback_count_ = 0; 27557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 27567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddCopyRequest(copy_layer_.get()); 27587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 27597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { 27617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 27627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()); 27637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++callback_count_; 27647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (callback_count_) { 27667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 27677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Hide the copy request layer. 27687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetHideLayerAndSubtree(false); 27697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetHideLayerAndSubtree(false); 27707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetHideLayerAndSubtree(true); 27717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddCopyRequest(copy_layer_.get()); 27727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 27737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 27747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Hide the copy request layer's parent only. 27757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetHideLayerAndSubtree(false); 27767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetHideLayerAndSubtree(true); 27777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetHideLayerAndSubtree(false); 27787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddCopyRequest(copy_layer_.get()); 27797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 27807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 3: 27817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Hide the copy request layer's grand parent only. 27827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetHideLayerAndSubtree(true); 27837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetHideLayerAndSubtree(false); 27847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetHideLayerAndSubtree(false); 27857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddCopyRequest(copy_layer_.get()); 27867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 27877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 4: 27887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Hide the copy request layer's parent and grandparent. 27897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetHideLayerAndSubtree(true); 27907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetHideLayerAndSubtree(true); 27917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetHideLayerAndSubtree(false); 27927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddCopyRequest(copy_layer_.get()); 27937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 27947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 5: 27957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Hide the copy request layer as well as its parent and grandparent. 27967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetHideLayerAndSubtree(true); 27977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetHideLayerAndSubtree(true); 27987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetHideLayerAndSubtree(true); 27997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddCopyRequest(copy_layer_.get()); 28007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 28017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 6: 28027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 28037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 28047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 28087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int callback_count_; 28107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 28117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> root_; 28127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> grand_parent_layer_; 28137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> parent_layer_; 28147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> copy_layer_; 28157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 28167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No output to copy for delegated renderers. 28187dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 28197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestAsyncReadbackInHiddenSubtree); 28207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest 28227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTest { 28237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 28247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 28257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch settings->cache_render_pass_contents = true; 28267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 28297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = FakeContentLayer::Create(&client_); 28307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->SetBounds(gfx::Size(20, 20)); 28317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_ = FakeContentLayer::Create(&client_); 28337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetBounds(gfx::Size(15, 15)); 28347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->SetHideLayerAndSubtree(true); 28357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(grand_parent_layer_); 28367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // parent_layer_ owns a render surface. 28387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_ = FakeContentLayer::Create(&client_); 28397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetBounds(gfx::Size(15, 15)); 28407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetForceRenderSurface(true); 28417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grand_parent_layer_->AddChild(parent_layer_); 28427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_ = FakeContentLayer::Create(&client_); 28447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetBounds(gfx::Size(10, 10)); 28457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->AddChild(copy_layer_); 28467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 28487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 28497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 28527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_draw_ = false; 28537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 28547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->RequestCopyOfOutput( 28567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CopyOutputRequest::CreateBitmapRequest(base::Bind( 28577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest:: 28587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CopyOutputCallback, 28597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this)))); 28607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { 28637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 28647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()); 28657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 28667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 28697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Renderer* renderer = host_impl->renderer(); 28707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* root = host_impl->active_tree()->root_layer(); 28727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* grand_parent = root->children()[0]; 28737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* parent = grand_parent->children()[0]; 28747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* copy_layer = parent->children()[0]; 28757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |parent| owns a surface, but it was hidden and not part of the copy 28777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // request so it should not allocate any resource. 28787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId( 28797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent->render_surface()->RenderPassId())); 28807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |copy_layer| should have been rendered to a texture since it was needed 28827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // for a copy request. 28837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId( 28847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer->render_surface()->RenderPassId())); 28857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_draw_ = true; 28877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE { EXPECT_TRUE(did_draw_); } 28907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 28927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_draw_; 28937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> root_; 28947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> grand_parent_layer_; 28957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> parent_layer_; 28967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> copy_layer_; 28977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 28987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No output to copy for delegated renderers. 29007dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 29017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest); 29027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestAsyncReadbackClippedOut : public LayerTreeHostTest { 29047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 29057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 29067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = FakeContentLayer::Create(&client_); 29077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->SetBounds(gfx::Size(20, 20)); 29087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_ = FakeContentLayer::Create(&client_); 29107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetBounds(gfx::Size(15, 15)); 29117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->SetMasksToBounds(true); 29127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(parent_layer_); 29137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_ = FakeContentLayer::Create(&client_); 29157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetPosition(gfx::Point(15, 15)); 29167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->SetBounds(gfx::Size(10, 10)); 29177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer_->AddChild(copy_layer_); 29187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 29207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 29217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 29247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 29257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch copy_layer_->RequestCopyOfOutput( 29277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CopyOutputRequest::CreateBitmapRequest(base::Bind( 29287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestAsyncReadbackClippedOut::CopyOutputCallback, 29297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this)))); 29307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { 29337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // We should still get a callback with no output if the copy requested layer 29347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // was completely clipped away. 29357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 29367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(gfx::Size().ToString(), result->size().ToString()); 29377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 29387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 29417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 29437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> root_; 29447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> parent_layer_; 29457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> copy_layer_; 29467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 29477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 29487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No output to copy for delegated renderers. 29497dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 29507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestAsyncReadbackClippedOut); 29517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2952b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest { 2953b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 2954a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2955a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_ = 0; 2956a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2957b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2958b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2959b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1: commit + draw 2960b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2: commit only (no draw/swap) 2961b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3: draw only (no commit) 2962b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 4: composite & readback (2 commits, no draw/swap) 2963b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 5: commit + draw 2964b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2965b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2966b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int commit = layer_tree_host()->commit_number(); 2967b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (commit) { 2968b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2 done. 2970b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, frame_); 2971b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2972b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2973b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 3: 2974b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // CompositeAndReadback in Round 4, first commit. 2975b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, frame_); 2976b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2977b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 4: 2978b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 4 done. 2979b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, frame_); 2980b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2981b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2982b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2983b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2984b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2985b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 2987b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int commit = layer_tree_host()->commit_number(); 2988b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ++frame_; 2989b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) char pixels[4] = {0}; 2990b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (frame_) { 2991b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 1: 2992b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1 done. 2993b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, commit); 2994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2995b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2996b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3 done. 2998b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, commit); 2999b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(0, 0, 1, 1)); 3000b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 3001b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 3: 3002b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 5 done. 3003b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(5, commit); 3004b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EndTest(); 3005b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 3006b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 3007b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 3008b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3009b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 3010b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3011b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 3012b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int frame_; 3013b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 3014b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3015b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LayerTreeHostTestNumFramesPending, DelegatingRenderer) { 3016a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 3017b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 3018b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3019b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LayerTreeHostTestNumFramesPending, GLRenderer) { 3020a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 3021b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 3022b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LayerTreeHostTestDeferredInitialize : public LayerTreeHostTest { 3024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 3025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 3026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // PictureLayer can only be used with impl side painting enabled. 3027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) settings->impl_side_painting = true; 3028eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings->solid_color_scrollbars = true; 3029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetupTree() OVERRIDE { 3032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer_ = FakePictureLayer::Create(&client_); 3033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 3034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostTest::SetupTree(); 3035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 30387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_initialize_gl_ = false; 30397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_release_gl_ = false; 3040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d( 3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestWebGraphicsContext3D::Create()); 3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context3d->set_support_swapbuffers_complete_callback(false); 3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return FakeOutputSurface::CreateDeferredGL( 3049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice)) 3050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .PassAs<OutputSurface>(); 3051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 3054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(host_impl->RootLayer()); 3055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakePictureLayerImpl* layer_impl = 3056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<FakePictureLayerImpl*>(host_impl->RootLayer()); 30577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!did_initialize_gl_) { 3058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1u, layer_impl->append_quads_count()); 30597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ImplThreadTaskRunner()->PostTask( 30607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind( 30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestDeferredInitialize::DeferredInitializeAndRedraw, 30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this), 30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(host_impl))); 30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (did_initialize_gl_ && !did_release_gl_) { 30667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(2u, layer_impl->append_quads_count()); 30677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ImplThreadTaskRunner()->PostTask( 30687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind( 30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &LayerTreeHostTestDeferredInitialize::ReleaseGLAndRedraw, 30717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(this), 30727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Unretained(host_impl))); 30737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (did_initialize_gl_ && did_release_gl_) { 30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(3u, layer_impl->append_quads_count()); 30757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 3076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DeferredInitializeAndRedraw(LayerTreeHostImpl* host_impl) { 30807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(did_initialize_gl_); 30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // SetAndInitializeContext3D calls SetNeedsCommit. 3082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(static_cast<FakeOutputSurface*>(host_impl->output_surface()) 3083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ->SetAndInitializeContext3D( 3084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<WebKit::WebGraphicsContext3D>( 3085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestWebGraphicsContext3D::Create()))); 30867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_initialize_gl_ = true; 30877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ReleaseGLAndRedraw(LayerTreeHostImpl* host_impl) { 30907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_initialize_gl_); 30917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(did_release_gl_); 30927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // ReleaseGL calls SetNeedsCommit. 30937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<FakeOutputSurface*>(host_impl->output_surface())->ReleaseGL(); 30947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch did_release_gl_ = true; 3095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 30987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_initialize_gl_); 30997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(did_release_gl_); 3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 3103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakeContentLayerClient client_; 3104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<FakePictureLayer> layer_; 31057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_initialize_gl_; 31067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool did_release_gl_; 3107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 3108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize); 3110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 31117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PushPropertiesCountingLayer : public Layer { 31127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 31137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static scoped_refptr<PushPropertiesCountingLayer> Create() { 31147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new PushPropertiesCountingLayer(); 31157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE { 31187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Layer::PushPropertiesTo(layer); 31197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch push_properties_count_++; 31207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (persist_needs_push_properties_) 31217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch needs_push_properties_ = true; 31227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t push_properties_count() const { return push_properties_count_; } 31257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void reset_push_properties_count() { push_properties_count_ = 0; } 31267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_persist_needs_push_properties(bool persist) { 31287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch persist_needs_push_properties_ = persist; 31297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 31327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PushPropertiesCountingLayer() 31337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : push_properties_count_(0), 31347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch persist_needs_push_properties_(false) { 31357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetAnchorPoint(gfx::PointF()); 31367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetBounds(gfx::Size(1, 1)); 31377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetIsDrawable(true); 31387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~PushPropertiesCountingLayer() {} 31407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t push_properties_count_; 31427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool persist_needs_push_properties_; 31437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 31447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestLayersPushProperties : public LayerTreeHostTest { 31467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 31477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 31487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_commits_ = 0; 31497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_root_ = 0; 31507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child_ = 0; 31517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild_ = 0; 31527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child2_ = 0; 31537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_other_root_ = 0; 31547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_leaf_layer_ = 0; 31557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 31567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 31597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = PushPropertiesCountingLayer::Create(); 31607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_ = PushPropertiesCountingLayer::Create(); 31617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_ = PushPropertiesCountingLayer::Create(); 31627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_ = PushPropertiesCountingLayer::Create(); 31637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (layer_tree_host()->settings().impl_side_painting) 31657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch leaf_picture_layer_ = FakePictureLayer::Create(&client_); 31667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else 31677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch leaf_content_layer_ = FakeContentLayer::Create(&client_); 31687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 31707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child2_); 31717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild_); 31727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (leaf_picture_layer_) 31737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->AddChild(leaf_picture_layer_); 31747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (leaf_content_layer_) 31757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->AddChild(leaf_content_layer_); 31767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_root_ = PushPropertiesCountingLayer::Create(); 31787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Don't set the root layer here. 31807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 31817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 31847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++num_commits_; 31857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_root_, root_->push_properties_count()); 31877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_child_, child_->push_properties_count()); 31887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_grandchild_, 31897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->push_properties_count()); 31907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_child2_, 31917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->push_properties_count()); 31927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_other_root_, 31937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_root_->push_properties_count()); 31947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (leaf_content_layer_) { 31957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_leaf_layer_, 31967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch leaf_content_layer_->push_properties_count()); 31977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (leaf_picture_layer_) { 31997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_push_properties_leaf_layer_, 32007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch leaf_picture_layer_->push_properties_count()); 32017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The content/picture layer always needs to be pushed. 32047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (root_->layer_tree_host()) { 32057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 32067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 32077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (child2_->layer_tree_host()) { 32097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child2_->descendant_needs_push_properties()); 32107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child2_->needs_push_properties()); 32117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (leaf_content_layer_.get() && leaf_content_layer_->layer_tree_host()) { 32137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(leaf_content_layer_->descendant_needs_push_properties()); 32147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(leaf_content_layer_->needs_push_properties()); 32157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (leaf_picture_layer_.get() && leaf_picture_layer_->layer_tree_host()) { 32177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(leaf_picture_layer_->descendant_needs_push_properties()); 32187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(leaf_picture_layer_->needs_push_properties()); 32197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // child_ and grandchild_ don't persist their need to push properties. 32227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (child_->layer_tree_host()) { 32237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 32247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 32257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (grandchild_->layer_tree_host()) { 32277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild_->descendant_needs_push_properties()); 32287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild_->needs_push_properties()); 32297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (other_root_->layer_tree_host()) { 32327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(other_root_->descendant_needs_push_properties()); 32337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(other_root_->needs_push_properties()); 32347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (num_commits_) { 32377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 32387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 32397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 32407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_root_; 32417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 32427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 32437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 32447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 32467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 32477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 32487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 3: 32507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(other_root_); 32517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 32527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_other_root_; 32537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 4: 32557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 32567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 32577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_root_; 32587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 32597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 32607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 32617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 5: 32637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 32647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 32657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 6: 32677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 32687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 32697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 7: 32717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 32727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 32737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 32747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 32757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 8: 32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->RemoveFromParent(); 32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 32797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 9: 32817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild_); 32827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 32837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 32847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 10: 32867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 32877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 32887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 11: 32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.8f, 1.1f); 32917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No layers need commit. 32927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 12: 32947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 32957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 32967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 13: 32997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child2_->SetPosition(gfx::Point(1, 1)); 33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 33017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child2_; 33027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 14: 33047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 33057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 33067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Layers added to the tree get committed. 33077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 33087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 33097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 15: 33117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild_->SetPosition(gfx::Point(1, 1)); 33127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 33137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_grandchild_; 33147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 16: 33167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetNeedsDisplay(); 33177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The modified layer needs commit 33187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_child_; 33197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 17: 33217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 33227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Content/Picture layers require PushProperties every commit that they are 33267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // in the tree. 33277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((leaf_content_layer_.get() && leaf_content_layer_->layer_tree_host()) || 33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (leaf_picture_layer_.get() && leaf_picture_layer_->layer_tree_host())) 33297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++expected_push_properties_leaf_layer_; 33307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int num_commits_; 33357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 33367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> root_; 33377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child_; 33387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child2_; 33397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild_; 33407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> other_root_; 33417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeContentLayer> leaf_content_layer_; 33427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakePictureLayer> leaf_picture_layer_; 33437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_root_; 33447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child_; 33457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child2_; 33467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild_; 33477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_other_root_; 33487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_leaf_layer_; 33497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 33507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33517dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestLayersPushProperties); 33527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPropertyChangesDuringUpdateArePushed 33547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTest { 33557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 33567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = Layer::Create(); 33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->SetBounds(gfx::Size(1, 1)); 33637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool paint_scrollbar = true; 33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool has_thumb = false; 33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_ = 33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, root_->id()); 33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(scrollbar_layer_); 33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 33737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (layer_tree_host()->commit_number()) { 33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: { 33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // During update, the ignore_set_needs_commit_ bit is set to true to 33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // avoid causing a second commit to be scheduled. If a property change 33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // is made during this, however, it needs to be pushed in the upcoming 33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // commit. 33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<base::AutoReset<bool> > ignore = 33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->IgnoreSetNeedsCommit(); 33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->SetBounds(gfx::Size(30, 30)); 33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(scrollbar_layer_->needs_push_properties()); 33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetNeedsCommit(); 33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scrollbar_layer_->reset_push_properties_count(); 33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0u, scrollbar_layer_->push_properties_count()); 33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 2: 33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, scrollbar_layer_->push_properties_count()); 33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<Layer> root_; 34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FakeScrollbarLayer> scrollbar_layer_; 34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 34097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34107dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPropertyChangesDuringUpdateArePushed); 34117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestCasePushPropertiesThreeGrandChildren 34137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTest { 34147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 34157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void BeginTest() OVERRIDE { 34167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_root_ = 0; 34177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_child_ = 0; 34187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild1_ = 0; 34197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild2_ = 0; 34207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_push_properties_grandchild3_ = 0; 34217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PostSetNeedsCommitToMainThread(); 34227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetupTree() OVERRIDE { 34257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_ = PushPropertiesCountingLayer::Create(); 34267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_ = PushPropertiesCountingLayer::Create(); 34277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_ = PushPropertiesCountingLayer::Create(); 34287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_ = PushPropertiesCountingLayer::Create(); 34297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild3_ = PushPropertiesCountingLayer::Create(); 34307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 34327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild1_); 34337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild2_); 34347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild3_); 34357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Don't set the root layer here. 34377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTest::SetupTree(); 34387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AfterTest() OVERRIDE {} 34417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeContentLayerClient client_; 34437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> root_; 34447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> child_; 34457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild1_; 34467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild2_; 34477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<PushPropertiesCountingLayer> grandchild3_; 34487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_root_; 34497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_child_; 34507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild1_; 34517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild2_; 34527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t expected_push_properties_grandchild3_; 34537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 34547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush 34567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 34577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 34587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 34597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int last_source_frame_number = layer_tree_host()->commit_number() - 1; 34607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 34617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 34747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->needs_push_properties()); 34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild3_->needs_push_properties()); 34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 34857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 34897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 34917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 34927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34937dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesAddingToTreeRequiresPush); 34947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion 34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 34977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 34987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 34997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int last_source_frame_number = layer_tree_host()->commit_number() - 1; 35007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 35017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 35027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 35037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 35047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 35057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 35077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 35097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 35107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 35177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 35187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 35217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 35237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->AddChild(grandchild1_); 35297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 35357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 35377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 35427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 35487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 35507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 35537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild2_ will still need a push properties. 35557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 35567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild3_ does not need a push properties, so recursing should 35637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no longer be needed. 35647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 35657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 35687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 35707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 35717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 35727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 35737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 35747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 35757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35767dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F(LayerTreeHostTestPushPropertiesRemovingChildStopsRecursion); 35777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 35787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence 35797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 35807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 35817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 35827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int last_source_frame_number = layer_tree_host()->commit_number() - 1; 35837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 35847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 35857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 35867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->set_persist_needs_push_properties(true); 35877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->set_persist_needs_push_properties(true); 35887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 35897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 35907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 35917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 35927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 35937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 35947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 35957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 35967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 35977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 35987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 35997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 36007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild2_ will still need a push properties. 36027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 36037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // grandchild3_ does not need a push properties, so recursing should 36107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no longer be needed. 36117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 36127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 36157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 36177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 36187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 36227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 36247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesRemovingChildStopsRecursionWithPersistence); 36257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree 36277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 36287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 36297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 36307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int last_source_frame_number = layer_tree_host()->commit_number() - 1; 36317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 36327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 36337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 36347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 36367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 36387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 36397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 36407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 36417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 36427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 36437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 36447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 36457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 36467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Change grandchildren while their parent is not in the tree. 36487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 36497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 36507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 36517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch root_->AddChild(child_); 36527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 36567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 36587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 36597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 36607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 36617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild3_->needs_push_properties()); 36627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 36637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 36657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 36697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 36727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 36767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 36777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild3_->RemoveFromParent(); 36797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 36817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 36827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 36837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 36847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 36867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 36877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 36897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 36907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36917dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 36927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertiesWhileOutsideTree); 36937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild 36957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 36967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 36977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 36987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int last_source_frame_number = layer_tree_host()->commit_number() - 1; 36997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 37007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 37017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 37047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 37067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 37077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 37117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 37137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 37167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 37177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 37187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 37247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 37267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 37287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 37317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 37387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 37457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 37487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 37507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 37537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 37547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37557dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 37567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertyInParentThenChild); 37577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent 37597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public LayerTreeHostTestCasePushPropertiesThreeGrandChildren { 37607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 37617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 37627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int last_source_frame_number = layer_tree_host()->commit_number() - 1; 37637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switch (last_source_frame_number) { 37647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 0: 37657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host()->SetRootLayer(root_); 37667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 37677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case 1: 37687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 37707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->needs_push_properties()); 37717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 37727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->needs_push_properties()); 37737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->needs_push_properties()); 37757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 37777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->SetPosition(gfx::Point(1, 1)); 37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->SetPosition(gfx::Point(1, 1)); 37817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->SetPosition(gfx::Point(1, 1)); 37827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 37877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild1_->needs_push_properties()); 37887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild1_->descendant_needs_push_properties()); 37897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(grandchild2_->needs_push_properties()); 37907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild2_->descendant_needs_push_properties()); 37917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->needs_push_properties()); 37927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(grandchild3_->descendant_needs_push_properties()); 37937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild1_->RemoveFromParent(); 37957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 37977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->descendant_needs_push_properties()); 38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch grandchild2_->RemoveFromParent(); 38027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(root_->descendant_needs_push_properties()); 38057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(child_->needs_push_properties()); 38067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(child_->descendant_needs_push_properties()); 38077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_->RemoveFromParent(); 38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->needs_push_properties()); 38117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(root_->descendant_needs_push_properties()); 38127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EndTest(); 38147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 38157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 38187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38197dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMULTI_THREAD_TEST_F( 38207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerTreeHostTestPushPropertiesSetPropertyInChildThenParent); 38217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 38222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 3824