layer_tree_host_unittest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/io_surface_layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h" 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h" 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AnyNumber; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtLeast; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Mock; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interleaving of redraws and commits 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCommitingWithContinuousRedraw 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCommitingWithContinuousRedraw() 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_complete_commits_(0), num_draws_(0) {} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_complete_commits_++; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_complete_commits_ == 2) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draws_ == 1) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_complete_commits_; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommitingWithContinuousRedraw); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit1() : num_commits_(0), num_draws_(0) {} 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!impl->active_tree()->source_frame_number()) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(1, num_commits_); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(1, num_draws_); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// A SetNeedsCommit should lead to 1 commit. Issuing a second commit after that 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest { 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit2() : num_commits_(0), num_draws_(0) {} 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (num_commits_) { 137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_commits_); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(1, num_draws_); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedraw() : num_commits_(0), num_draws_(0) {} 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redraw again to verify that the second redraw doesn't commit. 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_draws_); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GE(2, num_draws_); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After setNeedsRedrawRect(invalid_rect) the final damage_rect 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// must contain invalid_rect. 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedrawRect : public LayerTreeHostTest { 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetNeedsRedrawRect() 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_draws_(0), 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_(50, 50), 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalid_rect_(10, 10, 20, 20), 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_(ContentLayer::Create(&client_)) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(bounds_); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(result); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF root_damage_rect; 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame_data->render_passes.empty()) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_damage_rect = frame_data->render_passes.back()->damage_rect; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this is the first frame, expect full frame damage. 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(root_damage_rect, gfx::Rect(bounds_)); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that invalid_rect_ is indeed repainted. 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(root_damage_rect.Contains(invalid_rect_)); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!num_draws_) { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawRectToMainThread(invalid_rect_); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_draws_); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Size bounds_; 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Rect invalid_rect_; 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer_; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedrawRect); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest { 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_ = FakeContentLayer::Create(&client_); 269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->SetBounds(gfx::Size(1, 1)); 270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_->AddChild(scaled_layer_); 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 274b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 275b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 276b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scaled_layer_|, which should not generate 290b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, layer_tree_host()->commit_number()); 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(4, 4).ToString(), 301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scaled_layer_->content_bounds().ToString()); 302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<FakeContentLayer> scaled_layer_; 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings->layer_transforms_should_scale_layer_contents = true; 317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root_layer_ = Layer::Create(); 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(10, 20)); 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_ = FakeScrollbarLayer::Create(paint_scrollbar, 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) has_thumb, 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->id()); 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(scrollbar_); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 1) 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Changing the device scale factor causes a commit. It also changes 350b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the content bounds of |scrollbar_|, which should not generate 351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // a second commit as a result. 352b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(4.f); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No extra commits. 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, layer_tree_host()->commit_number()); 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), 362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scrollbar_->content_bounds().ToString()); 363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Layer> root_layer_; 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_; 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestNoExtraCommitFromScrollbarInvalidate); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadback : public LayerTreeHostTest { 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadback() : num_commits_(0) {} 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadback); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws() 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_(0) {} 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 4) { 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If the layerTreeHost says it can't draw, Then we should not try to draw. 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest { 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCanDrawBlocksDrawing() : num_commits_(0), done_(false) {} 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (done_) 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only the initial draw should bring us here. 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (done_) 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ >= 1) { 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // After the first commit, we should not be able to draw. 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make the viewport empty so the host says it can't draw. 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 2) { 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (num_commits_ == 3) { 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Let it draw so we go idle and end the test. 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(1, 1)); 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) done_ = true; 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool done_; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// beginLayerWrite should prevent draws from executing until a commit occurs 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersRedraw : public LayerTreeHostTest { 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestWriteLayersRedraw() : num_commits_(0), num_draws_(0) {} 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostAcquireLayerTextures(); 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); // should be inhibited without blocking 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draws_++; 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(num_draws_, num_commits_); 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_commits_); } 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersRedraw); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that when resuming visibility, Requesting layer write permission 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will not deadlock the main thread even though there are not yet any 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled redraws. This behavior is critical for reliably surviving tab 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// switching. There are no failure conditions to this test, it just passes 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by not timing out. 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersAfterVisible : public LayerTreeHostTest { 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestWriteLayersAfterVisible() : num_commits_(0) {} 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 2) 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (num_commits_ < 2) { 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(true); 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostAcquireLayerTextures(); 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersAfterVisible); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assertion. 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackWhileInvisible() : num_commits_(0) {} 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest { 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestAbortFrameWhenInvisible() {} 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request a commit (from the main thread), Which will trigger the commit 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // flow from the impl side. 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Then mark ourselves as not visible before processing any more messages 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // on the main thread. 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetVisible(false); 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we make it without kicking a frame, we pass! 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTestAfterDelay(1); 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(true); 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to the impl side. 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest { 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCommit() {} 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(5.f, 5.f, 5.f); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 616a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* impl) OVERRIDE { 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20), impl->device_viewport_size()); 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color()); 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5.f, impl->active_tree()->page_scale_factor()); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it doesn't draw due to tree 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// activation failure. 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterActivationFails 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public LayerTreeHostTest { 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails() : frame_(0) {} 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ >= 1) { 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks()); 64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(impl->settings().impl_side_painting); 65290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool CanActivatePendingTree(LayerTreeHostImpl* impl) OVERRIDE { 65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame_++; 65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ == 1) { 65890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_frame_time_ = impl->CurrentFrameTimeTicks(); 65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Since base::TimeTicks::Now() uses a low-resolution clock on 66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Windows, we need to make sure that the clock has incremented past 66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // first_frame_time_. 66390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) while (first_frame_time_ == base::TimeTicks::Now()) {} 66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int frame_; 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterActivationFails); 68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This test verifies that LayerTreeHostImpl's current frame time gets 68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// updated in consecutive frames when it draws in each frame. 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestFrameTimeUpdatesAfterDraw : public LayerTreeHostTest { 68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestFrameTimeUpdatesAfterDraw() : frame_(0) {} 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20)); 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame_++; 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (frame_ == 1) { 69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_frame_time_ = impl->CurrentFrameTimeTicks(); 69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) impl->SetNeedsRedraw(); 69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Since base::TimeTicks::Now() uses a low-resolution clock on 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Windows, we need to make sure that the clock has incremented past 70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // first_frame_time_. 70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) while (first_frame_time_ == base::TimeTicks::Now()) {} 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(first_frame_time_, impl->CurrentFrameTimeTicks()); 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure there isn't a commit between the two draws, to ensure that a 71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // commit isn't required for updating the current frame time. We can 71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // only check for this in the multi-threaded case, since in the single- 71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // threaded case there will always be a commit between consecutive draws. 71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (ImplThread()) 71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0, frame_); 71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int frame_; 72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks first_frame_time_; 72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameTimeUpdatesAfterDraw); 72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies that StartPageScaleAnimation events propagate correctly 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from LayerTreeHost to LayerTreeHostImpl in the MT compositor. 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest { 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestStartPageScaleAnimation() {} 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 736a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 737a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 738a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_ = FakeContentLayer::Create(&client_); 740a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollable(true); 741a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(gfx::Vector2d()); 742a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer_); 743a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 744a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE { 751a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d offset = scroll_layer_->scroll_offset(); 752a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scroll_layer_->SetScrollOffset(offset + scroll_delta); 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5f, 2.f); 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 756a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* impl) OVERRIDE { 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->ProcessScrollDeltas(); 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We get one commit before the first draw, and the animation doesn't happen 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // until the second draw. 760a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 761a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 0: 762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We'll start an animation when we get back to the main thread. 764a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 765a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 766a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.f, impl->active_tree()->page_scale_factor()); 767a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 768a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 769a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 2: 770a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(1.25f, impl->active_tree()->page_scale_factor()); 771a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EndTest(); 772a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 773a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) default: 774a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NOTREACHED(); 775a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 776a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 777a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 778a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 779a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 780a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case 1: 781a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f); 782a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) layer_tree_host()->StartPageScaleAnimation( 783a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Vector2d(), false, 1.25f, base::TimeDelta()); 784a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 789a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 790a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FakeContentLayerClient client_; 791a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_refptr<FakeContentLayer> scroll_layer_; 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest { 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSetVisible() : num_draws_(0) {} 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is suppressed while we're invisible. 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Triggers the redraw. 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(true); 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(impl->visible()); 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_draws_; 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_draws_); } 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draws_; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient { 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate() : test_layer_(0) {} 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas*, gfx::Rect, gfx::RectF*) OVERRIDE { 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set layer opacity to 0. 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (test_layer_) 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_->SetOpacity(0.f); 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* test_layer_; 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer { 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<ContentLayerWithUpdateTracking> Create( 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentLayerClient* client) { 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new ContentLayerWithUpdateTracking(client)); 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int PaintContentsCount() { return paint_contents_count_; } 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ResetPaintContentsCount() { paint_contents_count_ = 0; } 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Update(ResourceUpdateQueue* queue, 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const OcclusionTracker* occlusion, 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderingStats* stats) OVERRIDE { 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentLayer::Update(queue, occlusion, stats); 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_contents_count_++; 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit ContentLayerWithUpdateTracking(ContentLayerClient* client) 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client), paint_contents_count_(0) { 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetAnchorPoint(gfx::PointF(0.f, 0.f)); 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBounds(gfx::Size(10, 10)); 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsDrawable(true); 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ContentLayerWithUpdateTracking() {} 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_contents_count_; 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from being updated during commit. 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest { 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestOpacityChange() 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_opacity_change_delegate_(), 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) update_check_layer_(ContentLayerWithUpdateTracking::Create( 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &test_opacity_change_delegate_)) { 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_opacity_change_delegate_.SetTestLayer(update_check_layer_.get()); 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(update_check_layer_); 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update() should have been called once. 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, update_check_layer_->PaintContentsCount()); 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOpacityChangeLayerDelegate test_opacity_change_delegate_; 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> update_check_layer_; 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange); 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer { 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) { 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new NoScaleContentLayer(client)); 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CalculateContentsScale(float ideal_contents_scale, 910b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float device_scale_factor, 911b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float page_scale_factor, 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animating_transform_to_screen, 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_x, 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float* contents_scale_y, 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size* contentBounds) OVERRIDE { 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Skip over the ContentLayer's method to the base Layer class. 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::CalculateContentsScale(ideal_contents_scale, 918b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) device_scale_factor, 919b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) page_scale_factor, 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) animating_transform_to_screen, 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_x, 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_scale_y, 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentBounds); 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit NoScaleContentLayer(ContentLayerClient* client) 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ContentLayer(client) {} 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~NoScaleContentLayer() {} 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers() 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(NoScaleContentLayer::Create(&client_)), 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_(ContentLayer::Create(&client_)) {} 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(60, 60)); 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(1.5); 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size()); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer_); 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetIsDrawable(true); 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(30, 30)); 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetIsDrawable(true); 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetPosition(gfx::Point(2, 2)); 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetBounds(gfx::Size(10, 10)); 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 960a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* impl) OVERRIDE { 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should only do one commit. 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device scale factor should come over to impl. 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NEAR(impl->device_scale_factor(), 1.5f, 0.00001f); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers are on impl. 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size()); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Device viewport is scaled. 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), impl->device_viewport_size()); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* child = impl->active_tree()->root_layer()->children()[0]; 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Positions remain in layout pixels. 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(0, 0), root->position()); 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Point(2, 2), child->position()); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Compute all the layer transforms for the frame. 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData frame_data; 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->PrepareToDraw(&frame_data, gfx::Rect()); 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->DidDrawAllLayers(frame_data); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list = 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *frame_data.render_surface_layer_list; 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Both layers should be drawing into the root render surface. 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, render_surface_layer_list.size()); 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(root->render_surface(), 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_surface_layer_list[0]->render_surface()); 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, root->render_surface()->layer_list().size()); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root render surface is the size of the viewport. 994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60), 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->render_surface()->content_rect()); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The content bounds of the child should be scaled. 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size child_bounds_scaled = 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5)); 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(child_bounds_scaled, child->content_bounds()); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform scale_transform; 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scale_transform.Scale(impl->device_scale_factor(), 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->device_scale_factor()); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root layer is scaled by 2x. 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_screen_space_transform = scale_transform; 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform root_draw_transform = scale_transform; 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_draw_transform, root->draw_transform()); 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_screen_space_transform, root->screen_space_transform()); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The child is at position 2,2, which is transformed to 3,3 after the scale 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_screen_space_transform; 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_screen_space_transform.Translate(3.f, 3.f); 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform child_draw_transform = child_screen_space_transform; 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_draw_transform, 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->draw_transform()); 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(child_screen_space_transform, 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->screen_space_transform()); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<NoScaleContentLayer> root_layer_; 1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> child_layer_; 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify atomicity of commits and reuse of textures. 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest { 1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure partial texture updates are turned off. 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 0; 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->use_linear_fade_scrollbar_animator = false; 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_ = FakeContentLayer::Create(&client_); 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_ = 1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, layer_->id()); 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetPosition(gfx::Point(0, 10)); 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->AddChild(scrollbar_); 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = -1; 106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1068a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates); 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer 1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2u, context->NumTextures()); 1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used texture is correct. 1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be doubled as the first textures 1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // are used by impl thread and cannot by used for update. 1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should still be 1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // one for each layer. 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First textures should not have been used. 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // New textures should have been used. 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (drew_frame_ == impl->active_tree()->source_frame_number()) { 111890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()) << "For frame " << drew_frame_; 111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drew_frame_ = impl->active_tree()->source_frame_number(); 112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We draw/ship one texture each frame for each layer. 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_->SetNeedsDisplay(); 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_; 113990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int drew_frame_; 1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommit); 1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SetLayerPropertiesForTesting(Layer* layer, 1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* parent, 1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& transform, 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF anchor, 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF position, 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size bounds, 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool opaque) { 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->RemoveAllChildren(); 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent) 1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent->AddChild(layer); 1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(transform); 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetAnchorPoint(anchor); 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetPosition(position); 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(bounds); 1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetContentsOpaque(opaque); 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate 1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Allow one partial texture update. 1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->max_partial_texture_updates = 1; 1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->use_linear_fade_scrollbar_animator = false; 1169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // No partial updates when impl side painting is enabled. 1170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings->impl_side_painting = false; 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_ = FakeContentLayer::Create(&client_); 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->SetBounds(gfx::Size(10, 20)); 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetPosition(gfx::Point(0, 10)); 1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_->SetBounds(gfx::Size(3, 10)); 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool paint_scrollbar = true; 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_thumb = false; 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_with_paints_ = 1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, parent_->id()); 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_with_paints_->SetPosition(gfx::Point(3, 10)); 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_with_paints_->SetBounds(gfx::Size(3, 10)); 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_scrollbar = false; 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_without_paints_ = 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeScrollbarLayer::Create(paint_scrollbar, has_thumb, parent_->id()); 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_without_paints_->SetPosition(gfx::Point(6, 10)); 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scrollbar_without_paints_->SetBounds(gfx::Size(3, 10)); 1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(child_); 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(scrollbar_with_paints_); 1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_->AddChild(scrollbar_without_paints_); 1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 120390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 120490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 120590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 120690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 120790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 120890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 1: 120990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplay(); 121090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 121190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_with_paints_->SetNeedsDisplay(); 121290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_without_paints_->SetNeedsDisplay(); 121390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 121490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 2: 121590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Damage part of layers. 121690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parent_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 121790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f)); 121890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_with_paints_->SetNeedsDisplayRect( 121990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::RectF(0.f, 0.f, 5.f, 5.f)); 122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_without_paints_->SetNeedsDisplayRect( 122190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::RectF(0.f, 0.f, 5.f, 5.f)); 122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 3: 122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child_->SetNeedsDisplay(); 122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_with_paints_->SetNeedsDisplay(); 122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scrollbar_without_paints_->SetNeedsDisplay(); 122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 4: 123090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 123190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case 5: 123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EndTest(); 123490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 123590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 123690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED() << layer_tree_host()->commit_number(); 123790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 123890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 123990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1u, layer_tree_host()->settings().max_partial_texture_updates); 1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be one for each layer. 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(4u, context->NumTextures()); 1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, context->NumUsedTextures()); 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that used textures are correct. 1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be two for each content layer and one 1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // for each scrollbar, since they always do a partial update. 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(6u, context->NumTextures()); 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // layer, and one for the scrollbar layer that paints. 1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, context->NumUsedTextures()); 1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First content textures should not have been used. 1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The non-painting scrollbar's texture wasn't updated. 1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(2))); 1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The painting scrollbar's partial update texture was used. 1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // New textures should have been used. 1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(4))); 1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(5))); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures should be two for each content layer and one 1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // for each scrollbar, since they always do a partial update. 1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(6u, context->NumTextures()); 1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be one for each content 1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // layer, and one for the scrollbar layer that paints. 1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, context->NumUsedTextures()); 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The non-painting scrollbar's texture wasn't updated. 1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(2))); 1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The painting scrollbar does a partial update. 1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // One content layer does a partial update also. 1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(4))); 1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(5))); 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No textures should be used for commit. 1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, context->NumUsedTextures()); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for commit should be two. One for the 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // content layer, and one for the painting scrollbar. The 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // non-painting scrollbar doesn't update its texture. 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, context->NumUsedTextures()); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 132190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LT(impl->active_tree()->source_frame_number(), 5); 132290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->output_surface()->context3d()); 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Number of textures used for drawing should one per layer except for 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // frame 3 where the viewport only contains one layer. 132890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 3) { 1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, context->NumUsedTextures()); 133090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 133190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(4u, context->NumUsedTextures()) << 133290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "For frame " << impl->active_tree()->source_frame_number(); 133390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->ResetUsedTextures(); 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_with_paints_; 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_without_paints_; 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1348a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Partial updates are not possible with a delegating renderer. 134990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1350a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestAtomicCommitWithPartialUpdate); 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest { 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestFinishAllRendering() : once_(false), draw_count_(0) {} 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (once_) 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) once_ = true; 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->AcquireLayerTextures(); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) draw_count_ = 0; 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->FinishAllRendering(); 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, draw_count_); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoLock lock(lock_); 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++draw_count_; 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool once_; 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Lock lock_; 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int draw_count_; 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering); 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest { 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* root_layer = layer_tree_host()->root_layer(); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels), 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect(0, 0, 1, 1)); 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->render_surface()); 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup); 1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit() 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(FakeContentLayer::Create(&client_)), 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_( 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayer::Create(&client_)), 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) replica_layer1_( 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayer::Create(&client_)), 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_( 1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayer::Create(&client_)), 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) replica_layer2_( 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayer::Create(&client_)) {} 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->cache_render_pass_contents = true; 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100)); 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetBounds(gfx::Size(100, 100)); 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetForceRenderSurface(true); 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetOpacity(0.5f); 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetBounds(gfx::Size(100, 100)); 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetForceRenderSurface(true); 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetOpacity(0.5f); 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->SetReplicaLayer(replica_layer1_.get()); 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer2_->SetReplicaLayer(replica_layer2_.get()); 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(surface_layer1_); 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_layer1_->AddChild(surface_layer2_); 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Renderer* renderer = host_impl->renderer(); 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderPass::Id surface1_render_pass_id = host_impl->active_tree() 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->root_layer()->children()[0]->render_surface()->RenderPassId(); 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderPass::Id surface2_render_pass_id = 1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[0]->children()[0] 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->render_surface()->RenderPassId(); 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 0: 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId( 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface1_render_pass_id)); 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId( 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface2_render_pass_id)); 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reduce the memory limit to only fit the root layer and one render 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // surface. This prevents any contents drawing into surfaces 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from being allocated. 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->SetManagedMemoryPolicy( 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy(100 * 100 * 4 * 2)); 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId( 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface1_render_pass_id)); 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId( 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface2_render_pass_id)); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!TestEnded()) 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetNeedsDisplay(); 1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, root_layer_->update_count()); 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, surface_layer1_->update_count()); 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3u, surface_layer2_->update_count()); 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer1_; 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer1_; 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> surface_layer2_; 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> replica_layer2_; 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Surfaces don't exist with a delegated renderer. 1504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit); 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayer : public Layer { 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<EvictionTestLayer> Create() { 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_refptr(new EvictionTestLayer()); 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Update(ResourceUpdateQueue*, 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const OcclusionTracker*, 1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderingStats*) OVERRIDE; 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool DrawsContent() const OVERRIDE { return true; } 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE; 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PushPropertiesTo(LayerImpl* impl) OVERRIDE; 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE; 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HaveBackingTexture() const { 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return texture_.get() ? texture_->have_backing_texture() : false; 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayer() : Layer() {} 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayer() {} 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CreateTextureIfNeeded() { 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (texture_) 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_ = PrioritizedResource::Create( 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()); 1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_->SetDimensions(gfx::Size(10, 10), GL_RGBA); 1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap_.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture_; 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap bitmap_; 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl { 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* tree_impl, 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id) { 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(new EvictionTestLayerImpl(tree_impl, id)); 1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~EvictionTestLayerImpl() {} 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AppendQuads(QuadSink* quad_sink, 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AppendQuadsData* append_quads_data) OVERRIDE { 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(has_texture_); 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources()); 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetHasTexture(bool has_texture) { has_texture_ = has_texture; } 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl(LayerTreeImpl* tree_impl, int id) 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerImpl(tree_impl, id), has_texture_(false) {} 1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_texture_; 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) { 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_->set_request_priority(PriorityCalculator::UIPriority(true)); 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::Update(ResourceUpdateQueue* queue, 1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const OcclusionTracker*, 1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderingStats*) { 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTextureIfNeeded(); 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!texture_) 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect full_rect(0, 0, 10, 10); 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_.get(), &bitmap_, full_rect, full_rect, gfx::Vector2d()); 1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->AppendFullUpload(upload); 1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl( 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeImpl* tree_impl) { 1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return EvictionTestLayerImpl::Create(tree_impl, layer_id_) 1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .PassAs<LayerImpl>(); 1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layer_impl) { 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer::PushPropertiesTo(layer_impl); 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictionTestLayerImpl* test_layer_impl = 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<EvictionTestLayerImpl*>(layer_impl); 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_layer_impl->SetHasTexture(texture_->have_backing_texture()); 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest { 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestEvictTextures() 1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(EvictionTestLayer::Create()), 1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_(0), 1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20)); 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Transform identity_matrix; 1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetLayerPropertiesForTesting(layer_.get(), 1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) identity_matrix, 1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::PointF(0.f, 0.f), 1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size(10, 20), 1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PostEvictTextures() { 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(ImplThread()); 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImplThread()->PostTask( 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeHostTestEvictTextures::EvictTexturesOnImplThread, 1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void EvictTexturesOnImplThread() { 1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(impl_for_evict_textures_); 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_->EnforceManagedMemoryPolicy( 1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy(0)); 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 1: Just commit and draw normally, then post an eviction at the end 1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that will trigger a commit. 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 2: Triggered by the eviction, let it go through and then set 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // task, which will be handled before the commit. Don't set needsCommit, it 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should have been posted. A frame should not be drawn (note, 1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // didCommitAndDrawFrame may be called anyway). 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 4: Triggered by the eviction, let it go through and then set 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // needsCommit. 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 5: Triggered by the setNeedsCommit, post an eviction task in 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), a frame should not be drawn but a commit will be posted. 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit 6: Triggered by the eviction, post an eviction task in 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Layout(), which will be a noop, letting the commit (which recreates the 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // textures) go through and draw a frame, then end the test. 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 1+2 test the eviction recovery path where eviction happens outside 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the beginFrame/commit pair. 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 3+4 test the eviction recovery path where eviction happens inside 1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the beginFrame/commit pair. 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commits 5+6 test the path where an eviction happens during the eviction 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // recovery path. 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingTexture()); 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_for_evict_textures_ = impl; 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Layout() OVERRIDE { 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 3, 1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 6: 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 5, 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check here. 1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_->HaveBackingTexture()); 1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostEvictTextures(); 1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<EvictionTestLayer> layer_; 1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* impl_for_evict_textures_; 1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestEvictTextures); 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest { 1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousCommit() 1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit); 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest { 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestContinuousInvalidate() 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commit_complete_(0), num_draw_layers_(0) {} 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10)); 1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_ = ContentLayer::Create(&client_); 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetBounds(gfx::Size(10, 10)); 1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetPosition(gfx::PointF(0.f, 0.f)); 1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetIsDrawable(true); 1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(content_layer_); 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 179190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_layer_->SetNeedsDisplay(); 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 1) 1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commit_complete_++; 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_draw_layers_++; 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_draw_layers_ == 2) 1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commit_complete_); 1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> content_layer_; 1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commit_complete_; 1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_draw_layers_; 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestDeferCommits() 1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : num_commits_deferred_(0), num_complete_commits_(0) {} 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE { 1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_deferred_++; 1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_complete_commits_++; 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_complete_commits_) { 1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, num_commits_deferred_); 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, num_commits_deferred_); 1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, num_complete_commits_); 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_deferred_; 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_complete_commits_; 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost { 1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, 1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerTreeSettings& settings, 1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy) 1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerTreeHost(client, settings) { 1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetLayerTreeHost(this); 1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InitializeForTesting(proxy.PassAs<Proxy>())); 1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) { 1875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are not allowed, max updates should be 0. 1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy = 1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>())); 1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = false; 1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, host.settings().max_partial_texture_updates); 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should be limited by the proxy. 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy = 1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>())); 1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5u, host.settings().max_partial_texture_updates); 1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When partial updates are allowed, 1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // max updates should also be limited by the settings. 1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<FakeProxy> proxy = 1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>())); 1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(20); 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 10; 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.Pass()); 1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host.InitializeOutputSurfaceIfNeeded()); 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(10u, host.settings().max_partial_texture_updates); 1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) { 1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) { 1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE); 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) { 1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D); 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, host->settings().max_partial_texture_updates); 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(LayerTreeHostTest, 1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PartialUpdatesWithDelegatingRendererAndSoftwareContent) { 1970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE); 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings.max_partial_texture_updates = 4; 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = 1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 1977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host->InitializeOutputSurfaceIfNeeded()); 1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, host->settings().max_partial_texture_updates); 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCapturePicture : public LayerTreeHostTest { 1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCapturePicture() 1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : bounds_(gfx::Size(100, 100)), 1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_(PictureLayer::Create(&content_client_)) {} 1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->impl_side_painting = true; 1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class FillRectContentLayerClient : public ContentLayerClient { 1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect clip, 1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint.setColor(SK_ColorGREEN); 1998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkRect rect = SkRect::MakeWH(canvas->getDeviceSize().width(), 2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) canvas->getDeviceSize().height()); 2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *opaque = gfx::RectF(rect.width(), rect.height()); 2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) canvas->drawRect(rect, paint); 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetIsDrawable(true); 2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(bounds_); 2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Outside viewport so tiles don't have to be initialized for commit. 2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetPosition(gfx::Point(100, 100)); 2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_); 2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) picture_ = layer_tree_host()->CapturePicture(); 2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(bounds_, gfx::Size(picture_->width(), picture_->height())); 2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap bitmap; 2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap.setConfig( 2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap::kARGB_8888_Config, bounds_.width(), bounds_.height()); 2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap.allocPixels(); 2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap.eraseARGB(0, 0, 0, 0); 2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkCanvas canvas(bitmap); 2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) picture_->draw(&canvas); 2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap.lockPixels(); 2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); 2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(SK_ColorGREEN, pixels[0]); 2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bitmap.unlockPixels(); 2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size bounds_; 2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FillRectContentLayerClient content_client_; 2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<PictureLayer> layer_; 2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) skia::RefPtr<SkPicture> picture_; 2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCapturePicture); 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestMaxPendingFrames : public LayerTreeHostTest { 2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestMaxPendingFrames() : LayerTreeHostTest() {} 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(host_impl->proxy()->HasImplThread()); 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ThreadProxy* proxy = static_cast<ThreadProxy*>(host_impl->proxy()); 2060a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (delegating_renderer()) { 2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, proxy->MaxFramesPendingForTesting()); 2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(FrameRateController::DEFAULT_MAX_FRAMES_PENDING, 2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy->MaxFramesPendingForTesting()); 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestMaxPendingFrames, DelegatingRenderer) { 2073a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestMaxPendingFrames, GLRenderer) { 2077a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted 2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted() 2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : root_layer_(FakeContentLayer::Create(&client_)), 2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_(FakeContentLayer::Create(&client_)), 2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_(FakeContentLayer::Create(&client_)), 2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100)); 2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->SetBounds(gfx::Size(100, 100)); 2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer1_->SetBounds(gfx::Size(100, 100)); 2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_layer2_->SetBounds(gfx::Size(100, 100)); 2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer1_); 2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_->AddChild(child_layer2_); 2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer_); 2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* host_impl, 2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool visible) OVERRIDE { 2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // One backing should remain unevicted. 2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(100u * 100u * 4u * 1u, 2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that contents textures are marked as having been 2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // purged. 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(host_impl->active_tree()->ContentsTexturesPurged()); 2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // End the test in this state. 2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_commits_; 2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_commits_) { 2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All three backings should have memory. 2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 3u, 2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set a new policy that will kick out 1 of the 3 resources. 2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because a resource was evicted, a commit will be kicked off. 2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->SetManagedMemoryPolicy( 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy(100 * 100 * 4 * 2, 2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100 * 100 * 4 * 1, 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING)); 2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only two backings should have memory. 2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100u * 100u * 4u * 2u, 2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Become backgrounded, which will cause 1 more resource to be 2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // evicted. 2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetVisibleToMainThread(false); 2136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No further commits should happen because this is not visible 2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // anymore. 2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 2141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_layer_; 2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer1_; 2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_layer2_; 2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { 2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class NotificationClient : public ContentLayerClient { 2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient() 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(0), paint_count_(0), lcd_notification_count_(0) {} 2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 2166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count() const { return paint_count_; } 2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count() const { return lcd_notification_count_; } 2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect clip, 2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++paint_count_; 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE { 2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++lcd_notification_count_; 2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetNeedsDisplay(); 2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int paint_count_; 2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int lcd_notification_count_; 2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The expecations are based on the assumption that the default 2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD settings are: 2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); 2196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(root_layer->can_use_lcd_text()); 2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The first update consists one LCD notification and one paint. 2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been enabled on the layer. 2211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since nothing changed on layer, there should be no notification 2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or paint on the second update. 2217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must not have changed. 2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 2221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Change layer opacity that should trigger lcd notification. 2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetOpacity(.5f); 2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to request a commit - setting opacity will do it. 2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that there is not extra commit due to layer invalidation. 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, layer_tree_host()->commit_number()); 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD notification count should have incremented due to 2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // change in layer opacity. 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.lcd_notification_count()); 2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Paint count should be incremented due to invalidation. 2232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, client_.paint_count()); 2233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LCD text must have been disabled on the layer due to opacity. 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotificationClient client_; 2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification); 2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verify that the BeginFrame notification is used to initiate rendering. 224790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 225090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->render_parent_drives_begin_frame_ = true; 2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeOutputSurface* fake_output_surface = 2259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinterpret_cast<FakeOutputSurface*>(host_impl->output_surface()); 2260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The BeginFrame notification is turned off now but will get 226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // enabled once we return, so post a task to trigger it. 226390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(fake_output_surface->needs_begin_frame()); 226490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PostBeginFrameOnImplThread(fake_output_surface); 2265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void PostBeginFrameOnImplThread(FakeOutputSurface* fake_output_surface) { 2268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(ImplThread()); 2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImplThread()->PostTask( 227090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&LayerTreeHostTestBeginFrameNotification::BeginFrame, 2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this), 2272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(fake_output_surface))); 2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 227590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void BeginFrame(FakeOutputSurface* fake_output_surface) { 227690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(fake_output_surface->needs_begin_frame()); 227790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fake_output_surface->BeginFrame(frame_time_); 2278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread( 2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 2284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks frame_time_; 2292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 229490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestBeginFrameNotification); 2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 229690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled 2297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) : public LayerTreeHostTest { 2298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 2299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 230090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->render_parent_drives_begin_frame_ = true; 230190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->using_synchronous_renderer_compositor = true; 2302a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2303a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2304a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 230790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The BeginFrame notification is turned off now but will get enabled 230890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // once we return. End test while it's enabled. 2309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ImplThread()->PostTask(base::Bind( 231090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &LayerTreeHostTestBeginFrameNotification::EndTest, 231190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this))); 2312a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2313a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2314a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2315a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 2316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 231790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MULTI_THREAD_TEST_F( 231890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LayerTreeHostTestBeginFrameNotificationShutdownWhileEnabled); 2319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestInputDrivenRendering : public LayerTreeHostTest { 2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 232390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings->render_parent_drives_begin_frame_ = true; 2324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame_time_ = base::TimeTicks::Now(); 2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 233290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Post a task to send the final input event for the current BeginFrame; 233390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // it should trigger rendering. 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImplThread()->PostTask( 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&LayerTreeHostTestInputDrivenRendering::SendFinalInputEvent, 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this), 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(host_impl))); 2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SendFinalInputEvent(LayerTreeHostImpl* host_impl) { 234190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) host_impl->DidReceiveLastInputEventForBeginFrame(frame_time_); 2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(frame_time_, **host_impl->fps_counter()->begin()); 2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks frame_time_; 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestInputDrivenRendering); 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation 2358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->impl_side_painting = true; 2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Layer> layer = PictureLayer::Create(&client_); 2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetTransform(gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); 2369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(10, 10)); 2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(layer); 2371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F( 2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestUninvertibleTransformDoesNotBlockActivation); 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestChangeLayerPropertiesInPaintContents 2391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostTest { 2392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class SetBoundsClient : public ContentLayerClient { 2394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient() : layer_(0) {} 23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 2400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect clip, 2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE { 2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->SetBounds(gfx::Size(2, 2)); 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layer* layer_; 2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetIsDrawable(true); 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_.set_layer(root_layer.get()); 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_++; 2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (num_commits_ == 1) { 2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(1, 1), root_layer->bounds()); 2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImpl* root_layer = host_impl->active_tree()->root_layer(); 2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_SIZE_EQ(gfx::Size(2, 2), root_layer->bounds()); 2435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsClient client_; 2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_commits_; 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestChangeLayerPropertiesInPaintContents); 2445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockIOSurfaceWebGraphicsContext3D : public FakeWebGraphicsContext3D { 2447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIOSurfaceWebGraphicsContext3D() 2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : FakeWebGraphicsContext3D() {} 2450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual WebKit::WebGLId createTexture() OVERRIDE { 2452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 1; 2453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual WebKit::WebString getString(WebKit::WGC3Denum name) OVERRIDE { 2456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (name == GL_EXTENSIONS) { 2457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebString( 2458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "GL_CHROMIUM_iosurface GL_ARB_texture_rectangle"); 2459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebString(); 2461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD1(activeTexture, void(WebKit::WGC3Denum texture)); 2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD2(bindTexture, void(WebKit::WGC3Denum target, 2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebGLId texture_id)); 2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD3(texParameteri, void(WebKit::WGC3Denum target, 2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Denum pname, 2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dint param)); 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD5(texImageIOSurface2DCHROMIUM, void(WebKit::WGC3Denum target, 2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dint width, 2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dint height, 2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Duint ioSurfaceId, 2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Duint plane)); 2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD4(drawElements, void(WebKit::WGC3Denum mode, 2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dsizei count, 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Denum type, 2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WGC3Dintptr offset)); 2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest { 2482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<MockIOSurfaceWebGraphicsContext3D> context( 2485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new MockIOSurfaceWebGraphicsContext3D); 2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_context_ = context.get(); 2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface = FakeOutputSurface::Create3d( 2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context.PassAs<WebKit::WebGraphicsContext3D>()).PassAs<OutputSurface>(); 2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return output_surface.Pass(); 2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetIsDrawable(false); 2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_id_ = 9; 2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_ = gfx::Size(6, 7); 2499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface_layer = IOSurfaceLayer::Create(); 2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetBounds(gfx::Size(10, 10)); 2502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetAnchorPoint(gfx::PointF()); 2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIsDrawable(true); 2504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_); 2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(io_surface_layer); 2506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In WillDraw, the IOSurfaceLayer sets up the io surface texture. 2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(_)) 2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(0); 2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_MIN_FILTER, 2521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_LINEAR)) 2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_MAG_FILTER, 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_LINEAR)) 2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_WRAP_S, 2529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_CLAMP_TO_EDGE)) 2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texParameteri(GL_TEXTURE_RECTANGLE_ARB, 2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_WRAP_T, 2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_CLAMP_TO_EDGE)) 2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, texImageIOSurface2DCHROMIUM( 2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_TEXTURE_RECTANGLE_ARB, 2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_.width(), 2539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_size_.height(), 2540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_surface_id_, 2541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0)) 2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(_, 0)) 2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AnyNumber()); 2546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread( 2549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl* host_impl, 2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The io surface layer's texture is drawn. 2555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)) 2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1)) 2558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(1); 2559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_context_, drawElements(GL_TRIANGLES, 6, _, _)) 2560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtLeast(1)); 2561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_context_); 2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int io_surface_id_; 2573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIOSurfaceWebGraphicsContext3D* mock_context_; 2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size io_surface_size_; 2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2577a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 2578a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 2579a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostTestIOSurfaceDrawing); 2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAsyncReadback : public LayerTreeHostTest { 2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root = FakeContentLayer::Create(&client_); 2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->SetBounds(gfx::Size(20, 20)); 2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child = FakeContentLayer::Create(&client_); 2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child->SetBounds(gfx::Size(10, 10)); 2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root->AddChild(child); 2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 2592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForCallback(); 2601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitForCallback() { 2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind( 2607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &LayerTreeHostTestAsyncReadback::NextStep, 2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void NextStep() { 2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int frame = layer_tree_host()->commit_number(); 2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (frame) { 2614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 261590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 261690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::BitmapCallback, 261790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, callbacks_.size()); 2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (callbacks_.size() < 1u) { 2622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForCallback(); 2623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, callbacks_.size()); 2626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[0].ToString()); 2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 262890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 262990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::BitmapCallback, 263090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 263190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) root->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 263290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::BitmapCallback, 263390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 263490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( 263590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&LayerTreeHostTestAsyncReadback::BitmapCallback, 263690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, callbacks_.size()); 2638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (callbacks_.size() < 4u) { 2641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForCallback(); 2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, callbacks_.size()); 2645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The child was copied to a bitmap and passed back twice. 2646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[1].ToString()); 2647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[2].ToString()); 2648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root was copied to a bitmap and passed back also. 2649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20).ToString(), callbacks_[3].ToString()); 2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void BitmapCallback(scoped_ptr<SkBitmap> bitmap) { 2656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 2657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(bitmap); 2658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callbacks_.push_back(gfx::Size(bitmap->width(), bitmap->height())); 2659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 2662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4u, callbacks_.size()); 2663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (use_gl_renderer_) 2667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FakeOutputSurface::Create3d().PassAs<OutputSurface>(); 2668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FakeOutputSurface::CreateSoftware( 2669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_ptr(new SoftwareOutputDevice)).PassAs<OutputSurface>(); 2670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool use_gl_renderer_; 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<gfx::Size> callbacks_; 2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root; 2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> child; 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2679a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Readback can't be done with a delegating renderer. 2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, GLRenderer_RunSingleThread) { 2681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = true; 2682a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 2683a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 2684a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2685a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2686a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GLRenderer_RunMultiThread_MainThreadPainting) { 2687a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_gl_renderer_ = true; 2688a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 2689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2691a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2692a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GLRenderer_RunMultiThread_ImplSidePainting) { 2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = true; 2694a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, SoftwareRenderer_RunSingleThread) { 2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = false; 2699a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 2700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2703a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SoftwareRenderer_RunMultiThread_MainThreadPainting) { 2704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_gl_renderer_ = false; 2705a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 2706a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 2707a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2708a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostTestAsyncReadback, 2709a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SoftwareRenderer_RunMultiThread_ImplSidePainting) { 2710a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_gl_renderer_ = false; 2711a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestAsyncReadbackLayerDestroyed : public LayerTreeHostTest { 2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 2718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_->SetBounds(gfx::Size(20, 20)); 2719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_ = FakeContentLayer::Create(&client_); 2721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_->SetBounds(gfx::Size(15, 15)); 2722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_->AddChild(main_destroyed_); 2723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_ = FakeContentLayer::Create(&client_); 2725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_->SetBounds(gfx::Size(10, 10)); 2726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_->AddChild(impl_destroyed_); 2727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 2729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 2730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_count_ = 0; 2734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int frame = layer_tree_host()->commit_number(); 2739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (frame) { 2740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 1: 274190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) main_destroyed_->RequestCopyOfOutput( 274290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CopyOutputRequest::CreateBitmapRequest(base::Bind( 274390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &LayerTreeHostTestAsyncReadbackLayerDestroyed::BitmapCallback, 274490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 274590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) impl_destroyed_->RequestCopyOfOutput( 274690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CopyOutputRequest::CreateBitmapRequest(base::Bind( 274790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &LayerTreeHostTestAsyncReadbackLayerDestroyed::BitmapCallback, 274890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)))); 2749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, callback_count_); 2750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Destroy the main thread layer right away. 2752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_->RemoveFromParent(); 2753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_destroyed_ = NULL; 2754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should callback with a NULL bitmap. 2756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, callback_count_); 2757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Prevent drawing so we can't make a copy of the impl_destroyed layer. 2759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size()); 2760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 2: 2762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Flush the message loops and make sure the callbacks run. 2763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 3: 2766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No drawing means no readback yet. 2767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, callback_count_); 2768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Destroy the impl thread layer. 2770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_->RemoveFromParent(); 2771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_destroyed_ = NULL; 2772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No callback yet because it's on the impl side. 2774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, callback_count_); 2775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 4: 2777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Flush the message loops and make sure the callbacks run. 2778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case 5: 2781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We should get another callback with a NULL bitmap. 2782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, callback_count_); 2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 2784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void BitmapCallback(scoped_ptr<SkBitmap> bitmap) { 2789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 2790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(bitmap); 2791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++callback_count_; 2792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int callback_count_; 2797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeContentLayerClient client_; 2798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 2799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> main_destroyed_; 2800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FakeContentLayer> impl_destroyed_; 28012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestAsyncReadbackLayerDestroyed); 28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2805b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest { 2806b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 2807a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2808a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_ = 0; 2809a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2810b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2811b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2812b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1: commit + draw 2813b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2: commit only (no draw/swap) 2814b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3: draw only (no commit) 2815b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 4: composite & readback (2 commits, no draw/swap) 2816b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 5: commit + draw 2817b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2818b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2819b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int commit = layer_tree_host()->commit_number(); 2820b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (commit) { 2821b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2822b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 2 done. 2823b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, frame_); 2824b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2825b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2826b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 3: 2827b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // CompositeAndReadback in Round 4, first commit. 2828b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, frame_); 2829b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2830b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 4: 2831b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 4 done. 2832b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, frame_); 2833b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2834b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 2835b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2836b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2837b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2838b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2839b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE { 2840b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int commit = layer_tree_host()->commit_number(); 2841b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ++frame_; 2842b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) char pixels[4] = {0}; 2843b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (frame_) { 2844b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 1: 2845b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 1 done. 2846b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, commit); 2847b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2848b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2849b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 2: 2850b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 3 done. 2851b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, commit); 2852b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(0, 0, 1, 1)); 2853b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2854b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case 3: 2855b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Round 5 done. 2856b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(5, commit); 2857b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EndTest(); 2858b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 2859b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2860b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2861b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2862b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SwapBuffersCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2863b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const ThreadProxy* proxy = static_cast<ThreadProxy*>(impl->proxy()); 2864b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(0, proxy->NumFramesPendingForTesting()); 2865b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2866b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2867b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 2868b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2869b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 2870b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int frame_; 2871b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 2872b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2873b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LayerTreeHostTestNumFramesPending, DelegatingRenderer) { 2874a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 2875b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2876b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2877b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LayerTreeHostTestNumFramesPending, GLRenderer) { 2878a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 2879b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2880b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2883