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

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

Issue 1588093004: Compute if a layer is drawn without LayerTree hierarchy (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
« no previous file with comments | « 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 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 504
505 // If the layer has some translucency and does not have a preserves-3d 505 // If the layer has some translucency and does not have a preserves-3d
506 // transform style. This condition only needs a render surface if two or more 506 // transform style. This condition only needs a render surface if two or more
507 // layers in the subtree overlap. But checking layer overlaps is unnecessarily 507 // layers in the subtree overlap. But checking layer overlaps is unnecessarily
508 // costly so instead we conservatively create a surface whenever at least two 508 // costly so instead we conservatively create a surface whenever at least two
509 // layers draw content for this subtree. 509 // layers draw content for this subtree.
510 bool at_least_two_layers_in_subtree_draw_content = 510 bool at_least_two_layers_in_subtree_draw_content =
511 num_descendants_that_draw_content > 0 && 511 num_descendants_that_draw_content > 0 &&
512 (layer->DrawsContent() || num_descendants_that_draw_content > 1); 512 (layer->DrawsContent() || num_descendants_that_draw_content > 1);
513 513
514 if (layer->opacity() != 1.f && layer->should_flatten_transform() && 514 if (layer->EffectiveOpacity() != 1.f && layer->should_flatten_transform() &&
515 at_least_two_layers_in_subtree_draw_content) { 515 at_least_two_layers_in_subtree_draw_content) {
516 TRACE_EVENT_INSTANT0( 516 TRACE_EVENT_INSTANT0(
517 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity", 517 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity",
518 TRACE_EVENT_SCOPE_THREAD); 518 TRACE_EVENT_SCOPE_THREAD);
519 DCHECK(!is_root); 519 DCHECK(!is_root);
520 return true; 520 return true;
521 } 521 }
522 // If the layer has isolation. 522 // If the layer has isolation.
523 // TODO(rosca): to be optimized - create separate rendering surface only when 523 // TODO(rosca): to be optimized - create separate rendering surface only when
524 // the blending descendants might have access to the content behind this layer 524 // the blending descendants might have access to the content behind this layer
(...skipping 16 matching lines...) Expand all
541 541
542 return false; 542 return false;
543 } 543 }
544 544
545 template <typename LayerType> 545 template <typename LayerType>
546 bool AddEffectNodeIfNeeded( 546 bool AddEffectNodeIfNeeded(
547 const DataForRecursion<LayerType>& data_from_ancestor, 547 const DataForRecursion<LayerType>& data_from_ancestor,
548 LayerType* layer, 548 LayerType* layer,
549 DataForRecursion<LayerType>* data_for_children) { 549 DataForRecursion<LayerType>* data_for_children) {
550 const bool is_root = !layer->parent(); 550 const bool is_root = !layer->parent();
551 const bool has_transparency = layer->opacity() != 1.f; 551 const bool has_transparency = layer->EffectiveOpacity() != 1.f;
552 const bool has_animated_opacity = IsAnimatingOpacity(layer); 552 const bool has_animated_opacity = IsAnimatingOpacity(layer);
553 const bool should_create_render_surface = ShouldCreateRenderSurface( 553 const bool should_create_render_surface = ShouldCreateRenderSurface(
554 layer, data_from_ancestor.compound_transform_since_render_target, 554 layer, data_from_ancestor.compound_transform_since_render_target,
555 data_from_ancestor.axis_align_since_render_target); 555 data_from_ancestor.axis_align_since_render_target);
556 data_for_children->axis_align_since_render_target &= 556 data_for_children->axis_align_since_render_target &=
557 layer->AnimationsPreserveAxisAlignment(); 557 layer->AnimationsPreserveAxisAlignment();
558 558
559 bool requires_node = is_root || has_transparency || has_animated_opacity || 559 bool requires_node = is_root || has_transparency || has_animated_opacity ||
560 should_create_render_surface; 560 should_create_render_surface;
561 561
562 int parent_id = data_from_ancestor.effect_tree_parent; 562 int parent_id = data_from_ancestor.effect_tree_parent;
563 563
564 if (!requires_node) { 564 if (!requires_node) {
565 layer->SetEffectTreeIndex(parent_id); 565 layer->SetEffectTreeIndex(parent_id);
566 data_for_children->effect_tree_parent = parent_id; 566 data_for_children->effect_tree_parent = parent_id;
567 data_for_children->compound_transform_since_render_target *= 567 data_for_children->compound_transform_since_render_target *=
568 layer->transform(); 568 layer->transform();
569 return false; 569 return false;
570 } 570 }
571 571
572 EffectNode node; 572 EffectNode node;
573 node.owner_id = layer->id(); 573 node.owner_id = layer->id();
574 node.data.opacity = layer->opacity(); 574 node.data.opacity = layer->EffectiveOpacity();
575 node.data.screen_space_opacity = layer->opacity();
576 node.data.has_render_surface = should_create_render_surface; 575 node.data.has_render_surface = should_create_render_surface;
576 node.data.has_copy_request = layer->HasCopyRequest();
577 node.data.has_background_filters = !layer->background_filters().IsEmpty();
577 578
578 if (!is_root) { 579 if (!is_root) {
579 // The effect node's transform id is used only when we create a render 580 // The effect node's transform id is used only when we create a render
580 // surface. So, we can leave the default value when we don't create a render 581 // surface. So, we can leave the default value when we don't create a render
581 // surface. 582 // surface.
582 if (should_create_render_surface) { 583 if (should_create_render_surface) {
583 // In this case, we will create a transform node, so it's safe to use the 584 // In this case, we will create a transform node, so it's safe to use the
584 // next available id from the transform tree as this effect node's 585 // next available id from the transform tree as this effect node's
585 // transform id. 586 // transform id.
586 node.data.transform_id = 587 node.data.transform_id =
587 data_from_ancestor.transform_tree->next_available_id(); 588 data_from_ancestor.transform_tree->next_available_id();
588 } 589 }
589 node.data.clip_id = data_from_ancestor.clip_tree_parent; 590 node.data.clip_id = data_from_ancestor.clip_tree_parent;
590 591
591 node.data.screen_space_opacity *= 592 EffectNode* parent = data_from_ancestor.effect_tree->Node(parent_id);
592 data_from_ancestor.effect_tree->Node(parent_id) 593 node.data.screen_space_opacity_is_animating =
593 ->data.screen_space_opacity; 594 parent->data.screen_space_opacity_is_animating || has_animated_opacity;
594 } else { 595 } else {
595 // Root render surface acts the unbounded and untransformed to draw content 596 // Root render surface acts the unbounded and untransformed to draw content
596 // into. Transform node created from root layer (includes device scale 597 // into. Transform node created from root layer (includes device scale
597 // factor) and clip node created from root layer (include viewports) applies 598 // factor) and clip node created from root layer (include viewports) applies
598 // to root render surface's content, but not root render surface itself. 599 // to root render surface's content, but not root render surface itself.
599 node.data.transform_id = kRootPropertyTreeNodeId; 600 node.data.transform_id = kRootPropertyTreeNodeId;
600 node.data.clip_id = kRootPropertyTreeNodeId; 601 node.data.clip_id = kRootPropertyTreeNodeId;
602 node.data.screen_space_opacity_is_animating = has_animated_opacity;
601 } 603 }
602 data_for_children->effect_tree_parent = 604 data_for_children->effect_tree_parent =
603 data_for_children->effect_tree->Insert(node, parent_id); 605 data_for_children->effect_tree->Insert(node, parent_id);
604 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); 606 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent);
605 if (should_create_render_surface) { 607 if (should_create_render_surface) {
606 data_for_children->compound_transform_since_render_target = 608 data_for_children->compound_transform_since_render_target =
607 gfx::Transform(); 609 gfx::Transform();
608 data_for_children->axis_align_since_render_target = true; 610 data_for_children->axis_align_since_render_target = true;
609 } 611 }
610 return should_create_render_surface; 612 return should_create_render_surface;
(...skipping 19 matching lines...) Expand all
630 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); 632 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode);
631 } else { 633 } else {
632 layer->set_draw_blend_mode(layer->blend_mode()); 634 layer->set_draw_blend_mode(layer->blend_mode());
633 } 635 }
634 636
635 bool created_transform_node = AddTransformNodeIfNeeded( 637 bool created_transform_node = AddTransformNodeIfNeeded(
636 data_from_parent, layer, created_render_surface, &data_for_children); 638 data_from_parent, layer, created_render_surface, &data_for_children);
637 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, 639 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface,
638 created_transform_node, &data_for_children); 640 created_transform_node, &data_for_children);
639 641
640 data_for_children.is_hidden =
641 layer->hide_layer_and_subtree() || data_from_parent.is_hidden;
642 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden);
643
644 for (size_t i = 0; i < layer->children().size(); ++i) { 642 for (size_t i = 0; i < layer->children().size(); ++i) {
645 if (!layer->child_at(i)->scroll_parent()) { 643 if (!layer->child_at(i)->scroll_parent()) {
646 DataForRecursionFromChild<LayerType> data_from_child; 644 DataForRecursionFromChild<LayerType> data_from_child;
647 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, 645 BuildPropertyTreesInternal(layer->child_at(i), data_for_children,
648 &data_from_child); 646 &data_from_child);
649 data_to_parent->Merge(data_from_child); 647 data_to_parent->Merge(data_from_child);
650 } else { 648 } else {
651 // The child should be included in its scroll parent's list of scroll 649 // The child should be included in its scroll parent's list of scroll
652 // children. 650 // children.
653 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( 651 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count(
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 root_clip.data.clip = gfx::RectF(viewport); 747 root_clip.data.clip = gfx::RectF(viewport);
750 root_clip.data.transform_id = kRootPropertyTreeNodeId; 748 root_clip.data.transform_id = kRootPropertyTreeNodeId;
751 data_for_recursion.clip_tree_parent = 749 data_for_recursion.clip_tree_parent =
752 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); 750 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId);
753 751
754 DataForRecursionFromChild<LayerType> data_from_child; 752 DataForRecursionFromChild<LayerType> data_from_child;
755 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); 753 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child);
756 property_trees->needs_rebuild = false; 754 property_trees->needs_rebuild = false;
757 755
758 // The transform tree is kept up-to-date as it is built, but the 756 // The transform tree is kept up-to-date as it is built, but the
759 // combined_clips stored in the clip tree aren't computed during tree 757 // combined_clips stored in the clip tree and the screen_space_opacity and
760 // building. 758 // is_drawn in the effect tree aren't computed during tree building.
761 property_trees->transform_tree.set_needs_update(false); 759 property_trees->transform_tree.set_needs_update(false);
762 property_trees->clip_tree.set_needs_update(true); 760 property_trees->clip_tree.set_needs_update(true);
763 property_trees->effect_tree.set_needs_update(false); 761 property_trees->effect_tree.set_needs_update(true);
764 } 762 }
765 763
766 void PropertyTreeBuilder::BuildPropertyTrees( 764 void PropertyTreeBuilder::BuildPropertyTrees(
767 Layer* root_layer, 765 Layer* root_layer,
768 const Layer* page_scale_layer, 766 const Layer* page_scale_layer,
769 const Layer* inner_viewport_scroll_layer, 767 const Layer* inner_viewport_scroll_layer,
770 const Layer* outer_viewport_scroll_layer, 768 const Layer* outer_viewport_scroll_layer,
771 const Layer* overscroll_elasticity_layer, 769 const Layer* overscroll_elasticity_layer,
772 const gfx::Vector2dF& elastic_overscroll, 770 const gfx::Vector2dF& elastic_overscroll,
773 float page_scale_factor, 771 float page_scale_factor,
(...skipping 21 matching lines...) Expand all
795 const gfx::Transform& device_transform, 793 const gfx::Transform& device_transform,
796 PropertyTrees* property_trees) { 794 PropertyTrees* property_trees) {
797 BuildPropertyTreesTopLevelInternal( 795 BuildPropertyTreesTopLevelInternal(
798 root_layer, page_scale_layer, inner_viewport_scroll_layer, 796 root_layer, page_scale_layer, inner_viewport_scroll_layer,
799 outer_viewport_scroll_layer, overscroll_elasticity_layer, 797 outer_viewport_scroll_layer, overscroll_elasticity_layer,
800 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 798 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
801 device_transform, property_trees); 799 device_transform, property_trees);
802 } 800 }
803 801
804 } // namespace cc 802 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698