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...) 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...) 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...) 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...) 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...) 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...) 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 |