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