| Index: cc/trees/occlusion_tracker.cc
|
| diff --git a/cc/trees/occlusion_tracker.cc b/cc/trees/occlusion_tracker.cc
|
| index a1a3ca0747490fac0d5a1ffa3c4c77d7b46e4d29..b1319b8a7a4a5fb0ac857acdd28c89c7d413d850 100644
|
| --- a/cc/trees/occlusion_tracker.cc
|
| +++ b/cc/trees/occlusion_tracker.cc
|
| @@ -110,20 +110,21 @@ static SimpleEnclosedRegion TransformSurfaceOpaqueRegion(
|
| }
|
|
|
| void OcclusionTracker::EnterRenderTarget(const LayerImpl* new_target) {
|
| - if (!stack_.empty() && stack_.back().target == new_target)
|
| + DCHECK(new_target->has_render_surface());
|
| + if (!stack_.empty() && stack_.back().target == new_target->render_surface())
|
| return;
|
|
|
| - const LayerImpl* old_target = NULL;
|
| + const RenderSurfaceImpl* old_target_surface = NULL;
|
| const RenderSurfaceImpl* old_occlusion_immune_ancestor = NULL;
|
| if (!stack_.empty()) {
|
| - old_target = stack_.back().target;
|
| + old_target_surface = stack_.back().target;
|
| old_occlusion_immune_ancestor =
|
| - old_target->render_surface()->nearest_occlusion_immune_ancestor();
|
| + old_target_surface->nearest_occlusion_immune_ancestor();
|
| }
|
| const RenderSurfaceImpl* new_occlusion_immune_ancestor =
|
| new_target->render_surface()->nearest_occlusion_immune_ancestor();
|
|
|
| - stack_.push_back(StackObject(new_target));
|
| + stack_.push_back(StackObject(new_target->render_surface()));
|
|
|
| // We copy the screen occlusion into the new RenderSurfaceImpl subtree, but we
|
| // never copy in the occlusion from inside the target, since we are looking
|
| @@ -156,7 +157,7 @@ void OcclusionTracker::EnterRenderTarget(const LayerImpl* new_target) {
|
| size_t last_index = stack_.size() - 1;
|
| gfx::Transform old_target_to_new_target_transform(
|
| inverse_new_target_screen_space_transform,
|
| - old_target->render_surface()->screen_space_transform());
|
| + old_target_surface->screen_space_transform());
|
| stack_[last_index].occlusion_from_outside_target =
|
| TransformSurfaceOpaqueRegion(
|
| stack_[last_index - 1].occlusion_from_outside_target, false,
|
| @@ -246,15 +247,18 @@ static void ReduceOcclusionBelowSurface(
|
| void OcclusionTracker::LeaveToRenderTarget(const LayerImpl* new_target) {
|
| DCHECK(!stack_.empty());
|
| size_t last_index = stack_.size() - 1;
|
| + DCHECK(new_target->has_render_surface());
|
| bool surface_will_be_at_top_after_pop =
|
| - stack_.size() > 1 && stack_[last_index - 1].target == new_target;
|
| + stack_.size() > 1 &&
|
| + stack_[last_index - 1].target == new_target->render_surface();
|
|
|
| // We merge the screen occlusion from the current RenderSurfaceImpl subtree
|
| // out to its parent target RenderSurfaceImpl. The target occlusion can be
|
| // merged out as well but needs to be transformed to the new target.
|
|
|
| - const LayerImpl* old_target = stack_[last_index].target;
|
| - const RenderSurfaceImpl* old_surface = old_target->render_surface();
|
| + const RenderSurfaceImpl* old_surface = stack_[last_index].target;
|
| + const LayerImpl* old_target =
|
| + new_target->layer_tree_impl()->LayerById(old_surface->OwningLayerId());
|
|
|
| SimpleEnclosedRegion old_occlusion_from_inside_target_in_new_target =
|
| TransformSurfaceOpaqueRegion(
|
| @@ -302,7 +306,7 @@ void OcclusionTracker::LeaveToRenderTarget(const LayerImpl* new_target) {
|
| stack_.pop_back();
|
| } else {
|
| // Replace the top of the stack with the new pushed surface.
|
| - stack_.back().target = new_target;
|
| + stack_.back().target = new_target->render_surface();
|
| stack_.back().occlusion_from_inside_target =
|
| old_occlusion_from_inside_target_in_new_target;
|
| if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) {
|
| @@ -366,12 +370,11 @@ void OcclusionTracker::MarkOccludedBehindLayer(const LayerImpl* layer) {
|
| return;
|
|
|
| gfx::Rect clip_rect_in_target = ScreenSpaceClipRectInTargetSurface(
|
| - layer->render_target()->render_surface(), screen_space_clip_rect_);
|
| + layer->render_target(), screen_space_clip_rect_);
|
| if (layer->is_clipped()) {
|
| clip_rect_in_target.Intersect(layer->clip_rect());
|
| } else {
|
| - clip_rect_in_target.Intersect(
|
| - layer->render_target()->render_surface()->content_rect());
|
| + clip_rect_in_target.Intersect(layer->render_target()->content_rect());
|
| }
|
|
|
| for (size_t i = 0; i < opaque_layer_region.GetRegionComplexity(); ++i) {
|
| @@ -386,9 +389,9 @@ void OcclusionTracker::MarkOccludedBehindLayer(const LayerImpl* layer) {
|
| }
|
| }
|
|
|
| -Region OcclusionTracker::ComputeVisibleRegionInScreen() const {
|
| - DCHECK(stack_.back().target->layer_tree_impl()->IsRootLayer(
|
| - stack_.back().target));
|
| +Region OcclusionTracker::ComputeVisibleRegionInScreen(
|
| + const LayerTreeImpl* layer_tree) const {
|
| + DCHECK(layer_tree->root_layer()->render_surface() == stack_.back().target);
|
| const SimpleEnclosedRegion& occluded =
|
| stack_.back().occlusion_from_inside_target;
|
| Region visible_region(screen_space_clip_rect_);
|
|
|