| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <stack> | 8 #include <stack> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/atomic_sequence_num.h" | 11 #include "base/atomic_sequence_num.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
| 16 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
| 17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
| 18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/thread_task_runner_handle.h" | 19 #include "base/thread_task_runner_handle.h" |
| 20 #include "base/trace_event/trace_event.h" | 20 #include "base/trace_event/trace_event.h" |
| 21 #include "base/trace_event/trace_event_argument.h" | 21 #include "base/trace_event/trace_event_argument.h" |
| 22 #include "cc/animation/animation_host.h" | 22 #include "cc/animation/animation_host.h" |
| 23 #include "cc/animation/animation_registrar.h" | |
| 24 #include "cc/animation/layer_animation_controller.h" | |
| 25 #include "cc/base/math_util.h" | 23 #include "cc/base/math_util.h" |
| 26 #include "cc/debug/devtools_instrumentation.h" | 24 #include "cc/debug/devtools_instrumentation.h" |
| 27 #include "cc/debug/frame_viewer_instrumentation.h" | 25 #include "cc/debug/frame_viewer_instrumentation.h" |
| 28 #include "cc/debug/rendering_stats_instrumentation.h" | 26 #include "cc/debug/rendering_stats_instrumentation.h" |
| 29 #include "cc/input/layer_selection_bound.h" | 27 #include "cc/input/layer_selection_bound.h" |
| 30 #include "cc/input/page_scale_animation.h" | 28 #include "cc/input/page_scale_animation.h" |
| 31 #include "cc/input/top_controls_manager.h" | 29 #include "cc/input/top_controls_manager.h" |
| 32 #include "cc/layers/heads_up_display_layer.h" | 30 #include "cc/layers/heads_up_display_layer.h" |
| 33 #include "cc/layers/heads_up_display_layer_impl.h" | 31 #include "cc/layers/heads_up_display_layer_impl.h" |
| 34 #include "cc/layers/layer.h" | 32 #include "cc/layers/layer.h" |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 partial_texture_update_requests_(0), | 123 partial_texture_update_requests_(0), |
| 126 did_complete_scale_animation_(false), | 124 did_complete_scale_animation_(false), |
| 127 in_paint_layer_contents_(false), | 125 in_paint_layer_contents_(false), |
| 128 id_(s_layer_tree_host_sequence_number.GetNext() + 1), | 126 id_(s_layer_tree_host_sequence_number.GetNext() + 1), |
| 129 next_commit_forces_redraw_(false), | 127 next_commit_forces_redraw_(false), |
| 130 shared_bitmap_manager_(shared_bitmap_manager), | 128 shared_bitmap_manager_(shared_bitmap_manager), |
| 131 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 129 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 132 task_graph_runner_(task_graph_runner), | 130 task_graph_runner_(task_graph_runner), |
| 133 surface_id_namespace_(0u), | 131 surface_id_namespace_(0u), |
| 134 next_surface_sequence_(1u) { | 132 next_surface_sequence_(1u) { |
| 135 if (settings_.accelerated_animation_enabled && | |
| 136 !settings.use_compositor_animation_timelines) | |
| 137 animation_registrar_ = AnimationRegistrar::Create(); | |
| 138 rendering_stats_instrumentation_->set_record_rendering_stats( | 133 rendering_stats_instrumentation_->set_record_rendering_stats( |
| 139 debug_state_.RecordRenderingStats()); | 134 debug_state_.RecordRenderingStats()); |
| 140 | 135 |
| 141 if (settings_.use_compositor_animation_timelines) { | 136 animation_host_ = AnimationHost::Create(false); |
| 142 animation_host_ = AnimationHost::Create(false); | 137 animation_host_->SetLayerTreeMutatorsClient(this); |
| 143 animation_host_->SetLayerTreeMutatorsClient(this); | |
| 144 } | |
| 145 } | 138 } |
| 146 | 139 |
| 147 void LayerTreeHost::InitializeThreaded( | 140 void LayerTreeHost::InitializeThreaded( |
| 148 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 141 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 149 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | 142 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
| 150 scoped_ptr<BeginFrameSource> external_begin_frame_source) { | 143 scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
| 151 InitializeProxy(ThreadProxy::Create(this, | 144 InitializeProxy(ThreadProxy::Create(this, |
| 152 main_task_runner, | 145 main_task_runner, |
| 153 impl_task_runner, | 146 impl_task_runner, |
| 154 external_begin_frame_source.Pass())); | 147 external_begin_frame_source.Pass())); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 168 void LayerTreeHost::InitializeForTesting(scoped_ptr<Proxy> proxy_for_testing) { | 161 void LayerTreeHost::InitializeForTesting(scoped_ptr<Proxy> proxy_for_testing) { |
| 169 InitializeProxy(proxy_for_testing.Pass()); | 162 InitializeProxy(proxy_for_testing.Pass()); |
| 170 } | 163 } |
| 171 | 164 |
| 172 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { | 165 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { |
| 173 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); | 166 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); |
| 174 | 167 |
| 175 proxy_ = proxy.Pass(); | 168 proxy_ = proxy.Pass(); |
| 176 proxy_->Start(); | 169 proxy_->Start(); |
| 177 if (settings_.accelerated_animation_enabled) { | 170 if (settings_.accelerated_animation_enabled) { |
| 178 if (animation_registrar_) | 171 animation_host_->SetSupportsScrollAnimations( |
| 179 animation_registrar_->set_supports_scroll_animations( | 172 proxy_->SupportsImplScrolling()); |
| 180 proxy_->SupportsImplScrolling()); | |
| 181 | |
| 182 if (animation_host_) | |
| 183 animation_host_->SetSupportsScrollAnimations( | |
| 184 proxy_->SupportsImplScrolling()); | |
| 185 } | 173 } |
| 186 } | 174 } |
| 187 | 175 |
| 188 LayerTreeHost::~LayerTreeHost() { | 176 LayerTreeHost::~LayerTreeHost() { |
| 189 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); | 177 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); |
| 190 | 178 |
| 191 if (animation_host_) | 179 if (animation_host_) |
| 192 animation_host_->SetLayerTreeMutatorsClient(nullptr); | 180 animation_host_->SetLayerTreeMutatorsClient(nullptr); |
| 193 | 181 |
| 194 if (root_layer_.get()) | 182 if (root_layer_.get()) |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 proxy_->SetNextCommitWaitsForActivation(); | 546 proxy_->SetNextCommitWaitsForActivation(); |
| 559 } | 547 } |
| 560 | 548 |
| 561 void LayerTreeHost::SetNextCommitForcesRedraw() { | 549 void LayerTreeHost::SetNextCommitForcesRedraw() { |
| 562 next_commit_forces_redraw_ = true; | 550 next_commit_forces_redraw_ = true; |
| 563 } | 551 } |
| 564 | 552 |
| 565 void LayerTreeHost::SetAnimationEvents( | 553 void LayerTreeHost::SetAnimationEvents( |
| 566 scoped_ptr<AnimationEventsVector> events) { | 554 scoped_ptr<AnimationEventsVector> events) { |
| 567 DCHECK(proxy_->IsMainThread()); | 555 DCHECK(proxy_->IsMainThread()); |
| 568 if (animation_host_) | 556 animation_host_->SetAnimationEvents(events.Pass()); |
| 569 animation_host_->SetAnimationEvents(events.Pass()); | |
| 570 else | |
| 571 animation_registrar_->SetAnimationEvents(events.Pass()); | |
| 572 } | 557 } |
| 573 | 558 |
| 574 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { | 559 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { |
| 575 if (root_layer_.get() == root_layer.get()) | 560 if (root_layer_.get() == root_layer.get()) |
| 576 return; | 561 return; |
| 577 | 562 |
| 578 if (root_layer_.get()) | 563 if (root_layer_.get()) |
| 579 root_layer_->SetLayerTreeHost(NULL); | 564 root_layer_->SetLayerTreeHost(NULL); |
| 580 root_layer_ = root_layer; | 565 root_layer_ = root_layer; |
| 581 if (root_layer_.get()) { | 566 if (root_layer_.get()) { |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1166 constraints, | 1151 constraints, |
| 1167 current, | 1152 current, |
| 1168 animate)); | 1153 animate)); |
| 1169 } | 1154 } |
| 1170 | 1155 |
| 1171 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { | 1156 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { |
| 1172 if (!settings_.accelerated_animation_enabled) | 1157 if (!settings_.accelerated_animation_enabled) |
| 1173 return; | 1158 return; |
| 1174 | 1159 |
| 1175 AnimationEventsVector events; | 1160 AnimationEventsVector events; |
| 1176 if (animation_host_) { | 1161 if (animation_host_->AnimateLayers(monotonic_time)) |
| 1177 if (animation_host_->AnimateLayers(monotonic_time)) | 1162 animation_host_->UpdateAnimationState(true, &events); |
| 1178 animation_host_->UpdateAnimationState(true, &events); | |
| 1179 } else if (animation_registrar_) { | |
| 1180 if (animation_registrar_->AnimateLayers(monotonic_time)) | |
| 1181 animation_registrar_->UpdateAnimationState(true, &events); | |
| 1182 } | |
| 1183 | 1163 |
| 1184 if (!events.empty()) | 1164 if (!events.empty()) |
| 1185 property_trees_.needs_rebuild = true; | 1165 property_trees_.needs_rebuild = true; |
| 1186 } | 1166 } |
| 1187 | 1167 |
| 1188 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { | 1168 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { |
| 1189 DCHECK(client); | 1169 DCHECK(client); |
| 1190 | 1170 |
| 1191 UIResourceId next_id = next_ui_resource_id_++; | 1171 UIResourceId next_id = next_ui_resource_id_++; |
| 1192 DCHECK(ui_resource_client_map_.find(next_id) == | 1172 DCHECK(ui_resource_client_map_.find(next_id) == |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1346 return false; | 1326 return false; |
| 1347 } | 1327 } |
| 1348 | 1328 |
| 1349 void LayerTreeHost::SetMutatorsNeedCommit() { | 1329 void LayerTreeHost::SetMutatorsNeedCommit() { |
| 1350 SetNeedsCommit(); | 1330 SetNeedsCommit(); |
| 1351 } | 1331 } |
| 1352 | 1332 |
| 1353 void LayerTreeHost::SetLayerFilterMutated(int layer_id, | 1333 void LayerTreeHost::SetLayerFilterMutated(int layer_id, |
| 1354 bool active_tree, | 1334 bool active_tree, |
| 1355 const FilterOperations& filters) { | 1335 const FilterOperations& filters) { |
| 1356 LayerAnimationValueObserver* layer = LayerById(layer_id); | 1336 Layer* layer = LayerById(layer_id); |
| 1357 DCHECK(layer); | 1337 DCHECK(layer); |
| 1358 layer->OnFilterAnimated(filters); | 1338 layer->OnFilterAnimated(filters); |
| 1359 } | 1339 } |
| 1360 | 1340 |
| 1361 void LayerTreeHost::SetLayerOpacityMutated(int layer_id, | 1341 void LayerTreeHost::SetLayerOpacityMutated(int layer_id, |
| 1362 bool active_tree, | 1342 bool active_tree, |
| 1363 float opacity) { | 1343 float opacity) { |
| 1364 LayerAnimationValueObserver* layer = LayerById(layer_id); | 1344 Layer* layer = LayerById(layer_id); |
| 1365 DCHECK(layer); | 1345 DCHECK(layer); |
| 1366 layer->OnOpacityAnimated(opacity); | 1346 layer->OnOpacityAnimated(opacity); |
| 1367 } | 1347 } |
| 1368 | 1348 |
| 1369 void LayerTreeHost::SetLayerTransformMutated(int layer_id, | 1349 void LayerTreeHost::SetLayerTransformMutated(int layer_id, |
| 1370 bool active_tree, | 1350 bool active_tree, |
| 1371 const gfx::Transform& transform) { | 1351 const gfx::Transform& transform) { |
| 1372 LayerAnimationValueObserver* layer = LayerById(layer_id); | 1352 Layer* layer = LayerById(layer_id); |
| 1373 DCHECK(layer); | 1353 DCHECK(layer); |
| 1374 layer->OnTransformAnimated(transform); | 1354 layer->OnTransformAnimated(transform); |
| 1375 } | 1355 } |
| 1376 | 1356 |
| 1377 void LayerTreeHost::SetLayerScrollOffsetMutated( | 1357 void LayerTreeHost::SetLayerScrollOffsetMutated( |
| 1378 int layer_id, | 1358 int layer_id, |
| 1379 bool active_tree, | 1359 bool active_tree, |
| 1380 const gfx::ScrollOffset& scroll_offset) { | 1360 const gfx::ScrollOffset& scroll_offset) { |
| 1381 LayerAnimationValueObserver* layer = LayerById(layer_id); | 1361 // Do nothing. Scroll deltas will be sent from the compositor thread back |
| 1382 DCHECK(layer); | 1362 // to the main thread in the same manner as during non-animated |
| 1383 layer->OnScrollOffsetAnimated(scroll_offset); | 1363 // compositor-driven scrolling. |
| 1384 } | 1364 } |
| 1385 | 1365 |
| 1386 gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation( | 1366 gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation( |
| 1387 int layer_id) const { | 1367 int layer_id) const { |
| 1388 LayerAnimationValueProvider* layer = LayerById(layer_id); | 1368 Layer* layer = LayerById(layer_id); |
| 1389 DCHECK(layer); | 1369 DCHECK(layer); |
| 1390 return layer->ScrollOffsetForAnimation(); | 1370 return layer->ScrollOffsetForAnimation(); |
| 1391 } | 1371 } |
| 1392 | 1372 |
| 1393 bool LayerTreeHost::ScrollOffsetAnimationWasInterrupted( | 1373 bool LayerTreeHost::ScrollOffsetAnimationWasInterrupted( |
| 1394 const Layer* layer) const { | 1374 const Layer* layer) const { |
| 1395 return animation_host_ | 1375 return animation_host_->ScrollOffsetAnimationWasInterrupted(layer->id()); |
| 1396 ? animation_host_->ScrollOffsetAnimationWasInterrupted(layer->id()) | |
| 1397 : false; | |
| 1398 } | 1376 } |
| 1399 | 1377 |
| 1400 bool LayerTreeHost::IsAnimatingFilterProperty(const Layer* layer) const { | 1378 bool LayerTreeHost::IsAnimatingFilterProperty(const Layer* layer) const { |
| 1401 return animation_host_ | 1379 return animation_host_->IsAnimatingFilterProperty(layer->id()); |
| 1402 ? animation_host_->IsAnimatingFilterProperty(layer->id()) | |
| 1403 : false; | |
| 1404 } | 1380 } |
| 1405 | 1381 |
| 1406 bool LayerTreeHost::IsAnimatingOpacityProperty(const Layer* layer) const { | 1382 bool LayerTreeHost::IsAnimatingOpacityProperty(const Layer* layer) const { |
| 1407 return animation_host_ | 1383 return animation_host_->IsAnimatingOpacityProperty(layer->id()); |
| 1408 ? animation_host_->IsAnimatingOpacityProperty(layer->id()) | |
| 1409 : false; | |
| 1410 } | 1384 } |
| 1411 | 1385 |
| 1412 bool LayerTreeHost::IsAnimatingTransformProperty(const Layer* layer) const { | 1386 bool LayerTreeHost::IsAnimatingTransformProperty(const Layer* layer) const { |
| 1413 return animation_host_ | 1387 return animation_host_->IsAnimatingTransformProperty(layer->id()); |
| 1414 ? animation_host_->IsAnimatingTransformProperty(layer->id()) | |
| 1415 : false; | |
| 1416 } | 1388 } |
| 1417 | 1389 |
| 1418 bool LayerTreeHost::HasPotentiallyRunningOpacityAnimation( | 1390 bool LayerTreeHost::HasPotentiallyRunningOpacityAnimation( |
| 1419 const Layer* layer) const { | 1391 const Layer* layer) const { |
| 1420 return animation_host_ | 1392 return animation_host_->HasPotentiallyRunningOpacityAnimation(layer->id()); |
| 1421 ? animation_host_->HasPotentiallyRunningOpacityAnimation( | |
| 1422 layer->id()) | |
| 1423 : false; | |
| 1424 } | 1393 } |
| 1425 | 1394 |
| 1426 bool LayerTreeHost::HasPotentiallyRunningTransformAnimation( | 1395 bool LayerTreeHost::HasPotentiallyRunningTransformAnimation( |
| 1427 const Layer* layer) const { | 1396 const Layer* layer) const { |
| 1428 return animation_host_ | 1397 return animation_host_->HasPotentiallyRunningTransformAnimation(layer->id()); |
| 1429 ? animation_host_->HasPotentiallyRunningTransformAnimation( | |
| 1430 layer->id()) | |
| 1431 : false; | |
| 1432 } | 1398 } |
| 1433 | 1399 |
| 1434 bool LayerTreeHost::AnimationsPreserveAxisAlignment(const Layer* layer) const { | 1400 bool LayerTreeHost::AnimationsPreserveAxisAlignment(const Layer* layer) const { |
| 1435 return animation_host_ | 1401 return animation_host_->AnimationsPreserveAxisAlignment(layer->id()); |
| 1436 ? animation_host_->AnimationsPreserveAxisAlignment(layer->id()) | |
| 1437 : true; | |
| 1438 } | 1402 } |
| 1439 | 1403 |
| 1440 bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { | 1404 bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { |
| 1441 return animation_host_ ? animation_host_->HasAnyAnimation(layer->id()) | 1405 return animation_host_->HasAnyAnimation(layer->id()); |
| 1442 : false; | |
| 1443 } | 1406 } |
| 1444 | 1407 |
| 1445 bool LayerTreeHost::HasActiveAnimation(const Layer* layer) const { | 1408 bool LayerTreeHost::HasActiveAnimation(const Layer* layer) const { |
| 1446 return animation_host_ ? animation_host_->HasActiveAnimation(layer->id()) | 1409 return animation_host_->HasActiveAnimation(layer->id()); |
| 1447 : false; | |
| 1448 } | 1410 } |
| 1449 | 1411 |
| 1450 } // namespace cc | 1412 } // namespace cc |
| OLD | NEW |