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

Unified Diff: cc/layers/picture_layer_impl.cc

Issue 475233002: cc: Avoid redraw for missing tile outside visible rect (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove skip_viewport_for_tile_priority_check Created 6 years, 4 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
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layers/picture_layer_impl.cc
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index ede7da0ac3a5853216a7103b38852af889669b7e..7f444a3f3abc7c71253419e9b9e9b6b6aea093e7 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -265,6 +265,12 @@ void PictureLayerImpl::AppendQuads(
// unused can be considered for removal.
std::vector<PictureLayerTiling*> seen_tilings;
+ // Ignore missing tiles outside of viewport for tile priority. This is
+ // normally the same as draw viewport but can be independently overridden by
+ // embedders like Android WebView with SetExternalDrawConstraints.
+ gfx::Rect scaled_viewport_for_tile_priority = gfx::ScaleToEnclosingRect(
+ GetViewportForTilePriorityInContentSpace(), max_contents_scale);
+
size_t missing_tile_count = 0u;
size_t on_demand_missing_tile_count = 0u;
for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(),
@@ -291,8 +297,10 @@ void PictureLayerImpl::AppendQuads(
gfx::Rect opaque_rect = iter->opaque_rect();
opaque_rect.Intersect(geometry_rect);
- if (iter->contents_scale() != ideal_contents_scale_)
+ if (iter->contents_scale() != ideal_contents_scale_ &&
+ geometry_rect.Intersects(scaled_viewport_for_tile_priority)) {
append_quads_data->num_incomplete_tiles++;
+ }
TileDrawQuad* quad =
render_pass->CreateAndAppendDrawQuad<TileDrawQuad>();
@@ -365,10 +373,12 @@ void PictureLayerImpl::AppendQuads(
false);
}
- append_quads_data->num_missing_tiles++;
+ if (geometry_rect.Intersects(scaled_viewport_for_tile_priority)) {
+ append_quads_data->num_missing_tiles++;
+ ++missing_tile_count;
+ }
append_quads_data->approximated_visible_content_area +=
visible_geometry_rect.width() * visible_geometry_rect.height();
- ++missing_tile_count;
continue;
}
@@ -473,6 +483,28 @@ void PictureLayerImpl::UpdateTilePriorities(
if (!tiling_needs_update)
return;
+ gfx::Rect visible_rect_in_content_space(
+ GetViewportForTilePriorityInContentSpace());
+ visible_rect_in_content_space.Intersect(visible_content_rect());
+ gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect(
+ visible_rect_in_content_space, 1.f / contents_scale_x());
+ WhichTree tree =
+ layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+ tilings_->tiling_at(i)->UpdateTilePriorities(tree,
+ visible_layer_rect,
+ ideal_contents_scale_,
+ current_frame_time_in_seconds,
+ occlusion_tracker,
+ render_target(),
+ draw_transform());
+ }
+
+ // Tile priorities were modified.
+ layer_tree_impl()->DidModifyTilePriorities();
+}
+
+gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const {
// If visible_rect_for_tile_priority_ is empty or
// viewport_rect_for_tile_priority_ is set to be different from the device
// viewport, try to inverse project the viewport into layer space and use
@@ -493,22 +525,7 @@ void PictureLayerImpl::UpdateTilePriorities(
}
}
- gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect(
- visible_rect_in_content_space, 1.f / contents_scale_x());
- WhichTree tree =
- layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
- for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
- tilings_->tiling_at(i)->UpdateTilePriorities(tree,
- visible_layer_rect,
- ideal_contents_scale_,
- current_frame_time_in_seconds,
- occlusion_tracker,
- render_target(),
- draw_transform());
- }
-
- // Tile priorities were modified.
- layer_tree_impl()->DidModifyTilePriorities();
+ return visible_rect_in_content_space;
}
void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) {
@@ -766,6 +783,12 @@ void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
gfx::Rect rect(visible_content_rect());
+ // Only mark tiles inside the viewport for tile priority as required for
+ // activation. This viewport is normally the same as the draw viewport but
+ // can be independently overridden by embedders like Android WebView with
+ // SetExternalDrawConstraints.
+ rect.Intersect(GetViewportForTilePriorityInContentSpace());
+
float min_acceptable_scale =
std::min(raster_contents_scale_, ideal_contents_scale_);
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698