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_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <map> | 9 #include <map> |
10 | 10 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 paint_time_counter_(PaintTimeCounter::Create()), | 211 paint_time_counter_(PaintTimeCounter::Create()), |
212 memory_history_(MemoryHistory::Create()), | 212 memory_history_(MemoryHistory::Create()), |
213 debug_rect_history_(DebugRectHistory::Create()), | 213 debug_rect_history_(DebugRectHistory::Create()), |
214 texture_mailbox_deleter_(new TextureMailboxDeleter( | 214 texture_mailbox_deleter_(new TextureMailboxDeleter( |
215 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 215 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
216 : proxy_->MainThreadTaskRunner())), | 216 : proxy_->MainThreadTaskRunner())), |
217 max_memory_needed_bytes_(0), | 217 max_memory_needed_bytes_(0), |
218 device_scale_factor_(1.f), | 218 device_scale_factor_(1.f), |
219 resourceless_software_draw_(false), | 219 resourceless_software_draw_(false), |
220 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), | 220 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), |
221 animation_registrar_(AnimationRegistrar::Create()), | |
222 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 221 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
223 micro_benchmark_controller_(this), | 222 micro_benchmark_controller_(this), |
224 shared_bitmap_manager_(shared_bitmap_manager), | 223 shared_bitmap_manager_(shared_bitmap_manager), |
225 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 224 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
226 task_graph_runner_(task_graph_runner), | 225 task_graph_runner_(task_graph_runner), |
227 id_(id), | 226 id_(id), |
228 requires_high_res_to_draw_(false), | 227 requires_high_res_to_draw_(false), |
229 is_likely_to_require_a_draw_(false), | 228 is_likely_to_require_a_draw_(false), |
230 frame_timing_tracker_(FrameTimingTracker::Create()) { | 229 frame_timing_tracker_(FrameTimingTracker::Create()) { |
231 if (settings.use_compositor_animation_timelines) { | 230 if (settings.use_compositor_animation_timelines) { |
232 animation_host_ = AnimationHost::Create(true); | 231 animation_host_ = AnimationHost::Create(true); |
233 animation_host_->SetLayerTreeMutatorsClient(this); | 232 animation_host_->SetLayerTreeMutatorsClient(this); |
| 233 animation_host_->SetSupportsScrollAnimations( |
| 234 proxy_->SupportsImplScrolling()); |
| 235 } else { |
| 236 animation_registrar_ = AnimationRegistrar::Create(); |
| 237 animation_registrar_->set_supports_scroll_animations( |
| 238 proxy_->SupportsImplScrolling()); |
234 } | 239 } |
235 | 240 |
236 DCHECK(proxy_->IsImplThread()); | 241 DCHECK(proxy_->IsImplThread()); |
237 DidVisibilityChange(this, visible_); | 242 DidVisibilityChange(this, visible_); |
238 animation_registrar_->set_supports_scroll_animations( | |
239 proxy_->SupportsImplScrolling()); | |
240 | 243 |
241 SetDebugState(settings.initial_debug_state); | 244 SetDebugState(settings.initial_debug_state); |
242 | 245 |
243 // LTHI always has an active tree. | 246 // LTHI always has an active tree. |
244 active_tree_ = | 247 active_tree_ = |
245 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), | 248 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), |
246 new SyncedTopControls, new SyncedElasticOverscroll); | 249 new SyncedTopControls, new SyncedElasticOverscroll); |
247 | 250 |
248 viewport_ = Viewport::Create(this); | 251 viewport_ = Viewport::Create(this); |
249 | 252 |
(...skipping 23 matching lines...) Expand all Loading... |
273 // made a contract with our animation controllers that the registrar | 276 // made a contract with our animation controllers that the registrar |
274 // will outlive them, and we must make good. | 277 // will outlive them, and we must make good. |
275 if (recycle_tree_) | 278 if (recycle_tree_) |
276 recycle_tree_->Shutdown(); | 279 recycle_tree_->Shutdown(); |
277 if (pending_tree_) | 280 if (pending_tree_) |
278 pending_tree_->Shutdown(); | 281 pending_tree_->Shutdown(); |
279 active_tree_->Shutdown(); | 282 active_tree_->Shutdown(); |
280 recycle_tree_ = nullptr; | 283 recycle_tree_ = nullptr; |
281 pending_tree_ = nullptr; | 284 pending_tree_ = nullptr; |
282 active_tree_ = nullptr; | 285 active_tree_ = nullptr; |
| 286 |
| 287 if (animation_host_) { |
| 288 animation_host_->ClearTimelines(); |
| 289 animation_host_->SetLayerTreeMutatorsClient(nullptr); |
| 290 } |
| 291 |
283 DestroyTileManager(); | 292 DestroyTileManager(); |
284 } | 293 } |
285 | 294 |
286 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { | 295 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { |
287 // If the begin frame data was handled, then scroll and scale set was applied | 296 // If the begin frame data was handled, then scroll and scale set was applied |
288 // by the main thread, so the active tree needs to be updated as if these sent | 297 // by the main thread, so the active tree needs to be updated as if these sent |
289 // values were applied and committed. | 298 // values were applied and committed. |
290 if (CommitEarlyOutHandledCommit(reason)) { | 299 if (CommitEarlyOutHandledCommit(reason)) { |
291 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); | 300 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); |
292 active_tree_->ResetContentsTexturesPurged(); | 301 active_tree_->ResetContentsTexturesPurged(); |
(...skipping 1263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 // contents of its texture are updated as the last thing before the frame is | 1565 // contents of its texture are updated as the last thing before the frame is |
1557 // drawn. | 1566 // drawn. |
1558 if (active_tree_->hud_layer()) { | 1567 if (active_tree_->hud_layer()) { |
1559 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); | 1568 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); |
1560 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, | 1569 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, |
1561 resource_provider_.get()); | 1570 resource_provider_.get()); |
1562 } | 1571 } |
1563 | 1572 |
1564 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { | 1573 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { |
1565 bool disable_picture_quad_image_filtering = | 1574 bool disable_picture_quad_image_filtering = |
1566 IsActivelyScrolling() || animation_registrar_->needs_animate_layers(); | 1575 IsActivelyScrolling() || |
| 1576 (animation_host_ ? animation_host_->NeedsAnimateLayers() |
| 1577 : animation_registrar_->needs_animate_layers()); |
1567 | 1578 |
1568 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1579 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
1569 SoftwareRenderer::Create(this, &settings_.renderer_settings, | 1580 SoftwareRenderer::Create(this, &settings_.renderer_settings, |
1570 output_surface_.get(), NULL); | 1581 output_surface_.get(), NULL); |
1571 temp_software_renderer->DrawFrame(&frame->render_passes, | 1582 temp_software_renderer->DrawFrame(&frame->render_passes, |
1572 device_scale_factor_, | 1583 device_scale_factor_, |
1573 DeviceViewport(), | 1584 DeviceViewport(), |
1574 DeviceClip(), | 1585 DeviceClip(), |
1575 disable_picture_quad_image_filtering); | 1586 disable_picture_quad_image_filtering); |
1576 } else { | 1587 } else { |
(...skipping 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3029 for (auto& it : controllers_copy) | 3040 for (auto& it : controllers_copy) |
3030 it->Animate(monotonic_time); | 3041 it->Animate(monotonic_time); |
3031 | 3042 |
3032 SetNeedsAnimate(); | 3043 SetNeedsAnimate(); |
3033 } | 3044 } |
3034 | 3045 |
3035 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { | 3046 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { |
3036 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) | 3047 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
3037 return; | 3048 return; |
3038 | 3049 |
3039 if (animation_registrar_->AnimateLayers(monotonic_time)) | 3050 if (animation_host_) { |
3040 SetNeedsAnimate(); | 3051 if (animation_host_->AnimateLayers(monotonic_time)) |
| 3052 SetNeedsAnimate(); |
| 3053 } else { |
| 3054 if (animation_registrar_->AnimateLayers(monotonic_time)) |
| 3055 SetNeedsAnimate(); |
| 3056 } |
3041 } | 3057 } |
3042 | 3058 |
3043 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { | 3059 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { |
3044 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) | 3060 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
3045 return; | 3061 return; |
3046 | 3062 |
3047 scoped_ptr<AnimationEventsVector> events = | 3063 bool has_active_animations = false; |
3048 animation_registrar_->CreateEvents(); | 3064 scoped_ptr<AnimationEventsVector> events; |
3049 const bool has_active_animations = animation_registrar_->UpdateAnimationState( | 3065 |
3050 start_ready_animations, events.get()); | 3066 if (animation_host_) { |
| 3067 events = animation_host_->CreateEvents(); |
| 3068 has_active_animations = animation_host_->UpdateAnimationState( |
| 3069 start_ready_animations, events.get()); |
| 3070 } else { |
| 3071 events = animation_registrar_->CreateEvents(); |
| 3072 has_active_animations = animation_registrar_->UpdateAnimationState( |
| 3073 start_ready_animations, events.get()); |
| 3074 } |
3051 | 3075 |
3052 if (!events->empty()) | 3076 if (!events->empty()) |
3053 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); | 3077 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); |
3054 | 3078 |
3055 if (has_active_animations) | 3079 if (has_active_animations) |
3056 SetNeedsAnimate(); | 3080 SetNeedsAnimate(); |
3057 } | 3081 } |
3058 | 3082 |
3059 void LayerTreeHostImpl::ActivateAnimations() { | 3083 void LayerTreeHostImpl::ActivateAnimations() { |
3060 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) | 3084 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
3061 return; | 3085 return; |
3062 | 3086 |
3063 if (animation_registrar_->ActivateAnimations()) | 3087 if (animation_host_) { |
3064 SetNeedsAnimate(); | 3088 if (animation_host_->ActivateAnimations()) |
| 3089 SetNeedsAnimate(); |
| 3090 } else { |
| 3091 if (animation_registrar_->ActivateAnimations()) |
| 3092 SetNeedsAnimate(); |
| 3093 } |
3065 } | 3094 } |
3066 | 3095 |
3067 std::string LayerTreeHostImpl::LayerTreeAsJson() const { | 3096 std::string LayerTreeHostImpl::LayerTreeAsJson() const { |
3068 std::string str; | 3097 std::string str; |
3069 if (active_tree_->root_layer()) { | 3098 if (active_tree_->root_layer()) { |
3070 scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); | 3099 scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); |
3071 base::JSONWriter::WriteWithOptions( | 3100 base::JSONWriter::WriteWithOptions( |
3072 json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); | 3101 json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); |
3073 } | 3102 } |
3074 return str; | 3103 return str; |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3489 const gfx::ScrollOffset& scroll_offset) { | 3518 const gfx::ScrollOffset& scroll_offset) { |
3490 if (affects_active_tree) { | 3519 if (affects_active_tree) { |
3491 SetTreeLayerScrollOffsetMutated(layer_id, active_tree(), scroll_offset); | 3520 SetTreeLayerScrollOffsetMutated(layer_id, active_tree(), scroll_offset); |
3492 } else { | 3521 } else { |
3493 SetTreeLayerScrollOffsetMutated(layer_id, pending_tree(), scroll_offset); | 3522 SetTreeLayerScrollOffsetMutated(layer_id, pending_tree(), scroll_offset); |
3494 SetTreeLayerScrollOffsetMutated(layer_id, recycle_tree(), scroll_offset); | 3523 SetTreeLayerScrollOffsetMutated(layer_id, recycle_tree(), scroll_offset); |
3495 } | 3524 } |
3496 } | 3525 } |
3497 | 3526 |
3498 } // namespace cc | 3527 } // namespace cc |
OLD | NEW |