| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 #include "ui/gfx/geometry/vector2d_conversions.h" | 94 #include "ui/gfx/geometry/vector2d_conversions.h" |
| 95 | 95 |
| 96 namespace cc { | 96 namespace cc { |
| 97 namespace { | 97 namespace { |
| 98 | 98 |
| 99 // Small helper class that saves the current viewport location as the user sees | 99 // Small helper class that saves the current viewport location as the user sees |
| 100 // it and resets to the same location. | 100 // it and resets to the same location. |
| 101 class ViewportAnchor { | 101 class ViewportAnchor { |
| 102 public: | 102 public: |
| 103 ViewportAnchor(LayerImpl* inner_scroll, LayerImpl* outer_scroll) | 103 ViewportAnchor(LayerImpl* inner_scroll, LayerImpl* outer_scroll) |
| 104 : inner_(inner_scroll), | 104 : inner_(inner_scroll), outer_(outer_scroll) { |
| 105 outer_(outer_scroll) { | |
| 106 viewport_in_content_coordinates_ = inner_->CurrentScrollOffset(); | 105 viewport_in_content_coordinates_ = inner_->CurrentScrollOffset(); |
| 107 | 106 |
| 108 if (outer_) | 107 if (outer_) |
| 109 viewport_in_content_coordinates_ += outer_->CurrentScrollOffset(); | 108 viewport_in_content_coordinates_ += outer_->CurrentScrollOffset(); |
| 110 } | 109 } |
| 111 | 110 |
| 112 void ResetViewportToAnchoredPosition() { | 111 void ResetViewportToAnchoredPosition() { |
| 113 DCHECK(outer_); | 112 DCHECK(outer_); |
| 114 | 113 |
| 115 inner_->ClampScrollToMaxScrollOffset(); | 114 inner_->ClampScrollToMaxScrollOffset(); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 SetDebugState(settings.initial_debug_state); | 252 SetDebugState(settings.initial_debug_state); |
| 254 | 253 |
| 255 // LTHI always has an active tree. | 254 // LTHI always has an active tree. |
| 256 active_tree_ = base::MakeUnique<LayerTreeImpl>( | 255 active_tree_ = base::MakeUnique<LayerTreeImpl>( |
| 257 this, new SyncedProperty<ScaleGroup>, new SyncedTopControls, | 256 this, new SyncedProperty<ScaleGroup>, new SyncedTopControls, |
| 258 new SyncedElasticOverscroll); | 257 new SyncedElasticOverscroll); |
| 259 active_tree_->property_trees()->is_active = true; | 258 active_tree_->property_trees()->is_active = true; |
| 260 | 259 |
| 261 viewport_ = Viewport::Create(this); | 260 viewport_ = Viewport::Create(this); |
| 262 | 261 |
| 263 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 262 TRACE_EVENT_OBJECT_CREATED_WITH_ID(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 264 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_); | 263 "cc::LayerTreeHostImpl", id_); |
| 265 | 264 |
| 266 top_controls_manager_ = | 265 top_controls_manager_ = |
| 267 TopControlsManager::Create(this, | 266 TopControlsManager::Create(this, settings.top_controls_show_threshold, |
| 268 settings.top_controls_show_threshold, | |
| 269 settings.top_controls_hide_threshold); | 267 settings.top_controls_hide_threshold); |
| 270 } | 268 } |
| 271 | 269 |
| 272 LayerTreeHostImpl::~LayerTreeHostImpl() { | 270 LayerTreeHostImpl::~LayerTreeHostImpl() { |
| 273 DCHECK(task_runner_provider_->IsImplThread()); | 271 DCHECK(task_runner_provider_->IsImplThread()); |
| 274 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 272 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
| 275 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 273 TRACE_EVENT_OBJECT_DELETED_WITH_ID(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 276 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_); | 274 "cc::LayerTreeHostImpl", id_); |
| 277 | 275 |
| 278 // It is released before shutdown. | 276 // It is released before shutdown. |
| 279 DCHECK(!output_surface_); | 277 DCHECK(!output_surface_); |
| 280 | 278 |
| 281 DCHECK(!renderer_); | 279 DCHECK(!renderer_); |
| 282 DCHECK(!resource_provider_); | 280 DCHECK(!resource_provider_); |
| 283 DCHECK(!resource_pool_); | 281 DCHECK(!resource_pool_); |
| 284 DCHECK(!tile_task_manager_); | 282 DCHECK(!tile_task_manager_); |
| 285 DCHECK(!single_thread_synchronous_task_graph_runner_); | 283 DCHECK(!single_thread_synchronous_task_graph_runner_); |
| 286 DCHECK(!image_decode_controller_); | 284 DCHECK(!image_decode_controller_); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 301 pending_tree_->Shutdown(); | 299 pending_tree_->Shutdown(); |
| 302 active_tree_->Shutdown(); | 300 active_tree_->Shutdown(); |
| 303 recycle_tree_ = nullptr; | 301 recycle_tree_ = nullptr; |
| 304 pending_tree_ = nullptr; | 302 pending_tree_ = nullptr; |
| 305 active_tree_ = nullptr; | 303 active_tree_ = nullptr; |
| 306 | 304 |
| 307 animation_host_->ClearTimelines(); | 305 animation_host_->ClearTimelines(); |
| 308 animation_host_->SetMutatorHostClient(nullptr); | 306 animation_host_->SetMutatorHostClient(nullptr); |
| 309 } | 307 } |
| 310 | 308 |
| 311 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { | 309 void LayerTreeHostImpl::BeginMainFrameAborted( |
| 310 CommitEarlyOutReason reason, |
| 311 std::vector<std::unique_ptr<SwapPromise>> swap_promises) { |
| 312 // If the begin frame data was handled, then scroll and scale set was applied | 312 // If the begin frame data was handled, then scroll and scale set was applied |
| 313 // by the main thread, so the active tree needs to be updated as if these sent | 313 // by the main thread, so the active tree needs to be updated as if these sent |
| 314 // values were applied and committed. | 314 // values were applied and committed. |
| 315 if (CommitEarlyOutHandledCommit(reason)) | 315 if (CommitEarlyOutHandledCommit(reason)) { |
| 316 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); | 316 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); |
| 317 if (pending_tree_) { |
| 318 pending_tree_->AppendSwapPromises(std::move(swap_promises)); |
| 319 } else { |
| 320 for (const auto& swap_promise : swap_promises) |
| 321 swap_promise->DidNotSwap(SwapPromise::COMMIT_NO_UPDATE); |
| 322 } |
| 323 } |
| 317 } | 324 } |
| 318 | 325 |
| 319 void LayerTreeHostImpl::BeginCommit() { | 326 void LayerTreeHostImpl::BeginCommit() { |
| 320 TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit"); | 327 TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit"); |
| 321 | 328 |
| 322 // Ensure all textures are returned so partial texture updates can happen | 329 // Ensure all textures are returned so partial texture updates can happen |
| 323 // during the commit. | 330 // during the commit. |
| 324 // TODO(ericrk): We should not need to ForceReclaimResources when using | 331 // TODO(ericrk): We should not need to ForceReclaimResources when using |
| 325 // Impl-side-painting as it doesn't upload during commits. However, | 332 // Impl-side-painting as it doesn't upload during commits. However, |
| 326 // Display::Draw currently relies on resource being reclaimed to block drawing | 333 // Display::Draw currently relies on resource being reclaimed to block drawing |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 gfx::SizeF(active_tree_->InnerViewportContainerLayer()->bounds()); | 524 gfx::SizeF(active_tree_->InnerViewportContainerLayer()->bounds()); |
| 518 | 525 |
| 519 // TODO(miletus) : Pass in ScrollOffset. | 526 // TODO(miletus) : Pass in ScrollOffset. |
| 520 page_scale_animation_ = | 527 page_scale_animation_ = |
| 521 PageScaleAnimation::Create(ScrollOffsetToVector2dF(scroll_total), | 528 PageScaleAnimation::Create(ScrollOffsetToVector2dF(scroll_total), |
| 522 active_tree_->current_page_scale_factor(), | 529 active_tree_->current_page_scale_factor(), |
| 523 viewport_size, scaled_scrollable_size); | 530 viewport_size, scaled_scrollable_size); |
| 524 | 531 |
| 525 if (anchor_point) { | 532 if (anchor_point) { |
| 526 gfx::Vector2dF anchor(target_offset); | 533 gfx::Vector2dF anchor(target_offset); |
| 527 page_scale_animation_->ZoomWithAnchor(anchor, | 534 page_scale_animation_->ZoomWithAnchor(anchor, page_scale, |
| 528 page_scale, | |
| 529 duration.InSecondsF()); | 535 duration.InSecondsF()); |
| 530 } else { | 536 } else { |
| 531 gfx::Vector2dF scaled_target_offset = target_offset; | 537 gfx::Vector2dF scaled_target_offset = target_offset; |
| 532 page_scale_animation_->ZoomTo(scaled_target_offset, | 538 page_scale_animation_->ZoomTo(scaled_target_offset, page_scale, |
| 533 page_scale, | |
| 534 duration.InSecondsF()); | 539 duration.InSecondsF()); |
| 535 } | 540 } |
| 536 | 541 |
| 537 SetNeedsOneBeginImplFrame(); | 542 SetNeedsOneBeginImplFrame(); |
| 538 client_->SetNeedsCommitOnImplThread(); | 543 client_->SetNeedsCommitOnImplThread(); |
| 539 client_->RenewTreePriority(); | 544 client_->RenewTreePriority(); |
| 540 } | 545 } |
| 541 | 546 |
| 542 void LayerTreeHostImpl::SetNeedsAnimateInput() { | 547 void LayerTreeHostImpl::SetNeedsAnimateInput() { |
| 543 DCHECK(!IsCurrentlyScrollingInnerViewport() || | 548 DCHECK(!IsCurrentlyScrollingInnerViewport() || |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 // Manually create the quad state for the gutter quads, as the root layer | 742 // Manually create the quad state for the gutter quads, as the root layer |
| 738 // doesn't have any bounds and so can't generate this itself. | 743 // doesn't have any bounds and so can't generate this itself. |
| 739 // TODO(danakj): Make the gutter quads generated by the solid color layer | 744 // TODO(danakj): Make the gutter quads generated by the solid color layer |
| 740 // (make it smarter about generating quads to fill unoccluded areas). | 745 // (make it smarter about generating quads to fill unoccluded areas). |
| 741 | 746 |
| 742 gfx::Rect root_target_rect = root_render_surface->content_rect(); | 747 gfx::Rect root_target_rect = root_render_surface->content_rect(); |
| 743 float opacity = 1.f; | 748 float opacity = 1.f; |
| 744 int sorting_context_id = 0; | 749 int sorting_context_id = 0; |
| 745 SharedQuadState* shared_quad_state = | 750 SharedQuadState* shared_quad_state = |
| 746 target_render_pass->CreateAndAppendSharedQuadState(); | 751 target_render_pass->CreateAndAppendSharedQuadState(); |
| 747 shared_quad_state->SetAll(gfx::Transform(), | 752 shared_quad_state->SetAll(gfx::Transform(), root_target_rect.size(), |
| 748 root_target_rect.size(), | 753 root_target_rect, root_target_rect, false, opacity, |
| 749 root_target_rect, | 754 SkXfermode::kSrcOver_Mode, sorting_context_id); |
| 750 root_target_rect, | |
| 751 false, | |
| 752 opacity, | |
| 753 SkXfermode::kSrcOver_Mode, | |
| 754 sorting_context_id); | |
| 755 | 755 |
| 756 for (Region::Iterator fill_rects(fill_region); fill_rects.has_rect(); | 756 for (Region::Iterator fill_rects(fill_region); fill_rects.has_rect(); |
| 757 fill_rects.next()) { | 757 fill_rects.next()) { |
| 758 gfx::Rect screen_space_rect = fill_rects.rect(); | 758 gfx::Rect screen_space_rect = fill_rects.rect(); |
| 759 gfx::Rect visible_screen_space_rect = screen_space_rect; | 759 gfx::Rect visible_screen_space_rect = screen_space_rect; |
| 760 // Skip the quad culler and just append the quads directly to avoid | 760 // Skip the quad culler and just append the quads directly to avoid |
| 761 // occlusion checks. | 761 // occlusion checks. |
| 762 SolidColorDrawQuad* quad = | 762 SolidColorDrawQuad* quad = |
| 763 target_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 763 target_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 764 quad->SetNew(shared_quad_state, | 764 quad->SetNew(shared_quad_state, screen_space_rect, |
| 765 screen_space_rect, | 765 visible_screen_space_rect, screen_background_color, false); |
| 766 visible_screen_space_rect, | |
| 767 screen_background_color, | |
| 768 false); | |
| 769 } | 766 } |
| 770 } | 767 } |
| 771 | 768 |
| 772 static RenderPass* FindRenderPassById(const RenderPassList& list, | 769 static RenderPass* FindRenderPassById(const RenderPassList& list, |
| 773 RenderPassId id) { | 770 RenderPassId id) { |
| 774 auto it = std::find_if( | 771 auto it = std::find_if( |
| 775 list.begin(), list.end(), | 772 list.begin(), list.end(), |
| 776 [id](const std::unique_ptr<RenderPass>& p) { return p->id == id; }); | 773 [id](const std::unique_ptr<RenderPass>& p) { return p->id == id; }); |
| 777 return it == list.end() ? nullptr : it->get(); | 774 return it == list.end() ? nullptr : it->get(); |
| 778 } | 775 } |
| 779 | 776 |
| 780 DrawResult LayerTreeHostImpl::CalculateRenderPasses( | 777 DrawResult LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
| 781 FrameData* frame) { | |
| 782 DCHECK(frame->render_passes.empty()); | 778 DCHECK(frame->render_passes.empty()); |
| 783 DCHECK(CanDraw()); | 779 DCHECK(CanDraw()); |
| 784 DCHECK(!active_tree_->LayerListIsEmpty()); | 780 DCHECK(!active_tree_->LayerListIsEmpty()); |
| 785 | 781 |
| 786 TrackDamageForAllSurfaces(*frame->render_surface_layer_list); | 782 TrackDamageForAllSurfaces(*frame->render_surface_layer_list); |
| 787 | 783 |
| 788 // If the root render surface has no visible damage, then don't generate a | 784 // If the root render surface has no visible damage, then don't generate a |
| 789 // frame at all. | 785 // frame at all. |
| 790 RenderSurfaceImpl* root_surface = active_tree_->RootRenderSurface(); | 786 RenderSurfaceImpl* root_surface = active_tree_->RootRenderSurface(); |
| 791 bool root_surface_has_no_visible_damage = | 787 bool root_surface_has_no_visible_damage = |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 ->effect_tree.TakeCopyRequestsAndTransformToSurface( | 889 ->effect_tree.TakeCopyRequestsAndTransformToSurface( |
| 894 it->render_surface()->EffectTreeIndex(), | 890 it->render_surface()->EffectTreeIndex(), |
| 895 &target_render_pass->copy_requests); | 891 &target_render_pass->copy_requests); |
| 896 } | 892 } |
| 897 } else if (it.represents_contributing_render_surface() && | 893 } else if (it.represents_contributing_render_surface() && |
| 898 it->render_surface()->contributes_to_drawn_surface()) { | 894 it->render_surface()->contributes_to_drawn_surface()) { |
| 899 RenderPassId contributing_render_pass_id = | 895 RenderPassId contributing_render_pass_id = |
| 900 it->render_surface()->GetRenderPassId(); | 896 it->render_surface()->GetRenderPassId(); |
| 901 RenderPass* contributing_render_pass = | 897 RenderPass* contributing_render_pass = |
| 902 FindRenderPassById(frame->render_passes, contributing_render_pass_id); | 898 FindRenderPassById(frame->render_passes, contributing_render_pass_id); |
| 903 AppendQuadsForRenderSurfaceLayer(target_render_pass, | 899 AppendQuadsForRenderSurfaceLayer(target_render_pass, *it, |
| 904 *it, | |
| 905 contributing_render_pass, | 900 contributing_render_pass, |
| 906 &append_quads_data); | 901 &append_quads_data); |
| 907 } else if (it.represents_itself() && !it->visible_layer_rect().IsEmpty()) { | 902 } else if (it.represents_itself() && !it->visible_layer_rect().IsEmpty()) { |
| 908 bool occluded = | 903 bool occluded = |
| 909 it->draw_properties().occlusion_in_content_space.IsOccluded( | 904 it->draw_properties().occlusion_in_content_space.IsOccluded( |
| 910 it->visible_layer_rect()); | 905 it->visible_layer_rect()); |
| 911 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { | 906 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { |
| 912 DCHECK_EQ(active_tree_.get(), it->layer_tree_impl()); | 907 DCHECK_EQ(active_tree_.get(), it->layer_tree_impl()); |
| 913 | 908 |
| 914 frame->will_draw_layers.push_back(*it); | 909 frame->will_draw_layers.push_back(*it); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1054 void LayerTreeHostImpl::DidAnimateScrollOffset() { | 1049 void LayerTreeHostImpl::DidAnimateScrollOffset() { |
| 1055 client_->SetNeedsCommitOnImplThread(); | 1050 client_->SetNeedsCommitOnImplThread(); |
| 1056 client_->RenewTreePriority(); | 1051 client_->RenewTreePriority(); |
| 1057 } | 1052 } |
| 1058 | 1053 |
| 1059 void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) { | 1054 void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) { |
| 1060 viewport_damage_rect_.Union(damage_rect); | 1055 viewport_damage_rect_.Union(damage_rect); |
| 1061 } | 1056 } |
| 1062 | 1057 |
| 1063 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { | 1058 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { |
| 1064 TRACE_EVENT1("cc", | 1059 TRACE_EVENT1("cc", "LayerTreeHostImpl::PrepareToDraw", "SourceFrameNumber", |
| 1065 "LayerTreeHostImpl::PrepareToDraw", | |
| 1066 "SourceFrameNumber", | |
| 1067 active_tree_->source_frame_number()); | 1060 active_tree_->source_frame_number()); |
| 1068 if (input_handler_client_) | 1061 if (input_handler_client_) |
| 1069 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); | 1062 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); |
| 1070 | 1063 |
| 1071 if (const char* client_name = GetClientNameForMetrics()) { | 1064 if (const char* client_name = GetClientNameForMetrics()) { |
| 1072 size_t total_picture_memory = 0; | 1065 size_t total_picture_memory = 0; |
| 1073 for (const PictureLayerImpl* layer : active_tree()->picture_layers()) | 1066 for (const PictureLayerImpl* layer : active_tree()->picture_layers()) |
| 1074 total_picture_memory += layer->GetRasterSource()->GetPictureMemoryUsage(); | 1067 total_picture_memory += layer->GetRasterSource()->GetPictureMemoryUsage(); |
| 1075 if (total_picture_memory != 0) { | 1068 if (total_picture_memory != 0) { |
| 1076 // GetClientNameForMetrics only returns one non-null value over the | 1069 // GetClientNameForMetrics only returns one non-null value over the |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1234 if (visible_ && policy.bytes_limit_when_visible > 0) { | 1227 if (visible_ && policy.bytes_limit_when_visible > 0) { |
| 1235 global_tile_state_.hard_memory_limit_in_bytes = | 1228 global_tile_state_.hard_memory_limit_in_bytes = |
| 1236 policy.bytes_limit_when_visible; | 1229 policy.bytes_limit_when_visible; |
| 1237 global_tile_state_.soft_memory_limit_in_bytes = | 1230 global_tile_state_.soft_memory_limit_in_bytes = |
| 1238 (static_cast<int64_t>(global_tile_state_.hard_memory_limit_in_bytes) * | 1231 (static_cast<int64_t>(global_tile_state_.hard_memory_limit_in_bytes) * |
| 1239 settings_.max_memory_for_prepaint_percentage) / | 1232 settings_.max_memory_for_prepaint_percentage) / |
| 1240 100; | 1233 100; |
| 1241 } | 1234 } |
| 1242 global_tile_state_.memory_limit_policy = | 1235 global_tile_state_.memory_limit_policy = |
| 1243 ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( | 1236 ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( |
| 1244 visible_ ? | 1237 visible_ ? policy.priority_cutoff_when_visible |
| 1245 policy.priority_cutoff_when_visible : | 1238 : gpu::MemoryAllocation::CUTOFF_ALLOW_NOTHING); |
| 1246 gpu::MemoryAllocation::CUTOFF_ALLOW_NOTHING); | |
| 1247 global_tile_state_.num_resources_limit = policy.num_resources_limit; | 1239 global_tile_state_.num_resources_limit = policy.num_resources_limit; |
| 1248 | 1240 |
| 1249 if (global_tile_state_.hard_memory_limit_in_bytes > 0) { | 1241 if (global_tile_state_.hard_memory_limit_in_bytes > 0) { |
| 1250 // If |global_tile_state_.hard_memory_limit_in_bytes| is greater than 0, we | 1242 // If |global_tile_state_.hard_memory_limit_in_bytes| is greater than 0, we |
| 1251 // allow the worker context and image decode controller to retain allocated | 1243 // allow the worker context and image decode controller to retain allocated |
| 1252 // resources. Notify them here. If the memory policy has become zero, we'll | 1244 // resources. Notify them here. If the memory policy has become zero, we'll |
| 1253 // handle the notification in NotifyAllTileTasksCompleted, after | 1245 // handle the notification in NotifyAllTileTasksCompleted, after |
| 1254 // in-progress work finishes. | 1246 // in-progress work finishes. |
| 1255 if (output_surface_) { | 1247 if (output_surface_) { |
| 1256 output_surface_->SetWorkerContextShouldAggressivelyFreeResources( | 1248 output_surface_->SetWorkerContextShouldAggressivelyFreeResources( |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1607 } | 1599 } |
| 1608 if (!InnerViewportScrollLayer()) | 1600 if (!InnerViewportScrollLayer()) |
| 1609 return metadata; | 1601 return metadata; |
| 1610 | 1602 |
| 1611 metadata.root_overflow_x_hidden |= | 1603 metadata.root_overflow_x_hidden |= |
| 1612 !InnerViewportScrollLayer()->user_scrollable_horizontal(); | 1604 !InnerViewportScrollLayer()->user_scrollable_horizontal(); |
| 1613 metadata.root_overflow_y_hidden |= | 1605 metadata.root_overflow_y_hidden |= |
| 1614 !InnerViewportScrollLayer()->user_scrollable_vertical(); | 1606 !InnerViewportScrollLayer()->user_scrollable_vertical(); |
| 1615 | 1607 |
| 1616 // TODO(miletus) : Change the metadata to hold ScrollOffset. | 1608 // TODO(miletus) : Change the metadata to hold ScrollOffset. |
| 1617 metadata.root_scroll_offset = gfx::ScrollOffsetToVector2dF( | 1609 metadata.root_scroll_offset = |
| 1618 active_tree_->TotalScrollOffset()); | 1610 gfx::ScrollOffsetToVector2dF(active_tree_->TotalScrollOffset()); |
| 1619 | 1611 |
| 1620 return metadata; | 1612 return metadata; |
| 1621 } | 1613 } |
| 1622 | 1614 |
| 1623 void LayerTreeHostImpl::DrawLayers(FrameData* frame) { | 1615 void LayerTreeHostImpl::DrawLayers(FrameData* frame) { |
| 1624 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); | 1616 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); |
| 1625 | 1617 |
| 1626 base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; | 1618 base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; |
| 1627 DCHECK(CanDraw()); | 1619 DCHECK(CanDraw()); |
| 1628 | 1620 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1679 active_tree_->device_scale_factor(), gfx::ColorSpace(), | 1671 active_tree_->device_scale_factor(), gfx::ColorSpace(), |
| 1680 DeviceViewport(), DeviceClip()); | 1672 DeviceViewport(), DeviceClip()); |
| 1681 // The render passes should be consumed by the renderer. | 1673 // The render passes should be consumed by the renderer. |
| 1682 DCHECK(frame->render_passes.empty()); | 1674 DCHECK(frame->render_passes.empty()); |
| 1683 | 1675 |
| 1684 // The next frame should start by assuming nothing has changed, and changes | 1676 // The next frame should start by assuming nothing has changed, and changes |
| 1685 // are noted as they occur. | 1677 // are noted as they occur. |
| 1686 // TODO(boliu): If we did a temporary software renderer frame, propogate the | 1678 // TODO(boliu): If we did a temporary software renderer frame, propogate the |
| 1687 // damage forward to the next frame. | 1679 // damage forward to the next frame. |
| 1688 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { | 1680 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { |
| 1689 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> | 1681 (*frame->render_surface_layer_list)[i] |
| 1690 DidDrawDamagedArea(); | 1682 ->render_surface() |
| 1683 ->damage_tracker() |
| 1684 ->DidDrawDamagedArea(); |
| 1691 } | 1685 } |
| 1692 active_tree_->ResetAllChangeTracking(); | 1686 active_tree_->ResetAllChangeTracking(); |
| 1693 | 1687 |
| 1694 active_tree_->set_has_ever_been_drawn(true); | 1688 active_tree_->set_has_ever_been_drawn(true); |
| 1695 devtools_instrumentation::DidDrawFrame(id_); | 1689 devtools_instrumentation::DidDrawFrame(id_); |
| 1696 benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( | 1690 benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( |
| 1697 rendering_stats_instrumentation_->impl_thread_rendering_stats()); | 1691 rendering_stats_instrumentation_->impl_thread_rendering_stats()); |
| 1698 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); | 1692 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); |
| 1699 } | 1693 } |
| 1700 | 1694 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 | 1798 |
| 1805 // We have released tilings for both active and pending tree. | 1799 // We have released tilings for both active and pending tree. |
| 1806 // We would not have any content to draw until the pending tree is activated. | 1800 // We would not have any content to draw until the pending tree is activated. |
| 1807 // Prevent the active tree from drawing until activation. | 1801 // Prevent the active tree from drawing until activation. |
| 1808 // TODO(crbug.com/469175): Replace with RequiresHighResToDraw. | 1802 // TODO(crbug.com/469175): Replace with RequiresHighResToDraw. |
| 1809 SetRequiresHighResToDraw(); | 1803 SetRequiresHighResToDraw(); |
| 1810 | 1804 |
| 1811 tree_resources_for_gpu_rasterization_dirty_ = false; | 1805 tree_resources_for_gpu_rasterization_dirty_ = false; |
| 1812 } | 1806 } |
| 1813 | 1807 |
| 1814 const RendererCapabilitiesImpl& | 1808 const RendererCapabilitiesImpl& LayerTreeHostImpl::GetRendererCapabilities() |
| 1815 LayerTreeHostImpl::GetRendererCapabilities() const { | 1809 const { |
| 1816 CHECK(renderer_); | 1810 CHECK(renderer_); |
| 1817 return renderer_->Capabilities(); | 1811 return renderer_->Capabilities(); |
| 1818 } | 1812 } |
| 1819 | 1813 |
| 1820 bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { | 1814 bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { |
| 1821 ResetRequiresHighResToDraw(); | 1815 ResetRequiresHighResToDraw(); |
| 1822 if (frame.has_no_damage) { | 1816 if (frame.has_no_damage) { |
| 1823 active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS); | 1817 active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS); |
| 1824 return false; | 1818 return false; |
| 1825 } | 1819 } |
| 1826 CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); | 1820 CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); |
| 1827 active_tree()->FinishSwapPromises(&metadata); | 1821 active_tree()->FinishSwapPromises(&metadata); |
| 1828 for (auto& latency : metadata.latency_info) { | 1822 for (auto& latency : metadata.latency_info) { |
| 1829 TRACE_EVENT_WITH_FLOW1("input,benchmark", | 1823 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
| 1830 "LatencyInfo.Flow", | |
| 1831 TRACE_ID_DONT_MANGLE(latency.trace_id()), | 1824 TRACE_ID_DONT_MANGLE(latency.trace_id()), |
| 1832 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, | 1825 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
| 1833 "step", "SwapBuffers"); | 1826 "step", "SwapBuffers"); |
| 1834 // Only add the latency component once for renderer swap, not the browser | 1827 // Only add the latency component once for renderer swap, not the browser |
| 1835 // swap. | 1828 // swap. |
| 1836 if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, | 1829 if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, 0, |
| 1837 0, nullptr)) { | 1830 nullptr)) { |
| 1838 latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, | 1831 latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, |
| 1839 0, 0); | 1832 0, 0); |
| 1840 } | 1833 } |
| 1841 } | 1834 } |
| 1842 renderer_->SwapBuffers(std::move(metadata)); | 1835 renderer_->SwapBuffers(std::move(metadata)); |
| 1843 return true; | 1836 return true; |
| 1844 } | 1837 } |
| 1845 | 1838 |
| 1846 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { | 1839 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { |
| 1847 current_begin_frame_tracker_.Start(args); | 1840 current_begin_frame_tracker_.Start(args); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1863 current_begin_frame_tracker_.Finish(); | 1856 current_begin_frame_tracker_.Finish(); |
| 1864 } | 1857 } |
| 1865 | 1858 |
| 1866 void LayerTreeHostImpl::UpdateViewportContainerSizes() { | 1859 void LayerTreeHostImpl::UpdateViewportContainerSizes() { |
| 1867 LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer(); | 1860 LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer(); |
| 1868 LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer(); | 1861 LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer(); |
| 1869 | 1862 |
| 1870 if (!inner_container) | 1863 if (!inner_container) |
| 1871 return; | 1864 return; |
| 1872 | 1865 |
| 1873 ViewportAnchor anchor(InnerViewportScrollLayer(), | 1866 ViewportAnchor anchor(InnerViewportScrollLayer(), OuterViewportScrollLayer()); |
| 1874 OuterViewportScrollLayer()); | |
| 1875 | 1867 |
| 1876 float top_controls_layout_height = | 1868 float top_controls_layout_height = |
| 1877 active_tree_->top_controls_shrink_blink_size() | 1869 active_tree_->top_controls_shrink_blink_size() |
| 1878 ? active_tree_->top_controls_height() | 1870 ? active_tree_->top_controls_height() |
| 1879 : 0.f; | 1871 : 0.f; |
| 1880 float delta_from_top_controls = | 1872 float delta_from_top_controls = |
| 1881 top_controls_layout_height - top_controls_manager_->ContentTopOffset(); | 1873 top_controls_layout_height - top_controls_manager_->ContentTopOffset(); |
| 1882 | 1874 |
| 1883 // Adjust the viewport layers by shrinking/expanding the container to account | 1875 // Adjust the viewport layers by shrinking/expanding the container to account |
| 1884 // for changes in the size (e.g. top controls) since the last resize from | 1876 // for changes in the size (e.g. top controls) since the last resize from |
| 1885 // Blink. | 1877 // Blink. |
| 1886 gfx::Vector2dF amount_to_expand( | 1878 gfx::Vector2dF amount_to_expand(0.f, delta_from_top_controls); |
| 1887 0.f, | |
| 1888 delta_from_top_controls); | |
| 1889 inner_container->SetBoundsDelta(amount_to_expand); | 1879 inner_container->SetBoundsDelta(amount_to_expand); |
| 1890 | 1880 |
| 1891 if (outer_container && !outer_container->BoundsForScrolling().IsEmpty()) { | 1881 if (outer_container && !outer_container->BoundsForScrolling().IsEmpty()) { |
| 1892 // Adjust the outer viewport container as well, since adjusting only the | 1882 // Adjust the outer viewport container as well, since adjusting only the |
| 1893 // inner may cause its bounds to exceed those of the outer, causing scroll | 1883 // inner may cause its bounds to exceed those of the outer, causing scroll |
| 1894 // clamping. | 1884 // clamping. |
| 1895 gfx::Vector2dF amount_to_expand_scaled = gfx::ScaleVector2d( | 1885 gfx::Vector2dF amount_to_expand_scaled = gfx::ScaleVector2d( |
| 1896 amount_to_expand, 1.f / active_tree_->min_page_scale_factor()); | 1886 amount_to_expand, 1.f / active_tree_->min_page_scale_factor()); |
| 1897 outer_container->SetBoundsDelta(amount_to_expand_scaled); | 1887 outer_container->SetBoundsDelta(amount_to_expand_scaled); |
| 1898 active_tree_->InnerViewportScrollLayer()->SetBoundsDelta( | 1888 active_tree_->InnerViewportScrollLayer()->SetBoundsDelta( |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2023 DidModifyTilePriorities(); | 2013 DidModifyTilePriorities(); |
| 2024 | 2014 |
| 2025 client_->OnCanDrawStateChanged(CanDraw()); | 2015 client_->OnCanDrawStateChanged(CanDraw()); |
| 2026 client_->DidActivateSyncTree(); | 2016 client_->DidActivateSyncTree(); |
| 2027 if (!tree_activation_callback_.is_null()) | 2017 if (!tree_activation_callback_.is_null()) |
| 2028 tree_activation_callback_.Run(); | 2018 tree_activation_callback_.Run(); |
| 2029 | 2019 |
| 2030 std::unique_ptr<PendingPageScaleAnimation> pending_page_scale_animation = | 2020 std::unique_ptr<PendingPageScaleAnimation> pending_page_scale_animation = |
| 2031 active_tree_->TakePendingPageScaleAnimation(); | 2021 active_tree_->TakePendingPageScaleAnimation(); |
| 2032 if (pending_page_scale_animation) { | 2022 if (pending_page_scale_animation) { |
| 2033 StartPageScaleAnimation( | 2023 StartPageScaleAnimation(pending_page_scale_animation->target_offset, |
| 2034 pending_page_scale_animation->target_offset, | 2024 pending_page_scale_animation->use_anchor, |
| 2035 pending_page_scale_animation->use_anchor, | 2025 pending_page_scale_animation->scale, |
| 2036 pending_page_scale_animation->scale, | 2026 pending_page_scale_animation->duration); |
| 2037 pending_page_scale_animation->duration); | |
| 2038 } | 2027 } |
| 2039 // Activation can change the root scroll offset, so inform the synchronous | 2028 // Activation can change the root scroll offset, so inform the synchronous |
| 2040 // input handler. | 2029 // input handler. |
| 2041 UpdateRootLayerStateForSynchronousInputHandler(); | 2030 UpdateRootLayerStateForSynchronousInputHandler(); |
| 2042 } | 2031 } |
| 2043 | 2032 |
| 2044 void LayerTreeHostImpl::SetVisible(bool visible) { | 2033 void LayerTreeHostImpl::SetVisible(bool visible) { |
| 2045 DCHECK(task_runner_provider_->IsImplThread()); | 2034 DCHECK(task_runner_provider_->IsImplThread()); |
| 2046 | 2035 |
| 2047 if (visible_ == visible) | 2036 if (visible_ == visible) |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2895 gfx::PointF screen_space_point = | 2884 gfx::PointF screen_space_point = |
| 2896 gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space); | 2885 gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space); |
| 2897 | 2886 |
| 2898 gfx::Vector2dF screen_space_delta = viewport_delta; | 2887 gfx::Vector2dF screen_space_delta = viewport_delta; |
| 2899 screen_space_delta.Scale(scale_from_viewport_to_screen_space); | 2888 screen_space_delta.Scale(scale_from_viewport_to_screen_space); |
| 2900 | 2889 |
| 2901 // First project the scroll start and end points to local layer space to find | 2890 // First project the scroll start and end points to local layer space to find |
| 2902 // the scroll delta in layer coordinates. | 2891 // the scroll delta in layer coordinates. |
| 2903 bool start_clipped, end_clipped; | 2892 bool start_clipped, end_clipped; |
| 2904 gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta; | 2893 gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta; |
| 2905 gfx::PointF local_start_point = | 2894 gfx::PointF local_start_point = MathUtil::ProjectPoint( |
| 2906 MathUtil::ProjectPoint(inverse_screen_space_transform, | 2895 inverse_screen_space_transform, screen_space_point, &start_clipped); |
| 2907 screen_space_point, | 2896 gfx::PointF local_end_point = MathUtil::ProjectPoint( |
| 2908 &start_clipped); | 2897 inverse_screen_space_transform, screen_space_end_point, &end_clipped); |
| 2909 gfx::PointF local_end_point = | |
| 2910 MathUtil::ProjectPoint(inverse_screen_space_transform, | |
| 2911 screen_space_end_point, | |
| 2912 &end_clipped); | |
| 2913 | 2898 |
| 2914 // In general scroll point coordinates should not get clipped. | 2899 // In general scroll point coordinates should not get clipped. |
| 2915 DCHECK(!start_clipped); | 2900 DCHECK(!start_clipped); |
| 2916 DCHECK(!end_clipped); | 2901 DCHECK(!end_clipped); |
| 2917 if (start_clipped || end_clipped) | 2902 if (start_clipped || end_clipped) |
| 2918 return gfx::Vector2dF(); | 2903 return gfx::Vector2dF(); |
| 2919 | 2904 |
| 2920 // Apply the scroll delta. | 2905 // Apply the scroll delta. |
| 2921 gfx::ScrollOffset previous_offset = | 2906 gfx::ScrollOffset previous_offset = |
| 2922 scroll_tree->current_scroll_offset(scroll_node->owner_id); | 2907 scroll_tree->current_scroll_offset(scroll_node->owner_id); |
| 2923 scroll_tree->ScrollBy(scroll_node, local_end_point - local_start_point, | 2908 scroll_tree->ScrollBy(scroll_node, local_end_point - local_start_point, |
| 2924 active_tree()); | 2909 active_tree()); |
| 2925 gfx::ScrollOffset scrolled = | 2910 gfx::ScrollOffset scrolled = |
| 2926 scroll_tree->current_scroll_offset(scroll_node->owner_id) - | 2911 scroll_tree->current_scroll_offset(scroll_node->owner_id) - |
| 2927 previous_offset; | 2912 previous_offset; |
| 2928 | 2913 |
| 2929 // Get the end point in the layer's content space so we can apply its | 2914 // Get the end point in the layer's content space so we can apply its |
| 2930 // ScreenSpaceTransform. | 2915 // ScreenSpaceTransform. |
| 2931 gfx::PointF actual_local_end_point = | 2916 gfx::PointF actual_local_end_point = |
| 2932 local_start_point + gfx::Vector2dF(scrolled.x(), scrolled.y()); | 2917 local_start_point + gfx::Vector2dF(scrolled.x(), scrolled.y()); |
| 2933 | 2918 |
| 2934 // Calculate the applied scroll delta in viewport space coordinates. | 2919 // Calculate the applied scroll delta in viewport space coordinates. |
| 2935 gfx::PointF actual_screen_space_end_point = MathUtil::MapPoint( | 2920 gfx::PointF actual_screen_space_end_point = MathUtil::MapPoint( |
| 2936 screen_space_transform, actual_local_end_point, &end_clipped); | 2921 screen_space_transform, actual_local_end_point, &end_clipped); |
| 2937 DCHECK(!end_clipped); | 2922 DCHECK(!end_clipped); |
| 2938 if (end_clipped) | 2923 if (end_clipped) |
| 2939 return gfx::Vector2dF(); | 2924 return gfx::Vector2dF(); |
| 2940 gfx::PointF actual_viewport_end_point = | 2925 gfx::PointF actual_viewport_end_point = gfx::ScalePoint( |
| 2941 gfx::ScalePoint(actual_screen_space_end_point, | 2926 actual_screen_space_end_point, 1.f / scale_from_viewport_to_screen_space); |
| 2942 1.f / scale_from_viewport_to_screen_space); | |
| 2943 return actual_viewport_end_point - viewport_point; | 2927 return actual_viewport_end_point - viewport_point; |
| 2944 } | 2928 } |
| 2945 | 2929 |
| 2946 static gfx::Vector2dF ScrollNodeWithLocalDelta( | 2930 static gfx::Vector2dF ScrollNodeWithLocalDelta( |
| 2947 ScrollNode* scroll_node, | 2931 ScrollNode* scroll_node, |
| 2948 const gfx::Vector2dF& local_delta, | 2932 const gfx::Vector2dF& local_delta, |
| 2949 float page_scale_factor, | 2933 float page_scale_factor, |
| 2950 LayerTreeImpl* layer_tree_impl) { | 2934 LayerTreeImpl* layer_tree_impl) { |
| 2951 ScrollTree& scroll_tree = layer_tree_impl->property_trees()->scroll_tree; | 2935 ScrollTree& scroll_tree = layer_tree_impl->property_trees()->scroll_tree; |
| 2952 gfx::ScrollOffset previous_offset = | 2936 gfx::ScrollOffset previous_offset = |
| (...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3724 ResourceId id = ResourceIdForUIResource(uid); | 3708 ResourceId id = ResourceIdForUIResource(uid); |
| 3725 if (id) { | 3709 if (id) { |
| 3726 resource_provider_->DeleteResource(id); | 3710 resource_provider_->DeleteResource(id); |
| 3727 ui_resource_map_.erase(uid); | 3711 ui_resource_map_.erase(uid); |
| 3728 } | 3712 } |
| 3729 MarkUIResourceNotEvicted(uid); | 3713 MarkUIResourceNotEvicted(uid); |
| 3730 } | 3714 } |
| 3731 | 3715 |
| 3732 void LayerTreeHostImpl::ClearUIResources() { | 3716 void LayerTreeHostImpl::ClearUIResources() { |
| 3733 for (UIResourceMap::const_iterator iter = ui_resource_map_.begin(); | 3717 for (UIResourceMap::const_iterator iter = ui_resource_map_.begin(); |
| 3734 iter != ui_resource_map_.end(); | 3718 iter != ui_resource_map_.end(); ++iter) { |
| 3735 ++iter) { | |
| 3736 evicted_ui_resources_.insert(iter->first); | 3719 evicted_ui_resources_.insert(iter->first); |
| 3737 resource_provider_->DeleteResource(iter->second.resource_id); | 3720 resource_provider_->DeleteResource(iter->second.resource_id); |
| 3738 } | 3721 } |
| 3739 ui_resource_map_.clear(); | 3722 ui_resource_map_.clear(); |
| 3740 } | 3723 } |
| 3741 | 3724 |
| 3742 void LayerTreeHostImpl::EvictAllUIResources() { | 3725 void LayerTreeHostImpl::EvictAllUIResources() { |
| 3743 if (ui_resource_map_.empty()) | 3726 if (ui_resource_map_.empty()) |
| 3744 return; | 3727 return; |
| 3745 ClearUIResources(); | 3728 ClearUIResources(); |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4052 return task_runner_provider_->HasImplThread(); | 4035 return task_runner_provider_->HasImplThread(); |
| 4053 } | 4036 } |
| 4054 | 4037 |
| 4055 bool LayerTreeHostImpl::CommitToActiveTree() const { | 4038 bool LayerTreeHostImpl::CommitToActiveTree() const { |
| 4056 // In single threaded mode we skip the pending tree and commit directly to the | 4039 // In single threaded mode we skip the pending tree and commit directly to the |
| 4057 // active tree. | 4040 // active tree. |
| 4058 return !task_runner_provider_->HasImplThread(); | 4041 return !task_runner_provider_->HasImplThread(); |
| 4059 } | 4042 } |
| 4060 | 4043 |
| 4061 } // namespace cc | 4044 } // namespace cc |
| OLD | NEW |