| 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 2571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3495 (*it)->OnSetNeedsRedrawOnImpl(); | 3474 (*it)->OnSetNeedsRedrawOnImpl(); |
| 3496 } | 3475 } |
| 3497 | 3476 |
| 3498 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { | 3477 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { |
| 3499 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3478 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
| 3500 for (; it != swap_promise_monitor_.end(); it++) | 3479 for (; it != swap_promise_monitor_.end(); it++) |
| 3501 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); | 3480 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); |
| 3502 } | 3481 } |
| 3503 | 3482 |
| 3504 } // namespace cc | 3483 } // namespace cc |
| OLD | NEW |