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