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 d421f84b00c7418f24d41fda48980fa37ef86b96..3a93a670fee0fe69ef388934412882ef07a045e2 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -324,7 +324,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(); |
@@ -406,6 +407,12 @@ void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { |
} |
void LayerTreeHostImpl::PrepareTiles() { |
+ bool update_lcd_text = false; |
+ if (pending_tree_) |
+ pending_tree_->UpdateDrawProperties(update_lcd_text); |
+ if (active_tree_) |
+ active_tree_->UpdateDrawProperties(update_lcd_text); |
+ |
if (!tile_manager_) |
return; |
if (!tile_priorities_dirty_) |
@@ -413,8 +420,6 @@ void LayerTreeHostImpl::PrepareTiles() { |
tile_priorities_dirty_ = false; |
tile_manager_->PrepareTiles(global_tile_state_); |
- |
- client_->DidPrepareTiles(); |
} |
void LayerTreeHostImpl::StartPageScaleAnimation( |
@@ -790,6 +795,7 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
const DrawMode draw_mode = GetDrawMode(); |
+ int num_layers_missing_raster_source = 0; |
int num_missing_tiles = 0; |
int num_incomplete_tiles = 0; |
bool have_copy_request = false; |
@@ -872,10 +878,16 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
rendering_stats_instrumentation_->AddCheckerboardedVisibleContentArea( |
append_quads_data.checkerboarded_visible_content_area); |
+ if (!append_quads_data.raster_source_covers_visible_high_res_tiles) |
+ num_layers_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(); |
@@ -884,24 +896,28 @@ 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_layers_missing_raster_source) { |
+ TRACE_EVENT_INSTANT0("cc", "Raster missing source.", |
+ TRACE_EVENT_SCOPE_THREAD); |
+ draw_result = DRAW_ABORTED_MISSING_RASTER_SOURCE; |
enne (OOO)
2015/05/19 22:53:41
Is it possible to separate this change into two pa
brianderson
2015/05/20 01:33:17
Definitely need to split this patch up - I'll see
|
+ } else if (num_missing_tiles) { |
+ TRACE_EVENT_INSTANT0("cc", "Raster missing output.", |
+ TRACE_EVENT_SCOPE_THREAD); |
+ draw_result = DRAW_ABORTED_MISSING_RASTER_OUTPUT_ANY; |
+ } else if (num_incomplete_tiles) { |
+ TRACE_EVENT_INSTANT0("cc", "Raster missing high res.", |
+ TRACE_EVENT_SCOPE_THREAD); |
+ draw_result = DRAW_ABORTED_MISSING_RASTER_OUTPUT_HIGH_RES; |
+ } |
#if DCHECK_IS_ON() |
for (const auto& render_pass : frame->render_passes) { |
@@ -1220,7 +1236,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( |
@@ -1668,7 +1685,7 @@ void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() { |
// 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); |
tree_resources_for_gpu_rasterization_dirty_ = false; |
} |
@@ -1680,7 +1697,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; |
@@ -1942,15 +1959,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; |
@@ -2242,7 +2254,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; |
} |