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

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

Issue 1624693004: cc:: Add transform nodes at boundaries of 3d rendering contexts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
« cc/trees/property_tree.h ('K') | « cc/trees/property_tree.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/property_tree_builder.h" 5 #include "cc/trees/property_tree_builder.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 data_for_children->clip_tree->Insert(node, parent_id); 190 data_for_children->clip_tree->Insert(node, parent_id);
191 } 191 }
192 192
193 layer->SetClipTreeIndex(data_for_children->clip_tree_parent); 193 layer->SetClipTreeIndex(data_for_children->clip_tree_parent);
194 // TODO(awoloszyn): Right now when we hit a node with a replica, we reset the 194 // TODO(awoloszyn): Right now when we hit a node with a replica, we reset the
195 // clip for all children since we may need to draw. We need to figure out a 195 // clip for all children since we may need to draw. We need to figure out a
196 // better way, since we will need both the clipped and unclipped versions. 196 // better way, since we will need both the clipped and unclipped versions.
197 } 197 }
198 198
199 template <typename LayerType> 199 template <typename LayerType>
200 static bool IsRootLayerOfNewRenderingContext(LayerType* layer) {
201 if (layer->parent())
202 return !layer->parent()->Is3dSorted() && layer->Is3dSorted();
203 return layer->Is3dSorted();
204 }
205
206 template <typename LayerType>
207 static bool EndsExisiting3dRenderingContext(LayerType* layer) {
208 return layer->parent() ? layer->parent()->Is3dSorted() && !layer->Is3dSorted()
209 : false;
210 }
211
212 template <typename LayerType>
200 bool AddTransformNodeIfNeeded( 213 bool AddTransformNodeIfNeeded(
201 const DataForRecursion<LayerType>& data_from_ancestor, 214 const DataForRecursion<LayerType>& data_from_ancestor,
202 LayerType* layer, 215 LayerType* layer,
203 bool created_render_surface, 216 bool created_render_surface,
204 DataForRecursion<LayerType>* data_for_children) { 217 DataForRecursion<LayerType>* data_for_children) {
205 const bool is_root = !layer->parent(); 218 const bool is_root = !layer->parent();
206 const bool is_page_scale_layer = layer == data_from_ancestor.page_scale_layer; 219 const bool is_page_scale_layer = layer == data_from_ancestor.page_scale_layer;
207 const bool is_overscroll_elasticity_layer = 220 const bool is_overscroll_elasticity_layer =
208 layer == data_from_ancestor.overscroll_elasticity_layer; 221 layer == data_from_ancestor.overscroll_elasticity_layer;
209 const bool is_scrollable = layer->scrollable(); 222 const bool is_scrollable = layer->scrollable();
(...skipping 15 matching lines...) Expand all
225 const bool has_surface = created_render_surface; 238 const bool has_surface = created_render_surface;
226 239
227 // A transform node is needed to change the render target for subtree when 240 // A transform node is needed to change the render target for subtree when
228 // a scroll child's render target is different from the scroll parent's render 241 // a scroll child's render target is different from the scroll parent's render
229 // target. 242 // target.
230 const bool scroll_child_has_different_target = 243 const bool scroll_child_has_different_target =
231 layer->scroll_parent() && 244 layer->scroll_parent() &&
232 layer->parent()->effect_tree_index() != 245 layer->parent()->effect_tree_index() !=
233 layer->scroll_parent()->effect_tree_index(); 246 layer->scroll_parent()->effect_tree_index();
234 247
248 const bool is_root_of_new_rendering_context =
249 IsRootLayerOfNewRenderingContext(layer);
250 const bool ends_3d_rendering_context = EndsExisiting3dRenderingContext(layer);
251
235 bool requires_node = is_root || is_scrollable || has_significant_transform || 252 bool requires_node = is_root || is_scrollable || has_significant_transform ||
236 has_any_transform_animation || has_surface || is_fixed || 253 has_any_transform_animation || has_surface || is_fixed ||
237 is_page_scale_layer || is_overscroll_elasticity_layer || 254 is_page_scale_layer || is_overscroll_elasticity_layer ||
238 scroll_child_has_different_target; 255 scroll_child_has_different_target ||
256 is_root_of_new_rendering_context ||
257 ends_3d_rendering_context;
239 258
240 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); 259 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer);
241 DCHECK(is_root || transform_parent); 260 DCHECK(is_root || transform_parent);
242 261
243 int parent_index = kRootPropertyTreeNodeId; 262 int parent_index = kRootPropertyTreeNodeId;
244 if (transform_parent) 263 if (transform_parent)
245 parent_index = transform_parent->transform_tree_index(); 264 parent_index = transform_parent->transform_tree_index();
246 265
247 int source_index = parent_index; 266 int source_index = parent_index;
248 267
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 data_for_children->transform_tree->Insert(TransformNode(), parent_index); 324 data_for_children->transform_tree->Insert(TransformNode(), parent_index);
306 325
307 TransformNode* node = data_for_children->transform_tree->back(); 326 TransformNode* node = data_for_children->transform_tree->back();
308 layer->SetTransformTreeIndex(node->id); 327 layer->SetTransformTreeIndex(node->id);
309 if (layer->mask_layer()) 328 if (layer->mask_layer())
310 layer->mask_layer()->SetTransformTreeIndex(node->id); 329 layer->mask_layer()->SetTransformTreeIndex(node->id);
311 330
312 node->data.scrolls = is_scrollable; 331 node->data.scrolls = is_scrollable;
313 node->data.flattens_inherited_transform = data_for_children->should_flatten; 332 node->data.flattens_inherited_transform = data_for_children->should_flatten;
314 333
334 node->data.is_3d_sorted = layer->Is3dSorted();
335
315 if (layer == data_from_ancestor.page_scale_layer) 336 if (layer == data_from_ancestor.page_scale_layer)
316 data_for_children->in_subtree_of_page_scale_layer = true; 337 data_for_children->in_subtree_of_page_scale_layer = true;
317 node->data.in_subtree_of_page_scale_layer = 338 node->data.in_subtree_of_page_scale_layer =
318 data_for_children->in_subtree_of_page_scale_layer; 339 data_for_children->in_subtree_of_page_scale_layer;
319 340
320 // Surfaces inherently flatten transforms. 341 // Surfaces inherently flatten transforms.
321 data_for_children->should_flatten = 342 data_for_children->should_flatten =
322 layer->should_flatten_transform() || has_surface; 343 layer->should_flatten_transform() || has_surface;
323 DCHECK_GT(data_from_ancestor.effect_tree->size(), 0u); 344 DCHECK_GT(data_from_ancestor.effect_tree->size(), 0u);
324 345
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 const gfx::Transform& device_transform, 828 const gfx::Transform& device_transform,
808 PropertyTrees* property_trees) { 829 PropertyTrees* property_trees) {
809 BuildPropertyTreesTopLevelInternal( 830 BuildPropertyTreesTopLevelInternal(
810 root_layer, page_scale_layer, inner_viewport_scroll_layer, 831 root_layer, page_scale_layer, inner_viewport_scroll_layer,
811 outer_viewport_scroll_layer, overscroll_elasticity_layer, 832 outer_viewport_scroll_layer, overscroll_elasticity_layer,
812 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 833 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
813 device_transform, property_trees); 834 device_transform, property_trees);
814 } 835 }
815 836
816 } // namespace cc 837 } // namespace cc
OLDNEW
« cc/trees/property_tree.h ('K') | « cc/trees/property_tree.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698