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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: cc/trees/layer_tree_host_impl.cc
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 85ceb2e95a5109150374c74dab9eccfef375b3e8..19d62361176e5c156f1f36f3cc53e7c1a673ca63 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -364,16 +364,22 @@ bool LayerTreeHostImpl::CanDraw() const {
DCHECK(output_surface_);
// TODO(boliu): Make draws without root_layer work and move this below
- // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967.
+ // |resourceless_software_draw_| check. Tracked in crbug.com/264967.
if (!active_tree_->root_layer()) {
TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer",
TRACE_EVENT_SCOPE_THREAD);
return false;
}
- if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
+ if (resourceless_software_draw_)
return true;
+ if (!visible_) {
+ TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw invisible",
+ TRACE_EVENT_SCOPE_THREAD);
+ return false;
+ }
+
if (DrawViewportSize().IsEmpty()) {
TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport",
TRACE_EVENT_SCOPE_THREAD);
@@ -764,8 +770,7 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
TRACE_EVENT0("cc",
"LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect");
frame->has_no_damage = true;
- DCHECK(!output_surface_->capabilities()
- .draw_and_swap_full_viewport_every_frame);
+ DCHECK(!resourceless_software_draw_);
return DRAW_SUCCESS;
}
@@ -944,11 +949,11 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
}
- // When this capability is set we don't have control over the surface the
+ // When resourceless software draw, we don't have control over the surface the
// compositor draws to, so even though the frame may not be complete, the
// previous frame has already been potentially lost, so an incomplete frame is
// better than nothing, so this takes highest precidence.
- if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
+ if (resourceless_software_draw_)
draw_result = DRAW_SUCCESS;
#if DCHECK_IS_ON()
@@ -1089,8 +1094,7 @@ DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
DrawResult draw_result = CalculateRenderPasses(frame);
if (draw_result != DRAW_SUCCESS) {
- DCHECK(!output_surface_->capabilities()
- .draw_and_swap_full_viewport_every_frame);
+ DCHECK(!resourceless_software_draw_);
return draw_result;
}
@@ -1429,6 +1433,7 @@ void LayerTreeHostImpl::SetExternalDrawConstraints(
viewport_rect_for_tile_priority_ =
viewport_rect_for_tile_priority_in_view_space;
resourceless_software_draw_ = resourceless_software_draw;
+ client_->OnCanDrawStateChanged(CanDraw());
}
void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
@@ -1525,8 +1530,7 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame) {
if (frame->has_no_damage) {
TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD);
- DCHECK(!output_surface_->capabilities()
- .draw_and_swap_full_viewport_every_frame);
+ DCHECK(!resourceless_software_draw_);
return;
}
@@ -1961,6 +1965,7 @@ void LayerTreeHostImpl::SetVisible(bool visible) {
return;
visible_ = visible;
DidVisibilityChange(this, visible_);
+ client_->OnCanDrawStateChanged(CanDraw());
UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
// If we just became visible, we have to ensure that we draw high res tiles,
@@ -2785,13 +2790,15 @@ void LayerTreeHostImpl::RequestUpdateForSynchronousInputHandler() {
void LayerTreeHostImpl::SetSynchronousInputHandlerRootScrollOffset(
const gfx::ScrollOffset& root_offset) {
- active_tree_->DistributeRootScrollOffset(root_offset);
+ bool changed = active_tree_->DistributeRootScrollOffset(root_offset);
+ if (!changed)
+ return;
+
client_->SetNeedsCommitOnImplThread();
// After applying the synchronous input handler's scroll offset, tell it what
// we ended up with.
UpdateRootLayerStateForSynchronousInputHandler();
- // No need to SetNeedsRedraw, this is for WebView and every frame has redraw
- // requested by the WebView embedder already.
+ SetNeedsRedraw();
}
void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() {

Powered by Google App Engine
This is Rietveld 408576698