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

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

Issue 2118993002: Detemplatize cc property nodes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 5 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_host_unittest_scroll.cc ('k') | cc/trees/layer_tree_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/layer_tree_impl.h" 5 #include "cc/trees/layer_tree_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 15 matching lines...) Expand all
26 #include "cc/input/scrollbar_animation_controller.h" 26 #include "cc/input/scrollbar_animation_controller.h"
27 #include "cc/input/scrollbar_animation_controller_linear_fade.h" 27 #include "cc/input/scrollbar_animation_controller_linear_fade.h"
28 #include "cc/input/scrollbar_animation_controller_thinning.h" 28 #include "cc/input/scrollbar_animation_controller_thinning.h"
29 #include "cc/layers/heads_up_display_layer_impl.h" 29 #include "cc/layers/heads_up_display_layer_impl.h"
30 #include "cc/layers/layer.h" 30 #include "cc/layers/layer.h"
31 #include "cc/layers/layer_iterator.h" 31 #include "cc/layers/layer_iterator.h"
32 #include "cc/layers/layer_list_iterator.h" 32 #include "cc/layers/layer_list_iterator.h"
33 #include "cc/layers/render_surface_impl.h" 33 #include "cc/layers/render_surface_impl.h"
34 #include "cc/layers/scrollbar_layer_impl_base.h" 34 #include "cc/layers/scrollbar_layer_impl_base.h"
35 #include "cc/resources/ui_resource_request.h" 35 #include "cc/resources/ui_resource_request.h"
36 #include "cc/trees/clip_node.h"
36 #include "cc/trees/draw_property_utils.h" 37 #include "cc/trees/draw_property_utils.h"
38 #include "cc/trees/effect_node.h"
37 #include "cc/trees/layer_tree_host_common.h" 39 #include "cc/trees/layer_tree_host_common.h"
38 #include "cc/trees/layer_tree_host_impl.h" 40 #include "cc/trees/layer_tree_host_impl.h"
39 #include "cc/trees/occlusion_tracker.h" 41 #include "cc/trees/occlusion_tracker.h"
40 #include "cc/trees/property_tree.h" 42 #include "cc/trees/property_tree.h"
41 #include "cc/trees/property_tree_builder.h" 43 #include "cc/trees/property_tree_builder.h"
44 #include "cc/trees/scroll_node.h"
45 #include "cc/trees/transform_node.h"
42 #include "ui/gfx/geometry/box_f.h" 46 #include "ui/gfx/geometry/box_f.h"
43 #include "ui/gfx/geometry/point_conversions.h" 47 #include "ui/gfx/geometry/point_conversions.h"
44 #include "ui/gfx/geometry/rect_conversions.h" 48 #include "ui/gfx/geometry/rect_conversions.h"
45 #include "ui/gfx/geometry/size_conversions.h" 49 #include "ui/gfx/geometry/size_conversions.h"
46 #include "ui/gfx/geometry/vector2d_conversions.h" 50 #include "ui/gfx/geometry/vector2d_conversions.h"
47 51
48 namespace cc { 52 namespace cc {
49 53
50 LayerTreeImpl::LayerTreeImpl( 54 LayerTreeImpl::LayerTreeImpl(
51 LayerTreeHostImpl* layer_tree_host_impl, 55 LayerTreeHostImpl* layer_tree_host_impl,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 // corresponding pending layer. 155 // corresponding pending layer.
152 if (LayerById(layer_id)) { 156 if (LayerById(layer_id)) {
153 transform_id = LayerById(layer_id)->transform_tree_index(); 157 transform_id = LayerById(layer_id)->transform_tree_index();
154 } else { 158 } else {
155 DCHECK(!IsActiveTree()); 159 DCHECK(!IsActiveTree());
156 return; 160 return;
157 } 161 }
158 162
159 if (transform_id != -1) { 163 if (transform_id != -1) {
160 TransformNode* node = transform_tree.Node(transform_id); 164 TransformNode* node = transform_tree.Node(transform_id);
161 if (node->data.scroll_offset != 165 if (node->scroll_offset != scroll_tree.current_scroll_offset(layer_id)) {
162 scroll_tree.current_scroll_offset(layer_id)) { 166 node->scroll_offset = scroll_tree.current_scroll_offset(layer_id);
163 node->data.scroll_offset = scroll_tree.current_scroll_offset(layer_id); 167 node->needs_local_transform_update = true;
164 node->data.needs_local_transform_update = true;
165 transform_tree.set_needs_update(true); 168 transform_tree.set_needs_update(true);
166 } 169 }
167 node->data.transform_changed = true; 170 node->transform_changed = true;
168 property_trees()->changed = true; 171 property_trees()->changed = true;
169 set_needs_update_draw_properties(); 172 set_needs_update_draw_properties();
170 } 173 }
171 174
172 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) 175 if (IsActiveTree() && layer_tree_host_impl_->pending_tree())
173 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id, 176 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id,
174 transform_id); 177 transform_id);
175 } 178 }
176 179
177 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { 180 void LayerTreeImpl::DidUpdateScrollState(int layer_id) {
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 return ret; 353 return ret;
351 } 354 }
352 355
353 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, 356 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer,
354 ClipTree* clip_tree) { 357 ClipTree* clip_tree) {
355 if (layer && layer->masks_to_bounds()) { 358 if (layer && layer->masks_to_bounds()) {
356 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); 359 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index());
357 if (clip_node) { 360 if (clip_node) {
358 DCHECK_EQ(layer->id(), clip_node->owner_id); 361 DCHECK_EQ(layer->id(), clip_node->owner_id);
359 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); 362 gfx::SizeF bounds = gfx::SizeF(layer->bounds());
360 if (clip_node->data.clip.size() != bounds) { 363 if (clip_node->clip.size() != bounds) {
361 clip_node->data.clip.set_size(bounds); 364 clip_node->clip.set_size(bounds);
362 clip_tree->set_needs_update(true); 365 clip_tree->set_needs_update(true);
363 } 366 }
364 } 367 }
365 } 368 }
366 } 369 }
367 370
368 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { 371 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) {
369 property_trees_ = *property_trees; 372 property_trees_ = *property_trees;
370 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); 373 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree);
371 property_trees_.is_main_thread = false; 374 property_trees_.is_main_thread = false;
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 // updates from scrolling deltas on the compositor thread that have occurred 615 // updates from scrolling deltas on the compositor thread that have occurred
613 // after begin frame and updates from animations that have ticked since begin 616 // after begin frame and updates from animations that have ticked since begin
614 // frame to a newly-committed property tree. 617 // frame to a newly-committed property tree.
615 if (layer_list_.empty()) 618 if (layer_list_.empty())
616 return; 619 return;
617 for (auto& layer_id_to_opacity : opacity_animations_map_) { 620 for (auto& layer_id_to_opacity : opacity_animations_map_) {
618 const int id = layer_id_to_opacity.first; 621 const int id = layer_id_to_opacity.first;
619 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) { 622 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) {
620 EffectNode* node = property_trees_.effect_tree.Node( 623 EffectNode* node = property_trees_.effect_tree.Node(
621 property_trees_.effect_id_to_index_map[id]); 624 property_trees_.effect_id_to_index_map[id]);
622 if (!node->data.is_currently_animating_opacity || 625 if (!node->is_currently_animating_opacity ||
623 node->data.opacity == layer_id_to_opacity.second) 626 node->opacity == layer_id_to_opacity.second)
624 continue; 627 continue;
625 node->data.opacity = layer_id_to_opacity.second; 628 node->opacity = layer_id_to_opacity.second;
626 property_trees_.effect_tree.set_needs_update(true); 629 property_trees_.effect_tree.set_needs_update(true);
627 } 630 }
628 } 631 }
629 opacity_animations_map_.clear(); 632 opacity_animations_map_.clear();
630 633
631 for (auto& layer_id_to_transform : transform_animations_map_) { 634 for (auto& layer_id_to_transform : transform_animations_map_) {
632 const int id = layer_id_to_transform.first; 635 const int id = layer_id_to_transform.first;
633 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, 636 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
634 id)) { 637 id)) {
635 TransformNode* node = property_trees_.transform_tree.Node( 638 TransformNode* node = property_trees_.transform_tree.Node(
636 property_trees_.transform_id_to_index_map[id]); 639 property_trees_.transform_id_to_index_map[id]);
637 if (!node->data.is_currently_animating || 640 if (!node->is_currently_animating ||
638 node->data.local == layer_id_to_transform.second) 641 node->local == layer_id_to_transform.second)
639 continue; 642 continue;
640 node->data.local = layer_id_to_transform.second; 643 node->local = layer_id_to_transform.second;
641 node->data.needs_local_transform_update = true; 644 node->needs_local_transform_update = true;
642 property_trees_.transform_tree.set_needs_update(true); 645 property_trees_.transform_tree.set_needs_update(true);
643 } 646 }
644 } 647 }
645 transform_animations_map_.clear(); 648 transform_animations_map_.clear();
646 649
647 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { 650 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) {
648 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); 651 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded();
649 }); 652 });
650 } 653 }
651 654
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1653 // We need to visit all ancestor clip nodes to check this. Checking with just 1656 // We need to visit all ancestor clip nodes to check this. Checking with just
1654 // the combined clip stored at a clip node is not enough because parent 1657 // the combined clip stored at a clip node is not enough because parent
1655 // combined clip can sometimes be smaller than current combined clip. This can 1658 // combined clip can sometimes be smaller than current combined clip. This can
1656 // happen when we have transforms like rotation that inflate the combined 1659 // happen when we have transforms like rotation that inflate the combined
1657 // clip's bounds. Also, the point can be clipped by the content rect of an 1660 // clip's bounds. Also, the point can be clipped by the content rect of an
1658 // ancestor render surface. 1661 // ancestor render surface.
1659 1662
1660 // We first check if the point is clipped by viewport. 1663 // We first check if the point is clipped by viewport.
1661 const ClipNode* clip_node = clip_tree.Node(1); 1664 const ClipNode* clip_node = clip_tree.Node(1);
1662 gfx::Rect combined_clip_in_target_space = 1665 gfx::Rect combined_clip_in_target_space =
1663 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); 1666 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space);
1664 if (!PointHitsRect(screen_space_point, gfx::Transform(), 1667 if (!PointHitsRect(screen_space_point, gfx::Transform(),
1665 combined_clip_in_target_space, NULL)) 1668 combined_clip_in_target_space, NULL))
1666 return true; 1669 return true;
1667 1670
1668 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 1671 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
1669 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) { 1672 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) {
1670 if (clip_node->data.applies_local_clip) { 1673 if (clip_node->applies_local_clip) {
1671 const TransformNode* transform_node = 1674 const TransformNode* transform_node =
1672 transform_tree.Node(clip_node->data.target_id); 1675 transform_tree.Node(clip_node->target_id);
1673 gfx::Rect combined_clip_in_target_space = 1676 gfx::Rect combined_clip_in_target_space =
1674 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); 1677 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space);
1675 1678
1676 const LayerImpl* target_layer = 1679 const LayerImpl* target_layer =
1677 layer->layer_tree_impl()->LayerById(transform_node->owner_id); 1680 layer->layer_tree_impl()->LayerById(transform_node->owner_id);
1678 DCHECK(transform_node->id == 0 || target_layer->render_surface() || 1681 DCHECK(transform_node->id == 0 || target_layer->render_surface() ||
1679 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); 1682 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode());
1680 gfx::Transform surface_screen_space_transform = 1683 gfx::Transform surface_screen_space_transform =
1681 transform_node->id == 0 || 1684 transform_node->id == 0 ||
1682 (layer->layer_tree_impl() 1685 (layer->layer_tree_impl()
1683 ->is_in_resourceless_software_draw_mode()) 1686 ->is_in_resourceless_software_draw_mode())
1684 ? gfx::Transform() 1687 ? gfx::Transform()
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
2105 2108
2106 void LayerTreeImpl::ResetAllChangeTracking() { 2109 void LayerTreeImpl::ResetAllChangeTracking() {
2107 layers_that_should_push_properties_.clear(); 2110 layers_that_should_push_properties_.clear();
2108 // Iterate over all layers, including masks and replicas. 2111 // Iterate over all layers, including masks and replicas.
2109 for (auto& layer : *layers_) 2112 for (auto& layer : *layers_)
2110 layer->ResetChangeTracking(); 2113 layer->ResetChangeTracking();
2111 property_trees_.ResetAllChangeTracking(); 2114 property_trees_.ResetAllChangeTracking();
2112 } 2115 }
2113 2116
2114 } // namespace cc 2117 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_unittest_scroll.cc ('k') | cc/trees/layer_tree_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698