Commit 9d9da8d4 authored by vmpstr's avatar vmpstr Committed by Commit bot

cc: Don't clip tile priority visible rect to content bounds.

The tile priority visible rect is sometimes expected to be not
intersecting the layer bounds. That's expected, since the layer
might be offscreen. In those cases we should still be correctly
prioritizing and creating tiles. This fix addresses that.

BUG=414521
R=danakj

Review URL: https://codereview.chromium.org/577753002

Cr-Commit-Position: refs/heads/master@{#295630}
parent 32ac1c8d
...@@ -486,14 +486,15 @@ void PictureLayerImpl::UpdateTilePriorities( ...@@ -486,14 +486,15 @@ void PictureLayerImpl::UpdateTilePriorities(
if (!tiling_needs_update) if (!tiling_needs_update)
return; return;
gfx::Rect visible_layer_rect = GetViewportForTilePriorityInContentSpace(); gfx::Rect viewport_rect_in_layer_space =
GetViewportForTilePriorityInContentSpace();
WhichTree tree = WhichTree tree =
layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
for (size_t i = 0; i < tilings_->num_tilings(); ++i) { for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
// Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since // Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since
// they are the same space in picture lbayer, as contents scale is always 1. // they are the same space in picture lbayer, as contents scale is always 1.
tilings_->tiling_at(i)->UpdateTilePriorities(tree, tilings_->tiling_at(i)->UpdateTilePriorities(tree,
visible_layer_rect, viewport_rect_in_layer_space,
ideal_contents_scale_, ideal_contents_scale_,
current_frame_time_in_seconds, current_frame_time_in_seconds,
occlusion_in_content_space); occlusion_in_content_space);
...@@ -519,12 +520,8 @@ gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const { ...@@ -519,12 +520,8 @@ gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const {
visible_rect_in_content_space = visible_rect_in_content_space =
gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
view_to_layer, viewport_rect_for_tile_priority_)); view_to_layer, viewport_rect_for_tile_priority_));
visible_rect_in_content_space.Intersect(gfx::Rect(content_bounds()));
} }
} }
visible_rect_in_content_space.Intersect(visible_content_rect());
return visible_rect_in_content_space; return visible_rect_in_content_space;
} }
...@@ -793,6 +790,7 @@ void PictureLayerImpl::MarkVisibleResourcesAsRequired() const { ...@@ -793,6 +790,7 @@ void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
// can be independently overridden by embedders like Android WebView with // can be independently overridden by embedders like Android WebView with
// SetExternalDrawConstraints. // SetExternalDrawConstraints.
gfx::Rect rect = GetViewportForTilePriorityInContentSpace(); gfx::Rect rect = GetViewportForTilePriorityInContentSpace();
rect.Intersect(visible_content_rect());
float min_acceptable_scale = float min_acceptable_scale =
std::min(raster_contents_scale_, ideal_contents_scale_); std::min(raster_contents_scale_, ideal_contents_scale_);
......
...@@ -397,6 +397,10 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) { ...@@ -397,6 +397,10 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
bool success = transform_for_tile_priority.GetInverse(&screen_to_view); bool success = transform_for_tile_priority.GetInverse(&screen_to_view);
EXPECT_TRUE(success); EXPECT_TRUE(success);
// Note that we don't clip this to the layer bounds, since it is expected that
// the rect will sometimes be outside of the layer bounds. If we clip to
// bounds, then tile priorities will end up being incorrect in cases of fully
// offscreen layer.
viewport_rect_for_tile_priority_in_view_space = viewport_rect_for_tile_priority_in_view_space =
gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
screen_to_view, viewport_rect_for_tile_priority)); screen_to_view, viewport_rect_for_tile_priority));
...@@ -405,10 +409,6 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) { ...@@ -405,10 +409,6 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(), EXPECT_EQ(active_layer_->viewport_rect_for_tile_priority(),
viewport_rect_for_tile_priority_in_view_space); viewport_rect_for_tile_priority_in_view_space);
// Interset viewport_rect_for_tile_priority_in_view_space with the layer
// bounds and the result should be used in PictureLayerTiling.
viewport_rect_for_tile_priority_in_view_space.Intersect(
gfx::Rect(layer_bounds));
tilings = active_layer_->tilings(); tilings = active_layer_->tilings();
for (size_t i = 0; i < tilings->num_tilings(); i++) { for (size_t i = 0; i < tilings->num_tilings(); i++) {
PictureLayerTiling* tiling = tilings->tiling_at(i); PictureLayerTiling* tiling = tilings->tiling_at(i);
......
...@@ -536,7 +536,7 @@ gfx::Rect PictureLayerTiling::ComputeSkewport( ...@@ -536,7 +536,7 @@ gfx::Rect PictureLayerTiling::ComputeSkewport(
void PictureLayerTiling::UpdateTilePriorities( void PictureLayerTiling::UpdateTilePriorities(
WhichTree tree, WhichTree tree,
const gfx::Rect& visible_layer_rect, const gfx::Rect& viewport_in_layer_space,
float ideal_contents_scale, float ideal_contents_scale,
double current_frame_time_in_seconds, double current_frame_time_in_seconds,
const Occlusion& occlusion_in_layer_space) { const Occlusion& occlusion_in_layer_space) {
...@@ -547,7 +547,7 @@ void PictureLayerTiling::UpdateTilePriorities( ...@@ -547,7 +547,7 @@ void PictureLayerTiling::UpdateTilePriorities(
} }
gfx::Rect visible_rect_in_content_space = gfx::Rect visible_rect_in_content_space =
gfx::ScaleToEnclosingRect(visible_layer_rect, contents_scale_); gfx::ScaleToEnclosingRect(viewport_in_layer_space, contents_scale_);
if (tiling_size().IsEmpty()) { if (tiling_size().IsEmpty()) {
last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds;
......
...@@ -237,7 +237,7 @@ class CC_EXPORT PictureLayerTiling { ...@@ -237,7 +237,7 @@ class CC_EXPORT PictureLayerTiling {
void Reset(); void Reset();
void UpdateTilePriorities(WhichTree tree, void UpdateTilePriorities(WhichTree tree,
const gfx::Rect& visible_layer_rect, const gfx::Rect& viewport_in_layer_space,
float ideal_contents_scale, float ideal_contents_scale,
double current_frame_time_in_seconds, double current_frame_time_in_seconds,
const Occlusion& occlusion_in_layer_space); const Occlusion& occlusion_in_layer_space);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment