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

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

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 #include "cc/resources/software_rasterizer.h" 61 #include "cc/resources/software_rasterizer.h"
62 #include "cc/resources/texture_mailbox_deleter.h" 62 #include "cc/resources/texture_mailbox_deleter.h"
63 #include "cc/resources/tile_task_worker_pool.h" 63 #include "cc/resources/tile_task_worker_pool.h"
64 #include "cc/resources/ui_resource_bitmap.h" 64 #include "cc/resources/ui_resource_bitmap.h"
65 #include "cc/resources/zero_copy_tile_task_worker_pool.h" 65 #include "cc/resources/zero_copy_tile_task_worker_pool.h"
66 #include "cc/scheduler/delay_based_time_source.h" 66 #include "cc/scheduler/delay_based_time_source.h"
67 #include "cc/trees/damage_tracker.h" 67 #include "cc/trees/damage_tracker.h"
68 #include "cc/trees/layer_tree_host.h" 68 #include "cc/trees/layer_tree_host.h"
69 #include "cc/trees/layer_tree_host_common.h" 69 #include "cc/trees/layer_tree_host_common.h"
70 #include "cc/trees/layer_tree_impl.h" 70 #include "cc/trees/layer_tree_impl.h"
71 #include "cc/trees/occlusion_tracker.h"
72 #include "cc/trees/single_thread_proxy.h" 71 #include "cc/trees/single_thread_proxy.h"
73 #include "cc/trees/tree_synchronizer.h" 72 #include "cc/trees/tree_synchronizer.h"
74 #include "gpu/command_buffer/client/gles2_interface.h" 73 #include "gpu/command_buffer/client/gles2_interface.h"
75 #include "gpu/GLES2/gl2extchromium.h" 74 #include "gpu/GLES2/gl2extchromium.h"
76 #include "ui/gfx/frame_time.h" 75 #include "ui/gfx/frame_time.h"
77 #include "ui/gfx/geometry/rect_conversions.h" 76 #include "ui/gfx/geometry/rect_conversions.h"
78 #include "ui/gfx/geometry/size_conversions.h" 77 #include "ui/gfx/geometry/size_conversions.h"
79 #include "ui/gfx/geometry/vector2d_conversions.h" 78 #include "ui/gfx/geometry/vector2d_conversions.h"
80 79
81 namespace cc { 80 namespace cc {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 is_likely_to_require_a_draw_(false), 227 is_likely_to_require_a_draw_(false),
229 frame_timing_tracker_(FrameTimingTracker::Create()) { 228 frame_timing_tracker_(FrameTimingTracker::Create()) {
230 DCHECK(proxy_->IsImplThread()); 229 DCHECK(proxy_->IsImplThread());
231 DidVisibilityChange(this, visible_); 230 DidVisibilityChange(this, visible_);
232 animation_registrar_->set_supports_scroll_animations( 231 animation_registrar_->set_supports_scroll_animations(
233 proxy_->SupportsImplScrolling()); 232 proxy_->SupportsImplScrolling());
234 233
235 SetDebugState(settings.initial_debug_state); 234 SetDebugState(settings.initial_debug_state);
236 235
237 // LTHI always has an active tree. 236 // LTHI always has an active tree.
238 active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), 237 active_tree_ =
239 new SyncedElasticOverscroll); 238 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(),
239 new SyncedTopControls, new SyncedElasticOverscroll);
240 240
241 TRACE_EVENT_OBJECT_CREATED_WITH_ID( 241 TRACE_EVENT_OBJECT_CREATED_WITH_ID(
242 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_); 242 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_);
243 243
244 if (settings.calculate_top_controls_position) { 244 if (settings.calculate_top_controls_position) {
245 top_controls_manager_ = 245 top_controls_manager_ =
246 TopControlsManager::Create(this, 246 TopControlsManager::Create(this,
247 settings.top_controls_show_threshold, 247 settings.top_controls_show_threshold,
248 settings.top_controls_hide_threshold); 248 settings.top_controls_hide_threshold);
249 } 249 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 288
289 void LayerTreeHostImpl::BeginCommit() { 289 void LayerTreeHostImpl::BeginCommit() {
290 TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit"); 290 TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit");
291 291
292 // Ensure all textures are returned so partial texture updates can happen 292 // Ensure all textures are returned so partial texture updates can happen
293 // during the commit. Impl-side-painting doesn't upload during commits, so 293 // during the commit. Impl-side-painting doesn't upload during commits, so
294 // is unaffected. 294 // is unaffected.
295 if (!settings_.impl_side_painting && output_surface_) 295 if (!settings_.impl_side_painting && output_surface_)
296 output_surface_->ForceReclaimResources(); 296 output_surface_->ForceReclaimResources();
297 297
298 if (UsePendingTreeForSync()) 298 if (settings_.impl_side_painting && !proxy_->CommitToActiveTree())
299 CreatePendingTree(); 299 CreatePendingTree();
300 } 300 }
301 301
302 void LayerTreeHostImpl::CommitComplete() { 302 void LayerTreeHostImpl::CommitComplete() {
303 TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); 303 TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete");
304 304
305 sync_tree()->set_needs_update_draw_properties(); 305 sync_tree()->set_needs_update_draw_properties();
306 306
307 if (settings_.impl_side_painting) { 307 if (settings_.impl_side_painting) {
308 // Impl-side painting needs an update immediately post-commit to have the 308 // Impl-side painting needs an update immediately post-commit to have the
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 render_surface->layer_list(), 541 render_surface->layer_list(),
542 render_surface_layer->id(), 542 render_surface_layer->id(),
543 render_surface->SurfacePropertyChangedOnlyFromDescendant(), 543 render_surface->SurfacePropertyChangedOnlyFromDescendant(),
544 render_surface->content_rect(), 544 render_surface->content_rect(),
545 render_surface_layer->mask_layer(), 545 render_surface_layer->mask_layer(),
546 render_surface_layer->filters()); 546 render_surface_layer->filters());
547 } 547 }
548 } 548 }
549 549
550 void LayerTreeHostImpl::FrameData::AsValueInto( 550 void LayerTreeHostImpl::FrameData::AsValueInto(
551 base::debug::TracedValue* value) const { 551 base::trace_event::TracedValue* value) const {
552 value->SetBoolean("has_no_damage", has_no_damage); 552 value->SetBoolean("has_no_damage", has_no_damage);
553 553
554 // Quad data can be quite large, so only dump render passes if we select 554 // Quad data can be quite large, so only dump render passes if we select
555 // cc.debug.quads. 555 // cc.debug.quads.
556 bool quads_enabled; 556 bool quads_enabled;
557 TRACE_EVENT_CATEGORY_GROUP_ENABLED( 557 TRACE_EVENT_CATEGORY_GROUP_ENABLED(
558 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), &quads_enabled); 558 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), &quads_enabled);
559 if (quads_enabled) { 559 if (quads_enabled) {
560 value->BeginArray("render_passes"); 560 value->BeginArray("render_passes");
561 for (size_t i = 0; i < render_passes.size(); ++i) { 561 for (size_t i = 0; i < render_passes.size(); ++i) {
(...skipping 19 matching lines...) Expand all
581 } else { 581 } else {
582 DCHECK_EQ(!output_surface_->software_device(), 582 DCHECK_EQ(!output_surface_->software_device(),
583 output_surface_->capabilities().delegated_rendering && 583 output_surface_->capabilities().delegated_rendering &&
584 !output_surface_->capabilities().deferred_gl_initialization) 584 !output_surface_->capabilities().deferred_gl_initialization)
585 << output_surface_->capabilities().delegated_rendering << " " 585 << output_surface_->capabilities().delegated_rendering << " "
586 << output_surface_->capabilities().deferred_gl_initialization; 586 << output_surface_->capabilities().deferred_gl_initialization;
587 return DRAW_MODE_SOFTWARE; 587 return DRAW_MODE_SOFTWARE;
588 } 588 }
589 } 589 }
590 590
591 static void AppendQuadsForLayer(
592 RenderPass* target_render_pass,
593 LayerImpl* layer,
594 const OcclusionTracker<LayerImpl>& occlusion_tracker,
595 AppendQuadsData* append_quads_data) {
596 layer->AppendQuads(
597 target_render_pass,
598 occlusion_tracker.GetCurrentOcclusionForLayer(layer->draw_transform()),
599 append_quads_data);
600 }
601
602 static void AppendQuadsForRenderSurfaceLayer( 591 static void AppendQuadsForRenderSurfaceLayer(
603 RenderPass* target_render_pass, 592 RenderPass* target_render_pass,
604 LayerImpl* layer, 593 LayerImpl* layer,
605 const RenderPass* contributing_render_pass, 594 const RenderPass* contributing_render_pass,
606 const OcclusionTracker<LayerImpl>& occlusion_tracker,
607 AppendQuadsData* append_quads_data) { 595 AppendQuadsData* append_quads_data) {
608 bool is_replica = false; 596 RenderSurfaceImpl* surface = layer->render_surface();
609 layer->render_surface()->AppendQuads(target_render_pass, 597 const gfx::Transform& draw_transform = surface->draw_transform();
610 occlusion_tracker, 598 const Occlusion& occlusion = surface->occlusion_in_content_space();
611 append_quads_data, 599 SkColor debug_border_color = surface->GetDebugBorderColor();
612 is_replica, 600 float debug_border_width = surface->GetDebugBorderWidth();
613 contributing_render_pass->id); 601 LayerImpl* mask_layer = layer->mask_layer();
602
603 surface->AppendQuads(target_render_pass, draw_transform, occlusion,
604 debug_border_color, debug_border_width, mask_layer,
605 append_quads_data, contributing_render_pass->id);
614 606
615 // Add replica after the surface so that it appears below the surface. 607 // Add replica after the surface so that it appears below the surface.
616 if (layer->has_replica()) { 608 if (layer->has_replica()) {
617 is_replica = true; 609 const gfx::Transform& replica_draw_transform =
618 layer->render_surface()->AppendQuads(target_render_pass, 610 surface->replica_draw_transform();
619 occlusion_tracker, 611 Occlusion replica_occlusion = occlusion.GetOcclusionWithGivenDrawTransform(
620 append_quads_data, 612 surface->replica_draw_transform());
621 is_replica, 613 SkColor replica_debug_border_color = surface->GetReplicaDebugBorderColor();
622 contributing_render_pass->id); 614 float replica_debug_border_width = surface->GetReplicaDebugBorderWidth();
615 // TODO(danakj): By using the same RenderSurfaceImpl for both the
616 // content and its reflection, it's currently not possible to apply a
617 // separate mask to the reflection layer or correctly handle opacity in
618 // reflections (opacity must be applied after drawing both the layer and its
619 // reflection). The solution is to introduce yet another RenderSurfaceImpl
620 // to draw the layer and its reflection in. For now we only apply a separate
621 // reflection mask if the contents don't have a mask of their own.
622 LayerImpl* replica_mask_layer =
623 mask_layer ? mask_layer : layer->replica_layer()->mask_layer();
624
625 surface->AppendQuads(target_render_pass, replica_draw_transform,
626 replica_occlusion, replica_debug_border_color,
627 replica_debug_border_width, replica_mask_layer,
628 append_quads_data, contributing_render_pass->id);
623 } 629 }
624 } 630 }
625 631
626 static void AppendQuadsToFillScreen( 632 static void AppendQuadsToFillScreen(const gfx::Rect& root_scroll_layer_rect,
627 const gfx::Rect& root_scroll_layer_rect, 633 RenderPass* target_render_pass,
628 RenderPass* target_render_pass, 634 LayerImpl* root_layer,
629 LayerImpl* root_layer, 635 SkColor screen_background_color,
630 SkColor screen_background_color, 636 const Region& fill_region) {
631 const OcclusionTracker<LayerImpl>& occlusion_tracker) {
632 if (!root_layer || !SkColorGetA(screen_background_color)) 637 if (!root_layer || !SkColorGetA(screen_background_color))
633 return; 638 return;
634
635 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen();
636 if (fill_region.IsEmpty()) 639 if (fill_region.IsEmpty())
637 return; 640 return;
638 641
639 // Manually create the quad state for the gutter quads, as the root layer 642 // Manually create the quad state for the gutter quads, as the root layer
640 // doesn't have any bounds and so can't generate this itself. 643 // doesn't have any bounds and so can't generate this itself.
641 // TODO(danakj): Make the gutter quads generated by the solid color layer 644 // TODO(danakj): Make the gutter quads generated by the solid color layer
642 // (make it smarter about generating quads to fill unoccluded areas). 645 // (make it smarter about generating quads to fill unoccluded areas).
643 646
644 gfx::Rect root_target_rect = root_layer->render_surface()->content_rect(); 647 gfx::Rect root_target_rect = root_layer->render_surface()->content_rect();
645 float opacity = 1.f; 648 float opacity = 1.f;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 // entire root surface. This will disable partial-swap/scissor optimizations 732 // entire root surface. This will disable partial-swap/scissor optimizations
730 // that would prevent the HUD from updating, since the HUD does not cause 733 // that would prevent the HUD from updating, since the HUD does not cause
731 // damage itself, to prevent it from messing with damage visualizations. Since 734 // damage itself, to prevent it from messing with damage visualizations. Since
732 // damage visualizations are done off the LayerImpls and RenderSurfaceImpls, 735 // damage visualizations are done off the LayerImpls and RenderSurfaceImpls,
733 // changing the RenderPass does not affect them. 736 // changing the RenderPass does not affect them.
734 if (active_tree_->hud_layer()) { 737 if (active_tree_->hud_layer()) {
735 RenderPass* root_pass = frame->render_passes.back(); 738 RenderPass* root_pass = frame->render_passes.back();
736 root_pass->damage_rect = root_pass->output_rect; 739 root_pass->damage_rect = root_pass->output_rect;
737 } 740 }
738 741
739 OcclusionTracker<LayerImpl> occlusion_tracker( 742 // Grab this region here before iterating layers. Taking copy requests from
740 active_tree_->root_layer()->render_surface()->content_rect()); 743 // the layers while constructing the render passes will dirty the render
741 occlusion_tracker.set_minimum_tracking_size( 744 // surface layer list and this unoccluded region, flipping the dirty bit to
742 settings_.minimum_occlusion_tracking_size); 745 // true, and making us able to query for it without doing
743 746 // UpdateDrawProperties again. The value inside the Region is not actually
744 if (debug_state_.show_occluding_rects) { 747 // changed until UpdateDrawProperties happens, so a reference to it is safe.
745 occlusion_tracker.set_occluding_screen_space_rects_container( 748 const Region& unoccluded_screen_space_region =
746 &frame->occluding_screen_space_rects); 749 active_tree_->UnoccludedScreenSpaceRegion();
747 }
748 if (debug_state_.show_non_occluding_rects) {
749 occlusion_tracker.set_non_occluding_screen_space_rects_container(
750 &frame->non_occluding_screen_space_rects);
751 }
752
753 // Add quads to the Render passes in front-to-back order to allow for testing
754 // occlusion and performing culling during the tree walk.
755 typedef LayerIterator<LayerImpl> LayerIteratorType;
756 750
757 // Typically when we are missing a texture and use a checkerboard quad, we 751 // Typically when we are missing a texture and use a checkerboard quad, we
758 // still draw the frame. However when the layer being checkerboarded is moving 752 // still draw the frame. However when the layer being checkerboarded is moving
759 // due to an impl-animation, we drop the frame to avoid flashing due to the 753 // due to an impl-animation, we drop the frame to avoid flashing due to the
760 // texture suddenly appearing in the future. 754 // texture suddenly appearing in the future.
761 DrawResult draw_result = DRAW_SUCCESS; 755 DrawResult draw_result = DRAW_SUCCESS;
762 // When we have a copy request for a layer, we need to draw no matter 756 // When we have a copy request for a layer, we need to draw no matter
763 // what, as the layer may disappear after this frame. 757 // what, as the layer may disappear after this frame.
764 bool have_copy_request = false; 758 bool have_copy_request = false;
765 759
766 int layers_drawn = 0; 760 int layers_drawn = 0;
767 761
768 const DrawMode draw_mode = GetDrawMode(); 762 const DrawMode draw_mode = GetDrawMode();
769 763
770 int num_missing_tiles = 0; 764 int num_missing_tiles = 0;
771 int num_incomplete_tiles = 0; 765 int num_incomplete_tiles = 0;
772 766
773 LayerIteratorType end = 767 auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list);
774 LayerIteratorType::End(frame->render_surface_layer_list); 768 for (auto it =
775 for (LayerIteratorType it = 769 LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list);
776 LayerIteratorType::Begin(frame->render_surface_layer_list); 770 it != end; ++it) {
777 it != end;
778 ++it) {
779 RenderPassId target_render_pass_id = 771 RenderPassId target_render_pass_id =
780 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); 772 it.target_render_surface_layer()->render_surface()->GetRenderPassId();
781 RenderPass* target_render_pass = 773 RenderPass* target_render_pass =
782 frame->render_passes_by_id[target_render_pass_id]; 774 frame->render_passes_by_id[target_render_pass_id];
783 775
784 occlusion_tracker.EnterLayer(it);
785
786 AppendQuadsData append_quads_data; 776 AppendQuadsData append_quads_data;
787 777
788 if (it.represents_target_render_surface()) { 778 if (it.represents_target_render_surface()) {
789 if (it->HasCopyRequest()) { 779 if (it->HasCopyRequest()) {
790 have_copy_request = true; 780 have_copy_request = true;
791 it->TakeCopyRequestsAndTransformToTarget( 781 it->TakeCopyRequestsAndTransformToTarget(
792 &target_render_pass->copy_requests); 782 &target_render_pass->copy_requests);
793 } 783 }
794 } else if (it.represents_contributing_render_surface() && 784 } else if (it.represents_contributing_render_surface() &&
795 it->render_surface()->contributes_to_drawn_surface()) { 785 it->render_surface()->contributes_to_drawn_surface()) {
796 RenderPassId contributing_render_pass_id = 786 RenderPassId contributing_render_pass_id =
797 it->render_surface()->GetRenderPassId(); 787 it->render_surface()->GetRenderPassId();
798 RenderPass* contributing_render_pass = 788 RenderPass* contributing_render_pass =
799 frame->render_passes_by_id[contributing_render_pass_id]; 789 frame->render_passes_by_id[contributing_render_pass_id];
800 AppendQuadsForRenderSurfaceLayer(target_render_pass, 790 AppendQuadsForRenderSurfaceLayer(target_render_pass,
801 *it, 791 *it,
802 contributing_render_pass, 792 contributing_render_pass,
803 occlusion_tracker,
804 &append_quads_data); 793 &append_quads_data);
805 } else if (it.represents_itself() && 794 } else if (it.represents_itself() &&
806 !it->visible_content_rect().IsEmpty()) { 795 !it->visible_content_rect().IsEmpty()) {
807 bool occluded = 796 bool occluded =
808 occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform()) 797 it->draw_properties().occlusion_in_content_space.IsOccluded(
809 .IsOccluded(it->visible_content_rect()); 798 it->visible_content_rect());
810 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { 799 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) {
811 DCHECK_EQ(active_tree_, it->layer_tree_impl()); 800 DCHECK_EQ(active_tree_, it->layer_tree_impl());
812 801
813 frame->will_draw_layers.push_back(*it); 802 frame->will_draw_layers.push_back(*it);
814 803
815 if (it->HasContributingDelegatedRenderPasses()) { 804 if (it->HasContributingDelegatedRenderPasses()) {
816 RenderPassId contributing_render_pass_id = 805 RenderPassId contributing_render_pass_id =
817 it->FirstContributingRenderPassId(); 806 it->FirstContributingRenderPassId();
818 while (frame->render_passes_by_id.find(contributing_render_pass_id) != 807 while (frame->render_passes_by_id.find(contributing_render_pass_id) !=
819 frame->render_passes_by_id.end()) { 808 frame->render_passes_by_id.end()) {
820 RenderPass* render_pass = 809 RenderPass* render_pass =
821 frame->render_passes_by_id[contributing_render_pass_id]; 810 frame->render_passes_by_id[contributing_render_pass_id];
822 811
823 AppendQuadsForLayer(render_pass, 812 it->AppendQuads(render_pass, &append_quads_data);
824 *it,
825 occlusion_tracker,
826 &append_quads_data);
827 813
828 contributing_render_pass_id = 814 contributing_render_pass_id =
829 it->NextContributingRenderPassId(contributing_render_pass_id); 815 it->NextContributingRenderPassId(contributing_render_pass_id);
830 } 816 }
831 } 817 }
832 818
833 AppendQuadsForLayer(target_render_pass, 819 it->AppendQuads(target_render_pass, &append_quads_data);
834 *it,
835 occlusion_tracker,
836 &append_quads_data);
837 820
838 // For layers that represent themselves, add composite frame timing 821 // For layers that represent themselves, add composite frame timing
839 // requests if the visible rect intersects the requested rect. 822 // requests if the visible rect intersects the requested rect.
840 for (const auto& request : it->frame_timing_requests()) { 823 for (const auto& request : it->frame_timing_requests()) {
841 const gfx::Rect& request_content_rect = 824 const gfx::Rect& request_content_rect =
842 it->LayerRectToContentRect(request.rect()); 825 it->LayerRectToContentRect(request.rect());
843 if (request_content_rect.Intersects(it->visible_content_rect())) { 826 if (request_content_rect.Intersects(it->visible_content_rect())) {
844 frame->composite_events.push_back( 827 frame->composite_events.push_back(
845 FrameTimingTracker::FrameAndRectIds( 828 FrameTimingTracker::FrameAndRectIds(
846 active_tree_->source_frame_number(), request.id())); 829 active_tree_->source_frame_number(), request.id()));
(...skipping 18 matching lines...) Expand all
865 it->draw_transform_is_animating(); 848 it->draw_transform_is_animating();
866 if (layer_has_animating_transform) 849 if (layer_has_animating_transform)
867 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 850 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
868 } 851 }
869 852
870 if (append_quads_data.num_incomplete_tiles || 853 if (append_quads_data.num_incomplete_tiles ||
871 append_quads_data.num_missing_tiles) { 854 append_quads_data.num_missing_tiles) {
872 if (RequiresHighResToDraw()) 855 if (RequiresHighResToDraw())
873 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; 856 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
874 } 857 }
875
876 occlusion_tracker.LeaveLayer(it);
877 } 858 }
878 859
879 if (have_copy_request || 860 if (have_copy_request ||
880 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 861 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
881 draw_result = DRAW_SUCCESS; 862 draw_result = DRAW_SUCCESS;
882 863
883 #if DCHECK_IS_ON() 864 #if DCHECK_IS_ON()
884 for (const auto& render_pass : frame->render_passes) { 865 for (const auto& render_pass : frame->render_passes) {
885 for (const auto& quad : render_pass->quad_list) 866 for (const auto& quad : render_pass->quad_list)
886 DCHECK(quad->shared_quad_state); 867 DCHECK(quad->shared_quad_state);
887 DCHECK(frame->render_passes_by_id.find(render_pass->id) != 868 DCHECK(frame->render_passes_by_id.find(render_pass->id) !=
888 frame->render_passes_by_id.end()); 869 frame->render_passes_by_id.end());
889 } 870 }
890 #endif 871 #endif
891 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 872 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
892 873
893 if (!active_tree_->has_transparent_background()) { 874 if (!active_tree_->has_transparent_background()) {
894 frame->render_passes.back()->has_transparent_background = false; 875 frame->render_passes.back()->has_transparent_background = false;
895 AppendQuadsToFillScreen( 876 AppendQuadsToFillScreen(
896 active_tree_->RootScrollLayerDeviceViewportBounds(), 877 active_tree_->RootScrollLayerDeviceViewportBounds(),
897 frame->render_passes.back(), 878 frame->render_passes.back(), active_tree_->root_layer(),
898 active_tree_->root_layer(), 879 active_tree_->background_color(), unoccluded_screen_space_region);
899 active_tree_->background_color(),
900 occlusion_tracker);
901 } 880 }
902 881
903 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); 882 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame);
904 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); 883 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes);
905 884
906 // Any copy requests left in the tree are not going to get serviced, and 885 // Any copy requests left in the tree are not going to get serviced, and
907 // should be aborted. 886 // should be aborted.
908 ScopedPtrVector<CopyOutputRequest> requests_to_abort; 887 ScopedPtrVector<CopyOutputRequest> requests_to_abort;
909 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { 888 while (!active_tree_->LayersWithCopyOutputRequest().empty()) {
910 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); 889 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back();
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1106 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); 1085 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0));
1107 } 1086 }
1108 1087
1109 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { 1088 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) {
1110 NOTREACHED(); 1089 NOTREACHED();
1111 } 1090 }
1112 1091
1113 void LayerTreeHostImpl::ResetTreesForTesting() { 1092 void LayerTreeHostImpl::ResetTreesForTesting() {
1114 if (active_tree_) 1093 if (active_tree_)
1115 active_tree_->DetachLayerTree(); 1094 active_tree_->DetachLayerTree();
1116 active_tree_ = LayerTreeImpl::create(this, active_tree()->page_scale_factor(), 1095 active_tree_ =
1117 active_tree()->elastic_overscroll()); 1096 LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
1097 active_tree()->top_controls_shown_ratio(),
1098 active_tree()->elastic_overscroll());
1118 if (pending_tree_) 1099 if (pending_tree_)
1119 pending_tree_->DetachLayerTree(); 1100 pending_tree_->DetachLayerTree();
1120 pending_tree_ = nullptr; 1101 pending_tree_ = nullptr;
1121 if (recycle_tree_) 1102 if (recycle_tree_)
1122 recycle_tree_->DetachLayerTree(); 1103 recycle_tree_->DetachLayerTree();
1123 recycle_tree_ = nullptr; 1104 recycle_tree_ = nullptr;
1124 } 1105 }
1125 1106
1126 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( 1107 void LayerTreeHostImpl::EnforceManagedMemoryPolicy(
1127 const ManagedMemoryPolicy& policy) { 1108 const ManagedMemoryPolicy& policy) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 DCHECK(settings_.impl_side_painting); 1180 DCHECK(settings_.impl_side_painting);
1200 // Mark priorities as dirty and schedule a PrepareTiles(). 1181 // Mark priorities as dirty and schedule a PrepareTiles().
1201 tile_priorities_dirty_ = true; 1182 tile_priorities_dirty_ = true;
1202 client_->SetNeedsPrepareTilesOnImplThread(); 1183 client_->SetNeedsPrepareTilesOnImplThread();
1203 } 1184 }
1204 1185
1205 void LayerTreeHostImpl::GetPictureLayerImplPairs( 1186 void LayerTreeHostImpl::GetPictureLayerImplPairs(
1206 std::vector<PictureLayerImpl::Pair>* layer_pairs, 1187 std::vector<PictureLayerImpl::Pair>* layer_pairs,
1207 bool need_valid_tile_priorities) const { 1188 bool need_valid_tile_priorities) const {
1208 DCHECK(layer_pairs->empty()); 1189 DCHECK(layer_pairs->empty());
1209 for (std::vector<PictureLayerImpl*>::const_iterator it =
1210 picture_layers_.begin();
1211 it != picture_layers_.end();
1212 ++it) {
1213 PictureLayerImpl* layer = *it;
1214 1190
1215 if (!layer->IsOnActiveOrPendingTree() || 1191 for (auto& layer : active_tree_->picture_layers()) {
1216 (need_valid_tile_priorities && !layer->HasValidTilePriorities())) 1192 if (need_valid_tile_priorities && !layer->HasValidTilePriorities())
1217 continue; 1193 continue;
1218
1219 PictureLayerImpl* twin_layer = layer->GetPendingOrActiveTwinLayer(); 1194 PictureLayerImpl* twin_layer = layer->GetPendingOrActiveTwinLayer();
1220
1221 // Ignore the twin layer when tile priorities are invalid. 1195 // Ignore the twin layer when tile priorities are invalid.
1222 if (need_valid_tile_priorities && twin_layer && 1196 if (need_valid_tile_priorities && twin_layer &&
1223 !twin_layer->HasValidTilePriorities()) 1197 !twin_layer->HasValidTilePriorities()) {
1224 twin_layer = NULL; 1198 twin_layer = nullptr;
1199 }
1200 layer_pairs->push_back(PictureLayerImpl::Pair(layer, twin_layer));
1201 }
1225 1202
1226 // If the current tree is ACTIVE_TREE, then always generate a layer_pair. 1203 if (pending_tree_) {
1227 // If current tree is PENDING_TREE, then only generate a layer_pair if 1204 for (auto& layer : pending_tree_->picture_layers()) {
1228 // there is no twin layer. 1205 if (need_valid_tile_priorities && !layer->HasValidTilePriorities())
1229 if (layer->GetTree() == ACTIVE_TREE) { 1206 continue;
1230 DCHECK_IMPLIES(twin_layer, twin_layer->GetTree() == PENDING_TREE); 1207 if (PictureLayerImpl* twin_layer = layer->GetPendingOrActiveTwinLayer()) {
1231 layer_pairs->push_back(PictureLayerImpl::Pair(layer, twin_layer)); 1208 if (!need_valid_tile_priorities ||
1232 } else if (!twin_layer) { 1209 twin_layer->HasValidTilePriorities()) {
1233 DCHECK(layer->GetTree() == PENDING_TREE); 1210 // Already captured from the active tree.
1234 layer_pairs->push_back(PictureLayerImpl::Pair(NULL, layer)); 1211 continue;
1212 }
1213 }
1214 layer_pairs->push_back(PictureLayerImpl::Pair(nullptr, layer));
1235 } 1215 }
1236 } 1216 }
1237 } 1217 }
1238 1218
1239 scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue( 1219 scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue(
1240 TreePriority tree_priority, 1220 TreePriority tree_priority,
1241 RasterTilePriorityQueue::Type type) { 1221 RasterTilePriorityQueue::Type type) {
1242 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue"); 1222 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue");
1243 picture_layer_pairs_.clear(); 1223 picture_layer_pairs_.clear();
1244 GetPictureLayerImplPairs(&picture_layer_pairs_, true); 1224 GetPictureLayerImplPairs(&picture_layer_pairs_, true);
(...skipping 13 matching lines...) Expand all
1258 1238
1259 void LayerTreeHostImpl::SetIsLikelyToRequireADraw( 1239 void LayerTreeHostImpl::SetIsLikelyToRequireADraw(
1260 bool is_likely_to_require_a_draw) { 1240 bool is_likely_to_require_a_draw) {
1261 // Proactively tell the scheduler that we expect to draw within each vsync 1241 // Proactively tell the scheduler that we expect to draw within each vsync
1262 // until we get all the tiles ready to draw. If we happen to miss a required 1242 // until we get all the tiles ready to draw. If we happen to miss a required
1263 // for draw tile here, then we will miss telling the scheduler each frame that 1243 // for draw tile here, then we will miss telling the scheduler each frame that
1264 // we intend to draw so it may make worse scheduling decisions. 1244 // we intend to draw so it may make worse scheduling decisions.
1265 is_likely_to_require_a_draw_ = is_likely_to_require_a_draw; 1245 is_likely_to_require_a_draw_ = is_likely_to_require_a_draw;
1266 } 1246 }
1267 1247
1268 const std::vector<PictureLayerImpl*>& LayerTreeHostImpl::GetPictureLayers()
1269 const {
1270 return picture_layers_;
1271 }
1272
1273 void LayerTreeHostImpl::NotifyReadyToActivate() { 1248 void LayerTreeHostImpl::NotifyReadyToActivate() {
1274 client_->NotifyReadyToActivate(); 1249 client_->NotifyReadyToActivate();
1275 } 1250 }
1276 1251
1277 void LayerTreeHostImpl::NotifyReadyToDraw() { 1252 void LayerTreeHostImpl::NotifyReadyToDraw() {
1278 // Tiles that are ready will cause NotifyTileStateChanged() to be called so we 1253 // Tiles that are ready will cause NotifyTileStateChanged() to be called so we
1279 // don't need to schedule a draw here. Just stop WillBeginImplFrame() from 1254 // don't need to schedule a draw here. Just stop WillBeginImplFrame() from
1280 // causing optimistic requests to draw a frame. 1255 // causing optimistic requests to draw a frame.
1281 is_likely_to_require_a_draw_ = false; 1256 is_likely_to_require_a_draw_ = false;
1282 1257
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1445 if (top_controls_manager_) { 1420 if (top_controls_manager_) {
1446 metadata.location_bar_offset = 1421 metadata.location_bar_offset =
1447 gfx::Vector2dF(0.f, top_controls_manager_->ControlsTopOffset()); 1422 gfx::Vector2dF(0.f, top_controls_manager_->ControlsTopOffset());
1448 metadata.location_bar_content_translation = 1423 metadata.location_bar_content_translation =
1449 gfx::Vector2dF(0.f, top_controls_manager_->ContentTopOffset()); 1424 gfx::Vector2dF(0.f, top_controls_manager_->ContentTopOffset());
1450 } 1425 }
1451 1426
1452 active_tree_->GetViewportSelection(&metadata.selection_start, 1427 active_tree_->GetViewportSelection(&metadata.selection_start,
1453 &metadata.selection_end); 1428 &metadata.selection_end);
1454 1429
1430 LayerImpl* root_layer_for_overflow = OuterViewportScrollLayer()
1431 ? OuterViewportScrollLayer()
1432 : InnerViewportScrollLayer();
1433 if (root_layer_for_overflow) {
1434 metadata.root_overflow_x_hidden =
1435 !root_layer_for_overflow->user_scrollable_horizontal();
1436 metadata.root_overflow_y_hidden =
1437 !root_layer_for_overflow->user_scrollable_vertical();
1438 }
1439
1455 if (!InnerViewportScrollLayer()) 1440 if (!InnerViewportScrollLayer())
1456 return metadata; 1441 return metadata;
1457 1442
1458 // TODO(miletus) : Change the metadata to hold ScrollOffset. 1443 // TODO(miletus) : Change the metadata to hold ScrollOffset.
1459 metadata.root_scroll_offset = gfx::ScrollOffsetToVector2dF( 1444 metadata.root_scroll_offset = gfx::ScrollOffsetToVector2dF(
1460 active_tree_->TotalScrollOffset()); 1445 active_tree_->TotalScrollOffset());
1461 1446
1462 return metadata; 1447 return metadata;
1463 } 1448 }
1464 1449
(...skipping 27 matching lines...) Expand all
1492 if (tile_manager_) { 1477 if (tile_manager_) {
1493 memory_history_->SaveEntry( 1478 memory_history_->SaveEntry(
1494 tile_manager_->memory_stats_from_last_assign()); 1479 tile_manager_->memory_stats_from_last_assign());
1495 } 1480 }
1496 1481
1497 if (debug_state_.ShowHudRects()) { 1482 if (debug_state_.ShowHudRects()) {
1498 debug_rect_history_->SaveDebugRectsForCurrentFrame( 1483 debug_rect_history_->SaveDebugRectsForCurrentFrame(
1499 active_tree_->root_layer(), 1484 active_tree_->root_layer(),
1500 active_tree_->hud_layer(), 1485 active_tree_->hud_layer(),
1501 *frame->render_surface_layer_list, 1486 *frame->render_surface_layer_list,
1502 frame->occluding_screen_space_rects,
1503 frame->non_occluding_screen_space_rects,
1504 debug_state_); 1487 debug_state_);
1505 } 1488 }
1506 1489
1507 if (!settings_.impl_side_painting && debug_state_.continuous_painting) { 1490 if (!settings_.impl_side_painting && debug_state_.continuous_painting) {
1508 const RenderingStats& stats = 1491 const RenderingStats& stats =
1509 rendering_stats_instrumentation_->GetRenderingStats(); 1492 rendering_stats_instrumentation_->GetRenderingStats();
1510 paint_time_counter_->SavePaintTime( 1493 paint_time_counter_->SavePaintTime(
1511 stats.begin_main_frame_to_commit_duration.GetLastTimeDelta()); 1494 stats.begin_main_frame_to_commit_duration.GetLastTimeDelta());
1512 } 1495 }
1513 1496
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1671 1654
1672 ViewportAnchor anchor(InnerViewportScrollLayer(), 1655 ViewportAnchor anchor(InnerViewportScrollLayer(),
1673 OuterViewportScrollLayer()); 1656 OuterViewportScrollLayer());
1674 1657
1675 // Adjust the inner viewport by shrinking/expanding the container to account 1658 // Adjust the inner viewport by shrinking/expanding the container to account
1676 // for the change in top controls height since the last Resize from Blink. 1659 // for the change in top controls height since the last Resize from Blink.
1677 float top_controls_layout_height = 1660 float top_controls_layout_height =
1678 active_tree_->top_controls_shrink_blink_size() 1661 active_tree_->top_controls_shrink_blink_size()
1679 ? active_tree_->top_controls_height() 1662 ? active_tree_->top_controls_height()
1680 : 0.f; 1663 : 0.f;
1681 inner_container->SetBoundsDelta( 1664 inner_container->SetBoundsDelta(gfx::Vector2dF(
1682 gfx::Vector2dF(0, top_controls_layout_height - 1665 0,
1683 active_tree_->total_top_controls_content_offset())); 1666 top_controls_layout_height - top_controls_manager_->ContentTopOffset()));
1684 1667
1685 if (!outer_container || outer_container->BoundsForScrolling().IsEmpty()) 1668 if (!outer_container || outer_container->BoundsForScrolling().IsEmpty())
1686 return; 1669 return;
1687 1670
1688 // Adjust the outer viewport container as well, since adjusting only the 1671 // Adjust the outer viewport container as well, since adjusting only the
1689 // inner may cause its bounds to exceed those of the outer, causing scroll 1672 // inner may cause its bounds to exceed those of the outer, causing scroll
1690 // clamping. We adjust it so it maintains the same aspect ratio as the 1673 // clamping. We adjust it so it maintains the same aspect ratio as the
1691 // inner viewport. 1674 // inner viewport.
1692 float aspect_ratio = inner_container->BoundsForScrolling().width() / 1675 float aspect_ratio = inner_container->BoundsForScrolling().width() /
1693 inner_container->BoundsForScrolling().height(); 1676 inner_container->BoundsForScrolling().height();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1761 return NULL; 1744 return NULL;
1762 } 1745 }
1763 1746
1764 void LayerTreeHostImpl::CreatePendingTree() { 1747 void LayerTreeHostImpl::CreatePendingTree() {
1765 CHECK(!pending_tree_); 1748 CHECK(!pending_tree_);
1766 if (recycle_tree_) 1749 if (recycle_tree_)
1767 recycle_tree_.swap(pending_tree_); 1750 recycle_tree_.swap(pending_tree_);
1768 else 1751 else
1769 pending_tree_ = 1752 pending_tree_ =
1770 LayerTreeImpl::create(this, active_tree()->page_scale_factor(), 1753 LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
1754 active_tree()->top_controls_shown_ratio(),
1771 active_tree()->elastic_overscroll()); 1755 active_tree()->elastic_overscroll());
1772 1756
1773 // Update the delta from the active tree, which may have
1774 // adjusted its delta prior to the pending tree being created.
1775 DCHECK_EQ(0.f, pending_tree_->sent_top_controls_delta());
1776 pending_tree_->set_top_controls_delta(
1777 active_tree_->top_controls_delta() -
1778 active_tree_->sent_top_controls_delta());
1779 pending_tree_->set_top_controls_height(active_tree_->top_controls_height());
1780
1781 client_->OnCanDrawStateChanged(CanDraw()); 1757 client_->OnCanDrawStateChanged(CanDraw());
1782 TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get()); 1758 TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get());
1783 } 1759 }
1784 1760
1785 void LayerTreeHostImpl::ActivateSyncTree() { 1761 void LayerTreeHostImpl::ActivateSyncTree() {
1786 if (pending_tree_) { 1762 if (pending_tree_) {
1787 TRACE_EVENT_ASYNC_END0("cc", "PendingTree:waiting", pending_tree_.get()); 1763 TRACE_EVENT_ASYNC_END0("cc", "PendingTree:waiting", pending_tree_.get());
1788 1764
1789 active_tree_->SetRootLayerScrollOffsetDelegate(NULL); 1765 active_tree_->SetRootLayerScrollOffsetDelegate(NULL);
1790 active_tree_->PushPersistedState(pending_tree_.get()); 1766 active_tree_->PushPersistedState(pending_tree_.get());
(...skipping 14 matching lines...) Expand all
1805 1781
1806 // Now that we've synced everything from the pending tree to the active 1782 // Now that we've synced everything from the pending tree to the active
1807 // tree, rename the pending tree the recycle tree so we can reuse it on the 1783 // tree, rename the pending tree the recycle tree so we can reuse it on the
1808 // next sync. 1784 // next sync.
1809 DCHECK(!recycle_tree_); 1785 DCHECK(!recycle_tree_);
1810 pending_tree_.swap(recycle_tree_); 1786 pending_tree_.swap(recycle_tree_);
1811 1787
1812 active_tree_->SetRootLayerScrollOffsetDelegate( 1788 active_tree_->SetRootLayerScrollOffsetDelegate(
1813 root_layer_scroll_offset_delegate_); 1789 root_layer_scroll_offset_delegate_);
1814 1790
1815 if (top_controls_manager_) {
1816 top_controls_manager_->SetTopControlsHeight(
1817 active_tree_->top_controls_height());
1818 top_controls_manager_->SetControlsTopOffset(
1819 active_tree_->total_top_controls_content_offset() -
1820 active_tree_->top_controls_height());
1821 }
1822
1823 UpdateViewportContainerSizes(); 1791 UpdateViewportContainerSizes();
1824 } else { 1792 } else {
1825 active_tree_->ProcessUIResourceRequestQueue(); 1793 active_tree_->ProcessUIResourceRequestQueue();
1826 } 1794 }
1827 1795
1828 active_tree_->DidBecomeActive(); 1796 active_tree_->DidBecomeActive();
1829 ActivateAnimations(); 1797 ActivateAnimations();
1830 if (settings_.impl_side_painting) { 1798 if (settings_.impl_side_painting) {
1831 client_->RenewTreePriority(); 1799 client_->RenewTreePriority();
1832 // If we have any picture layers, then by activating we also modified tile 1800 // If we have any picture layers, then by activating we also modified tile
1833 // priorities. 1801 // priorities.
1834 if (!picture_layers_.empty()) 1802 if (!active_tree_->picture_layers().empty())
1835 DidModifyTilePriorities(); 1803 DidModifyTilePriorities();
1836 } 1804 }
1837 1805
1838 client_->OnCanDrawStateChanged(CanDraw()); 1806 client_->OnCanDrawStateChanged(CanDraw());
1839 client_->DidActivateSyncTree(); 1807 client_->DidActivateSyncTree();
1840 if (!tree_activation_callback_.is_null()) 1808 if (!tree_activation_callback_.is_null())
1841 tree_activation_callback_.Run(); 1809 tree_activation_callback_.Run();
1842 1810
1843 if (debug_state_.continuous_painting) { 1811 if (debug_state_.continuous_painting) {
1844 const RenderingStats& stats = 1812 const RenderingStats& stats =
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
2032 resource_provider_.get()); 2000 resource_provider_.get());
2033 return; 2001 return;
2034 } 2002 }
2035 2003
2036 if (use_gpu_rasterization_) { 2004 if (use_gpu_rasterization_) {
2037 *resource_pool = 2005 *resource_pool =
2038 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D); 2006 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D);
2039 2007
2040 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( 2008 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
2041 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), 2009 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
2042 resource_provider_.get()); 2010 static_cast<GpuRasterizer*>(rasterizer_.get()));
2043 return; 2011 return;
2044 } 2012 }
2045 2013
2046 if (GetRendererCapabilities().using_image) { 2014 if (GetRendererCapabilities().using_image) {
2047 unsigned image_target = settings_.use_image_texture_target; 2015 unsigned image_target = settings_.use_image_texture_target;
2048 DCHECK_IMPLIES( 2016 DCHECK_IMPLIES(
2049 image_target == GL_TEXTURE_RECTANGLE_ARB, 2017 image_target == GL_TEXTURE_RECTANGLE_ARB,
2050 context_provider->ContextCapabilities().gpu.texture_rectangle); 2018 context_provider->ContextCapabilities().gpu.texture_rectangle);
2051 DCHECK_IMPLIES( 2019 DCHECK_IMPLIES(
2052 image_target == GL_TEXTURE_EXTERNAL_OES, 2020 image_target == GL_TEXTURE_EXTERNAL_OES,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2097 2065
2098 void LayerTreeHostImpl::DestroyTileManager() { 2066 void LayerTreeHostImpl::DestroyTileManager() {
2099 tile_manager_ = nullptr; 2067 tile_manager_ = nullptr;
2100 resource_pool_ = nullptr; 2068 resource_pool_ = nullptr;
2101 staging_resource_pool_ = nullptr; 2069 staging_resource_pool_ = nullptr;
2102 tile_task_worker_pool_ = nullptr; 2070 tile_task_worker_pool_ = nullptr;
2103 rasterizer_ = nullptr; 2071 rasterizer_ = nullptr;
2104 single_thread_synchronous_task_graph_runner_ = nullptr; 2072 single_thread_synchronous_task_graph_runner_ = nullptr;
2105 } 2073 }
2106 2074
2107 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2108 // In impl-side painting, synchronize to the pending tree so that it has
2109 // time to raster before being displayed.
2110 return settings_.impl_side_painting;
2111 }
2112
2113 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { 2075 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
2114 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; 2076 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler;
2115 } 2077 }
2116 2078
2117 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { 2079 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) {
2118 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); 2080 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget);
2119 } 2081 }
2120 2082
2121 bool LayerTreeHostImpl::InitializeRenderer( 2083 bool LayerTreeHostImpl::InitializeRenderer(
2122 scoped_ptr<OutputSurface> output_surface) { 2084 scoped_ptr<OutputSurface> output_surface) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
2291 } 2253 }
2292 2254
2293 void LayerTreeHostImpl::DidChangeTopControlsPosition() { 2255 void LayerTreeHostImpl::DidChangeTopControlsPosition() {
2294 UpdateViewportContainerSizes(); 2256 UpdateViewportContainerSizes();
2295 SetNeedsRedraw(); 2257 SetNeedsRedraw();
2296 SetNeedsAnimate(); 2258 SetNeedsAnimate();
2297 active_tree_->set_needs_update_draw_properties(); 2259 active_tree_->set_needs_update_draw_properties();
2298 SetFullRootLayerDamage(); 2260 SetFullRootLayerDamage();
2299 } 2261 }
2300 2262
2301 void LayerTreeHostImpl::SetControlsTopOffset(float offset) { 2263 float LayerTreeHostImpl::TopControlsHeight() const {
2302 float current_top_offset = active_tree_->top_controls_content_offset() - 2264 return active_tree_->top_controls_height();
2303 active_tree_->top_controls_height();
2304 active_tree_->set_top_controls_delta(offset - current_top_offset);
2305 } 2265 }
2306 2266
2307 float LayerTreeHostImpl::ControlsTopOffset() const { 2267 void LayerTreeHostImpl::SetCurrentTopControlsShownRatio(float ratio) {
2308 return active_tree_->total_top_controls_content_offset() - 2268 if (active_tree_->SetCurrentTopControlsShownRatio(ratio))
2309 active_tree_->top_controls_height(); 2269 DidChangeTopControlsPosition();
2270 }
2271
2272 float LayerTreeHostImpl::CurrentTopControlsShownRatio() const {
2273 return active_tree_->CurrentTopControlsShownRatio();
2310 } 2274 }
2311 2275
2312 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { 2276 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) {
2313 DCHECK(input_handler_client_ == NULL); 2277 DCHECK(input_handler_client_ == NULL);
2314 input_handler_client_ = client; 2278 input_handler_client_ = client;
2315 } 2279 }
2316 2280
2317 LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint( 2281 LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
2318 const gfx::PointF& device_viewport_point, 2282 const gfx::PointF& device_viewport_point,
2319 InputHandler::ScrollInputType type, 2283 InputHandler::ScrollInputType type,
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
3052 for (size_t i = 0; i < layer_impl->children().size(); ++i) 3016 for (size_t i = 0; i < layer_impl->children().size(); ++i)
3053 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); 3017 CollectScrollDeltas(scroll_info, layer_impl->children()[i]);
3054 } 3018 }
3055 3019
3056 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { 3020 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() {
3057 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); 3021 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet());
3058 3022
3059 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); 3023 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer());
3060 scroll_info->page_scale_delta = 3024 scroll_info->page_scale_delta =
3061 active_tree_->page_scale_factor()->PullDeltaForMainThread(); 3025 active_tree_->page_scale_factor()->PullDeltaForMainThread();
3026 scroll_info->top_controls_delta =
3027 active_tree()->top_controls_shown_ratio()->PullDeltaForMainThread();
3062 scroll_info->elastic_overscroll_delta = 3028 scroll_info->elastic_overscroll_delta =
3063 active_tree_->elastic_overscroll()->PullDeltaForMainThread(); 3029 active_tree_->elastic_overscroll()->PullDeltaForMainThread();
3064 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); 3030 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_);
3065 scroll_info->top_controls_delta = active_tree()->top_controls_delta();
3066 active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta);
3067 3031
3068 return scroll_info.Pass(); 3032 return scroll_info.Pass();
3069 } 3033 }
3070 3034
3071 void LayerTreeHostImpl::SetFullRootLayerDamage() { 3035 void LayerTreeHostImpl::SetFullRootLayerDamage() {
3072 SetViewportDamage(gfx::Rect(DrawViewportSize())); 3036 SetViewportDamage(gfx::Rect(DrawViewportSize()));
3073 } 3037 }
3074 3038
3075 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) { 3039 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) {
3076 DCHECK(InnerViewportScrollLayer()); 3040 DCHECK(InnerViewportScrollLayer());
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
3275 // Try to use the current frame time to keep animations non-jittery. But if 3239 // Try to use the current frame time to keep animations non-jittery. But if
3276 // we're not in a frame (because this is during an input event or a delayed 3240 // we're not in a frame (because this is during an input event or a delayed
3277 // task), fall back to physical time. This should still be monotonic. 3241 // task), fall back to physical time. This should still be monotonic.
3278 if (current_begin_frame_args_.IsValid()) 3242 if (current_begin_frame_args_.IsValid())
3279 return current_begin_frame_args_; 3243 return current_begin_frame_args_;
3280 return BeginFrameArgs::Create( 3244 return BeginFrameArgs::Create(
3281 BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(), 3245 BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(),
3282 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL); 3246 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
3283 } 3247 }
3284 3248
3285 scoped_refptr<base::debug::ConvertableToTraceFormat> 3249 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
3286 LayerTreeHostImpl::AsValue() const { 3250 LayerTreeHostImpl::AsValue() const {
3287 return AsValueWithFrame(NULL); 3251 return AsValueWithFrame(NULL);
3288 } 3252 }
3289 3253
3290 scoped_refptr<base::debug::ConvertableToTraceFormat> 3254 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
3291 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const { 3255 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const {
3292 scoped_refptr<base::debug::TracedValue> state = 3256 scoped_refptr<base::trace_event::TracedValue> state =
3293 new base::debug::TracedValue(); 3257 new base::trace_event::TracedValue();
3294 AsValueWithFrameInto(frame, state.get()); 3258 AsValueWithFrameInto(frame, state.get());
3295 return state; 3259 return state;
3296 } 3260 }
3297 3261
3298 void LayerTreeHostImpl::AsValueInto(base::debug::TracedValue* value) const { 3262 void LayerTreeHostImpl::AsValueInto(
3263 base::trace_event::TracedValue* value) const {
3299 return AsValueWithFrameInto(NULL, value); 3264 return AsValueWithFrameInto(NULL, value);
3300 } 3265 }
3301 3266
3302 void LayerTreeHostImpl::AsValueWithFrameInto( 3267 void LayerTreeHostImpl::AsValueWithFrameInto(
3303 FrameData* frame, 3268 FrameData* frame,
3304 base::debug::TracedValue* state) const { 3269 base::trace_event::TracedValue* state) const {
3305 if (this->pending_tree_) { 3270 if (this->pending_tree_) {
3306 state->BeginDictionary("activation_state"); 3271 state->BeginDictionary("activation_state");
3307 ActivationStateAsValueInto(state); 3272 ActivationStateAsValueInto(state);
3308 state->EndDictionary(); 3273 state->EndDictionary();
3309 } 3274 }
3310 MathUtil::AddToTracedValue("device_viewport_size", device_viewport_size_, 3275 MathUtil::AddToTracedValue("device_viewport_size", device_viewport_size_,
3311 state); 3276 state);
3312 3277
3313 std::set<const Tile*> tiles; 3278 std::set<const Tile*> tiles;
3314 active_tree_->GetAllTilesForTracing(&tiles); 3279 active_tree_->GetAllTilesForTracing(&tiles);
(...skipping 25 matching lines...) Expand all
3340 pending_tree_->AsValueInto(state); 3305 pending_tree_->AsValueInto(state);
3341 state->EndDictionary(); 3306 state->EndDictionary();
3342 } 3307 }
3343 if (frame) { 3308 if (frame) {
3344 state->BeginDictionary("frame"); 3309 state->BeginDictionary("frame");
3345 frame->AsValueInto(state); 3310 frame->AsValueInto(state);
3346 state->EndDictionary(); 3311 state->EndDictionary();
3347 } 3312 }
3348 } 3313 }
3349 3314
3350 scoped_refptr<base::debug::ConvertableToTraceFormat> 3315 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
3351 LayerTreeHostImpl::ActivationStateAsValue() const { 3316 LayerTreeHostImpl::ActivationStateAsValue() const {
3352 scoped_refptr<base::debug::TracedValue> state = 3317 scoped_refptr<base::trace_event::TracedValue> state =
3353 new base::debug::TracedValue(); 3318 new base::trace_event::TracedValue();
3354 ActivationStateAsValueInto(state.get()); 3319 ActivationStateAsValueInto(state.get());
3355 return state; 3320 return state;
3356 } 3321 }
3357 3322
3358 void LayerTreeHostImpl::ActivationStateAsValueInto( 3323 void LayerTreeHostImpl::ActivationStateAsValueInto(
3359 base::debug::TracedValue* state) const { 3324 base::trace_event::TracedValue* state) const {
3360 TracedValue::SetIDRef(this, state, "lthi"); 3325 TracedValue::SetIDRef(this, state, "lthi");
3361 if (tile_manager_) { 3326 if (tile_manager_) {
3362 state->BeginDictionary("tile_manager"); 3327 state->BeginDictionary("tile_manager");
3363 tile_manager_->BasicStateAsValueInto(state); 3328 tile_manager_->BasicStateAsValueInto(state);
3364 state->EndDictionary(); 3329 state->EndDictionary();
3365 } 3330 }
3366 } 3331 }
3367 3332
3368 void LayerTreeHostImpl::SetDebugState( 3333 void LayerTreeHostImpl::SetDebugState(
3369 const LayerTreeDebugState& new_debug_state) { 3334 const LayerTreeDebugState& new_debug_state) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
3502 for (; it != swap_promise_monitor_.end(); it++) 3467 for (; it != swap_promise_monitor_.end(); it++)
3503 (*it)->OnSetNeedsRedrawOnImpl(); 3468 (*it)->OnSetNeedsRedrawOnImpl();
3504 } 3469 }
3505 3470
3506 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { 3471 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() {
3507 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3472 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3508 for (; it != swap_promise_monitor_.end(); it++) 3473 for (; it != swap_promise_monitor_.end(); it++)
3509 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); 3474 (*it)->OnForwardScrollUpdateToMainThreadOnImpl();
3510 } 3475 }
3511 3476
3512 void LayerTreeHostImpl::RegisterPictureLayerImpl(PictureLayerImpl* layer) {
3513 DCHECK(std::find(picture_layers_.begin(), picture_layers_.end(), layer) ==
3514 picture_layers_.end());
3515 picture_layers_.push_back(layer);
3516 }
3517
3518 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3519 std::vector<PictureLayerImpl*>::iterator it =
3520 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3521 DCHECK(it != picture_layers_.end());
3522 picture_layers_.erase(it);
3523 }
3524
3525 } // namespace cc 3477 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698