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 870b65d89ba7b123085028c34359d4afbf122131..69372d5f63a8a2702528f9156bb5c376c45d8820 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -195,6 +195,7 @@ LayerTreeHostImpl::LayerTreeHostImpl( |
zero_budget_(false), |
device_scale_factor_(1.f), |
overdraw_bottom_height_(0.f), |
+ device_viewport_valid_for_tile_management_(true), |
external_stencil_test_enabled_(false), |
animation_registrar_(AnimationRegistrar::Create()), |
rendering_stats_instrumentation_(rendering_stats_instrumentation), |
@@ -291,7 +292,7 @@ bool LayerTreeHostImpl::CanDraw() const { |
if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
return true; |
- if (device_viewport_size_.IsEmpty()) { |
+ if (DeviceViewport().IsEmpty()) { |
TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", |
TRACE_EVENT_SCOPE_THREAD); |
return false; |
@@ -326,6 +327,9 @@ void LayerTreeHostImpl::ManageTiles() { |
return; |
if (!manage_tiles_needed_) |
return; |
+ if (!device_viewport_valid_for_tile_management_) |
+ return; |
+ |
manage_tiles_needed_ = false; |
tile_manager_->ManageTiles(); |
@@ -353,7 +357,7 @@ void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, |
gfx::Vector2dF scroll_total = |
RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); |
gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); |
- gfx::SizeF viewport_size = VisibleViewportSize(); |
+ gfx::SizeF viewport_size = UnscaledScrollableViewportSize(); |
double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF(); |
@@ -1160,9 +1164,13 @@ void LayerTreeHostImpl::SetManagedMemoryPolicy( |
void LayerTreeHostImpl::SetExternalDrawConstraints( |
const gfx::Transform& transform, |
- gfx::Rect viewport) { |
+ gfx::Rect viewport, |
+ gfx::Rect clip, |
+ bool valid_for_tile_management) { |
external_transform_ = transform; |
external_viewport_ = viewport; |
+ external_clip_ = clip; |
+ device_viewport_valid_for_tile_management_ = valid_for_tile_management; |
} |
void LayerTreeHostImpl::SetExternalStencilTest(bool enabled) { |
@@ -1363,7 +1371,7 @@ float LayerTreeHostImpl::DeviceScaleFactor() const { |
return device_scale_factor_; |
} |
-gfx::SizeF LayerTreeHostImpl::VisibleViewportSize() const { |
+gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const { |
// The container layer bounds should be used if non-overlay scrollbars may |
// exist since it adjusts for them. |
LayerImpl* container_layer = active_tree_->RootContainerLayer(); |
@@ -1374,7 +1382,7 @@ gfx::SizeF LayerTreeHostImpl::VisibleViewportSize() const { |
} |
gfx::SizeF dip_size = |
- gfx::ScaleSize(device_viewport_size(), 1.f / device_scale_factor()); |
+ gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor()); |
float top_offset = |
top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; |
@@ -1811,6 +1819,13 @@ gfx::Rect LayerTreeHostImpl::DeviceViewport() const { |
return external_viewport_; |
} |
+gfx::Rect LayerTreeHostImpl::DeviceClip() const { |
+ if (external_clip_.IsEmpty()) |
+ return DeviceViewport(); |
+ |
+ return external_clip_; |
+} |
+ |
const gfx::Transform& LayerTreeHostImpl::DeviceTransform() const { |
return external_transform_; |
} |
@@ -2264,7 +2279,7 @@ scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { |
} |
void LayerTreeHostImpl::SetFullRootLayerDamage() { |
- SetViewportDamage(gfx::Rect(device_viewport_size_)); |
+ SetViewportDamage(gfx::Rect(DeviceViewport().size())); |
} |
void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { |