Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 2188093002: cc: Complete swap promise for aborted commit after pending activation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix compile error Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698