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

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

Issue 1633203002: cc :: Reland compute if layer is drawn from property trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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.cc ('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 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 513
514 // If the layer has some translucency and does not have a preserves-3d 514 // If the layer has some translucency and does not have a preserves-3d
515 // transform style. This condition only needs a render surface if two or more 515 // transform style. This condition only needs a render surface if two or more
516 // layers in the subtree overlap. But checking layer overlaps is unnecessarily 516 // layers in the subtree overlap. But checking layer overlaps is unnecessarily
517 // costly so instead we conservatively create a surface whenever at least two 517 // costly so instead we conservatively create a surface whenever at least two
518 // layers draw content for this subtree. 518 // layers draw content for this subtree.
519 bool at_least_two_layers_in_subtree_draw_content = 519 bool at_least_two_layers_in_subtree_draw_content =
520 num_descendants_that_draw_content > 0 && 520 num_descendants_that_draw_content > 0 &&
521 (layer->DrawsContent() || num_descendants_that_draw_content > 1); 521 (layer->DrawsContent() || num_descendants_that_draw_content > 1);
522 522
523 if (layer->opacity() != 1.f && layer->should_flatten_transform() && 523 if (layer->EffectiveOpacity() != 1.f && layer->should_flatten_transform() &&
524 at_least_two_layers_in_subtree_draw_content) { 524 at_least_two_layers_in_subtree_draw_content) {
525 TRACE_EVENT_INSTANT0( 525 TRACE_EVENT_INSTANT0(
526 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity", 526 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity",
527 TRACE_EVENT_SCOPE_THREAD); 527 TRACE_EVENT_SCOPE_THREAD);
528 DCHECK(!is_root); 528 DCHECK(!is_root);
529 return true; 529 return true;
530 } 530 }
531 // If the layer has isolation. 531 // If the layer has isolation.
532 // TODO(rosca): to be optimized - create separate rendering surface only when 532 // TODO(rosca): to be optimized - create separate rendering surface only when
533 // the blending descendants might have access to the content behind this layer 533 // the blending descendants might have access to the content behind this layer
(...skipping 16 matching lines...) Expand all
550 550
551 return false; 551 return false;
552 } 552 }
553 553
554 template <typename LayerType> 554 template <typename LayerType>
555 bool AddEffectNodeIfNeeded( 555 bool AddEffectNodeIfNeeded(
556 const DataForRecursion<LayerType>& data_from_ancestor, 556 const DataForRecursion<LayerType>& data_from_ancestor,
557 LayerType* layer, 557 LayerType* layer,
558 DataForRecursion<LayerType>* data_for_children) { 558 DataForRecursion<LayerType>* data_for_children) {
559 const bool is_root = !layer->parent(); 559 const bool is_root = !layer->parent();
560 const bool has_transparency = layer->opacity() != 1.f; 560 const bool has_transparency = layer->EffectiveOpacity() != 1.f;
561 const bool has_animated_opacity = IsAnimatingOpacity(layer); 561 const bool has_animated_opacity = IsAnimatingOpacity(layer);
562 const bool should_create_render_surface = ShouldCreateRenderSurface( 562 const bool should_create_render_surface = ShouldCreateRenderSurface(
563 layer, data_from_ancestor.compound_transform_since_render_target, 563 layer, data_from_ancestor.compound_transform_since_render_target,
564 data_from_ancestor.axis_align_since_render_target); 564 data_from_ancestor.axis_align_since_render_target);
565 data_for_children->axis_align_since_render_target &= 565 data_for_children->axis_align_since_render_target &=
566 layer->AnimationsPreserveAxisAlignment(); 566 layer->AnimationsPreserveAxisAlignment();
567 567
568 bool requires_node = is_root || has_transparency || has_animated_opacity || 568 bool requires_node = is_root || has_transparency || has_animated_opacity ||
569 should_create_render_surface; 569 should_create_render_surface;
570 570
571 int parent_id = data_from_ancestor.effect_tree_parent; 571 int parent_id = data_from_ancestor.effect_tree_parent;
572 572
573 if (!requires_node) { 573 if (!requires_node) {
574 layer->SetEffectTreeIndex(parent_id); 574 layer->SetEffectTreeIndex(parent_id);
575 data_for_children->effect_tree_parent = parent_id; 575 data_for_children->effect_tree_parent = parent_id;
576 data_for_children->compound_transform_since_render_target *= 576 data_for_children->compound_transform_since_render_target *=
577 layer->transform(); 577 layer->transform();
578 return false; 578 return false;
579 } 579 }
580 580
581 EffectNode node; 581 EffectNode node;
582 node.owner_id = layer->id(); 582 node.owner_id = layer->id();
583 node.data.opacity = layer->opacity(); 583 node.data.opacity = layer->EffectiveOpacity();
584 node.data.screen_space_opacity = layer->opacity();
585 node.data.has_render_surface = should_create_render_surface; 584 node.data.has_render_surface = should_create_render_surface;
585 node.data.has_copy_request = layer->HasCopyRequest();
586 node.data.has_background_filters = !layer->background_filters().IsEmpty();
586 587
587 if (!is_root) { 588 if (!is_root) {
588 // The effect node's transform id is used only when we create a render 589 // The effect node's transform id is used only when we create a render
589 // surface. So, we can leave the default value when we don't create a render 590 // surface. So, we can leave the default value when we don't create a render
590 // surface. 591 // surface.
591 if (should_create_render_surface) { 592 if (should_create_render_surface) {
592 // In this case, we will create a transform node, so it's safe to use the 593 // In this case, we will create a transform node, so it's safe to use the
593 // next available id from the transform tree as this effect node's 594 // next available id from the transform tree as this effect node's
594 // transform id. 595 // transform id.
595 node.data.transform_id = 596 node.data.transform_id =
596 data_from_ancestor.transform_tree->next_available_id(); 597 data_from_ancestor.transform_tree->next_available_id();
597 } 598 }
598 node.data.clip_id = data_from_ancestor.clip_tree_parent; 599 node.data.clip_id = data_from_ancestor.clip_tree_parent;
599 600
600 node.data.screen_space_opacity *= 601 EffectNode* parent = data_from_ancestor.effect_tree->Node(parent_id);
601 data_from_ancestor.effect_tree->Node(parent_id) 602 node.data.screen_space_opacity_is_animating =
602 ->data.screen_space_opacity; 603 parent->data.screen_space_opacity_is_animating || has_animated_opacity;
603 } else { 604 } else {
604 // Root render surface acts the unbounded and untransformed to draw content 605 // Root render surface acts the unbounded and untransformed to draw content
605 // into. Transform node created from root layer (includes device scale 606 // into. Transform node created from root layer (includes device scale
606 // factor) and clip node created from root layer (include viewports) applies 607 // factor) and clip node created from root layer (include viewports) applies
607 // to root render surface's content, but not root render surface itself. 608 // to root render surface's content, but not root render surface itself.
608 node.data.transform_id = kRootPropertyTreeNodeId; 609 node.data.transform_id = kRootPropertyTreeNodeId;
609 node.data.clip_id = kRootPropertyTreeNodeId; 610 node.data.clip_id = kRootPropertyTreeNodeId;
611 node.data.screen_space_opacity_is_animating = has_animated_opacity;
610 } 612 }
611 data_for_children->effect_tree_parent = 613 data_for_children->effect_tree_parent =
612 data_for_children->effect_tree->Insert(node, parent_id); 614 data_for_children->effect_tree->Insert(node, parent_id);
613 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); 615 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent);
614 if (should_create_render_surface) { 616 if (should_create_render_surface) {
615 data_for_children->compound_transform_since_render_target = 617 data_for_children->compound_transform_since_render_target =
616 gfx::Transform(); 618 gfx::Transform();
617 data_for_children->axis_align_since_render_target = true; 619 data_for_children->axis_align_since_render_target = true;
618 } 620 }
619 return should_create_render_surface; 621 return should_create_render_surface;
(...skipping 19 matching lines...) Expand all
639 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); 641 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode);
640 } else { 642 } else {
641 layer->set_draw_blend_mode(layer->blend_mode()); 643 layer->set_draw_blend_mode(layer->blend_mode());
642 } 644 }
643 645
644 bool created_transform_node = AddTransformNodeIfNeeded( 646 bool created_transform_node = AddTransformNodeIfNeeded(
645 data_from_parent, layer, created_render_surface, &data_for_children); 647 data_from_parent, layer, created_render_surface, &data_for_children);
646 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, 648 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface,
647 created_transform_node, &data_for_children); 649 created_transform_node, &data_for_children);
648 650
649 data_for_children.is_hidden =
650 layer->hide_layer_and_subtree() || data_from_parent.is_hidden;
651 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden);
652
653 for (size_t i = 0; i < layer->children().size(); ++i) { 651 for (size_t i = 0; i < layer->children().size(); ++i) {
654 if (!layer->child_at(i)->scroll_parent()) { 652 if (!layer->child_at(i)->scroll_parent()) {
655 DataForRecursionFromChild<LayerType> data_from_child; 653 DataForRecursionFromChild<LayerType> data_from_child;
656 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, 654 BuildPropertyTreesInternal(layer->child_at(i), data_for_children,
657 &data_from_child); 655 &data_from_child);
658 data_to_parent->Merge(data_from_child); 656 data_to_parent->Merge(data_from_child);
659 } else { 657 } else {
660 // The child should be included in its scroll parent's list of scroll 658 // The child should be included in its scroll parent's list of scroll
661 // children. 659 // children.
662 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( 660 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count(
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 root_clip.data.clip = gfx::RectF(viewport); 759 root_clip.data.clip = gfx::RectF(viewport);
762 root_clip.data.transform_id = kRootPropertyTreeNodeId; 760 root_clip.data.transform_id = kRootPropertyTreeNodeId;
763 data_for_recursion.clip_tree_parent = 761 data_for_recursion.clip_tree_parent =
764 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); 762 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId);
765 763
766 DataForRecursionFromChild<LayerType> data_from_child; 764 DataForRecursionFromChild<LayerType> data_from_child;
767 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); 765 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child);
768 property_trees->needs_rebuild = false; 766 property_trees->needs_rebuild = false;
769 767
770 // The transform tree is kept up-to-date as it is built, but the 768 // The transform tree is kept up-to-date as it is built, but the
771 // combined_clips stored in the clip tree aren't computed during tree 769 // combined_clips stored in the clip tree and the screen_space_opacity and
772 // building. 770 // is_drawn in the effect tree aren't computed during tree building.
773 property_trees->transform_tree.set_needs_update(false); 771 property_trees->transform_tree.set_needs_update(false);
774 property_trees->clip_tree.set_needs_update(true); 772 property_trees->clip_tree.set_needs_update(true);
775 property_trees->effect_tree.set_needs_update(false); 773 property_trees->effect_tree.set_needs_update(true);
776 } 774 }
777 775
778 void PropertyTreeBuilder::BuildPropertyTrees( 776 void PropertyTreeBuilder::BuildPropertyTrees(
779 Layer* root_layer, 777 Layer* root_layer,
780 const Layer* page_scale_layer, 778 const Layer* page_scale_layer,
781 const Layer* inner_viewport_scroll_layer, 779 const Layer* inner_viewport_scroll_layer,
782 const Layer* outer_viewport_scroll_layer, 780 const Layer* outer_viewport_scroll_layer,
783 const Layer* overscroll_elasticity_layer, 781 const Layer* overscroll_elasticity_layer,
784 const gfx::Vector2dF& elastic_overscroll, 782 const gfx::Vector2dF& elastic_overscroll,
785 float page_scale_factor, 783 float page_scale_factor,
(...skipping 21 matching lines...) Expand all
807 const gfx::Transform& device_transform, 805 const gfx::Transform& device_transform,
808 PropertyTrees* property_trees) { 806 PropertyTrees* property_trees) {
809 BuildPropertyTreesTopLevelInternal( 807 BuildPropertyTreesTopLevelInternal(
810 root_layer, page_scale_layer, inner_viewport_scroll_layer, 808 root_layer, page_scale_layer, inner_viewport_scroll_layer,
811 outer_viewport_scroll_layer, overscroll_elasticity_layer, 809 outer_viewport_scroll_layer, overscroll_elasticity_layer,
812 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 810 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
813 device_transform, property_trees); 811 device_transform, property_trees);
814 } 812 }
815 813
816 } // namespace cc 814 } // namespace cc
OLDNEW
« cc/trees/property_tree.cc ('K') | « cc/trees/property_tree.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698