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

Unified Diff: cc/trees/occlusion_tracker.cc

Issue 205443002: Do not clip inside OcclusionTracker: Contributing Surfaces Edition. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: occlusion-surface: Created 6 years, 9 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
Index: cc/trees/occlusion_tracker.cc
diff --git a/cc/trees/occlusion_tracker.cc b/cc/trees/occlusion_tracker.cc
index bc609cf9ce0389e5936558734c47a15df9f3417f..94125be5a203fff4bf275a68087b3d2a7513bbd1 100644
--- a/cc/trees/occlusion_tracker.cc
+++ b/cc/trees/occlusion_tracker.cc
@@ -335,10 +335,12 @@ void OcclusionTracker<LayerType>::LeaveToRenderTarget(
gfx::Rect unoccluded_replica_rect;
if (old_target->background_filters().HasFilterThatMovesPixels()) {
unoccluded_surface_rect = UnoccludedContributingSurfaceContentRect(
- old_target, false, old_surface->content_rect());
+ old_target, old_surface->content_rect(), old_surface->draw_transform());
if (old_target->has_replica()) {
unoccluded_replica_rect = UnoccludedContributingSurfaceContentRect(
- old_target, true, old_surface->content_rect());
+ old_target,
+ old_surface->content_rect(),
+ old_surface->replica_draw_transform());
}
}
@@ -591,8 +593,8 @@ gfx::Rect OcclusionTracker<LayerType>::UnoccludedContentRect(
template <typename LayerType>
gfx::Rect OcclusionTracker<LayerType>::UnoccludedContributingSurfaceContentRect(
const LayerType* layer,
- bool for_replica,
- const gfx::Rect& content_rect) const {
+ const gfx::Rect& content_rect,
+ const gfx::Transform& draw_transform) const {
DCHECK(!stack_.empty());
// The layer is a contributing render_target so it should have a surface.
DCHECK(layer->render_surface());
@@ -607,48 +609,31 @@ gfx::Rect OcclusionTracker<LayerType>::UnoccludedContributingSurfaceContentRect(
if (content_rect.IsEmpty())
return content_rect;
- const typename LayerType::RenderSurfaceType* surface =
- layer->render_surface();
- const LayerType* contributing_surface_render_target =
- layer->parent()->render_target();
+ // A contributing surface doesn't get occluded by things inside its own
+ // surface, so only things outside the surface can occlude it. That occlusion
+ // is found just below the top of the stack (if it exists).
+ bool has_occlusion = stack_.size() > 1;
+ if (!has_occlusion)
+ return content_rect;
- if (!SurfaceTransformsToTargetKnown(surface))
+ const StackObject& second_last = stack_[stack_.size() - 2];
+
+ if (second_last.occlusion_from_inside_target.IsEmpty() &&
+ second_last.occlusion_from_outside_target.IsEmpty())
return content_rect;
- gfx::Transform draw_transform =
- for_replica ? surface->replica_draw_transform()
- : surface->draw_transform();
gfx::Transform inverse_draw_transform(gfx::Transform::kSkipInitialization);
if (!draw_transform.GetInverse(&inverse_draw_transform))
return content_rect;
- // A contributing surface doesn't get occluded by things inside its own
- // surface, so only things outside the surface can occlude it. That occlusion
- // is found just below the top of the stack (if it exists).
- bool has_occlusion = stack_.size() > 1;
-
// Take the ToEnclosingRect at each step, as we want to contain any unoccluded
// partial pixels in the resulting Rect.
Region unoccluded_region_in_target_surface =
MathUtil::MapEnclosingClippedRect(draw_transform, content_rect);
- // Layers can't clip across surfaces, so count this as internal occlusion.
- if (surface->is_clipped())
- unoccluded_region_in_target_surface.Intersect(surface->clip_rect());
- if (has_occlusion) {
- const StackObject& second_last = stack_[stack_.size() - 2];
- unoccluded_region_in_target_surface.Subtract(
- second_last.occlusion_from_inside_target);
- unoccluded_region_in_target_surface.Subtract(
- second_last.occlusion_from_outside_target);
- }
-
- // Treat other clipping as occlusion from outside the target surface.
- unoccluded_region_in_target_surface.Intersect(
- contributing_surface_render_target->render_surface()->content_rect());
- unoccluded_region_in_target_surface.Intersect(
- ScreenSpaceClipRectInTargetSurface(
- contributing_surface_render_target->render_surface(),
- screen_space_clip_rect_));
+ unoccluded_region_in_target_surface.Subtract(
+ second_last.occlusion_from_inside_target);
+ unoccluded_region_in_target_surface.Subtract(
+ second_last.occlusion_from_outside_target);
gfx::Rect unoccluded_rect_in_target_surface =
unoccluded_region_in_target_surface.bounds();

Powered by Google App Engine
This is Rietveld 408576698