danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 1 | // 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.org | 4fc1b79 | 2013-03-26 08:58:57 | [diff] [blame] | 7 | #include "base/command_line.h" |
skyostil | 0fd1dad | 2015-04-13 20:11:48 | [diff] [blame] | 8 | #include "base/location.h" |
| 9 | #include "base/single_thread_task_runner.h" |
| 10 | #include "base/thread_task_runner_handle.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 11 | #include "cc/animation/animation.h" |
loyso | d71ece8 | 2015-07-03 13:48:50 | [diff] [blame] | 12 | #include "cc/animation/animation_host.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 13 | #include "cc/animation/animation_registrar.h" |
| 14 | #include "cc/animation/layer_animation_controller.h" |
| 15 | #include "cc/animation/timing_function.h" |
vollick@chromium.org | 8309341c | 2013-04-29 21:11:31 | [diff] [blame] | 16 | #include "cc/base/switches.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 17 | #include "cc/input/input_handler.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 18 | #include "cc/layers/layer.h" |
| 19 | #include "cc/layers/layer_impl.h" |
| 20 | #include "cc/test/animation_test_common.h" |
simonhong | a7e3ac4 | 2014-11-11 20:50:22 | [diff] [blame] | 21 | #include "cc/test/begin_frame_args_test.h" |
danakj | 6e3bf801 | 2014-12-16 18:27:53 | [diff] [blame] | 22 | #include "cc/test/fake_external_begin_frame_source.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 23 | #include "cc/test/fake_layer_tree_host_client.h" |
| 24 | #include "cc/test/fake_output_surface.h" |
jamesr@chromium.org | c2610b9f | 2013-10-31 06:54:59 | [diff] [blame] | 25 | #include "cc/test/test_context_provider.h" |
reveman | 22dd929 | 2014-10-13 20:52:05 | [diff] [blame] | 26 | #include "cc/test/test_gpu_memory_buffer_manager.h" |
jbauman@chromium.org | 4e2eb35 | 2014-03-20 17:25:45 | [diff] [blame] | 27 | #include "cc/test/test_shared_bitmap_manager.h" |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 28 | #include "cc/test/test_task_graph_runner.h" |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 29 | #include "cc/trees/layer_tree_host_client.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 30 | #include "cc/trees/layer_tree_host_impl.h" |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 31 | #include "cc/trees/layer_tree_host_single_thread_client.h" |
enne@chromium.org | 98ea818e | 2014-01-24 10:22:08 | [diff] [blame] | 32 | #include "cc/trees/layer_tree_impl.h" |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 33 | #include "cc/trees/proxy_impl.h" |
| 34 | #include "cc/trees/proxy_main.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 35 | #include "cc/trees/single_thread_proxy.h" |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 36 | #include "cc/trees/threaded_channel.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 37 | #include "testing/gmock/include/gmock/gmock.h" |
heejin.r.chung | d28506ba | 2014-10-23 16:36:20 | [diff] [blame] | 38 | #include "ui/gfx/geometry/size_conversions.h" |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 39 | |
| 40 | namespace cc { |
| 41 | |
bokan | f553cb3b | 2015-07-23 18:54:05 | [diff] [blame] | 42 | void 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 | |
| 79 | void 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 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 98 | // Creates a SingleThreadProxy that notifies the supplied |test_hooks| of |
| 99 | // various actions. |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 100 | class SingleThreadProxyForTest : public SingleThreadProxy { |
| 101 | public: |
| 102 | static scoped_ptr<Proxy> Create( |
| 103 | TestHooks* test_hooks, |
| 104 | LayerTreeHost* host, |
| 105 | LayerTreeHostSingleThreadClient* client, |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 106 | TaskRunnerProvider* task_runner_provider, |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 107 | scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
| 108 | return make_scoped_ptr(new SingleThreadProxyForTest( |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 109 | test_hooks, host, client, task_runner_provider, |
danakj | 78c30f0 | 2015-11-18 20:40:55 | [diff] [blame] | 110 | std::move(external_begin_frame_source))); |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | ~SingleThreadProxyForTest() override {} |
| 114 | |
| 115 | private: |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 116 | 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) {} |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 127 | |
brianderson | 266dc3a | 2015-11-12 03:16:40 | [diff] [blame] | 128 | void ScheduledActionSendBeginMainFrame(const BeginFrameArgs& args) override { |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 129 | test_hooks_->ScheduledActionWillSendBeginMainFrame(); |
brianderson | 266dc3a | 2015-11-12 03:16:40 | [diff] [blame] | 130 | SingleThreadProxy::ScheduledActionSendBeginMainFrame(args); |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 131 | test_hooks_->ScheduledActionSendBeginMainFrame(); |
| 132 | } |
| 133 | |
| 134 | DrawResult ScheduledActionDrawAndSwapIfPossible() override { |
| 135 | DrawResult result = |
| 136 | SingleThreadProxy::ScheduledActionDrawAndSwapIfPossible(); |
| 137 | test_hooks_->ScheduledActionDrawAndSwapIfPossible(); |
| 138 | return result; |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 139 | } |
| 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(); |
mithro | 51693e38 | 2015-05-07 23:52:41 | [diff] [blame] | 154 | } |
| 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(); |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 164 | } |
| 165 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 166 | TestHooks* test_hooks_; |
simonhong@chromium.org | 6f0fdcb | 2014-05-22 02:51:56 | [diff] [blame] | 167 | }; |
brianderson@chromium.org | d9fce672 | 2013-08-30 01:10:01 | [diff] [blame] | 168 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 169 | // Adapts LayerTreeHostImpl for test. Runs real code, then invokes test hooks. |
| 170 | class LayerTreeHostImplForTesting : public LayerTreeHostImpl { |
| 171 | public: |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 172 | static scoped_ptr<LayerTreeHostImplForTesting> Create( |
| 173 | TestHooks* test_hooks, |
| 174 | const LayerTreeSettings& settings, |
| 175 | LayerTreeHostImplClient* host_impl_client, |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 176 | TaskRunnerProvider* task_runner_provider, |
reveman | 22dd929 | 2014-10-13 20:52:05 | [diff] [blame] | 177 | SharedBitmapManager* shared_bitmap_manager, |
reveman | f9a8a23 | 2014-10-28 17:54:52 | [diff] [blame] | 178 | gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 179 | TaskGraphRunner* task_graph_runner, |
egraether@chromium.org | 372bad5f | 2013-03-21 16:38:43 | [diff] [blame] | 180 | RenderingStatsInstrumentation* stats_instrumentation) { |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 181 | return make_scoped_ptr(new LayerTreeHostImplForTesting( |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 182 | 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.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 185 | } |
| 186 | |
| 187 | protected: |
egraether@chromium.org | 372bad5f | 2013-03-21 16:38:43 | [diff] [blame] | 188 | LayerTreeHostImplForTesting( |
| 189 | TestHooks* test_hooks, |
| 190 | const LayerTreeSettings& settings, |
| 191 | LayerTreeHostImplClient* host_impl_client, |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 192 | TaskRunnerProvider* task_runner_provider, |
reveman | 22dd929 | 2014-10-13 20:52:05 | [diff] [blame] | 193 | SharedBitmapManager* shared_bitmap_manager, |
reveman | f9a8a23 | 2014-10-28 17:54:52 | [diff] [blame] | 194 | gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 195 | TaskGraphRunner* task_graph_runner, |
egraether@chromium.org | 372bad5f | 2013-03-21 16:38:43 | [diff] [blame] | 196 | RenderingStatsInstrumentation* stats_instrumentation) |
| 197 | : LayerTreeHostImpl(settings, |
| 198 | host_impl_client, |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 199 | task_runner_provider, |
jbauman@chromium.org | a7f3568 | 2013-10-22 23:05:57 | [diff] [blame] | 200 | stats_instrumentation, |
reveman | 22dd929 | 2014-10-13 20:52:05 | [diff] [blame] | 201 | shared_bitmap_manager, |
| 202 | gpu_memory_buffer_manager, |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 203 | task_graph_runner, |
caseq@chromium.org | dbe759a | 2013-12-02 19:23:02 | [diff] [blame] | 204 | 0), |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 205 | test_hooks_(test_hooks), |
| 206 | block_notify_ready_to_activate_for_testing_(false), |
| 207 | notify_ready_to_activate_was_blocked_(false) {} |
hendrikw | 2f32e4e | 2015-01-03 00:22:34 | [diff] [blame] | 208 | |
vmiura | a30e1ea | 2014-12-09 19:23:51 | [diff] [blame] | 209 | void CreateResourceAndTileTaskWorkerPool( |
| 210 | scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
reveman | 91d2327 | 2015-08-20 13:41:38 | [diff] [blame] | 211 | scoped_ptr<ResourcePool>* resource_pool) override { |
vmiura | a30e1ea | 2014-12-09 19:23:51 | [diff] [blame] | 212 | test_hooks_->CreateResourceAndTileTaskWorkerPool( |
reveman | 91d2327 | 2015-08-20 13:41:38 | [diff] [blame] | 213 | this, tile_task_worker_pool, resource_pool); |
enne | 03dbe8ae | 2014-10-30 01:32:55 | [diff] [blame] | 214 | } |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 215 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 216 | void WillBeginImplFrame(const BeginFrameArgs& args) override { |
brianderson@chromium.org | 97e9ccd6 | 2014-04-12 01:07:15 | [diff] [blame] | 217 | LayerTreeHostImpl::WillBeginImplFrame(args); |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 218 | test_hooks_->WillBeginImplFrameOnThread(this, args); |
mithro | 51693e38 | 2015-05-07 23:52:41 | [diff] [blame] | 219 | } |
| 220 | |
| 221 | void DidFinishImplFrame() override { |
| 222 | LayerTreeHostImpl::DidFinishImplFrame(); |
| 223 | test_hooks_->DidFinishImplFrameOnThread(this); |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 224 | } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 225 | |
mithro | f7a2150 | 2014-12-17 03:24:48 | [diff] [blame] | 226 | void BeginMainFrameAborted(CommitEarlyOutReason reason) override { |
| 227 | LayerTreeHostImpl::BeginMainFrameAborted(reason); |
| 228 | test_hooks_->BeginMainFrameAbortedOnThread(this, reason); |
brianderson@chromium.org | 097a0cbf | 2013-12-12 17:04:58 | [diff] [blame] | 229 | } |
| 230 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 231 | void BeginCommit() override { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 232 | LayerTreeHostImpl::BeginCommit(); |
| 233 | test_hooks_->BeginCommitOnThread(this); |
| 234 | } |
| 235 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 236 | void CommitComplete() override { |
danakj | 3c3973b | 2015-08-25 21:50:18 | [diff] [blame] | 237 | test_hooks_->WillCommitCompleteOnThread(this); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 238 | LayerTreeHostImpl::CommitComplete(); |
alokp@chromium.org | b606106 | 2014-06-27 19:20:08 | [diff] [blame] | 239 | test_hooks_->CommitCompleteOnThread(this); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 240 | } |
| 241 | |
danakj | b56d7d8 | 2015-08-28 19:28:59 | [diff] [blame] | 242 | bool PrepareTiles() override { |
| 243 | test_hooks_->WillPrepareTiles(this); |
| 244 | return LayerTreeHostImpl::PrepareTiles(); |
| 245 | } |
| 246 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 247 | DrawResult PrepareToDraw(FrameData* frame) override { |
danakj@chromium.org | 2aae9679 | 2014-05-15 23:10:50 | [diff] [blame] | 248 | DrawResult draw_result = LayerTreeHostImpl::PrepareToDraw(frame); |
enne@chromium.org | 7ddfe7e8 | 2014-01-30 07:22:11 | [diff] [blame] | 249 | return test_hooks_->PrepareToDrawOnThread(this, frame, draw_result); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 250 | } |
| 251 | |
mithro | 248d172 | 2015-05-05 05:23:45 | [diff] [blame] | 252 | void DrawLayers(FrameData* frame) override { |
| 253 | LayerTreeHostImpl::DrawLayers(frame); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 254 | test_hooks_->DrawLayersOnThread(this); |
| 255 | } |
| 256 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 257 | bool SwapBuffers(const LayerTreeHostImpl::FrameData& frame) override { |
danakj@chromium.org | e034135 | 2013-04-06 05:01:20 | [diff] [blame] | 258 | bool result = LayerTreeHostImpl::SwapBuffers(frame); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 259 | test_hooks_->SwapBuffersOnThread(this, result); |
| 260 | return result; |
| 261 | } |
| 262 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 263 | void DidSwapBuffersComplete() override { |
brianderson@chromium.org | c1490266 | 2014-04-18 05:06:11 | [diff] [blame] | 264 | LayerTreeHostImpl::DidSwapBuffersComplete(); |
piman@chromium.org | 2ae13edf | 2013-05-08 16:02:38 | [diff] [blame] | 265 | test_hooks_->SwapBuffersCompleteOnThread(this); |
| 266 | } |
| 267 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 268 | void ReclaimResources(const CompositorFrameAck* ack) override { |
jbauman@chromium.org | a7335e0b | 2013-09-18 09:34:51 | [diff] [blame] | 269 | LayerTreeHostImpl::ReclaimResources(ack); |
| 270 | } |
| 271 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 272 | void NotifyReadyToActivate() override { |
ernstm | dfac03e | 2014-11-11 20:18:05 | [diff] [blame] | 273 | if (block_notify_ready_to_activate_for_testing_) { |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 274 | notify_ready_to_activate_was_blocked_ = true; |
ernstm | dfac03e | 2014-11-11 20:18:05 | [diff] [blame] | 275 | } else { |
danakj | a819c255 | 2014-11-14 02:05:04 | [diff] [blame] | 276 | LayerTreeHostImpl::NotifyReadyToActivate(); |
ernstm | dfac03e | 2014-11-11 20:18:05 | [diff] [blame] | 277 | test_hooks_->NotifyReadyToActivateOnThread(this); |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | void NotifyReadyToDraw() override { |
danakj | a819c255 | 2014-11-14 02:05:04 | [diff] [blame] | 282 | LayerTreeHostImpl::NotifyReadyToDraw(); |
ernstm | dfac03e | 2014-11-11 20:18:05 | [diff] [blame] | 283 | test_hooks_->NotifyReadyToDrawOnThread(this); |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 284 | } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 285 | |
ericrk | 5804924 | 2015-06-22 20:32:15 | [diff] [blame] | 286 | void NotifyAllTileTasksCompleted() override { |
| 287 | LayerTreeHostImpl::NotifyAllTileTasksCompleted(); |
| 288 | test_hooks_->NotifyAllTileTasksCompleted(this); |
| 289 | } |
| 290 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 291 | void BlockNotifyReadyToActivateForTesting(bool block) override { |
khushalsagar | b64b360d | 2015-10-21 19:25:16 | [diff] [blame] | 292 | CHECK(task_runner_provider()->ImplThreadTaskRunner()) |
enne | 98f3a6c | 2014-10-09 20:09:44 | [diff] [blame] | 293 | << "Not supported for single-threaded mode."; |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 294 | 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.org | 94bf75c | 2013-06-12 13:20:04 | [diff] [blame] | 299 | } |
| 300 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 301 | void ActivateSyncTree() override { |
enne@chromium.org | 94bf75c | 2013-06-12 13:20:04 | [diff] [blame] | 302 | test_hooks_->WillActivateTreeOnThread(this); |
alokp@chromium.org | fc20d14 | 2014-07-01 00:49:15 | [diff] [blame] | 303 | LayerTreeHostImpl::ActivateSyncTree(); |
enne@chromium.org | 94bf75c | 2013-06-12 13:20:04 | [diff] [blame] | 304 | DCHECK(!pending_tree()); |
| 305 | test_hooks_->DidActivateTreeOnThread(this); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 306 | } |
| 307 | |
reveman | d180dfc3 | 2015-09-24 00:19:43 | [diff] [blame] | 308 | bool InitializeRenderer(OutputSurface* output_surface) override { |
| 309 | bool success = LayerTreeHostImpl::InitializeRenderer(output_surface); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 310 | test_hooks_->InitializedRendererOnThread(this, success); |
| 311 | return success; |
| 312 | } |
| 313 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 314 | void SetVisible(bool visible) override { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 315 | LayerTreeHostImpl::SetVisible(visible); |
| 316 | test_hooks_->DidSetVisibleOnImplTree(this, visible); |
| 317 | } |
| 318 | |
danakj | 492344054 | 2015-10-29 19:34:53 | [diff] [blame] | 319 | bool AnimateLayers(base::TimeTicks monotonic_time) override { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 320 | test_hooks_->WillAnimateLayers(this, monotonic_time); |
danakj | 492344054 | 2015-10-29 19:34:53 | [diff] [blame] | 321 | bool result = LayerTreeHostImpl::AnimateLayers(monotonic_time); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 322 | test_hooks_->AnimateLayers(this, monotonic_time); |
danakj | 492344054 | 2015-10-29 19:34:53 | [diff] [blame] | 323 | return result; |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 324 | } |
| 325 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 326 | void UpdateAnimationState(bool start_ready_animations) override { |
danakj@chromium.org | 3d9f743 | 2013-04-06 00:35:18 | [diff] [blame] | 327 | LayerTreeHostImpl::UpdateAnimationState(start_ready_animations); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 328 | bool has_unfinished_animation = false; |
loyso | d71ece8 | 2015-07-03 13:48:50 | [diff] [blame] | 329 | AnimationRegistrar* registrar = |
| 330 | animation_registrar() ? animation_registrar() |
| 331 | : animation_host()->animation_registrar(); |
sunnyps | ea328be1 | 2015-02-26 06:03:27 | [diff] [blame] | 332 | for (const auto& it : |
loyso | d71ece8 | 2015-07-03 13:48:50 | [diff] [blame] | 333 | registrar->active_animation_controllers_for_testing()) { |
sunnyps | ea328be1 | 2015-02-26 06:03:27 | [diff] [blame] | 334 | if (it.second->HasActiveAnimation()) { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 335 | has_unfinished_animation = true; |
| 336 | break; |
| 337 | } |
| 338 | } |
| 339 | test_hooks_->UpdateAnimationState(this, has_unfinished_animation); |
danakj | a819c255 | 2014-11-14 02:05:04 | [diff] [blame] | 340 | } |
| 341 | |
| 342 | void NotifyTileStateChanged(const Tile* tile) override { |
| 343 | LayerTreeHostImpl::NotifyTileStateChanged(tile); |
| 344 | test_hooks_->NotifyTileStateChangedOnThread(this, tile); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 345 | } |
| 346 | |
| 347 | private: |
| 348 | TestHooks* test_hooks_; |
brianderson@chromium.org | 4f48f6e | 2013-08-27 06:33:38 | [diff] [blame] | 349 | bool block_notify_ready_to_activate_for_testing_; |
| 350 | bool notify_ready_to_activate_was_blocked_; |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 351 | }; |
| 352 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 353 | // Implementation of LayerTreeHost callback interface. |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 354 | class LayerTreeHostClientForTesting : public LayerTreeHostClient, |
| 355 | public LayerTreeHostSingleThreadClient { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 356 | public: |
| 357 | static scoped_ptr<LayerTreeHostClientForTesting> Create( |
| 358 | TestHooks* test_hooks) { |
| 359 | return make_scoped_ptr(new LayerTreeHostClientForTesting(test_hooks)); |
| 360 | } |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 361 | ~LayerTreeHostClientForTesting() override {} |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 362 | |
caseq | 7d2f4c9 | 2015-02-04 16:43:27 | [diff] [blame] | 363 | void WillBeginMainFrame() override { test_hooks_->WillBeginMainFrame(); } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 364 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 365 | void DidBeginMainFrame() override { test_hooks_->DidBeginMainFrame(); } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 366 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 367 | void BeginMainFrame(const BeginFrameArgs& args) override { |
skyostil@chromium.org | 04c5900d | 2014-08-18 13:38:36 | [diff] [blame] | 368 | test_hooks_->BeginMainFrame(args); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 369 | } |
| 370 | |
wkorman | 7265db01 | 2015-11-03 04:08:25 | [diff] [blame] | 371 | void UpdateLayerTreeHost() override { |
| 372 | test_hooks_->UpdateLayerTreeHost(); |
| 373 | } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 374 | |
miletus | 7a22175 | 2015-02-04 20:44:49 | [diff] [blame] | 375 | void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, |
| 376 | const gfx::Vector2dF& outer_delta, |
ccameron | 98be9ac | 2014-12-09 19:56:32 | [diff] [blame] | 377 | const gfx::Vector2dF& elastic_overscroll_delta, |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 378 | float page_scale, |
| 379 | float top_controls_delta) override { |
ccameron | 98be9ac | 2014-12-09 19:56:32 | [diff] [blame] | 380 | test_hooks_->ApplyViewportDeltas(inner_delta, outer_delta, |
| 381 | elastic_overscroll_delta, page_scale, |
bokan | 59379b09 | 2014-09-29 13:47:21 | [diff] [blame] | 382 | top_controls_delta); |
| 383 | } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 384 | |
enne | 7f8fdde | 2014-12-10 21:32:09 | [diff] [blame] | 385 | void RequestNewOutputSurface() override { |
| 386 | test_hooks_->RequestNewOutputSurface(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 387 | } |
| 388 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 389 | void DidInitializeOutputSurface() override { |
danakj@chromium.org | da8e3b72b | 2014-04-25 02:33:45 | [diff] [blame] | 390 | test_hooks_->DidInitializeOutputSurface(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 391 | } |
| 392 | |
simonhong | d3d5f7f | 2014-11-21 16:38:03 | [diff] [blame] | 393 | void SendBeginFramesToChildren(const BeginFrameArgs& args) override { |
| 394 | test_hooks_->SendBeginFramesToChildren(args); |
| 395 | } |
| 396 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 397 | void DidFailToInitializeOutputSurface() override { |
boliu@chromium.org | 04049fc | 2013-05-01 03:13:20 | [diff] [blame] | 398 | test_hooks_->DidFailToInitializeOutputSurface(); |
enne | 7f8fdde | 2014-12-10 21:32:09 | [diff] [blame] | 399 | RequestNewOutputSurface(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 400 | } |
| 401 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 402 | void WillCommit() override { test_hooks_->WillCommit(); } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 403 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 404 | void DidCommit() override { test_hooks_->DidCommit(); } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 405 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 406 | void DidCommitAndDrawFrame() override { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 407 | test_hooks_->DidCommitAndDrawFrame(); |
| 408 | } |
| 409 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 410 | void DidCompleteSwapBuffers() override { |
piman@chromium.org | 2ae13edf | 2013-05-08 16:02:38 | [diff] [blame] | 411 | test_hooks_->DidCompleteSwapBuffers(); |
| 412 | } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 413 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 414 | void DidPostSwapBuffers() override {} |
| 415 | void DidAbortSwapBuffers() override {} |
jbauman | 399aec1a | 2014-10-25 02:33:32 | [diff] [blame] | 416 | void ScheduleComposite() override { test_hooks_->ScheduleComposite(); } |
rouslan | f7ebd883 | 2015-01-22 01:54:14 | [diff] [blame] | 417 | void DidCompletePageScaleAnimation() override {} |
rmcilroy | 0a19362a | 2015-02-18 12:34:25 | [diff] [blame] | 418 | void BeginMainFrameNotExpectedSoon() override {} |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 419 | |
mpb | ed24c2c | 2015-06-05 20:57:13 | [diff] [blame] | 420 | void RecordFrameTimingEvents( |
| 421 | scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, |
| 422 | scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) |
| 423 | override {} |
| 424 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 425 | private: |
| 426 | explicit LayerTreeHostClientForTesting(TestHooks* test_hooks) |
| 427 | : test_hooks_(test_hooks) {} |
| 428 | |
| 429 | TestHooks* test_hooks_; |
| 430 | }; |
| 431 | |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 432 | // Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting. |
| 433 | class LayerTreeHostForTesting : public LayerTreeHost { |
| 434 | public: |
| 435 | static scoped_ptr<LayerTreeHostForTesting> Create( |
| 436 | TestHooks* test_hooks, |
khushalsagar | 19458bd | 2015-12-08 02:19:01 | [diff] [blame] | 437 | CompositorMode mode, |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 438 | LayerTreeHostClientForTesting* client, |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 439 | SharedBitmapManager* shared_bitmap_manager, |
| 440 | gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 441 | TaskGraphRunner* task_graph_runner, |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 442 | const LayerTreeSettings& settings, |
skyostil@chromium.org | 27e6a21 | 2014-07-18 15:51:27 | [diff] [blame] | 443 | scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
simonhong | a7e3ac4 | 2014-11-11 20:50:22 | [diff] [blame] | 444 | scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
| 445 | scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
sadrul | 6780f3da | 2015-05-11 17:01:52 | [diff] [blame] | 446 | 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.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 452 | scoped_ptr<LayerTreeHostForTesting> layer_tree_host( |
khushalsagar | 19458bd | 2015-12-08 02:19:01 | [diff] [blame] | 453 | new LayerTreeHostForTesting(test_hooks, ¶ms, mode)); |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 454 | scoped_ptr<TaskRunnerProvider> task_runner_provider = |
| 455 | TaskRunnerProvider::Create(main_task_runner, impl_task_runner); |
| 456 | scoped_ptr<Proxy> proxy; |
khushalsagar | 19458bd | 2015-12-08 02:19:01 | [diff] [blame] | 457 | if (mode == CompositorMode::Threaded) { |
| 458 | DCHECK(impl_task_runner.get()); |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 459 | scoped_ptr<ProxyMain> proxy_main = ProxyMainForTest::CreateThreaded( |
danakj | 78c30f0 | 2015-11-18 20:40:55 | [diff] [blame] | 460 | test_hooks, layer_tree_host.get(), task_runner_provider.get(), |
| 461 | std::move(external_begin_frame_source)); |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 462 | proxy = std::move(proxy_main); |
simonhong@chromium.org | 6f0fdcb | 2014-05-22 02:51:56 | [diff] [blame] | 463 | } else { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 464 | proxy = SingleThreadProxyForTest::Create( |
| 465 | test_hooks, layer_tree_host.get(), client, task_runner_provider.get(), |
danakj | 78c30f0 | 2015-11-18 20:40:55 | [diff] [blame] | 466 | std::move(external_begin_frame_source)); |
simonhong@chromium.org | 6f0fdcb | 2014-05-22 02:51:56 | [diff] [blame] | 467 | } |
danakj | 78c30f0 | 2015-11-18 20:40:55 | [diff] [blame] | 468 | layer_tree_host->InitializeForTesting(std::move(task_runner_provider), |
| 469 | std::move(proxy)); |
| 470 | return layer_tree_host; |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 471 | } |
| 472 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 473 | scoped_ptr<LayerTreeHostImpl> CreateLayerTreeHostImpl( |
mostynb | f68776d8 | 2014-10-06 18:07:37 | [diff] [blame] | 474 | LayerTreeHostImplClient* host_impl_client) override { |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 475 | return LayerTreeHostImplForTesting::Create( |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 476 | test_hooks_, settings(), host_impl_client, task_runner_provider(), |
sadrul | 6780f3da | 2015-05-11 17:01:52 | [diff] [blame] | 477 | shared_bitmap_manager(), gpu_memory_buffer_manager(), |
| 478 | task_graph_runner(), rendering_stats_instrumentation()); |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 479 | } |
| 480 | |
dcheng | 716bedf | 2014-10-21 09:51:08 | [diff] [blame] | 481 | void SetNeedsCommit() override { |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 482 | if (!test_started_) |
| 483 | return; |
| 484 | LayerTreeHost::SetNeedsCommit(); |
| 485 | } |
| 486 | |
skyostil | 51d1575b | 2015-08-12 12:00:07 | [diff] [blame] | 487 | void SetNeedsUpdateLayers() override { |
| 488 | if (!test_started_) |
| 489 | return; |
| 490 | LayerTreeHost::SetNeedsUpdateLayers(); |
| 491 | } |
| 492 | |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 493 | void set_test_started(bool started) { test_started_ = started; } |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 494 | |
| 495 | private: |
sadrul | 6780f3da | 2015-05-11 17:01:52 | [diff] [blame] | 496 | LayerTreeHostForTesting(TestHooks* test_hooks, |
khushalsagar | 19458bd | 2015-12-08 02:19:01 | [diff] [blame] | 497 | LayerTreeHost::InitParams* params, |
| 498 | CompositorMode mode) |
| 499 | : LayerTreeHost(params, mode), |
| 500 | test_hooks_(test_hooks), |
| 501 | test_started_(false) {} |
jamesr@chromium.org | 943528e | 2013-11-07 05:01:32 | [diff] [blame] | 502 | |
| 503 | TestHooks* test_hooks_; |
| 504 | bool test_started_; |
| 505 | }; |
| 506 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 507 | LayerTreeTest::LayerTreeTest() |
enne | 03dbe8ae | 2014-10-30 01:32:55 | [diff] [blame] | 508 | : output_surface_(nullptr), |
simonhong | a7e3ac4 | 2014-11-11 20:50:22 | [diff] [blame] | 509 | external_begin_frame_source_(nullptr), |
enne | 03dbe8ae | 2014-10-30 01:32:55 | [diff] [blame] | 510 | beginning_(false), |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 511 | end_when_begin_returns_(false), |
| 512 | timed_out_(false), |
| 513 | scheduled_(false), |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 514 | started_(false), |
| 515 | ended_(false), |
danakj@chromium.org | 2a61ad5 | 2013-05-13 14:01:29 | [diff] [blame] | 516 | delegating_renderer_(false), |
ajuma | cef8a4c | 2015-06-30 17:07:54 | [diff] [blame] | 517 | verify_property_trees_(true), |
danakj@chromium.org | 4fc1b79 | 2013-03-26 08:58:57 | [diff] [blame] | 518 | timeout_seconds_(0), |
scherkus@chromium.org | 257b1a07 | 2013-04-26 08:01:40 | [diff] [blame] | 519 | weak_factory_(this) { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 520 | main_thread_weak_ptr_ = weak_factory_.GetWeakPtr(); |
danakj@chromium.org | 4fc1b79 | 2013-03-26 08:58:57 | [diff] [blame] | 521 | |
| 522 | // Tests should timeout quickly unless --cc-layer-tree-test-no-timeout was |
| 523 | // specified (for running in a debugger). |
pgal.u-szeged | 8c86796 | 2014-11-18 16:24:44 | [diff] [blame] | 524 | base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
vollick@chromium.org | 8309341c | 2013-04-29 21:11:31 | [diff] [blame] | 525 | if (!command_line->HasSwitch(switches::kCCLayerTreeTestNoTimeout)) |
danakj@chromium.org | 4fc1b79 | 2013-03-26 08:58:57 | [diff] [blame] | 526 | timeout_seconds_ = 5; |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 527 | } |
| 528 | |
| 529 | LayerTreeTest::~LayerTreeTest() {} |
| 530 | |
| 531 | void LayerTreeTest::EndTest() { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 532 | if (ended_) |
| 533 | return; |
enne@chromium.org | 66bfba6 | 2013-07-13 00:27:01 | [diff] [blame] | 534 | ended_ = true; |
| 535 | |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 536 | // 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.org | 7539d51 | 2013-03-22 15:56:44 | [diff] [blame] | 538 | if (beginning_) { |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 539 | end_when_begin_returns_ = true; |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 540 | } else { |
| 541 | main_task_runner_->PostTask( |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 542 | FROM_HERE, |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 543 | base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); |
leandrogracia@chromium.org | 7539d51 | 2013-03-22 15:56:44 | [diff] [blame] | 544 | } |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 545 | } |
| 546 | |
danakj | a819c255 | 2014-11-14 02:05:04 | [diff] [blame] | 547 | void LayerTreeTest::EndTestAfterDelayMs(int delay_milliseconds) { |
caseq@chromium.org | 2c6998c | 2014-04-03 11:33:57 | [diff] [blame] | 548 | main_task_runner_->PostDelayedTask( |
| 549 | FROM_HERE, |
| 550 | base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_), |
| 551 | base::TimeDelta::FromMilliseconds(delay_milliseconds)); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 552 | } |
| 553 | |
| 554 | void LayerTreeTest::PostAddAnimationToMainThread( |
| 555 | Layer* layer_to_receive_animation) { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 556 | main_task_runner_->PostTask( |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 557 | FROM_HERE, |
behara.ms | 591d77f9 | 2014-11-18 16:01:40 | [diff] [blame] | 558 | base::Bind(&LayerTreeTest::DispatchAddAnimation, main_thread_weak_ptr_, |
| 559 | base::Unretained(layer_to_receive_animation), 0.000004)); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 560 | } |
| 561 | |
danakj@chromium.org | 3d9f743 | 2013-04-06 00:35:18 | [diff] [blame] | 562 | void LayerTreeTest::PostAddInstantAnimationToMainThread( |
| 563 | Layer* layer_to_receive_animation) { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 564 | main_task_runner_->PostTask( |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 565 | FROM_HERE, |
ajuma@chromium.org | 40880faa | 2013-11-18 08:10:00 | [diff] [blame] | 566 | base::Bind(&LayerTreeTest::DispatchAddAnimation, |
danakj@chromium.org | 3d9f743 | 2013-04-06 00:35:18 | [diff] [blame] | 567 | main_thread_weak_ptr_, |
ajuma@chromium.org | 40880faa | 2013-11-18 08:10:00 | [diff] [blame] | 568 | base::Unretained(layer_to_receive_animation), |
| 569 | 0.0)); |
| 570 | } |
| 571 | |
| 572 | void 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)); |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 580 | } |
| 581 | |
loyso | d71ece8 | 2015-07-03 13:48:50 | [diff] [blame] | 582 | void 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 | |
| 591 | void 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 | |
| 600 | void 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 | |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 609 | void 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.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 614 | } |
| 615 | |
| 616 | void LayerTreeTest::PostSetNeedsCommitToMainThread() { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 617 | main_task_runner_->PostTask(FROM_HERE, |
| 618 | base::Bind(&LayerTreeTest::DispatchSetNeedsCommit, |
| 619 | main_thread_weak_ptr_)); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 620 | } |
| 621 | |
miletus@chromium.org | b69c1db | 2013-11-27 00:05:19 | [diff] [blame] | 622 | void LayerTreeTest::PostSetNeedsUpdateLayersToMainThread() { |
| 623 | main_task_runner_->PostTask( |
| 624 | FROM_HERE, |
| 625 | base::Bind(&LayerTreeTest::DispatchSetNeedsUpdateLayers, |
| 626 | main_thread_weak_ptr_)); |
| 627 | } |
| 628 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 629 | void LayerTreeTest::PostSetNeedsRedrawToMainThread() { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 630 | main_task_runner_->PostTask(FROM_HERE, |
| 631 | base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw, |
| 632 | main_thread_weak_ptr_)); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 633 | } |
| 634 | |
prashant.n@samsung.com | 0023fc7 | 2014-01-10 20:05:06 | [diff] [blame] | 635 | void LayerTreeTest::PostSetNeedsRedrawRectToMainThread( |
| 636 | const gfx::Rect& damage_rect) { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 637 | main_task_runner_->PostTask( |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 638 | FROM_HERE, |
skaslev@chromium.org | 878705be | 2013-04-15 22:44:02 | [diff] [blame] | 639 | base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect, |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 640 | main_thread_weak_ptr_, |
| 641 | damage_rect)); |
skaslev@chromium.org | 878705be | 2013-04-15 22:44:02 | [diff] [blame] | 642 | } |
| 643 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 644 | void LayerTreeTest::PostSetVisibleToMainThread(bool visible) { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 645 | main_task_runner_->PostTask( |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 646 | FROM_HERE, |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 647 | base::Bind( |
| 648 | &LayerTreeTest::DispatchSetVisible, main_thread_weak_ptr_, visible)); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 649 | } |
| 650 | |
kbr@chromium.org | 7d08a935 | 2013-10-15 08:24:56 | [diff] [blame] | 651 | void LayerTreeTest::PostSetNextCommitForcesRedrawToMainThread() { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 652 | main_task_runner_->PostTask( |
kbr@chromium.org | 7d08a935 | 2013-10-15 08:24:56 | [diff] [blame] | 653 | FROM_HERE, |
| 654 | base::Bind(&LayerTreeTest::DispatchSetNextCommitForcesRedraw, |
| 655 | main_thread_weak_ptr_)); |
| 656 | } |
| 657 | |
enne | 69277cb | 2014-10-29 23:03:40 | [diff] [blame] | 658 | void LayerTreeTest::PostCompositeImmediatelyToMainThread() { |
| 659 | main_task_runner_->PostTask( |
| 660 | FROM_HERE, |
| 661 | base::Bind(&LayerTreeTest::DispatchCompositeImmediately, |
| 662 | main_thread_weak_ptr_)); |
| 663 | } |
| 664 | |
sievers@google.com | e96e343 | 2013-12-19 18:56:07 | [diff] [blame] | 665 | void LayerTreeTest::WillBeginTest() { |
sievers | 71c62dd5 | 2015-10-07 01:44:39 | [diff] [blame] | 666 | layer_tree_host_->SetVisible(true); |
sievers@google.com | e96e343 | 2013-12-19 18:56:07 | [diff] [blame] | 667 | } |
| 668 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 669 | void LayerTreeTest::DoBeginTest() { |
| 670 | client_ = LayerTreeHostClientForTesting::Create(this); |
| 671 | |
danakj | 6e3bf801 | 2014-12-16 18:27:53 | [diff] [blame] | 672 | scoped_ptr<FakeExternalBeginFrameSource> external_begin_frame_source; |
bajones | 27411061 | 2015-01-06 20:53:59 | [diff] [blame] | 673 | if (settings_.use_external_begin_frame_source) { |
danakj | 6e3bf801 | 2014-12-16 18:27:53 | [diff] [blame] | 674 | external_begin_frame_source.reset(new FakeExternalBeginFrameSource( |
jbauman | c5be44c | 2014-11-20 22:17:12 | [diff] [blame] | 675 | settings_.renderer_settings.refresh_rate)); |
simonhong | a7e3ac4 | 2014-11-11 20:50:22 | [diff] [blame] | 676 | external_begin_frame_source_ = external_begin_frame_source.get(); |
| 677 | } |
| 678 | |
skyostil | 0fd1dad | 2015-04-13 20:11:48 | [diff] [blame] | 679 | DCHECK(!impl_thread_ || impl_thread_->task_runner().get()); |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 680 | layer_tree_host_ = LayerTreeHostForTesting::Create( |
khushalsagar | 737153c | 2015-12-09 02:39:21 | [diff] [blame] | 681 | this, mode_, client_.get(), shared_bitmap_manager_.get(), |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 682 | gpu_memory_buffer_manager_.get(), task_graph_runner_.get(), settings_, |
skyostil | 0fd1dad | 2015-04-13 20:11:48 | [diff] [blame] | 683 | base::ThreadTaskRunnerHandle::Get(), |
| 684 | impl_thread_ ? impl_thread_->task_runner() : NULL, |
danakj | 78c30f0 | 2015-11-18 20:40:55 | [diff] [blame] | 685 | std::move(external_begin_frame_source)); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 686 | ASSERT_TRUE(layer_tree_host_); |
| 687 | |
| 688 | started_ = true; |
| 689 | beginning_ = true; |
| 690 | SetupTree(); |
sievers@google.com | e96e343 | 2013-12-19 18:56:07 | [diff] [blame] | 691 | WillBeginTest(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 692 | 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.org | e7e7ebd | 2014-01-16 00:11:11 | [diff] [blame] | 700 | static_cast<LayerTreeHostForTesting*>(layer_tree_host_.get()) |
| 701 | ->set_test_started(true); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 702 | } |
| 703 | } |
| 704 | |
| 705 | void LayerTreeTest::SetupTree() { |
| 706 | if (!layer_tree_host_->root_layer()) { |
loyso | a6edaaf | 2015-05-25 03:26:44 | [diff] [blame] | 707 | scoped_refptr<Layer> root_layer = Layer::Create(layer_settings_); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 708 | 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(); |
danakj | ddaec91 | 2015-09-25 19:38:40 | [diff] [blame] | 713 | gfx::Size device_root_bounds = gfx::ScaleToCeiledSize( |
| 714 | root_bounds, layer_tree_host_->device_scale_factor()); |
aelias@chromium.org | 18ce5970 | 2013-04-09 04:58:40 | [diff] [blame] | 715 | layer_tree_host_->SetViewportSize(device_root_bounds); |
jaydasika | d7dea63 | 2015-11-06 04:40:12 | [diff] [blame] | 716 | layer_tree_host_->root_layer()->SetIsDrawable(true); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 717 | } |
| 718 | |
| 719 | void LayerTreeTest::Timeout() { |
| 720 | timed_out_ = true; |
| 721 | EndTest(); |
| 722 | } |
| 723 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 724 | void LayerTreeTest::RealEndTest() { |
mithro | 51693e38 | 2015-05-07 23:52:41 | [diff] [blame] | 725 | // TODO(mithro): Make this method only end when not inside an impl frame. |
danakj@chromium.org | 4ea293f7 | 2014-08-13 03:03:17 | [diff] [blame] | 726 | if (layer_tree_host_ && !timed_out_ && |
| 727 | proxy()->MainFrameWillHappenForTesting()) { |
danakj@chromium.org | 7ac8dcb | 2013-10-31 09:58:38 | [diff] [blame] | 728 | main_task_runner_->PostTask( |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 729 | FROM_HERE, |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 730 | base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); |
| 731 | return; |
| 732 | } |
jamesr@chromium.org | bf691c2 | 2013-03-26 21:15:06 | [diff] [blame] | 733 | |
ki.stfu | 94337f4 | 2015-10-23 11:24:20 | [diff] [blame] | 734 | base::MessageLoop::current()->QuitWhenIdle(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 735 | } |
| 736 | |
ajuma@chromium.org | 40880faa | 2013-11-18 08:10:00 | [diff] [blame] | 737 | void LayerTreeTest::DispatchAddAnimation(Layer* layer_to_receive_animation, |
| 738 | double animation_duration) { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 739 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 740 | |
danakj@chromium.org | 3d9f743 | 2013-04-06 00:35:18 | [diff] [blame] | 741 | if (layer_to_receive_animation) { |
jamesr@chromium.org | e7e7ebd | 2014-01-16 00:11:11 | [diff] [blame] | 742 | AddOpacityTransitionToLayer( |
| 743 | layer_to_receive_animation, animation_duration, 0, 0.5, true); |
danakj@chromium.org | 3d9f743 | 2013-04-06 00:35:18 | [diff] [blame] | 744 | } |
simonhong | 1625b74 | 2015-01-29 23:02:39 | [diff] [blame] | 745 | } |
| 746 | |
loyso | d71ece8 | 2015-07-03 13:48:50 | [diff] [blame] | 747 | void LayerTreeTest::DispatchAddAnimationToPlayer( |
| 748 | AnimationPlayer* player_to_receive_animation, |
| 749 | double animation_duration) { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 750 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
loyso | d71ece8 | 2015-07-03 13:48:50 | [diff] [blame] | 751 | |
| 752 | if (player_to_receive_animation) { |
| 753 | AddOpacityTransitionToPlayer(player_to_receive_animation, |
| 754 | animation_duration, 0, 0.5, true); |
| 755 | } |
| 756 | } |
| 757 | |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 758 | void LayerTreeTest::DispatchSetDeferCommits(bool defer_commits) { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 759 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
simonhong | c6309f79 | 2015-01-31 15:47:15 | [diff] [blame] | 760 | |
| 761 | if (layer_tree_host_) |
| 762 | layer_tree_host_->SetDeferCommits(defer_commits); |
| 763 | } |
| 764 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 765 | void LayerTreeTest::DispatchSetNeedsCommit() { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 766 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 767 | |
| 768 | if (layer_tree_host_) |
| 769 | layer_tree_host_->SetNeedsCommit(); |
| 770 | } |
| 771 | |
miletus@chromium.org | b69c1db | 2013-11-27 00:05:19 | [diff] [blame] | 772 | void LayerTreeTest::DispatchSetNeedsUpdateLayers() { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 773 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
miletus@chromium.org | b69c1db | 2013-11-27 00:05:19 | [diff] [blame] | 774 | |
| 775 | if (layer_tree_host_) |
| 776 | layer_tree_host_->SetNeedsUpdateLayers(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 777 | } |
| 778 | |
| 779 | void LayerTreeTest::DispatchSetNeedsRedraw() { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 780 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 781 | |
| 782 | if (layer_tree_host_) |
| 783 | layer_tree_host_->SetNeedsRedraw(); |
| 784 | } |
| 785 | |
prashant.n@samsung.com | 0023fc7 | 2014-01-10 20:05:06 | [diff] [blame] | 786 | void LayerTreeTest::DispatchSetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 787 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
skaslev@chromium.org | 878705be | 2013-04-15 22:44:02 | [diff] [blame] | 788 | |
| 789 | if (layer_tree_host_) |
| 790 | layer_tree_host_->SetNeedsRedrawRect(damage_rect); |
| 791 | } |
| 792 | |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 793 | void LayerTreeTest::DispatchSetVisible(bool visible) { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 794 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
enne@chromium.org | aeeedad | 2014-08-22 18:16:22 | [diff] [blame] | 795 | if (layer_tree_host_) |
| 796 | layer_tree_host_->SetVisible(visible); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 797 | } |
| 798 | |
kbr@chromium.org | 7d08a935 | 2013-10-15 08:24:56 | [diff] [blame] | 799 | void LayerTreeTest::DispatchSetNextCommitForcesRedraw() { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 800 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
kbr@chromium.org | 7d08a935 | 2013-10-15 08:24:56 | [diff] [blame] | 801 | |
| 802 | if (layer_tree_host_) |
mark@chromium.org | 8b9e52b | 2014-01-17 16:35:31 | [diff] [blame] | 803 | layer_tree_host_->SetNextCommitForcesRedraw(); |
enne@chromium.org | 2decdd78 | 2014-08-13 22:36:06 | [diff] [blame] | 804 | } |
| 805 | |
enne | 69277cb | 2014-10-29 23:03:40 | [diff] [blame] | 806 | void LayerTreeTest::DispatchCompositeImmediately() { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 807 | DCHECK(!task_runner_provider() || task_runner_provider()->IsMainThread()); |
enne | 69277cb | 2014-10-29 23:03:40 | [diff] [blame] | 808 | if (layer_tree_host_) |
abhishek.ka | 7215854d | 2015-05-26 06:13:17 | [diff] [blame] | 809 | layer_tree_host_->Composite(base::TimeTicks::Now()); |
enne | 69277cb | 2014-10-29 23:03:40 | [diff] [blame] | 810 | } |
| 811 | |
khushalsagar | 737153c | 2015-12-09 02:39:21 | [diff] [blame] | 812 | void LayerTreeTest::RunTest(CompositorMode mode, bool delegating_renderer) { |
| 813 | mode_ = mode; |
| 814 | if (mode_ == CompositorMode::Threaded) { |
vollick@chromium.org | 8309341c | 2013-04-29 21:11:31 | [diff] [blame] | 815 | impl_thread_.reset(new base::Thread("Compositor")); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 816 | ASSERT_TRUE(impl_thread_->Start()); |
| 817 | } |
| 818 | |
skyostil | 0fd1dad | 2015-04-13 20:11:48 | [diff] [blame] | 819 | main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
danakj@chromium.org | 4145d17 | 2013-05-10 16:54:36 | [diff] [blame] | 820 | |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 821 | shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
| 822 | gpu_memory_buffer_manager_.reset(new TestGpuMemoryBufferManager); |
| 823 | task_graph_runner_.reset(new TestTaskGraphRunner); |
| 824 | |
danakj@chromium.org | 4145d17 | 2013-05-10 16:54:36 | [diff] [blame] | 825 | delegating_renderer_ = delegating_renderer; |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 826 | |
brianderson@chromium.org | 97e9ccd6 | 2014-04-12 01:07:15 | [diff] [blame] | 827 | // Spend less time waiting for BeginFrame because the output is |
brianderson@chromium.org | c8cbae7 | 2013-05-23 10:45:03 | [diff] [blame] | 828 | // mocked out. |
jbauman | c5be44c | 2014-11-20 22:17:12 | [diff] [blame] | 829 | settings_.renderer_settings.refresh_rate = 200.0; |
mithro | 719bf679 | 2014-11-10 15:36:47 | [diff] [blame] | 830 | settings_.background_animation_rate = 200.0; |
hendrikw | 3c8dfa2 | 2014-12-22 21:52:29 | [diff] [blame] | 831 | settings_.verify_property_trees = verify_property_trees_; |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 832 | InitializeSettings(&settings_); |
loyso | a6edaaf | 2015-05-25 03:26:44 | [diff] [blame] | 833 | InitializeLayerSettings(&layer_settings_); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 834 | |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 835 | main_task_runner_->PostTask( |
| 836 | FROM_HERE, |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 837 | base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this))); |
danakj@chromium.org | 4fc1b79 | 2013-03-26 08:58:57 | [diff] [blame] | 838 | |
| 839 | if (timeout_seconds_) { |
| 840 | timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this))); |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 841 | main_task_runner_->PostDelayedTask( |
| 842 | FROM_HERE, |
danakj@chromium.org | 4fc1b79 | 2013-03-26 08:58:57 | [diff] [blame] | 843 | timeout_.callback(), |
| 844 | base::TimeDelta::FromSeconds(timeout_seconds_)); |
| 845 | } |
| 846 | |
xhwang@chromium.org | 2811f31 | 2013-04-27 05:21:17 | [diff] [blame] | 847 | base::MessageLoop::current()->Run(); |
danakj@chromium.org | df17af5 | 2014-02-06 02:20:40 | [diff] [blame] | 848 | DestroyLayerTreeHost(); |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 849 | |
| 850 | timeout_.Cancel(); |
| 851 | |
| 852 | ASSERT_FALSE(layer_tree_host_.get()); |
danakj | f446a07 | 2014-09-27 21:55:48 | [diff] [blame] | 853 | client_ = nullptr; |
danakj@chromium.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 854 | if (timed_out_) { |
| 855 | FAIL() << "Test timed out"; |
| 856 | return; |
| 857 | } |
| 858 | AfterTest(); |
clholgat@chromium.org | c0f7a7f | 2013-10-15 21:33:56 | [diff] [blame] | 859 | } |
| 860 | |
enne | 7f8fdde | 2014-12-10 21:32:09 | [diff] [blame] | 861 | void LayerTreeTest::RequestNewOutputSurface() { |
| 862 | layer_tree_host_->SetOutputSurface(CreateOutputSurface()); |
enne | 2097cab | 2014-09-25 20:16:31 | [diff] [blame] | 863 | } |
| 864 | |
enne | 7f8fdde | 2014-12-10 21:32:09 | [diff] [blame] | 865 | scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface() { |
| 866 | scoped_ptr<FakeOutputSurface> output_surface = CreateFakeOutputSurface(); |
| 867 | DCHECK_EQ(delegating_renderer_, |
| 868 | output_surface->capabilities().delegated_rendering); |
brianderson@chromium.org | 049fc7a | 2013-06-18 12:32:35 | [diff] [blame] | 869 | output_surface_ = output_surface.get(); |
simonhong | a7e3ac4 | 2014-11-11 20:50:22 | [diff] [blame] | 870 | |
bajones | 27411061 | 2015-01-06 20:53:59 | [diff] [blame] | 871 | if (settings_.use_external_begin_frame_source) { |
simonhong | a7e3ac4 | 2014-11-11 20:50:22 | [diff] [blame] | 872 | DCHECK(external_begin_frame_source_); |
| 873 | DCHECK(external_begin_frame_source_->is_ready()); |
| 874 | } |
danakj | 78c30f0 | 2015-11-18 20:40:55 | [diff] [blame] | 875 | return std::move(output_surface); |
jamesr@chromium.org | e7e7ebd | 2014-01-16 00:11:11 | [diff] [blame] | 876 | } |
| 877 | |
enne | 7f8fdde | 2014-12-10 21:32:09 | [diff] [blame] | 878 | scoped_ptr<FakeOutputSurface> LayerTreeTest::CreateFakeOutputSurface() { |
jamesr@chromium.org | e7e7ebd | 2014-01-16 00:11:11 | [diff] [blame] | 879 | if (delegating_renderer_) |
| 880 | return FakeOutputSurface::CreateDelegating3d(); |
| 881 | else |
| 882 | return FakeOutputSurface::Create3d(); |
danakj@chromium.org | 4145d17 | 2013-05-10 16:54:36 | [diff] [blame] | 883 | } |
| 884 | |
jamesr@chromium.org | e7e7ebd | 2014-01-16 00:11:11 | [diff] [blame] | 885 | TestWebGraphicsContext3D* LayerTreeTest::TestContext() { |
dcheng | 6afa1700 | 2014-08-26 19:11:31 | [diff] [blame] | 886 | return static_cast<TestContextProvider*>(output_surface_->context_provider()) |
| 887 | ->TestContext3d(); |
jamesr@chromium.org | e7e7ebd | 2014-01-16 00:11:11 | [diff] [blame] | 888 | } |
| 889 | |
enne@chromium.org | 98ea818e | 2014-01-24 10:22:08 | [diff] [blame] | 890 | int 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.org | df17af5 | 2014-02-06 02:20:40 | [diff] [blame] | 900 | void LayerTreeTest::DestroyLayerTreeHost() { |
| 901 | if (layer_tree_host_ && layer_tree_host_->root_layer()) |
| 902 | layer_tree_host_->root_layer()->SetLayerTreeHost(NULL); |
danakj | f446a07 | 2014-09-27 21:55:48 | [diff] [blame] | 903 | layer_tree_host_ = nullptr; |
danakj@chromium.org | df17af5 | 2014-02-06 02:20:40 | [diff] [blame] | 904 | } |
| 905 | |
ericrk | 4e3aa5a | 2015-12-01 03:53:56 | [diff] [blame] | 906 | TaskGraphRunner* LayerTreeTest::task_graph_runner() const { |
| 907 | return task_graph_runner_.get(); |
| 908 | } |
| 909 | |
vollick | 1aa8491 | 2015-03-19 18:49:09 | [diff] [blame] | 910 | LayerTreeHost* LayerTreeTest::layer_tree_host() { |
khushalsagar | b7db1fe | 2015-11-12 00:51:27 | [diff] [blame] | 911 | // 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()); |
vollick | 1aa8491 | 2015-03-19 18:49:09 | [diff] [blame] | 918 | return layer_tree_host_.get(); |
| 919 | } |
| 920 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame^] | 921 | ProxyMainForTest* LayerTreeTest::GetProxyMainForTest() const { |
| 922 | DCHECK(HasImplThread()); |
| 923 | return static_cast<ProxyMainForTest*>(proxy()); |
| 924 | } |
| 925 | |
| 926 | ProxyImplForTest* 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.org | e216fef0 | 2013-03-20 22:56:10 | [diff] [blame] | 938 | } // namespace cc |