Chromium Code Reviews| Index: cc/trees/occlusion_tracker.cc |
| diff --git a/cc/trees/occlusion_tracker.cc b/cc/trees/occlusion_tracker.cc |
| index 78f5cc66675962ecde7f111c1b73b5c007190077..27785c86ad35377dc1a6792a5fd77d3ceaf0f7f5 100644 |
| --- a/cc/trees/occlusion_tracker.cc |
| +++ b/cc/trees/occlusion_tracker.cc |
| @@ -56,23 +56,26 @@ OcclusionTracker::OcclusionSurfaceForContributingSurface() const { |
| return (stack_.size() < 2) ? nullptr : stack_[stack_.size() - 2].target; |
| } |
| -void OcclusionTracker::EnterLayer(const LayerIteratorPosition& layer_iterator) { |
| - LayerImpl* render_target = layer_iterator.target_render_surface_layer; |
| +void OcclusionTracker::EnterLayer( |
| + const EffectTreeLayerListIterator::Position& iterator) { |
| + RenderSurfaceImpl* render_target = iterator.target_render_surface; |
| - if (layer_iterator.represents_itself) |
| + if (iterator.state == EffectTreeLayerListIterator::State::LAYER) |
| EnterRenderTarget(render_target); |
| - else if (layer_iterator.represents_target_render_surface) |
| + else if (iterator.state == EffectTreeLayerListIterator::State::TARGET_SURFACE) |
| FinishedRenderTarget(render_target); |
| } |
| -void OcclusionTracker::LeaveLayer(const LayerIteratorPosition& layer_iterator) { |
| - LayerImpl* render_target = layer_iterator.target_render_surface_layer; |
| +void OcclusionTracker::LeaveLayer( |
| + const EffectTreeLayerListIterator::Position& iterator) { |
| + RenderSurfaceImpl* render_target = iterator.target_render_surface; |
| - if (layer_iterator.represents_itself) |
| - MarkOccludedBehindLayer(layer_iterator.current_layer); |
| + if (iterator.state == EffectTreeLayerListIterator::State::LAYER) |
| + MarkOccludedBehindLayer(iterator.current_layer); |
| // TODO(danakj): This should be done when entering the contributing surface, |
| // but in a way that the surface's own occlusion won't occlude itself. |
| - else if (layer_iterator.represents_contributing_render_surface) |
| + else if (iterator.state == |
| + EffectTreeLayerListIterator::State::CONTRIBUTING_SURFACE) |
| LeaveToRenderTarget(render_target); |
| } |
| @@ -117,9 +120,9 @@ static SimpleEnclosedRegion TransformSurfaceOpaqueRegion( |
| return transformed_region; |
| } |
| -void OcclusionTracker::EnterRenderTarget(const LayerImpl* new_target) { |
| - DCHECK(new_target->GetRenderSurface()); |
| - RenderSurfaceImpl* new_target_surface = new_target->GetRenderSurface(); |
| +void OcclusionTracker::EnterRenderTarget( |
| + const RenderSurfaceImpl* new_target_surface) { |
| + DCHECK(new_target_surface); |
| if (!stack_.empty() && stack_.back().target == new_target_surface) |
| return; |
| @@ -153,7 +156,7 @@ void OcclusionTracker::EnterRenderTarget(const LayerImpl* new_target) { |
| &inverse_new_target_screen_space_transform); |
| bool entering_root_target = |
| - new_target->layer_tree_impl()->IsRootLayer(new_target); |
| + new_target_surface->render_target() == new_target_surface; |
| bool copy_outside_occlusion_forward = |
| stack_.size() > 1 && |
| @@ -177,22 +180,26 @@ void OcclusionTracker::EnterRenderTarget(const LayerImpl* new_target) { |
| gfx::Rect(), old_target_to_new_target_transform)); |
| } |
| -void OcclusionTracker::FinishedRenderTarget(const LayerImpl* finished_target) { |
| +void OcclusionTracker::FinishedRenderTarget( |
| + const RenderSurfaceImpl* finished_target_surface) { |
| // Make sure we know about the target surface. |
| - EnterRenderTarget(finished_target); |
| + EnterRenderTarget(finished_target_surface); |
| - RenderSurfaceImpl* surface = finished_target->GetRenderSurface(); |
| + bool is_hidden = |
| + finished_target_surface->OwningEffectNode()->screen_space_opacity == 0.f; |
| // Readbacks always happen on render targets so we only need to check |
| // for readbacks here. |
| bool target_is_only_for_copy_request = |
| - surface->HasCopyRequest() && finished_target->IsHidden(); |
|
jaydasika
2017/03/22 20:49:42
Can LayerImpl::IsHidden be deleted as its not bein
ajuma
2017/03/24 17:25:07
Good catch, there was still one unit test using it
|
| + finished_target_surface->HasCopyRequest() && is_hidden; |
| // If the occlusion within the surface can not be applied to things outside of |
| // the surface's subtree, then clear the occlusion here so it won't be used. |
| - if (surface->MaskLayer() || surface->draw_opacity() < 1 || |
| - !surface->UsesDefaultBlendMode() || target_is_only_for_copy_request || |
| - surface->Filters().HasFilterThatAffectsOpacity()) { |
| + if (finished_target_surface->HasMask() || |
| + finished_target_surface->draw_opacity() < 1 || |
| + !finished_target_surface->UsesDefaultBlendMode() || |
| + target_is_only_for_copy_request || |
| + finished_target_surface->Filters().HasFilterThatAffectsOpacity()) { |
| stack_.back().occlusion_from_outside_target.Clear(); |
| stack_.back().occlusion_from_inside_target.Clear(); |
| } |
| @@ -252,13 +259,13 @@ static void ReduceOcclusionBelowSurface( |
| } |
| } |
| -void OcclusionTracker::LeaveToRenderTarget(const LayerImpl* new_target) { |
| +void OcclusionTracker::LeaveToRenderTarget( |
| + const RenderSurfaceImpl* new_target_surface) { |
| DCHECK(!stack_.empty()); |
| size_t last_index = stack_.size() - 1; |
| - DCHECK(new_target->GetRenderSurface()); |
| - RenderSurfaceImpl* new_surface = new_target->GetRenderSurface(); |
| + DCHECK(new_target_surface); |
| bool surface_will_be_at_top_after_pop = |
| - stack_.size() > 1 && stack_[last_index - 1].target == new_surface; |
| + stack_.size() > 1 && stack_[last_index - 1].target == new_target_surface; |
| // We merge the screen occlusion from the current RenderSurfaceImpl subtree |
| // out to its parent target RenderSurfaceImpl. The target occlusion can be |
| @@ -285,23 +292,24 @@ void OcclusionTracker::LeaveToRenderTarget(const LayerImpl* new_target) { |
| surface_occlusion.GetUnoccludedContentRect(old_surface->content_rect()); |
| } |
| + bool is_root = new_target_surface->render_target() == new_target_surface; |
| if (surface_will_be_at_top_after_pop) { |
| // Merge the top of the stack down. |
| stack_[last_index - 1].occlusion_from_inside_target.Union( |
| old_occlusion_from_inside_target_in_new_target); |
| // TODO(danakj): Strictly this should subtract the inside target occlusion |
| // before union. |
| - if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) { |
| + if (!is_root) { |
| stack_[last_index - 1].occlusion_from_outside_target.Union( |
| old_occlusion_from_outside_target_in_new_target); |
| } |
| stack_.pop_back(); |
| } else { |
| // Replace the top of the stack with the new pushed surface. |
| - stack_.back().target = new_surface; |
| + stack_.back().target = new_target_surface; |
| stack_.back().occlusion_from_inside_target = |
| old_occlusion_from_inside_target_in_new_target; |
| - if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) { |
| + if (!is_root) { |
| stack_.back().occlusion_from_outside_target = |
| old_occlusion_from_outside_target_in_new_target; |
| } else { |