Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(387)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 1394263004: android webview: allow cc to fail hardware draw (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: damage before hardware to avoid invalidate-draw loop Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698