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

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: 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
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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 // corresponding pending layer. 144 // corresponding pending layer.
141 if (LayerById(layer_id)) { 145 if (LayerById(layer_id)) {
142 transform_id = LayerById(layer_id)->transform_tree_index(); 146 transform_id = LayerById(layer_id)->transform_tree_index();
143 } else { 147 } else {
144 DCHECK(!IsActiveTree()); 148 DCHECK(!IsActiveTree());
145 return; 149 return;
146 } 150 }
147 151
148 if (transform_id != -1) { 152 if (transform_id != -1) {
149 TransformNode* node = transform_tree.Node(transform_id); 153 TransformNode* node = transform_tree.Node(transform_id);
150 if (node->data.scroll_offset != 154 if (node->scroll_offset != scroll_tree.current_scroll_offset(layer_id)) {
151 scroll_tree.current_scroll_offset(layer_id)) { 155 node->scroll_offset = scroll_tree.current_scroll_offset(layer_id);
152 node->data.scroll_offset = scroll_tree.current_scroll_offset(layer_id); 156 node->needs_local_transform_update = true;
153 node->data.needs_local_transform_update = true;
154 transform_tree.set_needs_update(true); 157 transform_tree.set_needs_update(true);
155 } 158 }
156 node->data.transform_changed = true; 159 node->transform_changed = true;
157 property_trees()->changed = true; 160 property_trees()->changed = true;
158 set_needs_update_draw_properties(); 161 set_needs_update_draw_properties();
159 } 162 }
160 163
161 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) 164 if (IsActiveTree() && layer_tree_host_impl_->pending_tree())
162 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id, 165 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id,
163 transform_id); 166 transform_id);
164 } 167 }
165 168
166 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { 169 void LayerTreeImpl::DidUpdateScrollState(int layer_id) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 return ret; 346 return ret;
344 } 347 }
345 348
346 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, 349 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer,
347 ClipTree* clip_tree) { 350 ClipTree* clip_tree) {
348 if (layer && layer->masks_to_bounds()) { 351 if (layer && layer->masks_to_bounds()) {
349 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); 352 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index());
350 if (clip_node) { 353 if (clip_node) {
351 DCHECK_EQ(layer->id(), clip_node->owner_id); 354 DCHECK_EQ(layer->id(), clip_node->owner_id);
352 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); 355 gfx::SizeF bounds = gfx::SizeF(layer->bounds());
353 if (clip_node->data.clip.size() != bounds) { 356 if (clip_node->clip.size() != bounds) {
354 clip_node->data.clip.set_size(bounds); 357 clip_node->clip.set_size(bounds);
355 clip_tree->set_needs_update(true); 358 clip_tree->set_needs_update(true);
356 } 359 }
357 } 360 }
358 } 361 }
359 } 362 }
360 363
361 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { 364 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) {
362 property_trees_ = *property_trees; 365 property_trees_ = *property_trees;
363 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); 366 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree);
364 property_trees_.is_main_thread = false; 367 property_trees_.is_main_thread = false;
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 // updates from scrolling deltas on the compositor thread that have occurred 608 // updates from scrolling deltas on the compositor thread that have occurred
606 // after begin frame and updates from animations that have ticked since begin 609 // after begin frame and updates from animations that have ticked since begin
607 // frame to a newly-committed property tree. 610 // frame to a newly-committed property tree.
608 if (layer_list_.empty()) 611 if (layer_list_.empty())
609 return; 612 return;
610 for (auto& layer_id_to_opacity : opacity_animations_map_) { 613 for (auto& layer_id_to_opacity : opacity_animations_map_) {
611 const int id = layer_id_to_opacity.first; 614 const int id = layer_id_to_opacity.first;
612 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) { 615 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) {
613 EffectNode* node = property_trees_.effect_tree.Node( 616 EffectNode* node = property_trees_.effect_tree.Node(
614 property_trees_.effect_id_to_index_map[id]); 617 property_trees_.effect_id_to_index_map[id]);
615 if (!node->data.is_currently_animating_opacity || 618 if (!node->is_currently_animating_opacity ||
616 node->data.opacity == layer_id_to_opacity.second) 619 node->opacity == layer_id_to_opacity.second)
617 continue; 620 continue;
618 node->data.opacity = layer_id_to_opacity.second; 621 node->opacity = layer_id_to_opacity.second;
619 property_trees_.effect_tree.set_needs_update(true); 622 property_trees_.effect_tree.set_needs_update(true);
620 } 623 }
621 } 624 }
622 opacity_animations_map_.clear(); 625 opacity_animations_map_.clear();
623 626
624 for (auto& layer_id_to_transform : transform_animations_map_) { 627 for (auto& layer_id_to_transform : transform_animations_map_) {
625 const int id = layer_id_to_transform.first; 628 const int id = layer_id_to_transform.first;
626 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, 629 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
627 id)) { 630 id)) {
628 TransformNode* node = property_trees_.transform_tree.Node( 631 TransformNode* node = property_trees_.transform_tree.Node(
629 property_trees_.transform_id_to_index_map[id]); 632 property_trees_.transform_id_to_index_map[id]);
630 if (!node->data.is_currently_animating || 633 if (!node->is_currently_animating ||
631 node->data.local == layer_id_to_transform.second) 634 node->local == layer_id_to_transform.second)
632 continue; 635 continue;
633 node->data.local = layer_id_to_transform.second; 636 node->local = layer_id_to_transform.second;
634 node->data.needs_local_transform_update = true; 637 node->needs_local_transform_update = true;
635 property_trees_.transform_tree.set_needs_update(true); 638 property_trees_.transform_tree.set_needs_update(true);
636 } 639 }
637 } 640 }
638 transform_animations_map_.clear(); 641 transform_animations_map_.clear();
639 642
640 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { 643 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) {
641 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); 644 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded();
642 }); 645 });
643 } 646 }
644 647
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 // We need to visit all ancestor clip nodes to check this. Checking with just 1649 // We need to visit all ancestor clip nodes to check this. Checking with just
1647 // the combined clip stored at a clip node is not enough because parent 1650 // the combined clip stored at a clip node is not enough because parent
1648 // combined clip can sometimes be smaller than current combined clip. This can 1651 // combined clip can sometimes be smaller than current combined clip. This can
1649 // happen when we have transforms like rotation that inflate the combined 1652 // happen when we have transforms like rotation that inflate the combined
1650 // clip's bounds. Also, the point can be clipped by the content rect of an 1653 // clip's bounds. Also, the point can be clipped by the content rect of an
1651 // ancestor render surface. 1654 // ancestor render surface.
1652 1655
1653 // We first check if the point is clipped by viewport. 1656 // We first check if the point is clipped by viewport.
1654 const ClipNode* clip_node = clip_tree.Node(1); 1657 const ClipNode* clip_node = clip_tree.Node(1);
1655 gfx::Rect combined_clip_in_target_space = 1658 gfx::Rect combined_clip_in_target_space =
1656 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); 1659 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space);
1657 if (!PointHitsRect(screen_space_point, gfx::Transform(), 1660 if (!PointHitsRect(screen_space_point, gfx::Transform(),
1658 combined_clip_in_target_space, NULL)) 1661 combined_clip_in_target_space, NULL))
1659 return true; 1662 return true;
1660 1663
1661 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 1664 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
1662 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) { 1665 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) {
1663 if (clip_node->data.applies_local_clip) { 1666 if (clip_node->applies_local_clip) {
1664 const TransformNode* transform_node = 1667 const TransformNode* transform_node =
1665 transform_tree.Node(clip_node->data.target_id); 1668 transform_tree.Node(clip_node->target_id);
1666 gfx::Rect combined_clip_in_target_space = 1669 gfx::Rect combined_clip_in_target_space =
1667 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); 1670 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space);
1668 1671
1669 const LayerImpl* target_layer = 1672 const LayerImpl* target_layer =
1670 layer->layer_tree_impl()->LayerById(transform_node->owner_id); 1673 layer->layer_tree_impl()->LayerById(transform_node->owner_id);
1671 DCHECK(transform_node->id == 0 || target_layer->render_surface() || 1674 DCHECK(transform_node->id == 0 || target_layer->render_surface() ||
1672 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); 1675 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode());
1673 gfx::Transform surface_screen_space_transform = 1676 gfx::Transform surface_screen_space_transform =
1674 transform_node->id == 0 || 1677 transform_node->id == 0 ||
1675 (layer->layer_tree_impl() 1678 (layer->layer_tree_impl()
1676 ->is_in_resourceless_software_draw_mode()) 1679 ->is_in_resourceless_software_draw_mode())
1677 ? gfx::Transform() 1680 ? gfx::Transform()
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
2098 2101
2099 void LayerTreeImpl::ResetAllChangeTracking() { 2102 void LayerTreeImpl::ResetAllChangeTracking() {
2100 layers_that_should_push_properties_.clear(); 2103 layers_that_should_push_properties_.clear();
2101 // Iterate over all layers, including masks and replicas. 2104 // Iterate over all layers, including masks and replicas.
2102 for (auto& layer : *layers_) 2105 for (auto& layer : *layers_)
2103 layer->ResetChangeTracking(); 2106 layer->ResetChangeTracking();
2104 property_trees_.ResetAllChangeTracking(); 2107 property_trees_.ResetAllChangeTracking();
2105 } 2108 }
2106 2109
2107 } // namespace cc 2110 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698