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

Side by Side Diff: cc/trees/occlusion_tracker.cc

Issue 1832663002: cc : Determine if a layer is root by using the value in LayerTreeImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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 unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/occlusion_tracker.h" 5 #include "cc/trees/occlusion_tracker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "cc/base/math_util.h" 11 #include "cc/base/math_util.h"
12 #include "cc/base/region.h" 12 #include "cc/base/region.h"
13 #include "cc/layers/layer.h" 13 #include "cc/layers/layer.h"
14 #include "cc/layers/layer_impl.h" 14 #include "cc/layers/layer_impl.h"
15 #include "cc/layers/render_surface_impl.h" 15 #include "cc/layers/render_surface_impl.h"
16 #include "cc/trees/layer_tree_impl.h"
16 #include "ui/gfx/geometry/quad_f.h" 17 #include "ui/gfx/geometry/quad_f.h"
17 #include "ui/gfx/geometry/rect_conversions.h" 18 #include "ui/gfx/geometry/rect_conversions.h"
18 19
19 namespace cc { 20 namespace cc {
20 21
21 OcclusionTracker::OcclusionTracker(const gfx::Rect& screen_space_clip_rect) 22 OcclusionTracker::OcclusionTracker(const gfx::Rect& screen_space_clip_rect)
22 : screen_space_clip_rect_(screen_space_clip_rect) { 23 : screen_space_clip_rect_(screen_space_clip_rect) {
23 } 24 }
24 25
25 OcclusionTracker::~OcclusionTracker() { 26 OcclusionTracker::~OcclusionTracker() {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 new_occlusion_immune_ancestor && 135 new_occlusion_immune_ancestor &&
135 new_occlusion_immune_ancestor != old_occlusion_immune_ancestor; 136 new_occlusion_immune_ancestor != old_occlusion_immune_ancestor;
136 137
137 gfx::Transform inverse_new_target_screen_space_transform( 138 gfx::Transform inverse_new_target_screen_space_transform(
138 // Note carefully, not used if screen space transform is uninvertible. 139 // Note carefully, not used if screen space transform is uninvertible.
139 gfx::Transform::kSkipInitialization); 140 gfx::Transform::kSkipInitialization);
140 bool have_transform_from_screen_to_new_target = 141 bool have_transform_from_screen_to_new_target =
141 new_target->render_surface()->screen_space_transform().GetInverse( 142 new_target->render_surface()->screen_space_transform().GetInverse(
142 &inverse_new_target_screen_space_transform); 143 &inverse_new_target_screen_space_transform);
143 144
144 bool entering_root_target = new_target->parent() == NULL; 145 bool entering_root_target =
146 new_target->layer_tree_impl()->IsRootLayer(new_target);
145 147
146 bool copy_outside_occlusion_forward = 148 bool copy_outside_occlusion_forward =
147 stack_.size() > 1 && 149 stack_.size() > 1 &&
148 !entering_unoccluded_subtree && 150 !entering_unoccluded_subtree &&
149 have_transform_from_screen_to_new_target && 151 have_transform_from_screen_to_new_target &&
150 !entering_root_target; 152 !entering_root_target;
151 if (!copy_outside_occlusion_forward) 153 if (!copy_outside_occlusion_forward)
152 return; 154 return;
153 155
154 size_t last_index = stack_.size() - 1; 156 size_t last_index = stack_.size() - 1;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 old_surface->content_rect()); 288 old_surface->content_rect());
287 } 289 }
288 } 290 }
289 291
290 if (surface_will_be_at_top_after_pop) { 292 if (surface_will_be_at_top_after_pop) {
291 // Merge the top of the stack down. 293 // Merge the top of the stack down.
292 stack_[last_index - 1].occlusion_from_inside_target.Union( 294 stack_[last_index - 1].occlusion_from_inside_target.Union(
293 old_occlusion_from_inside_target_in_new_target); 295 old_occlusion_from_inside_target_in_new_target);
294 // TODO(danakj): Strictly this should subtract the inside target occlusion 296 // TODO(danakj): Strictly this should subtract the inside target occlusion
295 // before union. 297 // before union.
296 if (new_target->parent()) { 298 if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) {
297 stack_[last_index - 1].occlusion_from_outside_target.Union( 299 stack_[last_index - 1].occlusion_from_outside_target.Union(
298 old_occlusion_from_outside_target_in_new_target); 300 old_occlusion_from_outside_target_in_new_target);
299 } 301 }
300 stack_.pop_back(); 302 stack_.pop_back();
301 } else { 303 } else {
302 // Replace the top of the stack with the new pushed surface. 304 // Replace the top of the stack with the new pushed surface.
303 stack_.back().target = new_target; 305 stack_.back().target = new_target;
304 stack_.back().occlusion_from_inside_target = 306 stack_.back().occlusion_from_inside_target =
305 old_occlusion_from_inside_target_in_new_target; 307 old_occlusion_from_inside_target_in_new_target;
306 if (new_target->parent()) { 308 if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) {
307 stack_.back().occlusion_from_outside_target = 309 stack_.back().occlusion_from_outside_target =
308 old_occlusion_from_outside_target_in_new_target; 310 old_occlusion_from_outside_target_in_new_target;
309 } else { 311 } else {
310 stack_.back().occlusion_from_outside_target.Clear(); 312 stack_.back().occlusion_from_outside_target.Clear();
311 } 313 }
312 } 314 }
313 315
314 if (!old_target->background_filters().HasFilterThatMovesPixels()) 316 if (!old_target->background_filters().HasFilterThatMovesPixels())
315 return; 317 return;
316 318
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 draw_transform, opaque_layer_region.GetRect(i)); 380 draw_transform, opaque_layer_region.GetRect(i));
379 transformed_rect.Intersect(clip_rect_in_target); 381 transformed_rect.Intersect(clip_rect_in_target);
380 if (transformed_rect.width() < minimum_tracking_size_.width() && 382 if (transformed_rect.width() < minimum_tracking_size_.width() &&
381 transformed_rect.height() < minimum_tracking_size_.height()) 383 transformed_rect.height() < minimum_tracking_size_.height())
382 continue; 384 continue;
383 stack_.back().occlusion_from_inside_target.Union(transformed_rect); 385 stack_.back().occlusion_from_inside_target.Union(transformed_rect);
384 } 386 }
385 } 387 }
386 388
387 Region OcclusionTracker::ComputeVisibleRegionInScreen() const { 389 Region OcclusionTracker::ComputeVisibleRegionInScreen() const {
388 DCHECK(!stack_.back().target->parent()); 390 DCHECK(stack_.back().target->layer_tree_impl()->IsRootLayer(
391 stack_.back().target));
389 const SimpleEnclosedRegion& occluded = 392 const SimpleEnclosedRegion& occluded =
390 stack_.back().occlusion_from_inside_target; 393 stack_.back().occlusion_from_inside_target;
391 Region visible_region(screen_space_clip_rect_); 394 Region visible_region(screen_space_clip_rect_);
392 for (size_t i = 0; i < occluded.GetRegionComplexity(); ++i) 395 for (size_t i = 0; i < occluded.GetRegionComplexity(); ++i)
393 visible_region.Subtract(occluded.GetRect(i)); 396 visible_region.Subtract(occluded.GetRect(i));
394 return visible_region; 397 return visible_region;
395 } 398 }
396 399
397 } // namespace cc 400 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698