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 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 if (settings_.impl_side_painting) { | 319 if (settings_.impl_side_painting) { |
320 // Impl-side painting needs an update immediately post-commit to have the | 320 // Impl-side painting needs an update immediately post-commit to have the |
321 // opportunity to create tilings. Other paths can call UpdateDrawProperties | 321 // opportunity to create tilings. Other paths can call UpdateDrawProperties |
322 // more lazily when needed prior to drawing. Because invalidations may | 322 // more lazily when needed prior to drawing. Because invalidations may |
323 // be coming from the main thread, it's safe to do an update for lcd text | 323 // be coming from the main thread, it's safe to do an update for lcd text |
324 // at this point and see if lcd text needs to be disabled on any layers. | 324 // at this point and see if lcd text needs to be disabled on any layers. |
325 bool update_lcd_text = true; | 325 bool update_lcd_text = true; |
326 sync_tree()->UpdateDrawProperties(update_lcd_text); | 326 sync_tree()->UpdateDrawProperties(update_lcd_text); |
327 // Start working on newly created tiles immediately if needed. | 327 // Start working on newly created tiles immediately if needed. |
328 if (tile_manager_ && tile_priorities_dirty_) { | 328 if (tile_manager_ && tile_priorities_dirty_) { |
329 PrepareTiles(); | 329 bool for_commit = true; |
| 330 client_->SetNeedsPrepareTilesOnImplThread(for_commit); |
330 } else { | 331 } else { |
331 NotifyReadyToActivate(); | 332 NotifyReadyToActivate(); |
332 | 333 |
333 // Ensure we get ReadyToDraw signal even when PrepareTiles not run. This | 334 // Ensure we get ReadyToDraw signal even when PrepareTiles not run. This |
334 // is important for SingleThreadProxy and impl-side painting case. For | 335 // is important for SingleThreadProxy and impl-side painting case. For |
335 // STP, we commit to active tree and RequiresHighResToDraw, and set | 336 // STP, we commit to active tree and RequiresHighResToDraw, and set |
336 // Scheduler to wait for ReadyToDraw signal to avoid Checkerboard. | 337 // Scheduler to wait for ReadyToDraw signal to avoid Checkerboard. |
337 if (proxy_->CommitToActiveTree()) | 338 if (proxy_->CommitToActiveTree()) |
338 NotifyReadyToDraw(); | 339 NotifyReadyToDraw(); |
339 } | 340 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { | 402 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { |
402 if (input_handler_client_) | 403 if (input_handler_client_) |
403 input_handler_client_->Animate(monotonic_time); | 404 input_handler_client_->Animate(monotonic_time); |
404 AnimatePageScale(monotonic_time); | 405 AnimatePageScale(monotonic_time); |
405 AnimateLayers(monotonic_time); | 406 AnimateLayers(monotonic_time); |
406 AnimateScrollbars(monotonic_time); | 407 AnimateScrollbars(monotonic_time); |
407 AnimateTopControls(monotonic_time); | 408 AnimateTopControls(monotonic_time); |
408 } | 409 } |
409 | 410 |
410 void LayerTreeHostImpl::PrepareTiles() { | 411 void LayerTreeHostImpl::PrepareTiles() { |
| 412 bool update_lcd_text = false; |
| 413 if (pending_tree_) |
| 414 pending_tree_->UpdateDrawProperties(update_lcd_text); |
| 415 if (active_tree_) |
| 416 active_tree_->UpdateDrawProperties(update_lcd_text); |
| 417 |
411 if (!tile_manager_) | 418 if (!tile_manager_) |
412 return; | 419 return; |
413 if (!tile_priorities_dirty_) | 420 if (!tile_priorities_dirty_) |
414 return; | 421 return; |
415 | 422 |
416 tile_priorities_dirty_ = false; | 423 tile_priorities_dirty_ = false; |
417 tile_manager_->PrepareTiles(global_tile_state_); | 424 tile_manager_->PrepareTiles(global_tile_state_); |
418 | |
419 client_->DidPrepareTiles(); | |
420 } | 425 } |
421 | 426 |
422 void LayerTreeHostImpl::StartPageScaleAnimation( | 427 void LayerTreeHostImpl::StartPageScaleAnimation( |
423 const gfx::Vector2d& target_offset, | 428 const gfx::Vector2d& target_offset, |
424 bool anchor_point, | 429 bool anchor_point, |
425 float page_scale, | 430 float page_scale, |
426 base::TimeDelta duration) { | 431 base::TimeDelta duration) { |
427 if (!InnerViewportScrollLayer()) | 432 if (!InnerViewportScrollLayer()) |
428 return; | 433 return; |
429 | 434 |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 // Typically when we are missing a texture and use a checkerboard quad, we | 790 // Typically when we are missing a texture and use a checkerboard quad, we |
786 // still draw the frame. However when the layer being checkerboarded is moving | 791 // still draw the frame. However when the layer being checkerboarded is moving |
787 // due to an impl-animation, we drop the frame to avoid flashing due to the | 792 // due to an impl-animation, we drop the frame to avoid flashing due to the |
788 // texture suddenly appearing in the future. | 793 // texture suddenly appearing in the future. |
789 DrawResult draw_result = DRAW_SUCCESS; | 794 DrawResult draw_result = DRAW_SUCCESS; |
790 | 795 |
791 int layers_drawn = 0; | 796 int layers_drawn = 0; |
792 | 797 |
793 const DrawMode draw_mode = GetDrawMode(); | 798 const DrawMode draw_mode = GetDrawMode(); |
794 | 799 |
| 800 int num_layers_missing_raster_source = 0; |
795 int num_missing_tiles = 0; | 801 int num_missing_tiles = 0; |
796 int num_incomplete_tiles = 0; | 802 int num_incomplete_tiles = 0; |
797 bool have_copy_request = false; | 803 bool have_copy_request = false; |
798 bool have_missing_animated_tiles = false; | 804 bool have_missing_animated_tiles = false; |
799 | 805 |
800 auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list); | 806 auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list); |
801 for (auto it = | 807 for (auto it = |
802 LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list); | 808 LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list); |
803 it != end; ++it) { | 809 it != end; ++it) { |
804 RenderPassId target_render_pass_id = | 810 RenderPassId target_render_pass_id = |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 ++layers_drawn; | 873 ++layers_drawn; |
868 } | 874 } |
869 | 875 |
870 rendering_stats_instrumentation_->AddVisibleContentArea( | 876 rendering_stats_instrumentation_->AddVisibleContentArea( |
871 append_quads_data.visible_content_area); | 877 append_quads_data.visible_content_area); |
872 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( | 878 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( |
873 append_quads_data.approximated_visible_content_area); | 879 append_quads_data.approximated_visible_content_area); |
874 rendering_stats_instrumentation_->AddCheckerboardedVisibleContentArea( | 880 rendering_stats_instrumentation_->AddCheckerboardedVisibleContentArea( |
875 append_quads_data.checkerboarded_visible_content_area); | 881 append_quads_data.checkerboarded_visible_content_area); |
876 | 882 |
| 883 if (!append_quads_data.raster_source_covers_visible_high_res_tiles) |
| 884 num_layers_missing_raster_source++; |
| 885 |
877 num_missing_tiles += append_quads_data.num_missing_tiles; | 886 num_missing_tiles += append_quads_data.num_missing_tiles; |
878 num_incomplete_tiles += append_quads_data.num_incomplete_tiles; | 887 num_incomplete_tiles += append_quads_data.num_incomplete_tiles; |
879 | 888 |
880 if (append_quads_data.num_missing_tiles) { | 889 if (append_quads_data.num_missing_tiles) { |
| 890 // TODO(brianderson): Figure out what to do in this case and |
| 891 // differentiate and prioritize scroll wheel, touch scroll, and |
| 892 // animations. |
881 bool layer_has_animating_transform = | 893 bool layer_has_animating_transform = |
882 it->screen_space_transform_is_animating() || | 894 it->screen_space_transform_is_animating() || |
883 it->draw_transform_is_animating(); | 895 it->draw_transform_is_animating(); |
884 if (layer_has_animating_transform) | 896 if (layer_has_animating_transform) |
885 have_missing_animated_tiles = true; | 897 have_missing_animated_tiles = true; |
886 } | 898 } |
887 } | 899 } |
888 | 900 |
889 if (have_missing_animated_tiles) | 901 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) { |
890 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | 902 // When this capability is set we don't have control over the surface the |
891 | 903 // compositor draws to, so even though the frame may not be complete, the |
892 // When we require high res to draw, abort the draw (almost) always. This does | 904 // previous frame has already been potentially lost, so an incomplete frame |
893 // not cause the scheduler to do a main frame, instead it will continue to try | 905 // is |
894 // drawing until we finally complete, so the copy request will not be lost. | 906 // better than nothing, so this takes highest precidence. |
895 // TODO(weiliangc): Remove RequiresHighResToDraw. crbug.com/469175 | 907 // TODO(brianderson): Use a forced draw instead of lying about the draw |
896 if (num_incomplete_tiles || num_missing_tiles) { | 908 // result. |
897 if (RequiresHighResToDraw()) | 909 draw_result = DRAW_SUCCESS; |
898 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | 910 } else if (num_layers_missing_raster_source) { |
| 911 TRACE_EVENT_INSTANT0("cc", "Raster missing source.", |
| 912 TRACE_EVENT_SCOPE_THREAD); |
| 913 draw_result = DRAW_ABORTED_MISSING_RASTER_SOURCE; |
| 914 } else if (num_missing_tiles) { |
| 915 TRACE_EVENT_INSTANT0("cc", "Raster missing output.", |
| 916 TRACE_EVENT_SCOPE_THREAD); |
| 917 draw_result = DRAW_ABORTED_MISSING_RASTER_OUTPUT_ANY_RES; |
| 918 } else if (num_incomplete_tiles) { |
| 919 TRACE_EVENT_INSTANT0("cc", "Raster missing high res.", |
| 920 TRACE_EVENT_SCOPE_THREAD); |
| 921 draw_result = DRAW_ABORTED_MISSING_RASTER_OUTPUT_HIGH_RES; |
899 } | 922 } |
900 | 923 |
901 // When this capability is set we don't have control over the surface the | |
902 // compositor draws to, so even though the frame may not be complete, the | |
903 // previous frame has already been potentially lost, so an incomplete frame is | |
904 // better than nothing, so this takes highest precidence. | |
905 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | |
906 draw_result = DRAW_SUCCESS; | |
907 | |
908 #if DCHECK_IS_ON() | 924 #if DCHECK_IS_ON() |
909 for (const auto& render_pass : frame->render_passes) { | 925 for (const auto& render_pass : frame->render_passes) { |
910 for (const auto& quad : render_pass->quad_list) | 926 for (const auto& quad : render_pass->quad_list) |
911 DCHECK(quad->shared_quad_state); | 927 DCHECK(quad->shared_quad_state); |
912 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | 928 DCHECK(frame->render_passes_by_id.find(render_pass->id) != |
913 frame->render_passes_by_id.end()); | 929 frame->render_passes_by_id.end()); |
914 } | 930 } |
915 #endif | 931 #endif |
916 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 932 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
917 | 933 |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1215 visible_ ? GetMaxStagingResourceCount() : 0); | 1231 visible_ ? GetMaxStagingResourceCount() : 0); |
1216 } | 1232 } |
1217 | 1233 |
1218 DidModifyTilePriorities(); | 1234 DidModifyTilePriorities(); |
1219 } | 1235 } |
1220 | 1236 |
1221 void LayerTreeHostImpl::DidModifyTilePriorities() { | 1237 void LayerTreeHostImpl::DidModifyTilePriorities() { |
1222 DCHECK(settings_.impl_side_painting); | 1238 DCHECK(settings_.impl_side_painting); |
1223 // Mark priorities as dirty and schedule a PrepareTiles(). | 1239 // Mark priorities as dirty and schedule a PrepareTiles(). |
1224 tile_priorities_dirty_ = true; | 1240 tile_priorities_dirty_ = true; |
1225 client_->SetNeedsPrepareTilesOnImplThread(); | 1241 bool for_commit = false; |
| 1242 client_->SetNeedsPrepareTilesOnImplThread(for_commit); |
1226 } | 1243 } |
1227 | 1244 |
1228 scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue( | 1245 scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue( |
1229 TreePriority tree_priority, | 1246 TreePriority tree_priority, |
1230 RasterTilePriorityQueue::Type type) { | 1247 RasterTilePriorityQueue::Type type) { |
1231 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue"); | 1248 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue"); |
1232 | 1249 |
1233 return RasterTilePriorityQueue::Create(active_tree_->picture_layers(), | 1250 return RasterTilePriorityQueue::Create(active_tree_->picture_layers(), |
1234 pending_tree_ | 1251 pending_tree_ |
1235 ? pending_tree_->picture_layers() | 1252 ? pending_tree_->picture_layers() |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1663 ReleaseTreeResources(); | 1680 ReleaseTreeResources(); |
1664 if (tile_manager_) { | 1681 if (tile_manager_) { |
1665 DestroyTileManager(); | 1682 DestroyTileManager(); |
1666 CreateAndSetTileManager(); | 1683 CreateAndSetTileManager(); |
1667 } | 1684 } |
1668 RecreateTreeResources(); | 1685 RecreateTreeResources(); |
1669 | 1686 |
1670 // We have released tilings for both active and pending tree. | 1687 // We have released tilings for both active and pending tree. |
1671 // We would not have any content to draw until the pending tree is activated. | 1688 // We would not have any content to draw until the pending tree is activated. |
1672 // Prevent the active tree from drawing until activation. | 1689 // Prevent the active tree from drawing until activation. |
1673 SetRequiresHighResToDraw(); | 1690 SetRequiresHighResToDraw(true); |
1674 | 1691 |
1675 tree_resources_for_gpu_rasterization_dirty_ = false; | 1692 tree_resources_for_gpu_rasterization_dirty_ = false; |
1676 } | 1693 } |
1677 | 1694 |
1678 const RendererCapabilitiesImpl& | 1695 const RendererCapabilitiesImpl& |
1679 LayerTreeHostImpl::GetRendererCapabilities() const { | 1696 LayerTreeHostImpl::GetRendererCapabilities() const { |
1680 CHECK(renderer_); | 1697 CHECK(renderer_); |
1681 return renderer_->Capabilities(); | 1698 return renderer_->Capabilities(); |
1682 } | 1699 } |
1683 | 1700 |
1684 bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { | 1701 bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { |
1685 ResetRequiresHighResToDraw(); | 1702 SetRequiresHighResToDraw(false); |
1686 if (frame.has_no_damage) { | 1703 if (frame.has_no_damage) { |
1687 active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS); | 1704 active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS); |
1688 return false; | 1705 return false; |
1689 } | 1706 } |
1690 CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); | 1707 CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); |
1691 active_tree()->FinishSwapPromises(&metadata); | 1708 active_tree()->FinishSwapPromises(&metadata); |
1692 for (auto& latency : metadata.latency_info) { | 1709 for (auto& latency : metadata.latency_info) { |
1693 TRACE_EVENT_FLOW_STEP0( | 1710 TRACE_EVENT_FLOW_STEP0( |
1694 "input,benchmark", | 1711 "input,benchmark", |
1695 "LatencyInfo.Flow", | 1712 "LatencyInfo.Flow", |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 | 1954 |
1938 if (visible_ == visible) | 1955 if (visible_ == visible) |
1939 return; | 1956 return; |
1940 visible_ = visible; | 1957 visible_ = visible; |
1941 DidVisibilityChange(this, visible_); | 1958 DidVisibilityChange(this, visible_); |
1942 EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); | 1959 EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); |
1943 | 1960 |
1944 // If we just became visible, we have to ensure that we draw high res tiles, | 1961 // If we just became visible, we have to ensure that we draw high res tiles, |
1945 // to prevent checkerboard/low res flashes. | 1962 // to prevent checkerboard/low res flashes. |
1946 if (visible_) | 1963 if (visible_) |
1947 SetRequiresHighResToDraw(); | 1964 SetRequiresHighResToDraw(true); |
1948 else | 1965 else |
1949 EvictAllUIResources(); | 1966 EvictAllUIResources(); |
1950 | 1967 |
1951 // Evict tiles immediately if invisible since this tab may never get another | |
1952 // draw or timer tick. | |
1953 if (!visible_) | |
1954 PrepareTiles(); | |
1955 | |
1956 if (!renderer_) | 1968 if (!renderer_) |
1957 return; | 1969 return; |
1958 | 1970 |
1959 renderer_->SetVisible(visible); | 1971 renderer_->SetVisible(visible); |
1960 } | 1972 } |
1961 | 1973 |
1962 void LayerTreeHostImpl::SetNeedsAnimate() { | 1974 void LayerTreeHostImpl::SetNeedsAnimate() { |
1963 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); | 1975 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); |
1964 client_->SetNeedsAnimateOnImplThread(); | 1976 client_->SetNeedsAnimateOnImplThread(); |
1965 } | 1977 } |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2241 | 2253 |
2242 int max_frames_pending = output_surface_->capabilities().max_frames_pending; | 2254 int max_frames_pending = output_surface_->capabilities().max_frames_pending; |
2243 if (max_frames_pending <= 0) | 2255 if (max_frames_pending <= 0) |
2244 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING; | 2256 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING; |
2245 client_->SetMaxSwapsPendingOnImplThread(max_frames_pending); | 2257 client_->SetMaxSwapsPendingOnImplThread(max_frames_pending); |
2246 client_->OnCanDrawStateChanged(CanDraw()); | 2258 client_->OnCanDrawStateChanged(CanDraw()); |
2247 | 2259 |
2248 // There will not be anything to draw here, so set high res | 2260 // There will not be anything to draw here, so set high res |
2249 // to avoid checkerboards, typically when we are recovering | 2261 // to avoid checkerboards, typically when we are recovering |
2250 // from lost context. | 2262 // from lost context. |
2251 SetRequiresHighResToDraw(); | 2263 SetRequiresHighResToDraw(true); |
2252 | 2264 |
2253 return true; | 2265 return true; |
2254 } | 2266 } |
2255 | 2267 |
2256 void LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase, | 2268 void LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase, |
2257 base::TimeDelta interval) { | 2269 base::TimeDelta interval) { |
2258 client_->CommitVSyncParameters(timebase, interval); | 2270 client_->CommitVSyncParameters(timebase, interval); |
2259 } | 2271 } |
2260 | 2272 |
2261 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { | 2273 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { |
(...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3442 new_target.SetToMin(layer_impl->MaxScrollOffset()); | 3454 new_target.SetToMin(layer_impl->MaxScrollOffset()); |
3443 | 3455 |
3444 curve->UpdateTarget( | 3456 curve->UpdateTarget( |
3445 animation->TrimTimeToCurrentIteration(CurrentBeginFrameArgs().frame_time) | 3457 animation->TrimTimeToCurrentIteration(CurrentBeginFrameArgs().frame_time) |
3446 .InSecondsF(), | 3458 .InSecondsF(), |
3447 new_target); | 3459 new_target); |
3448 | 3460 |
3449 return true; | 3461 return true; |
3450 } | 3462 } |
3451 } // namespace cc | 3463 } // namespace cc |
OLD | NEW |