| 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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 if (!renderer_) { | 357 if (!renderer_) { |
| 358 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer", | 358 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer", |
| 359 TRACE_EVENT_SCOPE_THREAD); | 359 TRACE_EVENT_SCOPE_THREAD); |
| 360 return false; | 360 return false; |
| 361 } | 361 } |
| 362 | 362 |
| 363 // Must have an OutputSurface if |renderer_| is not NULL. | 363 // Must have an OutputSurface if |renderer_| is not NULL. |
| 364 DCHECK(output_surface_); | 364 DCHECK(output_surface_); |
| 365 | 365 |
| 366 // TODO(boliu): Make draws without root_layer work and move this below | 366 // TODO(boliu): Make draws without root_layer work and move this below |
| 367 // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967. | 367 // |resourceless_software_draw_| check. Tracked in crbug.com/264967. |
| 368 if (!active_tree_->root_layer()) { | 368 if (!active_tree_->root_layer()) { |
| 369 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", | 369 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", |
| 370 TRACE_EVENT_SCOPE_THREAD); | 370 TRACE_EVENT_SCOPE_THREAD); |
| 371 return false; | 371 return false; |
| 372 } | 372 } |
| 373 | 373 |
| 374 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 374 if (resourceless_software_draw_) |
| 375 return true; | 375 return true; |
| 376 | 376 |
| 377 if (!visible_) { |
| 378 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw invisible", |
| 379 TRACE_EVENT_SCOPE_THREAD); |
| 380 return false; |
| 381 } |
| 382 |
| 377 if (DrawViewportSize().IsEmpty()) { | 383 if (DrawViewportSize().IsEmpty()) { |
| 378 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", | 384 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", |
| 379 TRACE_EVENT_SCOPE_THREAD); | 385 TRACE_EVENT_SCOPE_THREAD); |
| 380 return false; | 386 return false; |
| 381 } | 387 } |
| 382 if (active_tree_->ViewportSizeInvalid()) { | 388 if (active_tree_->ViewportSizeInvalid()) { |
| 383 TRACE_EVENT_INSTANT0( | 389 TRACE_EVENT_INSTANT0( |
| 384 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", | 390 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", |
| 385 TRACE_EVENT_SCOPE_THREAD); | 391 TRACE_EVENT_SCOPE_THREAD); |
| 386 return false; | 392 return false; |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 bool hud_wants_to_draw_ = active_tree_->hud_layer() && | 763 bool hud_wants_to_draw_ = active_tree_->hud_layer() && |
| 758 active_tree_->hud_layer()->IsAnimatingHUDContents(); | 764 active_tree_->hud_layer()->IsAnimatingHUDContents(); |
| 759 if (root_surface_has_contributing_layers && | 765 if (root_surface_has_contributing_layers && |
| 760 root_surface_has_no_visible_damage && | 766 root_surface_has_no_visible_damage && |
| 761 active_tree_->LayersWithCopyOutputRequest().empty() && | 767 active_tree_->LayersWithCopyOutputRequest().empty() && |
| 762 !output_surface_->capabilities().can_force_reclaim_resources && | 768 !output_surface_->capabilities().can_force_reclaim_resources && |
| 763 !hud_wants_to_draw_) { | 769 !hud_wants_to_draw_) { |
| 764 TRACE_EVENT0("cc", | 770 TRACE_EVENT0("cc", |
| 765 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 771 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
| 766 frame->has_no_damage = true; | 772 frame->has_no_damage = true; |
| 767 DCHECK(!output_surface_->capabilities() | 773 DCHECK(!resourceless_software_draw_); |
| 768 .draw_and_swap_full_viewport_every_frame); | |
| 769 return DRAW_SUCCESS; | 774 return DRAW_SUCCESS; |
| 770 } | 775 } |
| 771 | 776 |
| 772 TRACE_EVENT_BEGIN2( | 777 TRACE_EVENT_BEGIN2( |
| 773 "cc", "LayerTreeHostImpl::CalculateRenderPasses", | 778 "cc", "LayerTreeHostImpl::CalculateRenderPasses", |
| 774 "render_surface_layer_list.size()", | 779 "render_surface_layer_list.size()", |
| 775 static_cast<uint64>(frame->render_surface_layer_list->size()), | 780 static_cast<uint64>(frame->render_surface_layer_list->size()), |
| 776 "RequiresHighResToDraw", RequiresHighResToDraw()); | 781 "RequiresHighResToDraw", RequiresHighResToDraw()); |
| 777 | 782 |
| 778 // Create the render passes in dependency order. | 783 // Create the render passes in dependency order. |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 | 942 |
| 938 // When we require high res to draw, abort the draw (almost) always. This does | 943 // When we require high res to draw, abort the draw (almost) always. This does |
| 939 // not cause the scheduler to do a main frame, instead it will continue to try | 944 // not cause the scheduler to do a main frame, instead it will continue to try |
| 940 // drawing until we finally complete, so the copy request will not be lost. | 945 // drawing until we finally complete, so the copy request will not be lost. |
| 941 // TODO(weiliangc): Remove RequiresHighResToDraw. crbug.com/469175 | 946 // TODO(weiliangc): Remove RequiresHighResToDraw. crbug.com/469175 |
| 942 if (num_incomplete_tiles || num_missing_tiles) { | 947 if (num_incomplete_tiles || num_missing_tiles) { |
| 943 if (RequiresHighResToDraw()) | 948 if (RequiresHighResToDraw()) |
| 944 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | 949 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
| 945 } | 950 } |
| 946 | 951 |
| 947 // When this capability is set we don't have control over the surface the | 952 // When resourceless software draw, we don't have control over the surface the |
| 948 // compositor draws to, so even though the frame may not be complete, the | 953 // compositor draws to, so even though the frame may not be complete, the |
| 949 // previous frame has already been potentially lost, so an incomplete frame is | 954 // previous frame has already been potentially lost, so an incomplete frame is |
| 950 // better than nothing, so this takes highest precidence. | 955 // better than nothing, so this takes highest precidence. |
| 951 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 956 if (resourceless_software_draw_) |
| 952 draw_result = DRAW_SUCCESS; | 957 draw_result = DRAW_SUCCESS; |
| 953 | 958 |
| 954 #if DCHECK_IS_ON() | 959 #if DCHECK_IS_ON() |
| 955 for (const auto& render_pass : frame->render_passes) { | 960 for (const auto& render_pass : frame->render_passes) { |
| 956 for (const auto& quad : render_pass->quad_list) | 961 for (const auto& quad : render_pass->quad_list) |
| 957 DCHECK(quad->shared_quad_state); | 962 DCHECK(quad->shared_quad_state); |
| 958 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | 963 DCHECK(frame->render_passes_by_id.find(render_pass->id) != |
| 959 frame->render_passes_by_id.end()); | 964 frame->render_passes_by_id.end()); |
| 960 } | 965 } |
| 961 #endif | 966 #endif |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 if (active_tree_->root_layer()) { | 1087 if (active_tree_->root_layer()) { |
| 1083 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1088 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
| 1084 viewport_damage_rect_ = gfx::Rect(); | 1089 viewport_damage_rect_ = gfx::Rect(); |
| 1085 | 1090 |
| 1086 active_tree_->root_layer()->render_surface()->damage_tracker()-> | 1091 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
| 1087 AddDamageNextUpdate(device_viewport_damage_rect); | 1092 AddDamageNextUpdate(device_viewport_damage_rect); |
| 1088 } | 1093 } |
| 1089 | 1094 |
| 1090 DrawResult draw_result = CalculateRenderPasses(frame); | 1095 DrawResult draw_result = CalculateRenderPasses(frame); |
| 1091 if (draw_result != DRAW_SUCCESS) { | 1096 if (draw_result != DRAW_SUCCESS) { |
| 1092 DCHECK(!output_surface_->capabilities() | 1097 DCHECK(!resourceless_software_draw_); |
| 1093 .draw_and_swap_full_viewport_every_frame); | |
| 1094 return draw_result; | 1098 return draw_result; |
| 1095 } | 1099 } |
| 1096 | 1100 |
| 1097 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before | 1101 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before |
| 1098 // this function is called again. | 1102 // this function is called again. |
| 1099 return draw_result; | 1103 return draw_result; |
| 1100 } | 1104 } |
| 1101 | 1105 |
| 1102 void LayerTreeHostImpl::RemoveRenderPasses(FrameData* frame) { | 1106 void LayerTreeHostImpl::RemoveRenderPasses(FrameData* frame) { |
| 1103 // There is always at least a root RenderPass. | 1107 // There is always at least a root RenderPass. |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1422 viewport_rect_for_tile_priority_in_view_space) { | 1426 viewport_rect_for_tile_priority_in_view_space) { |
| 1423 active_tree_->set_needs_update_draw_properties(); | 1427 active_tree_->set_needs_update_draw_properties(); |
| 1424 } | 1428 } |
| 1425 | 1429 |
| 1426 external_transform_ = transform; | 1430 external_transform_ = transform; |
| 1427 external_viewport_ = viewport; | 1431 external_viewport_ = viewport; |
| 1428 external_clip_ = clip; | 1432 external_clip_ = clip; |
| 1429 viewport_rect_for_tile_priority_ = | 1433 viewport_rect_for_tile_priority_ = |
| 1430 viewport_rect_for_tile_priority_in_view_space; | 1434 viewport_rect_for_tile_priority_in_view_space; |
| 1431 resourceless_software_draw_ = resourceless_software_draw; | 1435 resourceless_software_draw_ = resourceless_software_draw; |
| 1436 client_->OnCanDrawStateChanged(CanDraw()); |
| 1432 } | 1437 } |
| 1433 | 1438 |
| 1434 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { | 1439 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
| 1435 if (damage_rect.IsEmpty()) | 1440 if (damage_rect.IsEmpty()) |
| 1436 return; | 1441 return; |
| 1437 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); | 1442 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); |
| 1438 client_->SetNeedsRedrawRectOnImplThread(damage_rect); | 1443 client_->SetNeedsRedrawRectOnImplThread(damage_rect); |
| 1439 } | 1444 } |
| 1440 | 1445 |
| 1441 void LayerTreeHostImpl::DidSwapBuffers() { | 1446 void LayerTreeHostImpl::DidSwapBuffers() { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1518 base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; | 1523 base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; |
| 1519 DCHECK(CanDraw()); | 1524 DCHECK(CanDraw()); |
| 1520 | 1525 |
| 1521 if (!frame->composite_events.empty()) { | 1526 if (!frame->composite_events.empty()) { |
| 1522 frame_timing_tracker_->SaveTimeStamps(frame_begin_time, | 1527 frame_timing_tracker_->SaveTimeStamps(frame_begin_time, |
| 1523 frame->composite_events); | 1528 frame->composite_events); |
| 1524 } | 1529 } |
| 1525 | 1530 |
| 1526 if (frame->has_no_damage) { | 1531 if (frame->has_no_damage) { |
| 1527 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); | 1532 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); |
| 1528 DCHECK(!output_surface_->capabilities() | 1533 DCHECK(!resourceless_software_draw_); |
| 1529 .draw_and_swap_full_viewport_every_frame); | |
| 1530 return; | 1534 return; |
| 1531 } | 1535 } |
| 1532 | 1536 |
| 1533 DCHECK(!frame->render_passes.empty()); | 1537 DCHECK(!frame->render_passes.empty()); |
| 1534 | 1538 |
| 1535 fps_counter_->SaveTimeStamp(frame_begin_time, | 1539 fps_counter_->SaveTimeStamp(frame_begin_time, |
| 1536 !output_surface_->context_provider()); | 1540 !output_surface_->context_provider()); |
| 1537 rendering_stats_instrumentation_->IncrementFrameCount(1); | 1541 rendering_stats_instrumentation_->IncrementFrameCount(1); |
| 1538 | 1542 |
| 1539 memory_history_->SaveEntry(tile_manager_->memory_stats_from_last_assign()); | 1543 memory_history_->SaveEntry(tile_manager_->memory_stats_from_last_assign()); |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1954 UpdateRootLayerStateForSynchronousInputHandler(); | 1958 UpdateRootLayerStateForSynchronousInputHandler(); |
| 1955 } | 1959 } |
| 1956 | 1960 |
| 1957 void LayerTreeHostImpl::SetVisible(bool visible) { | 1961 void LayerTreeHostImpl::SetVisible(bool visible) { |
| 1958 DCHECK(proxy_->IsImplThread()); | 1962 DCHECK(proxy_->IsImplThread()); |
| 1959 | 1963 |
| 1960 if (visible_ == visible) | 1964 if (visible_ == visible) |
| 1961 return; | 1965 return; |
| 1962 visible_ = visible; | 1966 visible_ = visible; |
| 1963 DidVisibilityChange(this, visible_); | 1967 DidVisibilityChange(this, visible_); |
| 1968 client_->OnCanDrawStateChanged(CanDraw()); |
| 1964 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1969 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| 1965 | 1970 |
| 1966 // If we just became visible, we have to ensure that we draw high res tiles, | 1971 // If we just became visible, we have to ensure that we draw high res tiles, |
| 1967 // to prevent checkerboard/low res flashes. | 1972 // to prevent checkerboard/low res flashes. |
| 1968 if (visible_) | 1973 if (visible_) |
| 1969 SetRequiresHighResToDraw(); | 1974 SetRequiresHighResToDraw(); |
| 1970 else | 1975 else |
| 1971 EvictAllUIResources(); | 1976 EvictAllUIResources(); |
| 1972 | 1977 |
| 1973 // Call PrepareTiles to evict tiles when we become invisible. | 1978 // Call PrepareTiles to evict tiles when we become invisible. |
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2778 | 2783 |
| 2779 return false; | 2784 return false; |
| 2780 } | 2785 } |
| 2781 | 2786 |
| 2782 void LayerTreeHostImpl::RequestUpdateForSynchronousInputHandler() { | 2787 void LayerTreeHostImpl::RequestUpdateForSynchronousInputHandler() { |
| 2783 UpdateRootLayerStateForSynchronousInputHandler(); | 2788 UpdateRootLayerStateForSynchronousInputHandler(); |
| 2784 } | 2789 } |
| 2785 | 2790 |
| 2786 void LayerTreeHostImpl::SetSynchronousInputHandlerRootScrollOffset( | 2791 void LayerTreeHostImpl::SetSynchronousInputHandlerRootScrollOffset( |
| 2787 const gfx::ScrollOffset& root_offset) { | 2792 const gfx::ScrollOffset& root_offset) { |
| 2788 active_tree_->DistributeRootScrollOffset(root_offset); | 2793 bool changed = active_tree_->DistributeRootScrollOffset(root_offset); |
| 2794 if (!changed) |
| 2795 return; |
| 2796 |
| 2789 client_->SetNeedsCommitOnImplThread(); | 2797 client_->SetNeedsCommitOnImplThread(); |
| 2790 // After applying the synchronous input handler's scroll offset, tell it what | 2798 // After applying the synchronous input handler's scroll offset, tell it what |
| 2791 // we ended up with. | 2799 // we ended up with. |
| 2792 UpdateRootLayerStateForSynchronousInputHandler(); | 2800 UpdateRootLayerStateForSynchronousInputHandler(); |
| 2793 // No need to SetNeedsRedraw, this is for WebView and every frame has redraw | 2801 SetNeedsRedraw(); |
| 2794 // requested by the WebView embedder already. | |
| 2795 } | 2802 } |
| 2796 | 2803 |
| 2797 void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() { | 2804 void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() { |
| 2798 active_tree_->ClearCurrentlyScrollingLayer(); | 2805 active_tree_->ClearCurrentlyScrollingLayer(); |
| 2799 did_lock_scrolling_layer_ = false; | 2806 did_lock_scrolling_layer_ = false; |
| 2800 scroll_affects_scroll_handler_ = false; | 2807 scroll_affects_scroll_handler_ = false; |
| 2801 accumulated_root_overscroll_ = gfx::Vector2dF(); | 2808 accumulated_root_overscroll_ = gfx::Vector2dF(); |
| 2802 } | 2809 } |
| 2803 | 2810 |
| 2804 void LayerTreeHostImpl::ScrollEnd() { | 2811 void LayerTreeHostImpl::ScrollEnd() { |
| (...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3607 if (active_tree()) { | 3614 if (active_tree()) { |
| 3608 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3615 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); |
| 3609 if (layer) | 3616 if (layer) |
| 3610 return layer->ScrollOffsetForAnimation(); | 3617 return layer->ScrollOffsetForAnimation(); |
| 3611 } | 3618 } |
| 3612 | 3619 |
| 3613 return gfx::ScrollOffset(); | 3620 return gfx::ScrollOffset(); |
| 3614 } | 3621 } |
| 3615 | 3622 |
| 3616 } // namespace cc | 3623 } // namespace cc |
| OLD | NEW |