| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 |
| OLD | NEW |