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

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: rebase + clean ups 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
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 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698