Chromium Code Reviews

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

Issue 863253002: Update from https://crrev.com/312600 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
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 <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 202 matching lines...)
213 fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), 213 fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())),
214 paint_time_counter_(PaintTimeCounter::Create()), 214 paint_time_counter_(PaintTimeCounter::Create()),
215 memory_history_(MemoryHistory::Create()), 215 memory_history_(MemoryHistory::Create()),
216 debug_rect_history_(DebugRectHistory::Create()), 216 debug_rect_history_(DebugRectHistory::Create()),
217 texture_mailbox_deleter_(new TextureMailboxDeleter( 217 texture_mailbox_deleter_(new TextureMailboxDeleter(
218 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 218 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
219 : proxy_->MainThreadTaskRunner())), 219 : proxy_->MainThreadTaskRunner())),
220 max_memory_needed_bytes_(0), 220 max_memory_needed_bytes_(0),
221 zero_budget_(false), 221 zero_budget_(false),
222 device_scale_factor_(1.f), 222 device_scale_factor_(1.f),
223 overhang_ui_resource_id_(0),
224 resourceless_software_draw_(false), 223 resourceless_software_draw_(false),
225 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), 224 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()),
226 animation_registrar_(AnimationRegistrar::Create()), 225 animation_registrar_(AnimationRegistrar::Create()),
227 rendering_stats_instrumentation_(rendering_stats_instrumentation), 226 rendering_stats_instrumentation_(rendering_stats_instrumentation),
228 micro_benchmark_controller_(this), 227 micro_benchmark_controller_(this),
229 shared_bitmap_manager_(shared_bitmap_manager), 228 shared_bitmap_manager_(shared_bitmap_manager),
230 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), 229 gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
231 id_(id), 230 id_(id),
232 requires_high_res_to_draw_(false), 231 requires_high_res_to_draw_(false),
233 required_for_draw_tile_is_top_of_raster_queue_(false) { 232 required_for_draw_tile_is_top_of_raster_queue_(false) {
(...skipping 354 matching lines...)
588 is_replica = true; 587 is_replica = true;
589 layer->render_surface()->AppendQuads(target_render_pass, 588 layer->render_surface()->AppendQuads(target_render_pass,
590 occlusion_tracker, 589 occlusion_tracker,
591 append_quads_data, 590 append_quads_data,
592 is_replica, 591 is_replica,
593 contributing_render_pass->id); 592 contributing_render_pass->id);
594 } 593 }
595 } 594 }
596 595
597 static void AppendQuadsToFillScreen( 596 static void AppendQuadsToFillScreen(
598 ResourceProvider::ResourceId overhang_resource_id,
599 const gfx::SizeF& overhang_resource_scaled_size,
600 const gfx::Rect& root_scroll_layer_rect, 597 const gfx::Rect& root_scroll_layer_rect,
601 RenderPass* target_render_pass, 598 RenderPass* target_render_pass,
602 LayerImpl* root_layer, 599 LayerImpl* root_layer,
603 SkColor screen_background_color, 600 SkColor screen_background_color,
604 const OcclusionTracker<LayerImpl>& occlusion_tracker) { 601 const OcclusionTracker<LayerImpl>& occlusion_tracker) {
605 if (!root_layer || !SkColorGetA(screen_background_color)) 602 if (!root_layer || !SkColorGetA(screen_background_color))
606 return; 603 return;
607 604
608 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); 605 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen();
609 if (fill_region.IsEmpty()) 606 if (fill_region.IsEmpty())
610 return; 607 return;
611 608
612 // Divide the fill region into the part to be filled with the overhang
613 // resource and the part to be filled with the background color.
614 Region screen_background_color_region = fill_region;
615 Region overhang_region;
616 if (overhang_resource_id) {
617 overhang_region = fill_region;
618 overhang_region.Subtract(root_scroll_layer_rect);
619 screen_background_color_region.Intersect(root_scroll_layer_rect);
620 }
621
622 // Manually create the quad state for the gutter quads, as the root layer 609 // Manually create the quad state for the gutter quads, as the root layer
623 // doesn't have any bounds and so can't generate this itself. 610 // doesn't have any bounds and so can't generate this itself.
624 // TODO(danakj): Make the gutter quads generated by the solid color layer 611 // TODO(danakj): Make the gutter quads generated by the solid color layer
625 // (make it smarter about generating quads to fill unoccluded areas). 612 // (make it smarter about generating quads to fill unoccluded areas).
626 613
627 gfx::Rect root_target_rect = root_layer->render_surface()->content_rect(); 614 gfx::Rect root_target_rect = root_layer->render_surface()->content_rect();
628 float opacity = 1.f; 615 float opacity = 1.f;
629 int sorting_context_id = 0; 616 int sorting_context_id = 0;
630 SharedQuadState* shared_quad_state = 617 SharedQuadState* shared_quad_state =
631 target_render_pass->CreateAndAppendSharedQuadState(); 618 target_render_pass->CreateAndAppendSharedQuadState();
632 shared_quad_state->SetAll(gfx::Transform(), 619 shared_quad_state->SetAll(gfx::Transform(),
633 root_target_rect.size(), 620 root_target_rect.size(),
634 root_target_rect, 621 root_target_rect,
635 root_target_rect, 622 root_target_rect,
636 false, 623 false,
637 opacity, 624 opacity,
638 SkXfermode::kSrcOver_Mode, 625 SkXfermode::kSrcOver_Mode,
639 sorting_context_id); 626 sorting_context_id);
640 627
641 for (Region::Iterator fill_rects(screen_background_color_region); 628 for (Region::Iterator fill_rects(fill_region); fill_rects.has_rect();
642 fill_rects.has_rect();
643 fill_rects.next()) { 629 fill_rects.next()) {
644 gfx::Rect screen_space_rect = fill_rects.rect(); 630 gfx::Rect screen_space_rect = fill_rects.rect();
645 gfx::Rect visible_screen_space_rect = screen_space_rect; 631 gfx::Rect visible_screen_space_rect = screen_space_rect;
646 // Skip the quad culler and just append the quads directly to avoid 632 // Skip the quad culler and just append the quads directly to avoid
647 // occlusion checks. 633 // occlusion checks.
648 SolidColorDrawQuad* quad = 634 SolidColorDrawQuad* quad =
649 target_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 635 target_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
650 quad->SetNew(shared_quad_state, 636 quad->SetNew(shared_quad_state,
651 screen_space_rect, 637 screen_space_rect,
652 visible_screen_space_rect, 638 visible_screen_space_rect,
653 screen_background_color, 639 screen_background_color,
654 false); 640 false);
655 } 641 }
656 for (Region::Iterator fill_rects(overhang_region);
657 fill_rects.has_rect();
658 fill_rects.next()) {
659 DCHECK(overhang_resource_id);
660 gfx::Rect screen_space_rect = fill_rects.rect();
661 gfx::Rect opaque_screen_space_rect = screen_space_rect;
662 gfx::Rect visible_screen_space_rect = screen_space_rect;
663 TextureDrawQuad* tex_quad =
664 target_render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
665 const float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f};
666 tex_quad->SetNew(
667 shared_quad_state,
668 screen_space_rect,
669 opaque_screen_space_rect,
670 visible_screen_space_rect,
671 overhang_resource_id,
672 false,
673 gfx::PointF(
674 screen_space_rect.x() / overhang_resource_scaled_size.width(),
675 screen_space_rect.y() / overhang_resource_scaled_size.height()),
676 gfx::PointF(
677 screen_space_rect.right() / overhang_resource_scaled_size.width(),
678 screen_space_rect.bottom() /
679 overhang_resource_scaled_size.height()),
680 screen_background_color,
681 vertex_opacity,
682 false,
683 false);
684 }
685 } 642 }
686 643
687 DrawResult LayerTreeHostImpl::CalculateRenderPasses( 644 DrawResult LayerTreeHostImpl::CalculateRenderPasses(
688 FrameData* frame) { 645 FrameData* frame) {
689 DCHECK(frame->render_passes.empty()); 646 DCHECK(frame->render_passes.empty());
690 DCHECK(CanDraw()); 647 DCHECK(CanDraw());
691 DCHECK(active_tree_->root_layer()); 648 DCHECK(active_tree_->root_layer());
692 649
693 TrackDamageForAllSurfaces(active_tree_->root_layer(), 650 TrackDamageForAllSurfaces(active_tree_->root_layer(),
694 *frame->render_surface_layer_list); 651 *frame->render_surface_layer_list);
(...skipping 192 matching lines...)
887 DCHECK(quad->shared_quad_state); 844 DCHECK(quad->shared_quad_state);
888 DCHECK(frame->render_passes_by_id.find(render_pass->id) != 845 DCHECK(frame->render_passes_by_id.find(render_pass->id) !=
889 frame->render_passes_by_id.end()); 846 frame->render_passes_by_id.end());
890 } 847 }
891 #endif 848 #endif
892 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 849 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
893 850
894 if (!active_tree_->has_transparent_background()) { 851 if (!active_tree_->has_transparent_background()) {
895 frame->render_passes.back()->has_transparent_background = false; 852 frame->render_passes.back()->has_transparent_background = false;
896 AppendQuadsToFillScreen( 853 AppendQuadsToFillScreen(
897 ResourceIdForUIResource(overhang_ui_resource_id_),
898 gfx::ScaleSize(overhang_ui_resource_size_, device_scale_factor_),
899 active_tree_->RootScrollLayerDeviceViewportBounds(), 854 active_tree_->RootScrollLayerDeviceViewportBounds(),
900 frame->render_passes.back(), 855 frame->render_passes.back(),
901 active_tree_->root_layer(), 856 active_tree_->root_layer(),
902 active_tree_->background_color(), 857 active_tree_->background_color(),
903 occlusion_tracker); 858 occlusion_tracker);
904 } 859 }
905 860
906 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); 861 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame);
907 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); 862 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes);
908 863
(...skipping 1318 matching lines...)
2227 active_tree_->SetViewportSizeInvalid(); 2182 active_tree_->SetViewportSizeInvalid();
2228 2183
2229 device_viewport_size_ = device_viewport_size; 2184 device_viewport_size_ = device_viewport_size;
2230 2185
2231 UpdateViewportContainerSizes(); 2186 UpdateViewportContainerSizes();
2232 client_->OnCanDrawStateChanged(CanDraw()); 2187 client_->OnCanDrawStateChanged(CanDraw());
2233 SetFullRootLayerDamage(); 2188 SetFullRootLayerDamage();
2234 active_tree_->set_needs_update_draw_properties(); 2189 active_tree_->set_needs_update_draw_properties();
2235 } 2190 }
2236 2191
2237 void LayerTreeHostImpl::SetOverhangUIResource(
2238 UIResourceId overhang_ui_resource_id,
2239 const gfx::Size& overhang_ui_resource_size) {
2240 overhang_ui_resource_id_ = overhang_ui_resource_id;
2241 overhang_ui_resource_size_ = overhang_ui_resource_size;
2242 }
2243
2244 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { 2192 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) {
2245 if (device_scale_factor == device_scale_factor_) 2193 if (device_scale_factor == device_scale_factor_)
2246 return; 2194 return;
2247 device_scale_factor_ = device_scale_factor; 2195 device_scale_factor_ = device_scale_factor;
2248 2196
2249 SetFullRootLayerDamage(); 2197 SetFullRootLayerDamage();
2250 } 2198 }
2251 2199
2252 void LayerTreeHostImpl::SetPageScaleOnActiveTree(float page_scale_factor) { 2200 void LayerTreeHostImpl::SetPageScaleOnActiveTree(float page_scale_factor) {
2253 active_tree_->SetPageScaleOnActiveTree(page_scale_factor); 2201 active_tree_->SetPageScaleOnActiveTree(page_scale_factor);
(...skipping 845 matching lines...)
3099 gfx::ScrollOffset next_scroll = gfx::ScrollOffset( 3047 gfx::ScrollOffset next_scroll = gfx::ScrollOffset(
3100 page_scale_animation_->ScrollOffsetAtTime(monotonic_time)); 3048 page_scale_animation_->ScrollOffsetAtTime(monotonic_time));
3101 3049
3102 ScrollViewportInnerFirst(next_scroll.DeltaFrom(scroll_total)); 3050 ScrollViewportInnerFirst(next_scroll.DeltaFrom(scroll_total));
3103 SetNeedsRedraw(); 3051 SetNeedsRedraw();
3104 3052
3105 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { 3053 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
3106 page_scale_animation_ = nullptr; 3054 page_scale_animation_ = nullptr;
3107 client_->SetNeedsCommitOnImplThread(); 3055 client_->SetNeedsCommitOnImplThread();
3108 client_->RenewTreePriority(); 3056 client_->RenewTreePriority();
3057 client_->DidCompletePageScaleAnimationOnImplThread();
3109 } else { 3058 } else {
3110 SetNeedsAnimate(); 3059 SetNeedsAnimate();
3111 } 3060 }
3112 } 3061 }
3113 3062
3114 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { 3063 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
3115 if (!top_controls_manager_ || !top_controls_manager_->animation()) 3064 if (!top_controls_manager_ || !top_controls_manager_->animation())
3116 return; 3065 return;
3117 3066
3118 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); 3067 gfx::Vector2dF scroll = top_controls_manager_->Animate(time);
(...skipping 388 matching lines...)
3507 } 3456 }
3508 3457
3509 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3458 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3510 std::vector<PictureLayerImpl*>::iterator it = 3459 std::vector<PictureLayerImpl*>::iterator it =
3511 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3460 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3512 DCHECK(it != picture_layers_.end()); 3461 DCHECK(it != picture_layers_.end());
3513 picture_layers_.erase(it); 3462 picture_layers_.erase(it);
3514 } 3463 }
3515 3464
3516 } // namespace cc 3465 } // namespace cc
OLDNEW

Powered by Google App Engine