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

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 671653005: SetNeedsRedraw directly when updating a visible tile. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pinchblurmerge-test: in-lthi Created 6 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 77c484fd1a4a6bef187c2bec963533ec8a750c4f..0f2c89d5f77b8c3346489782ce52c95845b794f7 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -238,8 +238,8 @@ class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient {
DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter);
};
-LayerTreeHostImpl::FrameData::FrameData()
- : contains_incomplete_tile(false), has_no_damage(false) {}
+LayerTreeHostImpl::FrameData::FrameData() : has_no_damage(false) {
+}
LayerTreeHostImpl::FrameData::~FrameData() {}
@@ -304,11 +304,11 @@ LayerTreeHostImpl::LayerTreeHostImpl(
animation_registrar_(AnimationRegistrar::Create()),
rendering_stats_instrumentation_(rendering_stats_instrumentation),
micro_benchmark_controller_(this),
- need_to_update_visible_tiles_before_draw_(false),
shared_bitmap_manager_(shared_bitmap_manager),
gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
id_(id),
- requires_high_res_to_draw_(false) {
+ requires_high_res_to_draw_(false),
+ active_visible_tile_is_top_of_raster_queue_(false) {
DCHECK(proxy_->IsImplThread());
DidVisibilityChange(this, visible_);
animation_registrar_->set_supports_scroll_animations(
@@ -546,7 +546,6 @@ void LayerTreeHostImpl::TrackDamageForAllSurfaces(
void LayerTreeHostImpl::FrameData::AsValueInto(
base::debug::TracedValue* value) const {
- value->SetBoolean("contains_incomplete_tile", contains_incomplete_tile);
value->SetBoolean("has_no_damage", has_no_damage);
// Quad data can be quite large, so only dump render passes if we select
@@ -896,7 +895,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
if (append_quads_data.num_incomplete_tiles ||
append_quads_data.num_missing_tiles) {
- frame->contains_incomplete_tile = true;
if (RequiresHighResToDraw())
draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
}
@@ -1114,11 +1112,8 @@ DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
"SourceFrameNumber",
active_tree_->source_frame_number());
- if (need_to_update_visible_tiles_before_draw_ &&
- tile_manager_ && tile_manager_->UpdateVisibleTiles()) {
- DidInitializeVisibleTile();
- }
- need_to_update_visible_tiles_before_draw_ = true;
+ if (settings().impl_side_painting)
+ tile_manager_->UpdateVisibleTiles();
UMA_HISTOGRAM_CUSTOM_COUNTS(
"Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20);
@@ -1130,7 +1125,6 @@ DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
frame->render_passes.clear();
frame->render_passes_by_id.clear();
frame->will_draw_layers.clear();
- frame->contains_incomplete_tile = false;
frame->has_no_damage = false;
if (active_tree_->root_layer()) {
@@ -1161,13 +1155,6 @@ void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) {
NOTREACHED();
}
-void LayerTreeHostImpl::DidInitializeVisibleTileForTesting() {
- // Add arbitrary damage, to trigger prepare-to-draws.
- // Here, setting damage as viewport size, used only for testing.
- SetFullRootLayerDamage();
- DidInitializeVisibleTile();
-}
-
void LayerTreeHostImpl::ResetTreesForTesting() {
if (active_tree_)
active_tree_->DetachLayerTree();
@@ -1260,8 +1247,9 @@ void LayerTreeHostImpl::DidModifyTilePriorities() {
}
void LayerTreeHostImpl::DidInitializeVisibleTile() {
- if (client_ && !client_->IsInsideDraw())
- client_->DidInitializeVisibleTileOnImplThread();
+ // Check for a non-null active tree to avoid doing this during shutdown.
+ if (active_tree_ && !client_->IsInsideDraw())
+ SetNeedsRedraw();
}
void LayerTreeHostImpl::GetPictureLayerImplPairs(
@@ -1302,6 +1290,19 @@ void LayerTreeHostImpl::BuildRasterQueue(RasterTilePriorityQueue* queue,
picture_layer_pairs_.clear();
GetPictureLayerImplPairs(&picture_layer_pairs_);
queue->Build(picture_layer_pairs_, tree_priority);
+
+ if (!queue->IsEmpty()) {
+ active_visible_tile_is_top_of_raster_queue_ =
+ queue->Top()->is_active_and_visible_priority();
+ } else {
+ active_visible_tile_is_top_of_raster_queue_ = false;
+ }
+}
+
+void LayerTreeHostImpl::FinishedRasterQueue() {
+ if (active_visible_tile_is_top_of_raster_queue_)
+ DidInitializeVisibleTile();
+ active_visible_tile_is_top_of_raster_queue_ = false;
}
void LayerTreeHostImpl::BuildEvictionQueue(EvictionTilePriorityQueue* queue,
@@ -1337,6 +1338,12 @@ void LayerTreeHostImpl::NotifyTileStateChanged(const Tile* tile) {
if (layer_impl)
layer_impl->NotifyTileStateChanged(tile);
}
+
+ if (tile->is_active_and_visible_priority()) {
+ // The LayerImpl::NotifyTileStateChanged() should damage the layer, so this
+ // redraw will make those tiles be displayed.
+ DidInitializeVisibleTile();
+ }
}
void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) {
@@ -1685,6 +1692,14 @@ void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) {
UpdateCurrentBeginFrameArgs(args);
// Cache the begin impl frame interval
begin_impl_frame_interval_ = args.interval;
+
+ if (settings().impl_side_painting &&
+ active_visible_tile_is_top_of_raster_queue_) {
+ // Pre-emptively schedule a draw now visible tiles are at the top of the
+ // current raster queue, so that we will expect it with our decisions around
+ // choosing a deadline for the impl frame we are beginning now.
+ SetNeedsRedraw();
+ }
}
void LayerTreeHostImpl::UpdateViewportContainerSizes() {
@@ -1812,15 +1827,7 @@ void LayerTreeHostImpl::CreatePendingTree() {
TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get());
}
-void LayerTreeHostImpl::UpdateVisibleTiles() {
- if (tile_manager_ && tile_manager_->UpdateVisibleTiles())
- DidInitializeVisibleTile();
- need_to_update_visible_tiles_before_draw_ = false;
-}
-
void LayerTreeHostImpl::ActivateSyncTree() {
- need_to_update_visible_tiles_before_draw_ = true;
-
if (pending_tree_) {
TRACE_EVENT_ASYNC_END0("cc", "PendingTree:waiting", pending_tree_.get());
@@ -2024,7 +2031,6 @@ void LayerTreeHostImpl::CreateAndSetTileManager() {
scheduled_raster_task_limit);
UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
- need_to_update_visible_tiles_before_draw_ = false;
}
void LayerTreeHostImpl::CreateResourceAndRasterWorkerPool(
@@ -3026,9 +3032,6 @@ void LayerTreeHostImpl::PinchGestureEnd() {
// scales that we want when we're not inside a pinch.
active_tree_->set_needs_update_draw_properties();
SetNeedsRedraw();
- // TODO(danakj): Don't set root damage. Just updating draw properties and
- // getting new tiles rastered should be enough! crbug.com/427423
- SetFullRootLayerDamage();
}
static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info,

Powered by Google App Engine
This is Rietveld 408576698