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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 !output_surface_->capabilities().deferred_gl_initialization) | 584 !output_surface_->capabilities().deferred_gl_initialization) |
586 << output_surface_->capabilities().delegated_rendering << " " | 585 << output_surface_->capabilities().delegated_rendering << " " |
587 << output_surface_->capabilities().deferred_gl_initialization; | 586 << output_surface_->capabilities().deferred_gl_initialization; |
588 return DRAW_MODE_SOFTWARE; | 587 return DRAW_MODE_SOFTWARE; |
589 } | 588 } |
590 } | 589 } |
591 | 590 |
592 static void AppendQuadsForLayer( | 591 static void AppendQuadsForLayer( |
593 RenderPass* target_render_pass, | 592 RenderPass* target_render_pass, |
594 LayerImpl* layer, | 593 LayerImpl* layer, |
595 const OcclusionTracker<LayerImpl>& occlusion_tracker, | |
596 AppendQuadsData* append_quads_data) { | 594 AppendQuadsData* append_quads_data) { |
597 layer->AppendQuads( | 595 layer->AppendQuads(target_render_pass, |
598 target_render_pass, | 596 layer->draw_properties().occlusion_in_content_space, |
599 occlusion_tracker.GetCurrentOcclusionForLayer(layer->draw_transform()), | 597 append_quads_data); |
600 append_quads_data); | |
601 } | 598 } |
602 | 599 |
603 static void AppendQuadsForRenderSurfaceLayer( | 600 static void AppendQuadsForRenderSurfaceLayer( |
604 RenderPass* target_render_pass, | 601 RenderPass* target_render_pass, |
605 LayerImpl* layer, | 602 LayerImpl* layer, |
606 const RenderPass* contributing_render_pass, | 603 const RenderPass* contributing_render_pass, |
607 const OcclusionTracker<LayerImpl>& occlusion_tracker, | |
608 AppendQuadsData* append_quads_data) { | 604 AppendQuadsData* append_quads_data) { |
609 RenderSurfaceImpl* surface = layer->render_surface(); | 605 RenderSurfaceImpl* surface = layer->render_surface(); |
610 const gfx::Transform& draw_transform = surface->draw_transform(); | 606 const gfx::Transform& draw_transform = surface->draw_transform(); |
611 const Occlusion& occlusion = | 607 const Occlusion& occlusion = surface->occlusion_in_content_space(); |
612 occlusion_tracker.GetCurrentOcclusionForContributingSurface( | |
613 draw_transform); | |
614 SkColor debug_border_color = surface->GetDebugBorderColor(); | 608 SkColor debug_border_color = surface->GetDebugBorderColor(); |
615 float debug_border_width = surface->GetDebugBorderWidth(); | 609 float debug_border_width = surface->GetDebugBorderWidth(); |
616 LayerImpl* mask_layer = layer->mask_layer(); | 610 LayerImpl* mask_layer = layer->mask_layer(); |
617 | 611 |
618 surface->AppendQuads(target_render_pass, draw_transform, occlusion, | 612 surface->AppendQuads(target_render_pass, draw_transform, occlusion, |
619 debug_border_color, debug_border_width, mask_layer, | 613 debug_border_color, debug_border_width, mask_layer, |
620 append_quads_data, contributing_render_pass->id); | 614 append_quads_data, contributing_render_pass->id); |
621 | 615 |
622 // Add replica after the surface so that it appears below the surface. | 616 // Add replica after the surface so that it appears below the surface. |
623 if (layer->has_replica()) { | 617 if (layer->has_replica()) { |
624 const gfx::Transform& replica_draw_transform = | 618 const gfx::Transform& replica_draw_transform = |
625 surface->replica_draw_transform(); | 619 surface->replica_draw_transform(); |
626 const Occlusion& replica_occlusion = | 620 Occlusion replica_occlusion = occlusion.GetOcclusionWithGivenDrawTransform( |
627 occlusion_tracker.GetCurrentOcclusionForContributingSurface( | 621 surface->replica_draw_transform()); |
628 replica_draw_transform); | |
629 SkColor replica_debug_border_color = surface->GetReplicaDebugBorderColor(); | 622 SkColor replica_debug_border_color = surface->GetReplicaDebugBorderColor(); |
630 float replica_debug_border_width = surface->GetReplicaDebugBorderWidth(); | 623 float replica_debug_border_width = surface->GetReplicaDebugBorderWidth(); |
631 // TODO(danakj): By using the same RenderSurfaceImpl for both the | 624 // TODO(danakj): By using the same RenderSurfaceImpl for both the |
632 // content and its reflection, it's currently not possible to apply a | 625 // content and its reflection, it's currently not possible to apply a |
633 // separate mask to the reflection layer or correctly handle opacity in | 626 // separate mask to the reflection layer or correctly handle opacity in |
634 // reflections (opacity must be applied after drawing both the layer and its | 627 // reflections (opacity must be applied after drawing both the layer and its |
635 // reflection). The solution is to introduce yet another RenderSurfaceImpl | 628 // reflection). The solution is to introduce yet another RenderSurfaceImpl |
636 // to draw the layer and its reflection in. For now we only apply a separate | 629 // to draw the layer and its reflection in. For now we only apply a separate |
637 // reflection mask if the contents don't have a mask of their own. | 630 // reflection mask if the contents don't have a mask of their own. |
638 LayerImpl* replica_mask_layer = | 631 LayerImpl* replica_mask_layer = |
639 mask_layer ? mask_layer : layer->replica_layer()->mask_layer(); | 632 mask_layer ? mask_layer : layer->replica_layer()->mask_layer(); |
640 | 633 |
641 surface->AppendQuads(target_render_pass, replica_draw_transform, | 634 surface->AppendQuads(target_render_pass, replica_draw_transform, |
642 replica_occlusion, replica_debug_border_color, | 635 replica_occlusion, replica_debug_border_color, |
643 replica_debug_border_width, replica_mask_layer, | 636 replica_debug_border_width, replica_mask_layer, |
644 append_quads_data, contributing_render_pass->id); | 637 append_quads_data, contributing_render_pass->id); |
645 } | 638 } |
646 } | 639 } |
647 | 640 |
648 static void AppendQuadsToFillScreen( | 641 static void AppendQuadsToFillScreen(const gfx::Rect& root_scroll_layer_rect, |
649 const gfx::Rect& root_scroll_layer_rect, | 642 RenderPass* target_render_pass, |
650 RenderPass* target_render_pass, | 643 LayerImpl* root_layer, |
651 LayerImpl* root_layer, | 644 SkColor screen_background_color, |
652 SkColor screen_background_color, | 645 const Region& fill_region) { |
653 const OcclusionTracker<LayerImpl>& occlusion_tracker) { | |
654 if (!root_layer || !SkColorGetA(screen_background_color)) | 646 if (!root_layer || !SkColorGetA(screen_background_color)) |
655 return; | 647 return; |
656 | |
657 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); | |
658 if (fill_region.IsEmpty()) | 648 if (fill_region.IsEmpty()) |
659 return; | 649 return; |
660 | 650 |
661 // Manually create the quad state for the gutter quads, as the root layer | 651 // Manually create the quad state for the gutter quads, as the root layer |
662 // doesn't have any bounds and so can't generate this itself. | 652 // doesn't have any bounds and so can't generate this itself. |
663 // TODO(danakj): Make the gutter quads generated by the solid color layer | 653 // TODO(danakj): Make the gutter quads generated by the solid color layer |
664 // (make it smarter about generating quads to fill unoccluded areas). | 654 // (make it smarter about generating quads to fill unoccluded areas). |
665 | 655 |
666 gfx::Rect root_target_rect = root_layer->render_surface()->content_rect(); | 656 gfx::Rect root_target_rect = root_layer->render_surface()->content_rect(); |
667 float opacity = 1.f; | 657 float opacity = 1.f; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 // entire root surface. This will disable partial-swap/scissor optimizations | 741 // entire root surface. This will disable partial-swap/scissor optimizations |
752 // that would prevent the HUD from updating, since the HUD does not cause | 742 // that would prevent the HUD from updating, since the HUD does not cause |
753 // damage itself, to prevent it from messing with damage visualizations. Since | 743 // damage itself, to prevent it from messing with damage visualizations. Since |
754 // damage visualizations are done off the LayerImpls and RenderSurfaceImpls, | 744 // damage visualizations are done off the LayerImpls and RenderSurfaceImpls, |
755 // changing the RenderPass does not affect them. | 745 // changing the RenderPass does not affect them. |
756 if (active_tree_->hud_layer()) { | 746 if (active_tree_->hud_layer()) { |
757 RenderPass* root_pass = frame->render_passes.back(); | 747 RenderPass* root_pass = frame->render_passes.back(); |
758 root_pass->damage_rect = root_pass->output_rect; | 748 root_pass->damage_rect = root_pass->output_rect; |
759 } | 749 } |
760 | 750 |
761 OcclusionTracker<LayerImpl> occlusion_tracker( | 751 // Grab this region here before iterating layers. Taking copy requests from |
762 active_tree_->root_layer()->render_surface()->content_rect()); | 752 // the layers while constructing the render passes will dirty the render |
763 occlusion_tracker.set_minimum_tracking_size( | 753 // surface layer list and this unoccluded region, flipping the dirty bit to |
764 settings_.minimum_occlusion_tracking_size); | 754 // true, and making us able to query for it without doing |
765 | 755 // UpdateDrawProperties again. The value inside the Region is not actually |
766 // Add quads to the Render passes in front-to-back order to allow for testing | 756 // changed until UpdateDrawProperties happens, so a reference to it is safe. |
767 // occlusion and performing culling during the tree walk. | 757 const Region& unoccluded_screen_space_region = |
768 typedef LayerIterator<LayerImpl> LayerIteratorType; | 758 active_tree_->UnoccludedScreenSpaceRegion(); |
769 | 759 |
770 // Typically when we are missing a texture and use a checkerboard quad, we | 760 // Typically when we are missing a texture and use a checkerboard quad, we |
771 // still draw the frame. However when the layer being checkerboarded is moving | 761 // still draw the frame. However when the layer being checkerboarded is moving |
772 // due to an impl-animation, we drop the frame to avoid flashing due to the | 762 // due to an impl-animation, we drop the frame to avoid flashing due to the |
773 // texture suddenly appearing in the future. | 763 // texture suddenly appearing in the future. |
774 DrawResult draw_result = DRAW_SUCCESS; | 764 DrawResult draw_result = DRAW_SUCCESS; |
775 // When we have a copy request for a layer, we need to draw no matter | 765 // When we have a copy request for a layer, we need to draw no matter |
776 // what, as the layer may disappear after this frame. | 766 // what, as the layer may disappear after this frame. |
777 bool have_copy_request = false; | 767 bool have_copy_request = false; |
778 | 768 |
779 int layers_drawn = 0; | 769 int layers_drawn = 0; |
780 | 770 |
781 const DrawMode draw_mode = GetDrawMode(); | 771 const DrawMode draw_mode = GetDrawMode(); |
782 | 772 |
783 int num_missing_tiles = 0; | 773 int num_missing_tiles = 0; |
784 int num_incomplete_tiles = 0; | 774 int num_incomplete_tiles = 0; |
785 | 775 |
786 LayerIteratorType end = | 776 auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list); |
787 LayerIteratorType::End(frame->render_surface_layer_list); | 777 for (auto it = |
788 for (LayerIteratorType it = | 778 LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list); |
789 LayerIteratorType::Begin(frame->render_surface_layer_list); | 779 it != end; ++it) { |
790 it != end; | |
791 ++it) { | |
792 RenderPassId target_render_pass_id = | 780 RenderPassId target_render_pass_id = |
793 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); | 781 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); |
794 RenderPass* target_render_pass = | 782 RenderPass* target_render_pass = |
795 frame->render_passes_by_id[target_render_pass_id]; | 783 frame->render_passes_by_id[target_render_pass_id]; |
796 | 784 |
797 occlusion_tracker.EnterLayer(it); | |
798 | |
799 AppendQuadsData append_quads_data; | 785 AppendQuadsData append_quads_data; |
800 | 786 |
801 if (it.represents_target_render_surface()) { | 787 if (it.represents_target_render_surface()) { |
802 if (it->HasCopyRequest()) { | 788 if (it->HasCopyRequest()) { |
803 have_copy_request = true; | 789 have_copy_request = true; |
804 it->TakeCopyRequestsAndTransformToTarget( | 790 it->TakeCopyRequestsAndTransformToTarget( |
805 &target_render_pass->copy_requests); | 791 &target_render_pass->copy_requests); |
806 } | 792 } |
807 } else if (it.represents_contributing_render_surface() && | 793 } else if (it.represents_contributing_render_surface() && |
808 it->render_surface()->contributes_to_drawn_surface()) { | 794 it->render_surface()->contributes_to_drawn_surface()) { |
809 RenderPassId contributing_render_pass_id = | 795 RenderPassId contributing_render_pass_id = |
810 it->render_surface()->GetRenderPassId(); | 796 it->render_surface()->GetRenderPassId(); |
811 RenderPass* contributing_render_pass = | 797 RenderPass* contributing_render_pass = |
812 frame->render_passes_by_id[contributing_render_pass_id]; | 798 frame->render_passes_by_id[contributing_render_pass_id]; |
813 AppendQuadsForRenderSurfaceLayer(target_render_pass, | 799 AppendQuadsForRenderSurfaceLayer(target_render_pass, |
814 *it, | 800 *it, |
815 contributing_render_pass, | 801 contributing_render_pass, |
816 occlusion_tracker, | |
817 &append_quads_data); | 802 &append_quads_data); |
818 } else if (it.represents_itself() && | 803 } else if (it.represents_itself() && |
819 !it->visible_content_rect().IsEmpty()) { | 804 !it->visible_content_rect().IsEmpty()) { |
820 bool occluded = | 805 bool occluded = |
821 occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform()) | 806 it->draw_properties().occlusion_in_content_space.IsOccluded( |
822 .IsOccluded(it->visible_content_rect()); | 807 it->visible_content_rect()); |
823 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { | 808 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { |
824 DCHECK_EQ(active_tree_, it->layer_tree_impl()); | 809 DCHECK_EQ(active_tree_, it->layer_tree_impl()); |
825 | 810 |
826 frame->will_draw_layers.push_back(*it); | 811 frame->will_draw_layers.push_back(*it); |
827 | 812 |
828 if (it->HasContributingDelegatedRenderPasses()) { | 813 if (it->HasContributingDelegatedRenderPasses()) { |
829 RenderPassId contributing_render_pass_id = | 814 RenderPassId contributing_render_pass_id = |
830 it->FirstContributingRenderPassId(); | 815 it->FirstContributingRenderPassId(); |
831 while (frame->render_passes_by_id.find(contributing_render_pass_id) != | 816 while (frame->render_passes_by_id.find(contributing_render_pass_id) != |
832 frame->render_passes_by_id.end()) { | 817 frame->render_passes_by_id.end()) { |
833 RenderPass* render_pass = | 818 RenderPass* render_pass = |
834 frame->render_passes_by_id[contributing_render_pass_id]; | 819 frame->render_passes_by_id[contributing_render_pass_id]; |
835 | 820 |
836 AppendQuadsForLayer(render_pass, | 821 AppendQuadsForLayer(render_pass, |
837 *it, | 822 *it, |
838 occlusion_tracker, | |
839 &append_quads_data); | 823 &append_quads_data); |
840 | 824 |
841 contributing_render_pass_id = | 825 contributing_render_pass_id = |
842 it->NextContributingRenderPassId(contributing_render_pass_id); | 826 it->NextContributingRenderPassId(contributing_render_pass_id); |
843 } | 827 } |
844 } | 828 } |
845 | 829 |
846 AppendQuadsForLayer(target_render_pass, | 830 AppendQuadsForLayer(target_render_pass, |
847 *it, | 831 *it, |
848 occlusion_tracker, | |
849 &append_quads_data); | 832 &append_quads_data); |
850 | 833 |
851 // For layers that represent themselves, add composite frame timing | 834 // For layers that represent themselves, add composite frame timing |
852 // requests if the visible rect intersects the requested rect. | 835 // requests if the visible rect intersects the requested rect. |
853 for (const auto& request : it->frame_timing_requests()) { | 836 for (const auto& request : it->frame_timing_requests()) { |
854 const gfx::Rect& request_content_rect = | 837 const gfx::Rect& request_content_rect = |
855 it->LayerRectToContentRect(request.rect()); | 838 it->LayerRectToContentRect(request.rect()); |
856 if (request_content_rect.Intersects(it->visible_content_rect())) { | 839 if (request_content_rect.Intersects(it->visible_content_rect())) { |
857 frame->composite_events.push_back( | 840 frame->composite_events.push_back( |
858 FrameTimingTracker::FrameAndRectIds( | 841 FrameTimingTracker::FrameAndRectIds( |
(...skipping 19 matching lines...) Expand all Loading... |
878 it->draw_transform_is_animating(); | 861 it->draw_transform_is_animating(); |
879 if (layer_has_animating_transform) | 862 if (layer_has_animating_transform) |
880 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | 863 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
881 } | 864 } |
882 | 865 |
883 if (append_quads_data.num_incomplete_tiles || | 866 if (append_quads_data.num_incomplete_tiles || |
884 append_quads_data.num_missing_tiles) { | 867 append_quads_data.num_missing_tiles) { |
885 if (RequiresHighResToDraw()) | 868 if (RequiresHighResToDraw()) |
886 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | 869 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
887 } | 870 } |
888 | |
889 occlusion_tracker.LeaveLayer(it); | |
890 } | 871 } |
891 | 872 |
892 if (have_copy_request || | 873 if (have_copy_request || |
893 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 874 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
894 draw_result = DRAW_SUCCESS; | 875 draw_result = DRAW_SUCCESS; |
895 | 876 |
896 #if DCHECK_IS_ON() | 877 #if DCHECK_IS_ON() |
897 for (const auto& render_pass : frame->render_passes) { | 878 for (const auto& render_pass : frame->render_passes) { |
898 for (const auto& quad : render_pass->quad_list) | 879 for (const auto& quad : render_pass->quad_list) |
899 DCHECK(quad->shared_quad_state); | 880 DCHECK(quad->shared_quad_state); |
900 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | 881 DCHECK(frame->render_passes_by_id.find(render_pass->id) != |
901 frame->render_passes_by_id.end()); | 882 frame->render_passes_by_id.end()); |
902 } | 883 } |
903 #endif | 884 #endif |
904 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 885 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
905 | 886 |
906 if (!active_tree_->has_transparent_background()) { | 887 if (!active_tree_->has_transparent_background()) { |
907 frame->render_passes.back()->has_transparent_background = false; | 888 frame->render_passes.back()->has_transparent_background = false; |
908 AppendQuadsToFillScreen( | 889 AppendQuadsToFillScreen( |
909 active_tree_->RootScrollLayerDeviceViewportBounds(), | 890 active_tree_->RootScrollLayerDeviceViewportBounds(), |
910 frame->render_passes.back(), | 891 frame->render_passes.back(), active_tree_->root_layer(), |
911 active_tree_->root_layer(), | 892 active_tree_->background_color(), unoccluded_screen_space_region); |
912 active_tree_->background_color(), | |
913 occlusion_tracker); | |
914 } | 893 } |
915 | 894 |
916 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); | 895 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |
917 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); | 896 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |
918 | 897 |
919 // Any copy requests left in the tree are not going to get serviced, and | 898 // Any copy requests left in the tree are not going to get serviced, and |
920 // should be aborted. | 899 // should be aborted. |
921 ScopedPtrVector<CopyOutputRequest> requests_to_abort; | 900 ScopedPtrVector<CopyOutputRequest> requests_to_abort; |
922 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { | 901 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { |
923 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); | 902 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); |
(...skipping 2581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3505 (*it)->OnSetNeedsRedrawOnImpl(); | 3484 (*it)->OnSetNeedsRedrawOnImpl(); |
3506 } | 3485 } |
3507 | 3486 |
3508 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { | 3487 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { |
3509 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3488 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
3510 for (; it != swap_promise_monitor_.end(); it++) | 3489 for (; it != swap_promise_monitor_.end(); it++) |
3511 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); | 3490 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); |
3512 } | 3491 } |
3513 | 3492 |
3514 } // namespace cc | 3493 } // namespace cc |
OLD | NEW |