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

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: tests compile but crash 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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698