| Index: cc/trees/occlusion_tracker.cc
|
| diff --git a/cc/trees/occlusion_tracker.cc b/cc/trees/occlusion_tracker.cc
|
| index 7e24e840cee122739147418d46d1f5507dc61191..6bfc5954f7467cdaa66e8074752ba53fc2fe3e81 100644
|
| --- a/cc/trees/occlusion_tracker.cc
|
| +++ b/cc/trees/occlusion_tracker.cc
|
| @@ -508,9 +508,7 @@ bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::Occluded(
|
| const LayerType* render_target,
|
| gfx::Rect content_rect,
|
| const gfx::Transform& draw_transform,
|
| - bool impl_draw_transform_is_unknown,
|
| - bool is_clipped,
|
| - gfx::Rect clip_rect_in_target) const {
|
| + bool impl_draw_transform_is_unknown) const {
|
| if (prevent_occlusion_)
|
| return false;
|
|
|
| @@ -530,6 +528,11 @@ bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::Occluded(
|
| DCHECK(render_target->render_surface());
|
| DCHECK_EQ(render_target, stack_.back().target);
|
|
|
| + if (stack_.back().occlusion_from_inside_target.IsEmpty() &&
|
| + stack_.back().occlusion_from_outside_target.IsEmpty()) {
|
| + return false;
|
| + }
|
| +
|
| gfx::Transform inverse_draw_transform(gfx::Transform::kSkipInitialization);
|
| if (!draw_transform.GetInverse(&inverse_draw_transform))
|
| return false;
|
| @@ -538,9 +541,6 @@ bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::Occluded(
|
| // partial pixels in the resulting Rect.
|
| Region unoccluded_region_in_target_surface = gfx::ToEnclosingRect(
|
| MathUtil::MapClippedRect(draw_transform, gfx::RectF(content_rect)));
|
| - // Layers can't clip across surfaces, so count this as internal occlusion.
|
| - if (is_clipped)
|
| - unoccluded_region_in_target_surface.Intersect(clip_rect_in_target);
|
| unoccluded_region_in_target_surface.Subtract(
|
| stack_.back().occlusion_from_inside_target);
|
| gfx::RectF unoccluded_rect_in_target_surface_without_outside_occlusion =
|
| @@ -548,14 +548,6 @@ bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::Occluded(
|
| unoccluded_region_in_target_surface.Subtract(
|
| stack_.back().occlusion_from_outside_target);
|
|
|
| - // Treat other clipping as occlusion from outside the surface.
|
| - // TODO(danakj): Clip to visibleContentRect?
|
| - unoccluded_region_in_target_surface.Intersect(
|
| - render_target->render_surface()->content_rect());
|
| - unoccluded_region_in_target_surface.Intersect(
|
| - ScreenSpaceClipRectInTargetSurface(render_target->render_surface(),
|
| - screen_space_clip_rect_));
|
| -
|
| gfx::RectF unoccluded_rect_in_target_surface =
|
| unoccluded_region_in_target_surface.bounds();
|
|
|
| @@ -568,9 +560,7 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::
|
| const LayerType* render_target,
|
| gfx::Rect content_rect,
|
| const gfx::Transform& draw_transform,
|
| - bool impl_draw_transform_is_unknown,
|
| - bool is_clipped,
|
| - gfx::Rect clip_rect_in_target) const {
|
| + bool impl_draw_transform_is_unknown) const {
|
| if (prevent_occlusion_)
|
| return content_rect;
|
|
|
| @@ -590,6 +580,11 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::
|
| DCHECK(render_target->render_surface());
|
| DCHECK_EQ(render_target, stack_.back().target);
|
|
|
| + if (stack_.back().occlusion_from_inside_target.IsEmpty() &&
|
| + stack_.back().occlusion_from_outside_target.IsEmpty()) {
|
| + return content_rect;
|
| + }
|
| +
|
| gfx::Transform inverse_draw_transform(gfx::Transform::kSkipInitialization);
|
| if (!draw_transform.GetInverse(&inverse_draw_transform))
|
| return content_rect;
|
| @@ -598,9 +593,6 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::
|
| // partial pixels in the resulting Rect.
|
| Region unoccluded_region_in_target_surface = gfx::ToEnclosingRect(
|
| MathUtil::MapClippedRect(draw_transform, gfx::RectF(content_rect)));
|
| - // Layers can't clip across surfaces, so count this as internal occlusion.
|
| - if (is_clipped)
|
| - unoccluded_region_in_target_surface.Intersect(clip_rect_in_target);
|
| unoccluded_region_in_target_surface.Subtract(
|
| stack_.back().occlusion_from_inside_target);
|
| gfx::RectF unoccluded_rect_in_target_surface_without_outside_occlusion =
|
| @@ -608,14 +600,6 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::
|
| unoccluded_region_in_target_surface.Subtract(
|
| stack_.back().occlusion_from_outside_target);
|
|
|
| - // Treat other clipping as occlusion from outside the surface.
|
| - // TODO(danakj): Clip to visibleContentRect?
|
| - unoccluded_region_in_target_surface.Intersect(
|
| - render_target->render_surface()->content_rect());
|
| - unoccluded_region_in_target_surface.Intersect(
|
| - ScreenSpaceClipRectInTargetSurface(render_target->render_surface(),
|
| - screen_space_clip_rect_));
|
| -
|
| gfx::RectF unoccluded_rect_in_target_surface =
|
| unoccluded_region_in_target_surface.bounds();
|
| gfx::Rect unoccluded_rect = gfx::ToEnclosingRect(
|
|
|