Chromium Code Reviews| 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 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 358 if (!renderer_) { | 358 if (!renderer_) { |
| 359 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer", | 359 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer", |
| 360 TRACE_EVENT_SCOPE_THREAD); | 360 TRACE_EVENT_SCOPE_THREAD); |
| 361 return false; | 361 return false; |
| 362 } | 362 } |
| 363 | 363 |
| 364 // Must have an OutputSurface if |renderer_| is not NULL. | 364 // Must have an OutputSurface if |renderer_| is not NULL. |
| 365 DCHECK(output_surface_); | 365 DCHECK(output_surface_); |
| 366 | 366 |
| 367 // TODO(boliu): Make draws without root_layer work and move this below | 367 // TODO(boliu): Make draws without root_layer work and move this below |
| 368 // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967. | 368 // |resourceless_software_draw_| check. Tracked in crbug.com/264967. |
| 369 if (!active_tree_->root_layer()) { | 369 if (!active_tree_->root_layer()) { |
| 370 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", | 370 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", |
| 371 TRACE_EVENT_SCOPE_THREAD); | 371 TRACE_EVENT_SCOPE_THREAD); |
| 372 return false; | 372 return false; |
| 373 } | 373 } |
| 374 | 374 |
| 375 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 375 if (resourceless_software_draw_) |
| 376 return true; | 376 return true; |
| 377 | 377 |
| 378 if (DrawViewportSize().IsEmpty()) { | 378 if (DrawViewportSize().IsEmpty()) { |
| 379 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", | 379 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", |
| 380 TRACE_EVENT_SCOPE_THREAD); | 380 TRACE_EVENT_SCOPE_THREAD); |
| 381 return false; | 381 return false; |
| 382 } | 382 } |
| 383 if (active_tree_->ViewportSizeInvalid()) { | 383 if (active_tree_->ViewportSizeInvalid()) { |
| 384 TRACE_EVENT_INSTANT0( | 384 TRACE_EVENT_INSTANT0( |
| 385 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", | 385 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 758 bool hud_wants_to_draw_ = active_tree_->hud_layer() && | 758 bool hud_wants_to_draw_ = active_tree_->hud_layer() && |
| 759 active_tree_->hud_layer()->IsAnimatingHUDContents(); | 759 active_tree_->hud_layer()->IsAnimatingHUDContents(); |
| 760 if (root_surface_has_contributing_layers && | 760 if (root_surface_has_contributing_layers && |
| 761 root_surface_has_no_visible_damage && | 761 root_surface_has_no_visible_damage && |
| 762 active_tree_->LayersWithCopyOutputRequest().empty() && | 762 active_tree_->LayersWithCopyOutputRequest().empty() && |
| 763 !output_surface_->capabilities().can_force_reclaim_resources && | 763 !output_surface_->capabilities().can_force_reclaim_resources && |
| 764 !hud_wants_to_draw_) { | 764 !hud_wants_to_draw_) { |
| 765 TRACE_EVENT0("cc", | 765 TRACE_EVENT0("cc", |
| 766 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 766 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
| 767 frame->has_no_damage = true; | 767 frame->has_no_damage = true; |
| 768 DCHECK(!output_surface_->capabilities() | 768 DCHECK(!resourceless_software_draw_); |
| 769 .draw_and_swap_full_viewport_every_frame); | |
| 770 return DRAW_SUCCESS; | 769 return DRAW_SUCCESS; |
| 771 } | 770 } |
| 772 | 771 |
| 773 TRACE_EVENT_BEGIN2( | 772 TRACE_EVENT_BEGIN2( |
| 774 "cc", "LayerTreeHostImpl::CalculateRenderPasses", | 773 "cc", "LayerTreeHostImpl::CalculateRenderPasses", |
| 775 "render_surface_layer_list.size()", | 774 "render_surface_layer_list.size()", |
| 776 static_cast<uint64>(frame->render_surface_layer_list->size()), | 775 static_cast<uint64>(frame->render_surface_layer_list->size()), |
| 777 "RequiresHighResToDraw", RequiresHighResToDraw()); | 776 "RequiresHighResToDraw", RequiresHighResToDraw()); |
| 778 | 777 |
| 779 // Create the render passes in dependency order. | 778 // Create the render passes in dependency order. |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 938 | 937 |
| 939 // When we require high res to draw, abort the draw (almost) always. This does | 938 // When we require high res to draw, abort the draw (almost) always. This does |
| 940 // not cause the scheduler to do a main frame, instead it will continue to try | 939 // not cause the scheduler to do a main frame, instead it will continue to try |
| 941 // drawing until we finally complete, so the copy request will not be lost. | 940 // drawing until we finally complete, so the copy request will not be lost. |
| 942 // TODO(weiliangc): Remove RequiresHighResToDraw. crbug.com/469175 | 941 // TODO(weiliangc): Remove RequiresHighResToDraw. crbug.com/469175 |
| 943 if (num_incomplete_tiles || num_missing_tiles) { | 942 if (num_incomplete_tiles || num_missing_tiles) { |
| 944 if (RequiresHighResToDraw()) | 943 if (RequiresHighResToDraw()) |
| 945 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | 944 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
| 946 } | 945 } |
| 947 | 946 |
| 948 // When this capability is set we don't have control over the surface the | 947 // When resourceless software draw, we don't have control over the surface the |
| 949 // compositor draws to, so even though the frame may not be complete, the | 948 // compositor draws to, so even though the frame may not be complete, the |
| 950 // previous frame has already been potentially lost, so an incomplete frame is | 949 // previous frame has already been potentially lost, so an incomplete frame is |
| 951 // better than nothing, so this takes highest precidence. | 950 // better than nothing, so this takes highest precidence. |
| 952 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 951 if (resourceless_software_draw_) |
| 953 draw_result = DRAW_SUCCESS; | 952 draw_result = DRAW_SUCCESS; |
| 954 | 953 |
| 955 #if DCHECK_IS_ON() | 954 #if DCHECK_IS_ON() |
| 956 for (const auto& render_pass : frame->render_passes) { | 955 for (const auto& render_pass : frame->render_passes) { |
| 957 for (const auto& quad : render_pass->quad_list) | 956 for (const auto& quad : render_pass->quad_list) |
| 958 DCHECK(quad->shared_quad_state); | 957 DCHECK(quad->shared_quad_state); |
| 959 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | 958 DCHECK(frame->render_passes_by_id.find(render_pass->id) != |
| 960 frame->render_passes_by_id.end()); | 959 frame->render_passes_by_id.end()); |
| 961 } | 960 } |
| 962 #endif | 961 #endif |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1083 if (active_tree_->root_layer()) { | 1082 if (active_tree_->root_layer()) { |
| 1084 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1083 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
| 1085 viewport_damage_rect_ = gfx::Rect(); | 1084 viewport_damage_rect_ = gfx::Rect(); |
| 1086 | 1085 |
| 1087 active_tree_->root_layer()->render_surface()->damage_tracker()-> | 1086 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
| 1088 AddDamageNextUpdate(device_viewport_damage_rect); | 1087 AddDamageNextUpdate(device_viewport_damage_rect); |
| 1089 } | 1088 } |
| 1090 | 1089 |
| 1091 DrawResult draw_result = CalculateRenderPasses(frame); | 1090 DrawResult draw_result = CalculateRenderPasses(frame); |
| 1092 if (draw_result != DRAW_SUCCESS) { | 1091 if (draw_result != DRAW_SUCCESS) { |
| 1093 DCHECK(!output_surface_->capabilities() | 1092 DCHECK(!resourceless_software_draw_); |
| 1094 .draw_and_swap_full_viewport_every_frame); | |
| 1095 return draw_result; | 1093 return draw_result; |
| 1096 } | 1094 } |
| 1097 | 1095 |
| 1098 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before | 1096 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before |
| 1099 // this function is called again. | 1097 // this function is called again. |
| 1100 return draw_result; | 1098 return draw_result; |
| 1101 } | 1099 } |
| 1102 | 1100 |
| 1103 void LayerTreeHostImpl::RemoveRenderPasses(FrameData* frame) { | 1101 void LayerTreeHostImpl::RemoveRenderPasses(FrameData* frame) { |
| 1104 // There is always at least a root RenderPass. | 1102 // There is always at least a root RenderPass. |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1441 | 1439 |
| 1442 // When not toggling resourceless software draw, need to set redraw for | 1440 // When not toggling resourceless software draw, need to set redraw for |
| 1443 // all changes to draw parameters. Damage will be set externally by Android | 1441 // all changes to draw parameters. Damage will be set externally by Android |
| 1444 // WebView for resourceless software draw toggles, so ignored here. | 1442 // WebView for resourceless software draw toggles, so ignored here. |
| 1445 const bool draw_params_changed = transform_changed || viewport_changed || | 1443 const bool draw_params_changed = transform_changed || viewport_changed || |
| 1446 clip_changed || tile_priority_params_changed; | 1444 clip_changed || tile_priority_params_changed; |
| 1447 if (!resourceless_software_draw_changed && draw_params_changed) { | 1445 if (!resourceless_software_draw_changed && draw_params_changed) { |
| 1448 SetFullRootLayerDamage(); | 1446 SetFullRootLayerDamage(); |
| 1449 SetNeedsRedraw(); | 1447 SetNeedsRedraw(); |
| 1450 } | 1448 } |
| 1449 | |
| 1450 if (resourceless_software_draw_changed) { | |
| 1451 client_->OnResourcelessSoftareDrawStateChanged(resourceless_software_draw); | |
|
brianderson
2015/10/21 22:43:04
Is it possible this is triggered within a draw? Ju
boliu
2015/10/21 22:46:34
As in inside LTHI::OnDraw? Nope
| |
| 1452 client_->OnCanDrawStateChanged(CanDraw()); | |
| 1453 } | |
| 1451 } | 1454 } |
| 1452 | 1455 |
| 1453 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { | 1456 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
| 1454 if (damage_rect.IsEmpty()) | 1457 if (damage_rect.IsEmpty()) |
| 1455 return; | 1458 return; |
| 1456 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); | 1459 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); |
| 1457 client_->SetNeedsRedrawRectOnImplThread(damage_rect); | 1460 client_->SetNeedsRedrawRectOnImplThread(damage_rect); |
| 1458 } | 1461 } |
| 1459 | 1462 |
| 1460 void LayerTreeHostImpl::DidSwapBuffers() { | 1463 void LayerTreeHostImpl::DidSwapBuffers() { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1549 base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; | 1552 base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; |
| 1550 DCHECK(CanDraw()); | 1553 DCHECK(CanDraw()); |
| 1551 | 1554 |
| 1552 if (!frame->composite_events.empty()) { | 1555 if (!frame->composite_events.empty()) { |
| 1553 frame_timing_tracker_->SaveTimeStamps(frame_begin_time, | 1556 frame_timing_tracker_->SaveTimeStamps(frame_begin_time, |
| 1554 frame->composite_events); | 1557 frame->composite_events); |
| 1555 } | 1558 } |
| 1556 | 1559 |
| 1557 if (frame->has_no_damage) { | 1560 if (frame->has_no_damage) { |
| 1558 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); | 1561 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); |
| 1559 DCHECK(!output_surface_->capabilities() | 1562 DCHECK(!resourceless_software_draw_); |
| 1560 .draw_and_swap_full_viewport_every_frame); | |
| 1561 return; | 1563 return; |
| 1562 } | 1564 } |
| 1563 | 1565 |
| 1564 DCHECK(!frame->render_passes.empty()); | 1566 DCHECK(!frame->render_passes.empty()); |
| 1565 | 1567 |
| 1566 fps_counter_->SaveTimeStamp(frame_begin_time, | 1568 fps_counter_->SaveTimeStamp(frame_begin_time, |
| 1567 !output_surface_->context_provider()); | 1569 !output_surface_->context_provider()); |
| 1568 rendering_stats_instrumentation_->IncrementFrameCount(1); | 1570 rendering_stats_instrumentation_->IncrementFrameCount(1); |
| 1569 | 1571 |
| 1570 memory_history_->SaveEntry(tile_manager_->memory_stats_from_last_assign()); | 1572 memory_history_->SaveEntry(tile_manager_->memory_stats_from_last_assign()); |
| (...skipping 2058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3629 if (active_tree()) { | 3631 if (active_tree()) { |
| 3630 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3632 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); |
| 3631 if (layer) | 3633 if (layer) |
| 3632 return layer->ScrollOffsetForAnimation(); | 3634 return layer->ScrollOffsetForAnimation(); |
| 3633 } | 3635 } |
| 3634 | 3636 |
| 3635 return gfx::ScrollOffset(); | 3637 return gfx::ScrollOffset(); |
| 3636 } | 3638 } |
| 3637 | 3639 |
| 3638 } // namespace cc | 3640 } // namespace cc |
| OLD | NEW |