[go: nahoru, domu]

blob: d68ec6744bf8f72135da6a993027cccc369c28b2 [file] [log] [blame]
danakj@chromium.orge216fef02013-03-20 22:56:101// Copyright 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/test/layer_tree_test.h"
6
danakj@chromium.org4fc1b792013-03-26 08:58:577#include "base/command_line.h"
skyostil0fd1dad2015-04-13 20:11:488#include "base/location.h"
9#include "base/single_thread_task_runner.h"
10#include "base/thread_task_runner_handle.h"
danakj@chromium.orge216fef02013-03-20 22:56:1011#include "cc/animation/animation.h"
loysod71ece82015-07-03 13:48:5012#include "cc/animation/animation_host.h"
danakj@chromium.orge216fef02013-03-20 22:56:1013#include "cc/animation/animation_registrar.h"
14#include "cc/animation/layer_animation_controller.h"
15#include "cc/animation/timing_function.h"
vollick@chromium.org8309341c2013-04-29 21:11:3116#include "cc/base/switches.h"
danakj@chromium.orge216fef02013-03-20 22:56:1017#include "cc/input/input_handler.h"
danakj@chromium.orge216fef02013-03-20 22:56:1018#include "cc/layers/layer.h"
19#include "cc/layers/layer_impl.h"
20#include "cc/test/animation_test_common.h"
simonhonga7e3ac42014-11-11 20:50:2221#include "cc/test/begin_frame_args_test.h"
danakj6e3bf8012014-12-16 18:27:5322#include "cc/test/fake_external_begin_frame_source.h"
danakj@chromium.orge216fef02013-03-20 22:56:1023#include "cc/test/fake_layer_tree_host_client.h"
24#include "cc/test/fake_output_surface.h"
jamesr@chromium.orgc2610b9f2013-10-31 06:54:5925#include "cc/test/test_context_provider.h"
reveman22dd9292014-10-13 20:52:0526#include "cc/test/test_gpu_memory_buffer_manager.h"
jbauman@chromium.org4e2eb352014-03-20 17:25:4527#include "cc/test/test_shared_bitmap_manager.h"
reveman34b7a1522015-03-23 20:27:4728#include "cc/test/test_task_graph_runner.h"
jamesr@chromium.org943528e2013-11-07 05:01:3229#include "cc/trees/layer_tree_host_client.h"
danakj@chromium.orge216fef02013-03-20 22:56:1030#include "cc/trees/layer_tree_host_impl.h"
jamesr@chromium.org943528e2013-11-07 05:01:3231#include "cc/trees/layer_tree_host_single_thread_client.h"
enne@chromium.org98ea818e2014-01-24 10:22:0832#include "cc/trees/layer_tree_impl.h"
khushalsagar0a226af2015-12-09 10:30:2033#include "cc/trees/proxy_impl.h"
34#include "cc/trees/proxy_main.h"
danakj@chromium.orge216fef02013-03-20 22:56:1035#include "cc/trees/single_thread_proxy.h"
khushalsagar0a226af2015-12-09 10:30:2036#include "cc/trees/threaded_channel.h"
danakj@chromium.orge216fef02013-03-20 22:56:1037#include "testing/gmock/include/gmock/gmock.h"
heejin.r.chungd28506ba2014-10-23 16:36:2038#include "ui/gfx/geometry/size_conversions.h"
danakj@chromium.orge216fef02013-03-20 22:56:1039
40namespace cc {
41
bokanf553cb3b2015-07-23 18:54:0542void CreateVirtualViewportLayers(Layer* root_layer,
43 scoped_refptr<Layer> outer_scroll_layer,
44 const gfx::Size& inner_bounds,
45 const gfx::Size& outer_bounds,
46 LayerTreeHost* host,
47 const LayerSettings& layer_settings) {
48 scoped_refptr<Layer> inner_viewport_container_layer =
49 Layer::Create(layer_settings);
50 scoped_refptr<Layer> inner_viewport_scroll_layer =
51 Layer::Create(layer_settings);
52 scoped_refptr<Layer> outer_viewport_container_layer =
53 Layer::Create(layer_settings);
54 scoped_refptr<Layer> page_scale_layer = Layer::Create(layer_settings);
55
56 root_layer->AddChild(inner_viewport_container_layer);
57 inner_viewport_container_layer->AddChild(page_scale_layer);
58 page_scale_layer->AddChild(inner_viewport_scroll_layer);
59 inner_viewport_scroll_layer->AddChild(outer_viewport_container_layer);
60 outer_viewport_container_layer->AddChild(outer_scroll_layer);
61
62 inner_viewport_scroll_layer->SetScrollClipLayerId(
63 inner_viewport_container_layer->id());
64 outer_scroll_layer->SetScrollClipLayerId(
65 outer_viewport_container_layer->id());
66
67 inner_viewport_container_layer->SetBounds(inner_bounds);
68 inner_viewport_scroll_layer->SetBounds(outer_bounds);
69 outer_viewport_container_layer->SetBounds(outer_bounds);
70
71 inner_viewport_scroll_layer->SetIsContainerForFixedPositionLayers(true);
72 outer_scroll_layer->SetIsContainerForFixedPositionLayers(true);
73 host->RegisterViewportLayers(NULL,
74 root_layer,
75 inner_viewport_scroll_layer,
76 outer_scroll_layer);
77}
78
79void CreateVirtualViewportLayers(Layer* root_layer,
80 const gfx::Size& inner_bounds,
81 const gfx::Size& outer_bounds,
82 const gfx::Size& scroll_bounds,
83 LayerTreeHost* host,
84 const LayerSettings& layer_settings) {
85 scoped_refptr<Layer> outer_viewport_scroll_layer =
86 Layer::Create(layer_settings);
87
88 outer_viewport_scroll_layer->SetBounds(scroll_bounds);
89 outer_viewport_scroll_layer->SetIsDrawable(true);
90 CreateVirtualViewportLayers(root_layer,
91 outer_viewport_scroll_layer,
92 inner_bounds,
93 outer_bounds,
94 host,
95 layer_settings);
96}
97
khushalsagar0a226af2015-12-09 10:30:2098// Creates a SingleThreadProxy that notifies the supplied |test_hooks| of
99// various actions.
simonhongc6309f792015-01-31 15:47:15100class SingleThreadProxyForTest : public SingleThreadProxy {
101 public:
102 static scoped_ptr<Proxy> Create(
103 TestHooks* test_hooks,
104 LayerTreeHost* host,
105 LayerTreeHostSingleThreadClient* client,
khushalsagarb7db1fe2015-11-12 00:51:27106 TaskRunnerProvider* task_runner_provider,
simonhongc6309f792015-01-31 15:47:15107 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
108 return make_scoped_ptr(new SingleThreadProxyForTest(
khushalsagarb7db1fe2015-11-12 00:51:27109 test_hooks, host, client, task_runner_provider,
danakj78c30f02015-11-18 20:40:55110 std::move(external_begin_frame_source)));
simonhongc6309f792015-01-31 15:47:15111 }
112
113 ~SingleThreadProxyForTest() override {}
114
115 private:
khushalsagar0a226af2015-12-09 10:30:20116 SingleThreadProxyForTest(
117 TestHooks* test_hooks,
118 LayerTreeHost* host,
119 LayerTreeHostSingleThreadClient* client,
120 TaskRunnerProvider* task_runner_provider,
121 scoped_ptr<BeginFrameSource> external_begin_frame_source)
122 : SingleThreadProxy(host,
123 client,
124 task_runner_provider,
125 std::move(external_begin_frame_source)),
126 test_hooks_(test_hooks) {}
simonhongc6309f792015-01-31 15:47:15127
brianderson266dc3a2015-11-12 03:16:40128 void ScheduledActionSendBeginMainFrame(const BeginFrameArgs& args) override {
simonhongc6309f792015-01-31 15:47:15129 test_hooks_->ScheduledActionWillSendBeginMainFrame();
brianderson266dc3a2015-11-12 03:16:40130 SingleThreadProxy::ScheduledActionSendBeginMainFrame(args);
simonhongc6309f792015-01-31 15:47:15131 test_hooks_->ScheduledActionSendBeginMainFrame();
132 }
133
134 DrawResult ScheduledActionDrawAndSwapIfPossible() override {
135 DrawResult result =
136 SingleThreadProxy::ScheduledActionDrawAndSwapIfPossible();
137 test_hooks_->ScheduledActionDrawAndSwapIfPossible();
138 return result;
simonhongc6309f792015-01-31 15:47:15139 }
140
141 void ScheduledActionCommit() override {
142 SingleThreadProxy::ScheduledActionCommit();
143 test_hooks_->ScheduledActionCommit();
144 }
145
146 void ScheduledActionBeginOutputSurfaceCreation() override {
147 SingleThreadProxy::ScheduledActionBeginOutputSurfaceCreation();
148 test_hooks_->ScheduledActionBeginOutputSurfaceCreation();
149 }
150
151 void ScheduledActionPrepareTiles() override {
152 SingleThreadProxy::ScheduledActionPrepareTiles();
153 test_hooks_->ScheduledActionPrepareTiles();
mithro51693e382015-05-07 23:52:41154 }
155
156 void ScheduledActionInvalidateOutputSurface() override {
157 SingleThreadProxy::ScheduledActionInvalidateOutputSurface();
158 test_hooks_->ScheduledActionInvalidateOutputSurface();
159 }
160
161 void SendBeginMainFrameNotExpectedSoon() override {
162 SingleThreadProxy::SendBeginMainFrameNotExpectedSoon();
163 test_hooks_->SendBeginMainFrameNotExpectedSoon();
simonhongc6309f792015-01-31 15:47:15164 }
165
khushalsagar0a226af2015-12-09 10:30:20166 TestHooks* test_hooks_;
simonhong@chromium.org6f0fdcb2014-05-22 02:51:56167};
brianderson@chromium.orgd9fce6722013-08-30 01:10:01168
danakj@chromium.orge216fef02013-03-20 22:56:10169// Adapts LayerTreeHostImpl for test. Runs real code, then invokes test hooks.
170class LayerTreeHostImplForTesting : public LayerTreeHostImpl {
171 public:
danakj@chromium.orge216fef02013-03-20 22:56:10172 static scoped_ptr<LayerTreeHostImplForTesting> Create(
173 TestHooks* test_hooks,
174 const LayerTreeSettings& settings,
175 LayerTreeHostImplClient* host_impl_client,
khushalsagarb7db1fe2015-11-12 00:51:27176 TaskRunnerProvider* task_runner_provider,
reveman22dd9292014-10-13 20:52:05177 SharedBitmapManager* shared_bitmap_manager,
revemanf9a8a232014-10-28 17:54:52178 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
reveman34b7a1522015-03-23 20:27:47179 TaskGraphRunner* task_graph_runner,
egraether@chromium.org372bad5f2013-03-21 16:38:43180 RenderingStatsInstrumentation* stats_instrumentation) {
reveman34b7a1522015-03-23 20:27:47181 return make_scoped_ptr(new LayerTreeHostImplForTesting(
khushalsagarb7db1fe2015-11-12 00:51:27182 test_hooks, settings, host_impl_client, task_runner_provider,
183 shared_bitmap_manager, gpu_memory_buffer_manager, task_graph_runner,
184 stats_instrumentation));
danakj@chromium.orge216fef02013-03-20 22:56:10185 }
186
187 protected:
egraether@chromium.org372bad5f2013-03-21 16:38:43188 LayerTreeHostImplForTesting(
189 TestHooks* test_hooks,
190 const LayerTreeSettings& settings,
191 LayerTreeHostImplClient* host_impl_client,
khushalsagarb7db1fe2015-11-12 00:51:27192 TaskRunnerProvider* task_runner_provider,
reveman22dd9292014-10-13 20:52:05193 SharedBitmapManager* shared_bitmap_manager,
revemanf9a8a232014-10-28 17:54:52194 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
reveman34b7a1522015-03-23 20:27:47195 TaskGraphRunner* task_graph_runner,
egraether@chromium.org372bad5f2013-03-21 16:38:43196 RenderingStatsInstrumentation* stats_instrumentation)
197 : LayerTreeHostImpl(settings,
198 host_impl_client,
khushalsagarb7db1fe2015-11-12 00:51:27199 task_runner_provider,
jbauman@chromium.orga7f35682013-10-22 23:05:57200 stats_instrumentation,
reveman22dd9292014-10-13 20:52:05201 shared_bitmap_manager,
202 gpu_memory_buffer_manager,
reveman34b7a1522015-03-23 20:27:47203 task_graph_runner,
caseq@chromium.orgdbe759a2013-12-02 19:23:02204 0),
brianderson@chromium.org4f48f6e2013-08-27 06:33:38205 test_hooks_(test_hooks),
206 block_notify_ready_to_activate_for_testing_(false),
207 notify_ready_to_activate_was_blocked_(false) {}
hendrikw2f32e4e2015-01-03 00:22:34208
vmiuraa30e1ea2014-12-09 19:23:51209 void CreateResourceAndTileTaskWorkerPool(
210 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
reveman91d23272015-08-20 13:41:38211 scoped_ptr<ResourcePool>* resource_pool) override {
vmiuraa30e1ea2014-12-09 19:23:51212 test_hooks_->CreateResourceAndTileTaskWorkerPool(
reveman91d23272015-08-20 13:41:38213 this, tile_task_worker_pool, resource_pool);
enne03dbe8ae2014-10-30 01:32:55214 }
brianderson@chromium.org4f48f6e2013-08-27 06:33:38215
dcheng716bedf2014-10-21 09:51:08216 void WillBeginImplFrame(const BeginFrameArgs& args) override {
brianderson@chromium.org97e9ccd62014-04-12 01:07:15217 LayerTreeHostImpl::WillBeginImplFrame(args);
brianderson@chromium.org4f48f6e2013-08-27 06:33:38218 test_hooks_->WillBeginImplFrameOnThread(this, args);
mithro51693e382015-05-07 23:52:41219 }
220
221 void DidFinishImplFrame() override {
222 LayerTreeHostImpl::DidFinishImplFrame();
223 test_hooks_->DidFinishImplFrameOnThread(this);
brianderson@chromium.org4f48f6e2013-08-27 06:33:38224 }
danakj@chromium.orge216fef02013-03-20 22:56:10225
mithrof7a21502014-12-17 03:24:48226 void BeginMainFrameAborted(CommitEarlyOutReason reason) override {
227 LayerTreeHostImpl::BeginMainFrameAborted(reason);
228 test_hooks_->BeginMainFrameAbortedOnThread(this, reason);
brianderson@chromium.org097a0cbf2013-12-12 17:04:58229 }
230
dcheng716bedf2014-10-21 09:51:08231 void BeginCommit() override {
danakj@chromium.orge216fef02013-03-20 22:56:10232 LayerTreeHostImpl::BeginCommit();
233 test_hooks_->BeginCommitOnThread(this);
234 }
235
dcheng716bedf2014-10-21 09:51:08236 void CommitComplete() override {
danakj3c3973b2015-08-25 21:50:18237 test_hooks_->WillCommitCompleteOnThread(this);
danakj@chromium.orge216fef02013-03-20 22:56:10238 LayerTreeHostImpl::CommitComplete();
alokp@chromium.orgb6061062014-06-27 19:20:08239 test_hooks_->CommitCompleteOnThread(this);
danakj@chromium.orge216fef02013-03-20 22:56:10240 }
241
danakjb56d7d82015-08-28 19:28:59242 bool PrepareTiles() override {
243 test_hooks_->WillPrepareTiles(this);
244 return LayerTreeHostImpl::PrepareTiles();
245 }
246
dcheng716bedf2014-10-21 09:51:08247 DrawResult PrepareToDraw(FrameData* frame) override {
danakj@chromium.org2aae96792014-05-15 23:10:50248 DrawResult draw_result = LayerTreeHostImpl::PrepareToDraw(frame);
enne@chromium.org7ddfe7e82014-01-30 07:22:11249 return test_hooks_->PrepareToDrawOnThread(this, frame, draw_result);
danakj@chromium.orge216fef02013-03-20 22:56:10250 }
251
mithro248d1722015-05-05 05:23:45252 void DrawLayers(FrameData* frame) override {
253 LayerTreeHostImpl::DrawLayers(frame);
danakj@chromium.orge216fef02013-03-20 22:56:10254 test_hooks_->DrawLayersOnThread(this);
255 }
256
dcheng716bedf2014-10-21 09:51:08257 bool SwapBuffers(const LayerTreeHostImpl::FrameData& frame) override {
danakj@chromium.orge0341352013-04-06 05:01:20258 bool result = LayerTreeHostImpl::SwapBuffers(frame);
danakj@chromium.orge216fef02013-03-20 22:56:10259 test_hooks_->SwapBuffersOnThread(this, result);
260 return result;
261 }
262
dcheng716bedf2014-10-21 09:51:08263 void DidSwapBuffersComplete() override {
brianderson@chromium.orgc14902662014-04-18 05:06:11264 LayerTreeHostImpl::DidSwapBuffersComplete();
piman@chromium.org2ae13edf2013-05-08 16:02:38265 test_hooks_->SwapBuffersCompleteOnThread(this);
266 }
267
dcheng716bedf2014-10-21 09:51:08268 void ReclaimResources(const CompositorFrameAck* ack) override {
jbauman@chromium.orga7335e0b2013-09-18 09:34:51269 LayerTreeHostImpl::ReclaimResources(ack);
270 }
271
dcheng716bedf2014-10-21 09:51:08272 void NotifyReadyToActivate() override {
ernstmdfac03e2014-11-11 20:18:05273 if (block_notify_ready_to_activate_for_testing_) {
brianderson@chromium.org4f48f6e2013-08-27 06:33:38274 notify_ready_to_activate_was_blocked_ = true;
ernstmdfac03e2014-11-11 20:18:05275 } else {
danakja819c2552014-11-14 02:05:04276 LayerTreeHostImpl::NotifyReadyToActivate();
ernstmdfac03e2014-11-11 20:18:05277 test_hooks_->NotifyReadyToActivateOnThread(this);
278 }
279 }
280
281 void NotifyReadyToDraw() override {
danakja819c2552014-11-14 02:05:04282 LayerTreeHostImpl::NotifyReadyToDraw();
ernstmdfac03e2014-11-11 20:18:05283 test_hooks_->NotifyReadyToDrawOnThread(this);
brianderson@chromium.org4f48f6e2013-08-27 06:33:38284 }
danakj@chromium.orge216fef02013-03-20 22:56:10285
ericrk58049242015-06-22 20:32:15286 void NotifyAllTileTasksCompleted() override {
287 LayerTreeHostImpl::NotifyAllTileTasksCompleted();
288 test_hooks_->NotifyAllTileTasksCompleted(this);
289 }
290
dcheng716bedf2014-10-21 09:51:08291 void BlockNotifyReadyToActivateForTesting(bool block) override {
khushalsagarb64b360d2015-10-21 19:25:16292 CHECK(task_runner_provider()->ImplThreadTaskRunner())
enne98f3a6c2014-10-09 20:09:44293 << "Not supported for single-threaded mode.";
brianderson@chromium.org4f48f6e2013-08-27 06:33:38294 block_notify_ready_to_activate_for_testing_ = block;
295 if (!block && notify_ready_to_activate_was_blocked_) {
296 NotifyReadyToActivate();
297 notify_ready_to_activate_was_blocked_ = false;
298 }
enne@chromium.org94bf75c2013-06-12 13:20:04299 }
300
dcheng716bedf2014-10-21 09:51:08301 void ActivateSyncTree() override {
enne@chromium.org94bf75c2013-06-12 13:20:04302 test_hooks_->WillActivateTreeOnThread(this);
alokp@chromium.orgfc20d142014-07-01 00:49:15303 LayerTreeHostImpl::ActivateSyncTree();
enne@chromium.org94bf75c2013-06-12 13:20:04304 DCHECK(!pending_tree());
305 test_hooks_->DidActivateTreeOnThread(this);
danakj@chromium.orge216fef02013-03-20 22:56:10306 }
307
revemand180dfc32015-09-24 00:19:43308 bool InitializeRenderer(OutputSurface* output_surface) override {
309 bool success = LayerTreeHostImpl::InitializeRenderer(output_surface);
danakj@chromium.orge216fef02013-03-20 22:56:10310 test_hooks_->InitializedRendererOnThread(this, success);
311 return success;
312 }
313
dcheng716bedf2014-10-21 09:51:08314 void SetVisible(bool visible) override {
danakj@chromium.orge216fef02013-03-20 22:56:10315 LayerTreeHostImpl::SetVisible(visible);
316 test_hooks_->DidSetVisibleOnImplTree(this, visible);
317 }
318
danakj4923440542015-10-29 19:34:53319 bool AnimateLayers(base::TimeTicks monotonic_time) override {
danakj@chromium.orge216fef02013-03-20 22:56:10320 test_hooks_->WillAnimateLayers(this, monotonic_time);
danakj4923440542015-10-29 19:34:53321 bool result = LayerTreeHostImpl::AnimateLayers(monotonic_time);
danakj@chromium.orge216fef02013-03-20 22:56:10322 test_hooks_->AnimateLayers(this, monotonic_time);
danakj4923440542015-10-29 19:34:53323 return result;
danakj@chromium.orge216fef02013-03-20 22:56:10324 }
325
dcheng716bedf2014-10-21 09:51:08326 void UpdateAnimationState(bool start_ready_animations) override {
danakj@chromium.org3d9f7432013-04-06 00:35:18327 LayerTreeHostImpl::UpdateAnimationState(start_ready_animations);
danakj@chromium.orge216fef02013-03-20 22:56:10328 bool has_unfinished_animation = false;
loysod71ece82015-07-03 13:48:50329 AnimationRegistrar* registrar =
330 animation_registrar() ? animation_registrar()
331 : animation_host()->animation_registrar();
sunnypsea328be12015-02-26 06:03:27332 for (const auto& it :
loysod71ece82015-07-03 13:48:50333 registrar->active_animation_controllers_for_testing()) {
sunnypsea328be12015-02-26 06:03:27334 if (it.second->HasActiveAnimation()) {
danakj@chromium.orge216fef02013-03-20 22:56:10335 has_unfinished_animation = true;
336 break;
337 }
338 }
339 test_hooks_->UpdateAnimationState(this, has_unfinished_animation);
danakja819c2552014-11-14 02:05:04340 }
341
342 void NotifyTileStateChanged(const Tile* tile) override {
343 LayerTreeHostImpl::NotifyTileStateChanged(tile);
344 test_hooks_->NotifyTileStateChangedOnThread(this, tile);
danakj@chromium.orge216fef02013-03-20 22:56:10345 }
346
347 private:
348 TestHooks* test_hooks_;
brianderson@chromium.org4f48f6e2013-08-27 06:33:38349 bool block_notify_ready_to_activate_for_testing_;
350 bool notify_ready_to_activate_was_blocked_;
danakj@chromium.orge216fef02013-03-20 22:56:10351};
352
danakj@chromium.orge216fef02013-03-20 22:56:10353// Implementation of LayerTreeHost callback interface.
jamesr@chromium.org943528e2013-11-07 05:01:32354class LayerTreeHostClientForTesting : public LayerTreeHostClient,
355 public LayerTreeHostSingleThreadClient {
danakj@chromium.orge216fef02013-03-20 22:56:10356 public:
357 static scoped_ptr<LayerTreeHostClientForTesting> Create(
358 TestHooks* test_hooks) {
359 return make_scoped_ptr(new LayerTreeHostClientForTesting(test_hooks));
360 }
dcheng716bedf2014-10-21 09:51:08361 ~LayerTreeHostClientForTesting() override {}
danakj@chromium.orge216fef02013-03-20 22:56:10362
caseq7d2f4c92015-02-04 16:43:27363 void WillBeginMainFrame() override { test_hooks_->WillBeginMainFrame(); }
danakj@chromium.orge216fef02013-03-20 22:56:10364
dcheng716bedf2014-10-21 09:51:08365 void DidBeginMainFrame() override { test_hooks_->DidBeginMainFrame(); }
danakj@chromium.orge216fef02013-03-20 22:56:10366
dcheng716bedf2014-10-21 09:51:08367 void BeginMainFrame(const BeginFrameArgs& args) override {
skyostil@chromium.org04c5900d2014-08-18 13:38:36368 test_hooks_->BeginMainFrame(args);
danakj@chromium.orge216fef02013-03-20 22:56:10369 }
370
wkorman7265db012015-11-03 04:08:25371 void UpdateLayerTreeHost() override {
372 test_hooks_->UpdateLayerTreeHost();
373 }
danakj@chromium.orge216fef02013-03-20 22:56:10374
miletus7a221752015-02-04 20:44:49375 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
376 const gfx::Vector2dF& outer_delta,
ccameron98be9ac2014-12-09 19:56:32377 const gfx::Vector2dF& elastic_overscroll_delta,
dcheng716bedf2014-10-21 09:51:08378 float page_scale,
379 float top_controls_delta) override {
ccameron98be9ac2014-12-09 19:56:32380 test_hooks_->ApplyViewportDeltas(inner_delta, outer_delta,
381 elastic_overscroll_delta, page_scale,
bokan59379b092014-09-29 13:47:21382 top_controls_delta);
383 }
danakj@chromium.orge216fef02013-03-20 22:56:10384
enne7f8fdde2014-12-10 21:32:09385 void RequestNewOutputSurface() override {
386 test_hooks_->RequestNewOutputSurface();
danakj@chromium.orge216fef02013-03-20 22:56:10387 }
388
dcheng716bedf2014-10-21 09:51:08389 void DidInitializeOutputSurface() override {
danakj@chromium.orgda8e3b72b2014-04-25 02:33:45390 test_hooks_->DidInitializeOutputSurface();
danakj@chromium.orge216fef02013-03-20 22:56:10391 }
392
simonhongd3d5f7f2014-11-21 16:38:03393 void SendBeginFramesToChildren(const BeginFrameArgs& args) override {
394 test_hooks_->SendBeginFramesToChildren(args);
395 }
396
dcheng716bedf2014-10-21 09:51:08397 void DidFailToInitializeOutputSurface() override {
boliu@chromium.org04049fc2013-05-01 03:13:20398 test_hooks_->DidFailToInitializeOutputSurface();
enne7f8fdde2014-12-10 21:32:09399 RequestNewOutputSurface();
danakj@chromium.orge216fef02013-03-20 22:56:10400 }
401
dcheng716bedf2014-10-21 09:51:08402 void WillCommit() override { test_hooks_->WillCommit(); }
danakj@chromium.orge216fef02013-03-20 22:56:10403
dcheng716bedf2014-10-21 09:51:08404 void DidCommit() override { test_hooks_->DidCommit(); }
danakj@chromium.orge216fef02013-03-20 22:56:10405
dcheng716bedf2014-10-21 09:51:08406 void DidCommitAndDrawFrame() override {
danakj@chromium.orge216fef02013-03-20 22:56:10407 test_hooks_->DidCommitAndDrawFrame();
408 }
409
dcheng716bedf2014-10-21 09:51:08410 void DidCompleteSwapBuffers() override {
piman@chromium.org2ae13edf2013-05-08 16:02:38411 test_hooks_->DidCompleteSwapBuffers();
412 }
danakj@chromium.orge216fef02013-03-20 22:56:10413
dcheng716bedf2014-10-21 09:51:08414 void DidPostSwapBuffers() override {}
415 void DidAbortSwapBuffers() override {}
jbauman399aec1a2014-10-25 02:33:32416 void ScheduleComposite() override { test_hooks_->ScheduleComposite(); }
rouslanf7ebd8832015-01-22 01:54:14417 void DidCompletePageScaleAnimation() override {}
rmcilroy0a19362a2015-02-18 12:34:25418 void BeginMainFrameNotExpectedSoon() override {}
jamesr@chromium.org943528e2013-11-07 05:01:32419
mpbed24c2c2015-06-05 20:57:13420 void RecordFrameTimingEvents(
421 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
422 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events)
423 override {}
424
danakj@chromium.orge216fef02013-03-20 22:56:10425 private:
426 explicit LayerTreeHostClientForTesting(TestHooks* test_hooks)
427 : test_hooks_(test_hooks) {}
428
429 TestHooks* test_hooks_;
430};
431
jamesr@chromium.org943528e2013-11-07 05:01:32432// Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting.
433class LayerTreeHostForTesting : public LayerTreeHost {
434 public:
435 static scoped_ptr<LayerTreeHostForTesting> Create(
436 TestHooks* test_hooks,
khushalsagar19458bd2015-12-08 02:19:01437 CompositorMode mode,
jamesr@chromium.org943528e2013-11-07 05:01:32438 LayerTreeHostClientForTesting* client,
reveman34b7a1522015-03-23 20:27:47439 SharedBitmapManager* shared_bitmap_manager,
440 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
441 TaskGraphRunner* task_graph_runner,
jamesr@chromium.org943528e2013-11-07 05:01:32442 const LayerTreeSettings& settings,
skyostil@chromium.org27e6a212014-07-18 15:51:27443 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
simonhonga7e3ac42014-11-11 20:50:22444 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
445 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
sadrul6780f3da2015-05-11 17:01:52446 LayerTreeHost::InitParams params;
447 params.client = client;
448 params.shared_bitmap_manager = shared_bitmap_manager;
449 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager;
450 params.task_graph_runner = task_graph_runner;
451 params.settings = &settings;
jamesr@chromium.org943528e2013-11-07 05:01:32452 scoped_ptr<LayerTreeHostForTesting> layer_tree_host(
khushalsagar19458bd2015-12-08 02:19:01453 new LayerTreeHostForTesting(test_hooks, &params, mode));
khushalsagarb7db1fe2015-11-12 00:51:27454 scoped_ptr<TaskRunnerProvider> task_runner_provider =
455 TaskRunnerProvider::Create(main_task_runner, impl_task_runner);
456 scoped_ptr<Proxy> proxy;
khushalsagar19458bd2015-12-08 02:19:01457 if (mode == CompositorMode::Threaded) {
458 DCHECK(impl_task_runner.get());
khushalsagar0a226af2015-12-09 10:30:20459 scoped_ptr<ProxyMain> proxy_main = ProxyMainForTest::CreateThreaded(
danakj78c30f02015-11-18 20:40:55460 test_hooks, layer_tree_host.get(), task_runner_provider.get(),
461 std::move(external_begin_frame_source));
khushalsagar0a226af2015-12-09 10:30:20462 proxy = std::move(proxy_main);
simonhong@chromium.org6f0fdcb2014-05-22 02:51:56463 } else {
khushalsagarb7db1fe2015-11-12 00:51:27464 proxy = SingleThreadProxyForTest::Create(
465 test_hooks, layer_tree_host.get(), client, task_runner_provider.get(),
danakj78c30f02015-11-18 20:40:55466 std::move(external_begin_frame_source));
simonhong@chromium.org6f0fdcb2014-05-22 02:51:56467 }
danakj78c30f02015-11-18 20:40:55468 layer_tree_host->InitializeForTesting(std::move(task_runner_provider),
469 std::move(proxy));
470 return layer_tree_host;
jamesr@chromium.org943528e2013-11-07 05:01:32471 }
472
dcheng716bedf2014-10-21 09:51:08473 scoped_ptr<LayerTreeHostImpl> CreateLayerTreeHostImpl(
mostynbf68776d82014-10-06 18:07:37474 LayerTreeHostImplClient* host_impl_client) override {
jamesr@chromium.org943528e2013-11-07 05:01:32475 return LayerTreeHostImplForTesting::Create(
khushalsagarb7db1fe2015-11-12 00:51:27476 test_hooks_, settings(), host_impl_client, task_runner_provider(),
sadrul6780f3da2015-05-11 17:01:52477 shared_bitmap_manager(), gpu_memory_buffer_manager(),
478 task_graph_runner(), rendering_stats_instrumentation());
jamesr@chromium.org943528e2013-11-07 05:01:32479 }
480
dcheng716bedf2014-10-21 09:51:08481 void SetNeedsCommit() override {
jamesr@chromium.org943528e2013-11-07 05:01:32482 if (!test_started_)
483 return;
484 LayerTreeHost::SetNeedsCommit();
485 }
486
skyostil51d1575b2015-08-12 12:00:07487 void SetNeedsUpdateLayers() override {
488 if (!test_started_)
489 return;
490 LayerTreeHost::SetNeedsUpdateLayers();
491 }
492
jamesr@chromium.org943528e2013-11-07 05:01:32493 void set_test_started(bool started) { test_started_ = started; }
jamesr@chromium.org943528e2013-11-07 05:01:32494
495 private:
sadrul6780f3da2015-05-11 17:01:52496 LayerTreeHostForTesting(TestHooks* test_hooks,
khushalsagar19458bd2015-12-08 02:19:01497 LayerTreeHost::InitParams* params,
498 CompositorMode mode)
499 : LayerTreeHost(params, mode),
500 test_hooks_(test_hooks),
501 test_started_(false) {}
jamesr@chromium.org943528e2013-11-07 05:01:32502
503 TestHooks* test_hooks_;
504 bool test_started_;
505};
506
danakj@chromium.orge216fef02013-03-20 22:56:10507LayerTreeTest::LayerTreeTest()
enne03dbe8ae2014-10-30 01:32:55508 : output_surface_(nullptr),
simonhonga7e3ac42014-11-11 20:50:22509 external_begin_frame_source_(nullptr),
enne03dbe8ae2014-10-30 01:32:55510 beginning_(false),
danakj@chromium.orge216fef02013-03-20 22:56:10511 end_when_begin_returns_(false),
512 timed_out_(false),
513 scheduled_(false),
danakj@chromium.orge216fef02013-03-20 22:56:10514 started_(false),
515 ended_(false),
danakj@chromium.org2a61ad52013-05-13 14:01:29516 delegating_renderer_(false),
ajumacef8a4c2015-06-30 17:07:54517 verify_property_trees_(true),
danakj@chromium.org4fc1b792013-03-26 08:58:57518 timeout_seconds_(0),
scherkus@chromium.org257b1a072013-04-26 08:01:40519 weak_factory_(this) {
danakj@chromium.orge216fef02013-03-20 22:56:10520 main_thread_weak_ptr_ = weak_factory_.GetWeakPtr();
danakj@chromium.org4fc1b792013-03-26 08:58:57521
522 // Tests should timeout quickly unless --cc-layer-tree-test-no-timeout was
523 // specified (for running in a debugger).
pgal.u-szeged8c867962014-11-18 16:24:44524 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
vollick@chromium.org8309341c2013-04-29 21:11:31525 if (!command_line->HasSwitch(switches::kCCLayerTreeTestNoTimeout))
danakj@chromium.org4fc1b792013-03-26 08:58:57526 timeout_seconds_ = 5;
danakj@chromium.orge216fef02013-03-20 22:56:10527}
528
529LayerTreeTest::~LayerTreeTest() {}
530
531void LayerTreeTest::EndTest() {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38532 if (ended_)
533 return;
enne@chromium.org66bfba62013-07-13 00:27:01534 ended_ = true;
535
danakj@chromium.org7ac8dcb2013-10-31 09:58:38536 // For the case where we EndTest during BeginTest(), set a flag to indicate
537 // that the test should end the second BeginTest regains control.
leandrogracia@chromium.org7539d512013-03-22 15:56:44538 if (beginning_) {
danakj@chromium.orge216fef02013-03-20 22:56:10539 end_when_begin_returns_ = true;
danakj@chromium.org7ac8dcb2013-10-31 09:58:38540 } else {
541 main_task_runner_->PostTask(
danakj@chromium.org810d40b72013-06-20 18:26:15542 FROM_HERE,
danakj@chromium.orge216fef02013-03-20 22:56:10543 base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_));
leandrogracia@chromium.org7539d512013-03-22 15:56:44544 }
danakj@chromium.orge216fef02013-03-20 22:56:10545}
546
danakja819c2552014-11-14 02:05:04547void LayerTreeTest::EndTestAfterDelayMs(int delay_milliseconds) {
caseq@chromium.org2c6998c2014-04-03 11:33:57548 main_task_runner_->PostDelayedTask(
549 FROM_HERE,
550 base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_),
551 base::TimeDelta::FromMilliseconds(delay_milliseconds));
danakj@chromium.orge216fef02013-03-20 22:56:10552}
553
554void LayerTreeTest::PostAddAnimationToMainThread(
555 Layer* layer_to_receive_animation) {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38556 main_task_runner_->PostTask(
danakj@chromium.org810d40b72013-06-20 18:26:15557 FROM_HERE,
behara.ms591d77f92014-11-18 16:01:40558 base::Bind(&LayerTreeTest::DispatchAddAnimation, main_thread_weak_ptr_,
559 base::Unretained(layer_to_receive_animation), 0.000004));
danakj@chromium.orge216fef02013-03-20 22:56:10560}
561
danakj@chromium.org3d9f7432013-04-06 00:35:18562void LayerTreeTest::PostAddInstantAnimationToMainThread(
563 Layer* layer_to_receive_animation) {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38564 main_task_runner_->PostTask(
danakj@chromium.org810d40b72013-06-20 18:26:15565 FROM_HERE,
ajuma@chromium.org40880faa2013-11-18 08:10:00566 base::Bind(&LayerTreeTest::DispatchAddAnimation,
danakj@chromium.org3d9f7432013-04-06 00:35:18567 main_thread_weak_ptr_,
ajuma@chromium.org40880faa2013-11-18 08:10:00568 base::Unretained(layer_to_receive_animation),
569 0.0));
570}
571
572void LayerTreeTest::PostAddLongAnimationToMainThread(
573 Layer* layer_to_receive_animation) {
574 main_task_runner_->PostTask(
575 FROM_HERE,
576 base::Bind(&LayerTreeTest::DispatchAddAnimation,
577 main_thread_weak_ptr_,
578 base::Unretained(layer_to_receive_animation),
579 1.0));
simonhongc6309f792015-01-31 15:47:15580}
581
loysod71ece82015-07-03 13:48:50582void LayerTreeTest::PostAddAnimationToMainThreadPlayer(
583 AnimationPlayer* player_to_receive_animation) {
584 main_task_runner_->PostTask(
585 FROM_HERE,
586 base::Bind(&LayerTreeTest::DispatchAddAnimationToPlayer,
587 main_thread_weak_ptr_,
588 base::Unretained(player_to_receive_animation), 0.000004));
589}
590
591void LayerTreeTest::PostAddInstantAnimationToMainThreadPlayer(
592 AnimationPlayer* player_to_receive_animation) {
593 main_task_runner_->PostTask(
594 FROM_HERE,
595 base::Bind(&LayerTreeTest::DispatchAddAnimationToPlayer,
596 main_thread_weak_ptr_,
597 base::Unretained(player_to_receive_animation), 0.0));
598}
599
600void LayerTreeTest::PostAddLongAnimationToMainThreadPlayer(
601 AnimationPlayer* player_to_receive_animation) {
602 main_task_runner_->PostTask(
603 FROM_HERE,
604 base::Bind(&LayerTreeTest::DispatchAddAnimationToPlayer,
605 main_thread_weak_ptr_,
606 base::Unretained(player_to_receive_animation), 1.0));
607}
608
simonhongc6309f792015-01-31 15:47:15609void LayerTreeTest::PostSetDeferCommitsToMainThread(bool defer_commits) {
610 main_task_runner_->PostTask(
611 FROM_HERE,
612 base::Bind(&LayerTreeTest::DispatchSetDeferCommits,
613 main_thread_weak_ptr_, defer_commits));
danakj@chromium.orge216fef02013-03-20 22:56:10614}
615
616void LayerTreeTest::PostSetNeedsCommitToMainThread() {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38617 main_task_runner_->PostTask(FROM_HERE,
618 base::Bind(&LayerTreeTest::DispatchSetNeedsCommit,
619 main_thread_weak_ptr_));
danakj@chromium.orge216fef02013-03-20 22:56:10620}
621
miletus@chromium.orgb69c1db2013-11-27 00:05:19622void LayerTreeTest::PostSetNeedsUpdateLayersToMainThread() {
623 main_task_runner_->PostTask(
624 FROM_HERE,
625 base::Bind(&LayerTreeTest::DispatchSetNeedsUpdateLayers,
626 main_thread_weak_ptr_));
627}
628
danakj@chromium.orge216fef02013-03-20 22:56:10629void LayerTreeTest::PostSetNeedsRedrawToMainThread() {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38630 main_task_runner_->PostTask(FROM_HERE,
631 base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw,
632 main_thread_weak_ptr_));
danakj@chromium.orge216fef02013-03-20 22:56:10633}
634
prashant.n@samsung.com0023fc72014-01-10 20:05:06635void LayerTreeTest::PostSetNeedsRedrawRectToMainThread(
636 const gfx::Rect& damage_rect) {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38637 main_task_runner_->PostTask(
danakj@chromium.org810d40b72013-06-20 18:26:15638 FROM_HERE,
skaslev@chromium.org878705be2013-04-15 22:44:02639 base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect,
danakj@chromium.org7ac8dcb2013-10-31 09:58:38640 main_thread_weak_ptr_,
641 damage_rect));
skaslev@chromium.org878705be2013-04-15 22:44:02642}
643
danakj@chromium.orge216fef02013-03-20 22:56:10644void LayerTreeTest::PostSetVisibleToMainThread(bool visible) {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38645 main_task_runner_->PostTask(
danakj@chromium.org810d40b72013-06-20 18:26:15646 FROM_HERE,
danakj@chromium.org7ac8dcb2013-10-31 09:58:38647 base::Bind(
648 &LayerTreeTest::DispatchSetVisible, main_thread_weak_ptr_, visible));
danakj@chromium.orge216fef02013-03-20 22:56:10649}
650
kbr@chromium.org7d08a9352013-10-15 08:24:56651void LayerTreeTest::PostSetNextCommitForcesRedrawToMainThread() {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38652 main_task_runner_->PostTask(
kbr@chromium.org7d08a9352013-10-15 08:24:56653 FROM_HERE,
654 base::Bind(&LayerTreeTest::DispatchSetNextCommitForcesRedraw,
655 main_thread_weak_ptr_));
656}
657
enne69277cb2014-10-29 23:03:40658void LayerTreeTest::PostCompositeImmediatelyToMainThread() {
659 main_task_runner_->PostTask(
660 FROM_HERE,
661 base::Bind(&LayerTreeTest::DispatchCompositeImmediately,
662 main_thread_weak_ptr_));
663}
664
sievers@google.come96e3432013-12-19 18:56:07665void LayerTreeTest::WillBeginTest() {
sievers71c62dd52015-10-07 01:44:39666 layer_tree_host_->SetVisible(true);
sievers@google.come96e3432013-12-19 18:56:07667}
668
danakj@chromium.orge216fef02013-03-20 22:56:10669void LayerTreeTest::DoBeginTest() {
670 client_ = LayerTreeHostClientForTesting::Create(this);
671
danakj6e3bf8012014-12-16 18:27:53672 scoped_ptr<FakeExternalBeginFrameSource> external_begin_frame_source;
bajones274110612015-01-06 20:53:59673 if (settings_.use_external_begin_frame_source) {
danakj6e3bf8012014-12-16 18:27:53674 external_begin_frame_source.reset(new FakeExternalBeginFrameSource(
jbaumanc5be44c2014-11-20 22:17:12675 settings_.renderer_settings.refresh_rate));
simonhonga7e3ac42014-11-11 20:50:22676 external_begin_frame_source_ = external_begin_frame_source.get();
677 }
678
skyostil0fd1dad2015-04-13 20:11:48679 DCHECK(!impl_thread_ || impl_thread_->task_runner().get());
danakj@chromium.org810d40b72013-06-20 18:26:15680 layer_tree_host_ = LayerTreeHostForTesting::Create(
khushalsagar737153c2015-12-09 02:39:21681 this, mode_, client_.get(), shared_bitmap_manager_.get(),
reveman34b7a1522015-03-23 20:27:47682 gpu_memory_buffer_manager_.get(), task_graph_runner_.get(), settings_,
skyostil0fd1dad2015-04-13 20:11:48683 base::ThreadTaskRunnerHandle::Get(),
684 impl_thread_ ? impl_thread_->task_runner() : NULL,
danakj78c30f02015-11-18 20:40:55685 std::move(external_begin_frame_source));
danakj@chromium.orge216fef02013-03-20 22:56:10686 ASSERT_TRUE(layer_tree_host_);
687
688 started_ = true;
689 beginning_ = true;
690 SetupTree();
sievers@google.come96e3432013-12-19 18:56:07691 WillBeginTest();
danakj@chromium.orge216fef02013-03-20 22:56:10692 BeginTest();
693 beginning_ = false;
694 if (end_when_begin_returns_)
695 RealEndTest();
696
697 // Allow commits to happen once BeginTest() has had a chance to post tasks
698 // so that those tasks will happen before the first commit.
699 if (layer_tree_host_) {
jamesr@chromium.orge7e7ebd2014-01-16 00:11:11700 static_cast<LayerTreeHostForTesting*>(layer_tree_host_.get())
701 ->set_test_started(true);
danakj@chromium.orge216fef02013-03-20 22:56:10702 }
703}
704
705void LayerTreeTest::SetupTree() {
706 if (!layer_tree_host_->root_layer()) {
loysoa6edaaf2015-05-25 03:26:44707 scoped_refptr<Layer> root_layer = Layer::Create(layer_settings_);
danakj@chromium.orge216fef02013-03-20 22:56:10708 root_layer->SetBounds(gfx::Size(1, 1));
709 layer_tree_host_->SetRootLayer(root_layer);
710 }
711
712 gfx::Size root_bounds = layer_tree_host_->root_layer()->bounds();
danakjddaec912015-09-25 19:38:40713 gfx::Size device_root_bounds = gfx::ScaleToCeiledSize(
714 root_bounds, layer_tree_host_->device_scale_factor());
aelias@chromium.org18ce59702013-04-09 04:58:40715 layer_tree_host_->SetViewportSize(device_root_bounds);
jaydasikad7dea632015-11-06 04:40:12716 layer_tree_host_->root_layer()->SetIsDrawable(true);
danakj@chromium.orge216fef02013-03-20 22:56:10717}
718
719void LayerTreeTest::Timeout() {
720 timed_out_ = true;
721 EndTest();
722}
723
danakj@chromium.orge216fef02013-03-20 22:56:10724void LayerTreeTest::RealEndTest() {
mithro51693e382015-05-07 23:52:41725 // TODO(mithro): Make this method only end when not inside an impl frame.
danakj@chromium.org4ea293f72014-08-13 03:03:17726 if (layer_tree_host_ && !timed_out_ &&
727 proxy()->MainFrameWillHappenForTesting()) {
danakj@chromium.org7ac8dcb2013-10-31 09:58:38728 main_task_runner_->PostTask(
danakj@chromium.org810d40b72013-06-20 18:26:15729 FROM_HERE,
danakj@chromium.orge216fef02013-03-20 22:56:10730 base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_));
731 return;
732 }
jamesr@chromium.orgbf691c22013-03-26 21:15:06733
ki.stfu94337f42015-10-23 11:24:20734 base::MessageLoop::current()->QuitWhenIdle();
danakj@chromium.orge216fef02013-03-20 22:56:10735}
736
ajuma@chromium.org40880faa2013-11-18 08:10:00737void LayerTreeTest::DispatchAddAnimation(Layer* layer_to_receive_animation,
738 double animation_duration) {
khushalsagarb7db1fe2015-11-12 00:51:27739 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
danakj@chromium.orge216fef02013-03-20 22:56:10740
danakj@chromium.org3d9f7432013-04-06 00:35:18741 if (layer_to_receive_animation) {
jamesr@chromium.orge7e7ebd2014-01-16 00:11:11742 AddOpacityTransitionToLayer(
743 layer_to_receive_animation, animation_duration, 0, 0.5, true);
danakj@chromium.org3d9f7432013-04-06 00:35:18744 }
simonhong1625b742015-01-29 23:02:39745}
746
loysod71ece82015-07-03 13:48:50747void LayerTreeTest::DispatchAddAnimationToPlayer(
748 AnimationPlayer* player_to_receive_animation,
749 double animation_duration) {
khushalsagarb7db1fe2015-11-12 00:51:27750 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
loysod71ece82015-07-03 13:48:50751
752 if (player_to_receive_animation) {
753 AddOpacityTransitionToPlayer(player_to_receive_animation,
754 animation_duration, 0, 0.5, true);
755 }
756}
757
simonhongc6309f792015-01-31 15:47:15758void LayerTreeTest::DispatchSetDeferCommits(bool defer_commits) {
khushalsagarb7db1fe2015-11-12 00:51:27759 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
simonhongc6309f792015-01-31 15:47:15760
761 if (layer_tree_host_)
762 layer_tree_host_->SetDeferCommits(defer_commits);
763}
764
danakj@chromium.orge216fef02013-03-20 22:56:10765void LayerTreeTest::DispatchSetNeedsCommit() {
khushalsagarb7db1fe2015-11-12 00:51:27766 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
danakj@chromium.orge216fef02013-03-20 22:56:10767
768 if (layer_tree_host_)
769 layer_tree_host_->SetNeedsCommit();
770}
771
miletus@chromium.orgb69c1db2013-11-27 00:05:19772void LayerTreeTest::DispatchSetNeedsUpdateLayers() {
khushalsagarb7db1fe2015-11-12 00:51:27773 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
miletus@chromium.orgb69c1db2013-11-27 00:05:19774
775 if (layer_tree_host_)
776 layer_tree_host_->SetNeedsUpdateLayers();
danakj@chromium.orge216fef02013-03-20 22:56:10777}
778
779void LayerTreeTest::DispatchSetNeedsRedraw() {
khushalsagarb7db1fe2015-11-12 00:51:27780 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
danakj@chromium.orge216fef02013-03-20 22:56:10781
782 if (layer_tree_host_)
783 layer_tree_host_->SetNeedsRedraw();
784}
785
prashant.n@samsung.com0023fc72014-01-10 20:05:06786void LayerTreeTest::DispatchSetNeedsRedrawRect(const gfx::Rect& damage_rect) {
khushalsagarb7db1fe2015-11-12 00:51:27787 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
skaslev@chromium.org878705be2013-04-15 22:44:02788
789 if (layer_tree_host_)
790 layer_tree_host_->SetNeedsRedrawRect(damage_rect);
791}
792
danakj@chromium.orge216fef02013-03-20 22:56:10793void LayerTreeTest::DispatchSetVisible(bool visible) {
khushalsagarb7db1fe2015-11-12 00:51:27794 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
enne@chromium.orgaeeedad2014-08-22 18:16:22795 if (layer_tree_host_)
796 layer_tree_host_->SetVisible(visible);
danakj@chromium.orge216fef02013-03-20 22:56:10797}
798
kbr@chromium.org7d08a9352013-10-15 08:24:56799void LayerTreeTest::DispatchSetNextCommitForcesRedraw() {
khushalsagarb7db1fe2015-11-12 00:51:27800 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
kbr@chromium.org7d08a9352013-10-15 08:24:56801
802 if (layer_tree_host_)
mark@chromium.org8b9e52b2014-01-17 16:35:31803 layer_tree_host_->SetNextCommitForcesRedraw();
enne@chromium.org2decdd782014-08-13 22:36:06804}
805
enne69277cb2014-10-29 23:03:40806void LayerTreeTest::DispatchCompositeImmediately() {
khushalsagarb7db1fe2015-11-12 00:51:27807 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread());
enne69277cb2014-10-29 23:03:40808 if (layer_tree_host_)
abhishek.ka7215854d2015-05-26 06:13:17809 layer_tree_host_->Composite(base::TimeTicks::Now());
enne69277cb2014-10-29 23:03:40810}
811
khushalsagar737153c2015-12-09 02:39:21812void LayerTreeTest::RunTest(CompositorMode mode, bool delegating_renderer) {
813 mode_ = mode;
814 if (mode_ == CompositorMode::Threaded) {
vollick@chromium.org8309341c2013-04-29 21:11:31815 impl_thread_.reset(new base::Thread("Compositor"));
danakj@chromium.orge216fef02013-03-20 22:56:10816 ASSERT_TRUE(impl_thread_->Start());
817 }
818
skyostil0fd1dad2015-04-13 20:11:48819 main_task_runner_ = base::ThreadTaskRunnerHandle::Get();
danakj@chromium.org4145d172013-05-10 16:54:36820
reveman34b7a1522015-03-23 20:27:47821 shared_bitmap_manager_.reset(new TestSharedBitmapManager);
822 gpu_memory_buffer_manager_.reset(new TestGpuMemoryBufferManager);
823 task_graph_runner_.reset(new TestTaskGraphRunner);
824
danakj@chromium.org4145d172013-05-10 16:54:36825 delegating_renderer_ = delegating_renderer;
danakj@chromium.orge216fef02013-03-20 22:56:10826
brianderson@chromium.org97e9ccd62014-04-12 01:07:15827 // Spend less time waiting for BeginFrame because the output is
brianderson@chromium.orgc8cbae72013-05-23 10:45:03828 // mocked out.
jbaumanc5be44c2014-11-20 22:17:12829 settings_.renderer_settings.refresh_rate = 200.0;
mithro719bf6792014-11-10 15:36:47830 settings_.background_animation_rate = 200.0;
hendrikw3c8dfa22014-12-22 21:52:29831 settings_.verify_property_trees = verify_property_trees_;
danakj@chromium.orge216fef02013-03-20 22:56:10832 InitializeSettings(&settings_);
loysoa6edaaf2015-05-25 03:26:44833 InitializeLayerSettings(&layer_settings_);
danakj@chromium.orge216fef02013-03-20 22:56:10834
danakj@chromium.org810d40b72013-06-20 18:26:15835 main_task_runner_->PostTask(
836 FROM_HERE,
danakj@chromium.orge216fef02013-03-20 22:56:10837 base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this)));
danakj@chromium.org4fc1b792013-03-26 08:58:57838
839 if (timeout_seconds_) {
840 timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this)));
danakj@chromium.org810d40b72013-06-20 18:26:15841 main_task_runner_->PostDelayedTask(
842 FROM_HERE,
danakj@chromium.org4fc1b792013-03-26 08:58:57843 timeout_.callback(),
844 base::TimeDelta::FromSeconds(timeout_seconds_));
845 }
846
xhwang@chromium.org2811f312013-04-27 05:21:17847 base::MessageLoop::current()->Run();
danakj@chromium.orgdf17af52014-02-06 02:20:40848 DestroyLayerTreeHost();
danakj@chromium.orge216fef02013-03-20 22:56:10849
850 timeout_.Cancel();
851
852 ASSERT_FALSE(layer_tree_host_.get());
danakjf446a072014-09-27 21:55:48853 client_ = nullptr;
danakj@chromium.orge216fef02013-03-20 22:56:10854 if (timed_out_) {
855 FAIL() << "Test timed out";
856 return;
857 }
858 AfterTest();
clholgat@chromium.orgc0f7a7f2013-10-15 21:33:56859}
860
enne7f8fdde2014-12-10 21:32:09861void LayerTreeTest::RequestNewOutputSurface() {
862 layer_tree_host_->SetOutputSurface(CreateOutputSurface());
enne2097cab2014-09-25 20:16:31863}
864
enne7f8fdde2014-12-10 21:32:09865scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface() {
866 scoped_ptr<FakeOutputSurface> output_surface = CreateFakeOutputSurface();
867 DCHECK_EQ(delegating_renderer_,
868 output_surface->capabilities().delegated_rendering);
brianderson@chromium.org049fc7a2013-06-18 12:32:35869 output_surface_ = output_surface.get();
simonhonga7e3ac42014-11-11 20:50:22870
bajones274110612015-01-06 20:53:59871 if (settings_.use_external_begin_frame_source) {
simonhonga7e3ac42014-11-11 20:50:22872 DCHECK(external_begin_frame_source_);
873 DCHECK(external_begin_frame_source_->is_ready());
874 }
danakj78c30f02015-11-18 20:40:55875 return std::move(output_surface);
jamesr@chromium.orge7e7ebd2014-01-16 00:11:11876}
877
enne7f8fdde2014-12-10 21:32:09878scoped_ptr<FakeOutputSurface> LayerTreeTest::CreateFakeOutputSurface() {
jamesr@chromium.orge7e7ebd2014-01-16 00:11:11879 if (delegating_renderer_)
880 return FakeOutputSurface::CreateDelegating3d();
881 else
882 return FakeOutputSurface::Create3d();
danakj@chromium.org4145d172013-05-10 16:54:36883}
884
jamesr@chromium.orge7e7ebd2014-01-16 00:11:11885TestWebGraphicsContext3D* LayerTreeTest::TestContext() {
dcheng6afa17002014-08-26 19:11:31886 return static_cast<TestContextProvider*>(output_surface_->context_provider())
887 ->TestContext3d();
jamesr@chromium.orge7e7ebd2014-01-16 00:11:11888}
889
enne@chromium.org98ea818e2014-01-24 10:22:08890int LayerTreeTest::LastCommittedSourceFrameNumber(LayerTreeHostImpl* impl)
891 const {
892 if (impl->pending_tree())
893 return impl->pending_tree()->source_frame_number();
894 if (impl->active_tree())
895 return impl->active_tree()->source_frame_number();
896 // Source frames start at 0, so this is invalid.
897 return -1;
898}
899
danakj@chromium.orgdf17af52014-02-06 02:20:40900void LayerTreeTest::DestroyLayerTreeHost() {
901 if (layer_tree_host_ && layer_tree_host_->root_layer())
902 layer_tree_host_->root_layer()->SetLayerTreeHost(NULL);
danakjf446a072014-09-27 21:55:48903 layer_tree_host_ = nullptr;
danakj@chromium.orgdf17af52014-02-06 02:20:40904}
905
ericrk4e3aa5a2015-12-01 03:53:56906TaskGraphRunner* LayerTreeTest::task_graph_runner() const {
907 return task_graph_runner_.get();
908}
909
vollick1aa84912015-03-19 18:49:09910LayerTreeHost* LayerTreeTest::layer_tree_host() {
khushalsagarb7db1fe2015-11-12 00:51:27911 // We check for a null task_runner_provider here as we sometimes ask for the
912 // layer tree host when the task_runner_provider does not exist, often for
913 // checking settings after a test has completed. For example,
914 // LTHPixelResourceTest::RunPixelResourceTest. See elsewhere in this file for
915 // other examples.
916 DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread() ||
917 task_runner_provider()->IsMainThreadBlocked());
vollick1aa84912015-03-19 18:49:09918 return layer_tree_host_.get();
919}
920
khushalsagar0a226af2015-12-09 10:30:20921ProxyMainForTest* LayerTreeTest::GetProxyMainForTest() const {
922 DCHECK(HasImplThread());
923 return static_cast<ProxyMainForTest*>(proxy());
924}
925
926ProxyImplForTest* LayerTreeTest::GetProxyImplForTest() const {
927 DCHECK(HasImplThread());
928 ThreadedChannel* threaded_channel =
929 static_cast<ThreadedChannel*>(GetProxyMainForTest()->channel_main());
930 ProxyImpl* proxy_impl = threaded_channel->GetProxyImplForTesting();
931
932 // We check for null ProxyImpl since ProxyImpl exists in the ThreadedChannel
933 // only after it is initialized.
934 DCHECK(proxy_impl);
935 return static_cast<ProxyImplForTest*>(proxy_impl);
936}
937
danakj@chromium.orge216fef02013-03-20 22:56:10938} // namespace cc