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

Unified Diff: cc/tiles/picture_layer_tiling.cc

Issue 1939963002: cc: Move prepaint region calculations to the tiling set. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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/tiles/picture_layer_tiling.h ('k') | cc/tiles/picture_layer_tiling_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tiles/picture_layer_tiling.cc
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc
index 01beed6937045970d700af0c0b34e1f2203844bd..401dd78e81b3be9eb37f5affdbbe50d7920ed64a 100644
--- a/cc/tiles/picture_layer_tiling.cc
+++ b/cc/tiles/picture_layer_tiling.cc
@@ -29,40 +29,13 @@
#include "ui/gfx/geometry/size_conversions.h"
namespace cc {
-namespace {
-
-const float kSoonBorderDistanceViewportPercentage = 0.15f;
-const float kMaxSoonBorderDistanceInScreenPixels = 312.f;
-
-} // namespace
-
-std::unique_ptr<PictureLayerTiling> PictureLayerTiling::Create(
- WhichTree tree,
- float contents_scale,
- scoped_refptr<RasterSource> raster_source,
- PictureLayerTilingClient* client,
- size_t tiling_interest_area_padding,
- float skewport_target_time_in_seconds,
- int skewport_extrapolation_limit_in_content_pixels) {
- return base::WrapUnique(new PictureLayerTiling(
- tree, contents_scale, raster_source, client, tiling_interest_area_padding,
- skewport_target_time_in_seconds,
- skewport_extrapolation_limit_in_content_pixels));
-}
PictureLayerTiling::PictureLayerTiling(
WhichTree tree,
float contents_scale,
scoped_refptr<RasterSource> raster_source,
- PictureLayerTilingClient* client,
- size_t tiling_interest_area_padding,
- float skewport_target_time_in_seconds,
- int skewport_extrapolation_limit_in_content_pixels)
- : tiling_interest_area_padding_(tiling_interest_area_padding),
- skewport_target_time_in_seconds_(skewport_target_time_in_seconds),
- skewport_extrapolation_limit_in_content_pixels_(
- skewport_extrapolation_limit_in_content_pixels),
- contents_scale_(contents_scale),
+ PictureLayerTilingClient* client)
+ : contents_scale_(contents_scale),
client_(client),
tree_(tree),
raster_source_(raster_source),
@@ -75,8 +48,7 @@ PictureLayerTiling::PictureLayerTiling(
has_skewport_rect_tiles_(false),
has_soon_border_rect_tiles_(false),
has_eventually_rect_tiles_(false),
- all_tiles_done_(true),
- invalidated_since_last_compute_priority_rects_(false) {
+ all_tiles_done_(true) {
DCHECK(!raster_source->IsSolidColor());
gfx::Size content_bounds =
gfx::ScaleToCeiledSize(raster_source_->GetSize(), contents_scale);
@@ -95,17 +67,6 @@ PictureLayerTiling::PictureLayerTiling(
PictureLayerTiling::~PictureLayerTiling() {
}
-// static
-float PictureLayerTiling::CalculateSoonBorderDistance(
- const gfx::Rect& visible_rect_in_content_space,
- float content_to_screen_scale) {
- float max_dimension = std::max(visible_rect_in_content_space.width(),
- visible_rect_in_content_space.height());
- return std::min(
- kMaxSoonBorderDistanceInScreenPixels / content_to_screen_scale,
- max_dimension * kSoonBorderDistanceViewportPercentage);
-}
-
Tile* PictureLayerTiling::CreateTile(const Tile::CreateInfo& info) {
const int i = info.tiling_i_index;
const int j = info.tiling_j_index;
@@ -289,7 +250,6 @@ void PictureLayerTiling::SetRasterSourceAndResize(
void PictureLayerTiling::Invalidate(const Region& layer_invalidation) {
DCHECK(tree_ != ACTIVE_TREE || !client_->GetPendingOrActiveTwinTiling(this));
- invalidated_since_last_compute_priority_rects_ = true;
RemoveTilesInRegion(layer_invalidation, true /* recreate tiles */);
}
@@ -575,69 +535,12 @@ void PictureLayerTiling::Reset() {
all_tiles_done_ = true;
}
-gfx::Rect PictureLayerTiling::ComputeSkewport(
- double current_frame_time_in_seconds,
- const gfx::Rect& visible_rect_in_content_space) const {
- gfx::Rect skewport = visible_rect_in_content_space;
- if (skewport.IsEmpty())
- return skewport;
-
- if (visible_rect_history_[1].frame_time_in_seconds == 0.0)
- return skewport;
-
- double time_delta = current_frame_time_in_seconds -
- visible_rect_history_[1].frame_time_in_seconds;
- if (time_delta == 0.0)
- return skewport;
-
- double extrapolation_multiplier =
- skewport_target_time_in_seconds_ / time_delta;
-
- int old_x = visible_rect_history_[1].visible_rect_in_content_space.x();
- int old_y = visible_rect_history_[1].visible_rect_in_content_space.y();
- int old_right =
- visible_rect_history_[1].visible_rect_in_content_space.right();
- int old_bottom =
- visible_rect_history_[1].visible_rect_in_content_space.bottom();
-
- int new_x = visible_rect_in_content_space.x();
- int new_y = visible_rect_in_content_space.y();
- int new_right = visible_rect_in_content_space.right();
- int new_bottom = visible_rect_in_content_space.bottom();
-
- // Compute the maximum skewport based on
- // |skewport_extrapolation_limit_in_content_pixels_|.
- gfx::Rect max_skewport = skewport;
- max_skewport.Inset(-skewport_extrapolation_limit_in_content_pixels_,
- -skewport_extrapolation_limit_in_content_pixels_);
-
- // Inset the skewport by the needed adjustment.
- skewport.Inset(extrapolation_multiplier * (new_x - old_x),
- extrapolation_multiplier * (new_y - old_y),
- extrapolation_multiplier * (old_right - new_right),
- extrapolation_multiplier * (old_bottom - new_bottom));
-
- // Ensure that visible rect is contained in the skewport.
- skewport.Union(visible_rect_in_content_space);
-
- // Clip the skewport to |max_skewport|. This needs to happen after the
- // union in case intersecting would have left the empty rect.
- skewport.Intersect(max_skewport);
-
- // Due to limits in int's representation, it is possible that the two
- // operations above (union and intersect) result in an empty skewport. To
- // avoid any unpleasant situations like that, union the visible rect again to
- // ensure that skewport.Contains(visible_rect_in_content_space) is always
- // true.
- skewport.Union(visible_rect_in_content_space);
-
- return skewport;
-}
-
-bool PictureLayerTiling::ComputeTilePriorityRects(
- const gfx::Rect& viewport_in_layer_space,
+void PictureLayerTiling::ComputeTilePriorityRects(
+ const gfx::Rect& visible_rect_in_layer_space,
+ const gfx::Rect& skewport_in_layer_space,
+ const gfx::Rect& soon_border_rect_in_layer_space,
+ const gfx::Rect& eventually_rect_in_layer_space,
float ideal_contents_scale,
- double current_frame_time_in_seconds,
const Occlusion& occlusion_in_layer_space) {
// If we have, or had occlusions, mark the tiles as 'not done' to ensure that
// we reiterate the tiles for rasterization.
@@ -646,87 +549,24 @@ bool PictureLayerTiling::ComputeTilePriorityRects(
set_all_tiles_done(false);
}
- bool invalidated = invalidated_since_last_compute_priority_rects_;
- invalidated_since_last_compute_priority_rects_ = false;
- if (!NeedsUpdateForFrameAtTimeAndViewport(current_frame_time_in_seconds,
- viewport_in_layer_space)) {
- // This should never be zero for the purposes of has_ever_been_updated().
- DCHECK_NE(current_frame_time_in_seconds, 0.0);
- return invalidated;
- }
-
const float content_to_screen_scale = ideal_contents_scale / contents_scale_;
- // We want to compute the visible rect and eventually rect from it in the
- // space of the tiling. But the visible rect (viewport) can be arbitrarily
- // positioned, so be careful when scaling it since we can exceed integer
- // bounds.
- gfx::Rect eventually_rect;
- gfx::Rect visible_rect_in_content_space;
-
- // We keep things as floats in here.
- {
- gfx::RectF visible_rectf_in_content_space =
- gfx::ScaleRect(gfx::RectF(viewport_in_layer_space), contents_scale_);
-
- // Determine if the eventually rect will even touch the tiling, if it's too
- // far away just treat it as empty so we don't exceed integer bounds.
- const float pad_in_content_space =
- tiling_interest_area_padding_ / content_to_screen_scale;
- gfx::RectF eventually_rectf = visible_rectf_in_content_space;
- // If the visible rect is empty, keep the eventually rect as empty.
- if (!eventually_rectf.IsEmpty()) {
- eventually_rectf.Inset(-pad_in_content_space, -pad_in_content_space);
-
- // If the eventually rect will touch the tiling, then we convert back to
- // integers and set the visible and eventually rects.
- auto bounds = gfx::RectF(gfx::SizeF(tiling_size()));
- if (eventually_rectf.Intersects(bounds)) {
- visible_rect_in_content_space =
- gfx::ToEnclosingRect(visible_rectf_in_content_space);
- eventually_rect = gfx::ToEnclosingRect(eventually_rectf);
- }
- }
+ const gfx::Rect* input_rects[] = {
+ &visible_rect_in_layer_space, &skewport_in_layer_space,
+ &soon_border_rect_in_layer_space, &eventually_rect_in_layer_space};
+ gfx::Rect output_rects[4];
+ for (size_t i = 0; i < arraysize(input_rects); ++i) {
+ output_rects[i] = gfx::ToEnclosingRect(
+ gfx::ScaleRect(gfx::RectF(*input_rects[i]), contents_scale_));
}
- DCHECK_EQ(visible_rect_in_content_space.IsEmpty(), eventually_rect.IsEmpty());
-
- // Now we have an empty visible/eventually rect if it's not useful and a
- // non-empty one if it is. We can compute the final eventually rect.
- eventually_rect =
- tiling_data_.ExpandRectIgnoringBordersToTileBounds(eventually_rect);
+ // Make sure the eventually rect is aligned to tile bounds.
+ output_rects[3] =
+ tiling_data_.ExpandRectIgnoringBordersToTileBounds(output_rects[3]);
- DCHECK(eventually_rect.IsEmpty() ||
- gfx::Rect(tiling_size()).Contains(eventually_rect))
- << "tiling_size: " << tiling_size().ToString()
- << " eventually_rect: " << eventually_rect.ToString();
-
- if (tiling_size().IsEmpty()) {
- UpdateVisibleRectHistory(current_frame_time_in_seconds,
- visible_rect_in_content_space);
- last_viewport_in_layer_space_ = viewport_in_layer_space;
- return false;
- }
-
- // Calculate the skewport.
- gfx::Rect skewport = ComputeSkewport(current_frame_time_in_seconds,
- visible_rect_in_content_space);
- DCHECK(skewport.Contains(visible_rect_in_content_space));
-
- // Calculate the soon border rect.
- gfx::Rect soon_border_rect = visible_rect_in_content_space;
- float border = CalculateSoonBorderDistance(visible_rect_in_content_space,
- content_to_screen_scale);
- soon_border_rect.Inset(-border, -border, -border, -border);
-
- UpdateVisibleRectHistory(current_frame_time_in_seconds,
- visible_rect_in_content_space);
- last_viewport_in_layer_space_ = viewport_in_layer_space;
-
- SetTilePriorityRects(content_to_screen_scale, visible_rect_in_content_space,
- skewport, soon_border_rect, eventually_rect,
+ SetTilePriorityRects(content_to_screen_scale, output_rects[0],
+ output_rects[1], output_rects[2], output_rects[3],
occlusion_in_layer_space);
- SetLiveTilesRect(eventually_rect);
- return true;
+ SetLiveTilesRect(output_rects[3]);
}
void PictureLayerTiling::SetTilePriorityRects(
« no previous file with comments | « cc/tiles/picture_layer_tiling.h ('k') | cc/tiles/picture_layer_tiling_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698