| 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() {
|
|
|