| 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 61253372be19003f42f111f0856321cc61acb389..5ad085c8aaf1925bd0e68289aab5db940385401e 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -321,7 +321,8 @@ void LayerTreeHostImpl::CommitComplete() {
|
| sync_tree()->UpdateDrawProperties(update_lcd_text);
|
| // Start working on newly created tiles immediately if needed.
|
| if (tile_manager_ && tile_priorities_dirty_) {
|
| - PrepareTiles();
|
| + bool for_commit = true;
|
| + client_->SetNeedsPrepareTilesOnImplThread(for_commit);
|
| } else {
|
| NotifyReadyToActivate();
|
|
|
| @@ -410,8 +411,6 @@ void LayerTreeHostImpl::PrepareTiles() {
|
|
|
| tile_priorities_dirty_ = false;
|
| tile_manager_->PrepareTiles(global_tile_state_);
|
| -
|
| - client_->DidPrepareTiles();
|
| }
|
|
|
| void LayerTreeHostImpl::StartPageScaleAnimation(
|
| @@ -787,6 +786,7 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
|
|
| const DrawMode draw_mode = GetDrawMode();
|
|
|
| + int num_tiles_missing_raster_source = 0;
|
| int num_missing_tiles = 0;
|
| int num_incomplete_tiles = 0;
|
| bool have_copy_request = false;
|
| @@ -869,10 +869,15 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
| rendering_stats_instrumentation_->AddCheckerboardedVisibleContentArea(
|
| append_quads_data.checkerboarded_visible_content_area);
|
|
|
| + num_tiles_missing_raster_source +=
|
| + append_quads_data.num_tiles_missing_raster_source;
|
| num_missing_tiles += append_quads_data.num_missing_tiles;
|
| num_incomplete_tiles += append_quads_data.num_incomplete_tiles;
|
|
|
| if (append_quads_data.num_missing_tiles) {
|
| + // TODO(brianderson): Figure out what to do in this case and
|
| + // differentiate and prioritize scroll wheel, touch scroll, and
|
| + // animations.
|
| bool layer_has_animating_transform =
|
| it->screen_space_transform_is_animating() ||
|
| it->draw_transform_is_animating();
|
| @@ -881,24 +886,22 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
| }
|
| }
|
|
|
| - if (have_missing_animated_tiles)
|
| - draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
|
| -
|
| - // When we require high res to draw, abort the draw (almost) always. This does
|
| - // not cause the scheduler to do a main frame, instead it will continue to try
|
| - // drawing until we finally complete, so the copy request will not be lost.
|
| - // TODO(weiliangc): Remove RequiresHighResToDraw. crbug.com/469175
|
| - if (num_incomplete_tiles || num_missing_tiles) {
|
| - if (RequiresHighResToDraw())
|
| - draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
|
| - }
|
| -
|
| - // When this capability is set 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 (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) {
|
| + // When this capability is set 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.
|
| + // TODO(brianderson): Use a forced draw instead of lying about the draw
|
| + // result.
|
| draw_result = DRAW_SUCCESS;
|
| + } else if (num_tiles_missing_raster_source) {
|
| + draw_result = DRAW_ABORTED_MISSING_RASTER_SOURCE;
|
| + } else if (num_missing_tiles) {
|
| + draw_result = DRAW_ABORTED_MISSING_RASTER_OUTPUT_ANY;
|
| + } else if (num_incomplete_tiles) {
|
| + draw_result = DRAW_ABORTED_MISSING_RASTER_OUTPUT_HIGH_RES;
|
| + }
|
|
|
| #if DCHECK_IS_ON()
|
| for (const auto& render_pass : frame->render_passes) {
|
| @@ -1217,7 +1220,8 @@ void LayerTreeHostImpl::DidModifyTilePriorities() {
|
| DCHECK(settings_.impl_side_painting);
|
| // Mark priorities as dirty and schedule a PrepareTiles().
|
| tile_priorities_dirty_ = true;
|
| - client_->SetNeedsPrepareTilesOnImplThread();
|
| + bool for_commit = false;
|
| + client_->SetNeedsPrepareTilesOnImplThread(for_commit);
|
| }
|
|
|
| scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue(
|
| @@ -1633,7 +1637,7 @@ void LayerTreeHostImpl::UpdateGpuRasterizationStatus() {
|
| // We have released tilings for both active and pending tree.
|
| // We would not have any content to draw until the pending tree is activated.
|
| // Prevent the active tree from drawing until activation.
|
| - SetRequiresHighResToDraw();
|
| + SetRequiresHighResToDraw(true);
|
| }
|
|
|
| const RendererCapabilitiesImpl&
|
| @@ -1643,7 +1647,7 @@ LayerTreeHostImpl::GetRendererCapabilities() const {
|
| }
|
|
|
| bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) {
|
| - ResetRequiresHighResToDraw();
|
| + SetRequiresHighResToDraw(false);
|
| if (frame.has_no_damage) {
|
| active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS);
|
| return false;
|
| @@ -1905,15 +1909,10 @@ void LayerTreeHostImpl::SetVisible(bool visible) {
|
| // If we just became visible, we have to ensure that we draw high res tiles,
|
| // to prevent checkerboard/low res flashes.
|
| if (visible_)
|
| - SetRequiresHighResToDraw();
|
| + SetRequiresHighResToDraw(true);
|
| else
|
| EvictAllUIResources();
|
|
|
| - // Evict tiles immediately if invisible since this tab may never get another
|
| - // draw or timer tick.
|
| - if (!visible_)
|
| - PrepareTiles();
|
| -
|
| if (!renderer_)
|
| return;
|
|
|
| @@ -2204,7 +2203,7 @@ bool LayerTreeHostImpl::InitializeRenderer(
|
| // There will not be anything to draw here, so set high res
|
| // to avoid checkerboards, typically when we are recovering
|
| // from lost context.
|
| - SetRequiresHighResToDraw();
|
| + SetRequiresHighResToDraw(true);
|
|
|
| return true;
|
| }
|
|
|