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

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

Issue 2693703010: cc: Remove support for disabling non-root render surfaces. (Closed)
Patch Set: softwaredraw-remove-no-surfaces: rebase Created 3 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
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/layer_tree_host.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 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/draw_property_utils.h" 5 #include "cc/trees/draw_property_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 bool include_viewport_clip = true; 348 bool include_viewport_clip = true;
349 bool include_expanding_clips = true; 349 bool include_expanding_clips = true;
350 ConditionalClip accumulated_clip = ComputeAccumulatedClip( 350 ConditionalClip accumulated_clip = ComputeAccumulatedClip(
351 property_trees, include_viewport_clip, include_expanding_clips, 351 property_trees, include_viewport_clip, include_expanding_clips,
352 local_clip_id, root_effect_id); 352 local_clip_id, root_effect_id);
353 DCHECK(accumulated_clip.is_clipped); 353 DCHECK(accumulated_clip.is_clipped);
354 return accumulated_clip.clip_rect; 354 return accumulated_clip.clip_rect;
355 } 355 }
356 356
357 void CalculateClipRects(const std::vector<LayerImpl*>& visible_layer_list, 357 void CalculateClipRects(const std::vector<LayerImpl*>& visible_layer_list,
358 const PropertyTrees* property_trees, 358 const PropertyTrees* property_trees) {
359 bool non_root_surfaces_enabled) {
360 const ClipTree& clip_tree = property_trees->clip_tree; 359 const ClipTree& clip_tree = property_trees->clip_tree;
361 for (auto* layer : visible_layer_list) { 360 for (auto* layer : visible_layer_list) {
362 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 361 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
363 bool layer_needs_clip_rect = 362 if (!clip_node->layers_are_clipped) {
364 non_root_surfaces_enabled
365 ? clip_node->layers_are_clipped
366 : clip_node->layers_are_clipped_when_surfaces_disabled;
367 if (!layer_needs_clip_rect) {
368 layer->set_clip_rect(gfx::Rect()); 363 layer->set_clip_rect(gfx::Rect());
369 continue; 364 continue;
370 } 365 }
371 if (!non_root_surfaces_enabled) {
372 layer->set_clip_rect(
373 gfx::ToEnclosingRect(clip_node->clip_in_target_space));
374 continue;
375 }
376 366
377 const TransformTree& transform_tree = property_trees->transform_tree; 367 const TransformTree& transform_tree = property_trees->transform_tree;
378 const TransformNode* transform_node = 368 const TransformNode* transform_node =
379 transform_tree.Node(layer->transform_tree_index()); 369 transform_tree.Node(layer->transform_tree_index());
380 int target_node_id = transform_tree.ContentTargetId(transform_node->id); 370 int target_node_id = transform_tree.ContentTargetId(transform_node->id);
381 371
382 // The clip node stores clip rect in its target space. 372 // The clip node stores clip rect in its target space.
383 gfx::RectF clip_rect_in_target_space = clip_node->clip_in_target_space; 373 gfx::RectF clip_rect_in_target_space = clip_node->clip_in_target_space;
384 374
385 // If required, this clip rect should be mapped to the current layer's 375 // If required, this clip rect should be mapped to the current layer's
(...skipping 16 matching lines...) Expand all
402 392
403 if (!clip_rect_in_target_space.IsEmpty()) { 393 if (!clip_rect_in_target_space.IsEmpty()) {
404 layer->set_clip_rect(gfx::ToEnclosingRect(clip_rect_in_target_space)); 394 layer->set_clip_rect(gfx::ToEnclosingRect(clip_rect_in_target_space));
405 } else { 395 } else {
406 layer->set_clip_rect(gfx::Rect()); 396 layer->set_clip_rect(gfx::Rect());
407 } 397 }
408 } 398 }
409 } 399 }
410 400
411 void CalculateVisibleRects(const LayerImplList& visible_layer_list, 401 void CalculateVisibleRects(const LayerImplList& visible_layer_list,
412 const PropertyTrees* property_trees, 402 const PropertyTrees* property_trees) {
413 bool non_root_surfaces_enabled) {
414 const EffectTree& effect_tree = property_trees->effect_tree; 403 const EffectTree& effect_tree = property_trees->effect_tree;
415 const TransformTree& transform_tree = property_trees->transform_tree; 404 const TransformTree& transform_tree = property_trees->transform_tree;
416 const ClipTree& clip_tree = property_trees->clip_tree; 405 const ClipTree& clip_tree = property_trees->clip_tree;
417 for (auto* layer : visible_layer_list) { 406 for (auto* layer : visible_layer_list) {
418 gfx::Size layer_bounds = layer->bounds(); 407 gfx::Size layer_bounds = layer->bounds();
419 408
420 int effect_ancestor_with_copy_request = 409 int effect_ancestor_with_copy_request =
421 effect_tree.ClosestAncestorWithCopyRequest(layer->effect_tree_index()); 410 effect_tree.ClosestAncestorWithCopyRequest(layer->effect_tree_index());
422 if (effect_ancestor_with_copy_request > EffectTree::kContentsRootNodeId) { 411 if (effect_ancestor_with_copy_request > EffectTree::kContentsRootNodeId) {
423 // Non root copy request. 412 // Non root copy request.
(...skipping 25 matching lines...) Expand all
449 layer->set_visible_layer_rect(visible_rect); 438 layer->set_visible_layer_rect(visible_rect);
450 } else { 439 } else {
451 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 440 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
452 } 441 }
453 continue; 442 continue;
454 } 443 }
455 444
456 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 445 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
457 const TransformNode* transform_node = 446 const TransformNode* transform_node =
458 transform_tree.Node(layer->transform_tree_index()); 447 transform_tree.Node(layer->transform_tree_index());
459 if (!non_root_surfaces_enabled) {
460 // When we only have a root surface, the clip node and the layer must
461 // necessarily have the same target (the root).
462 if (transform_node->ancestors_are_invertible) {
463 gfx::RectF combined_clip_rect_in_target_space =
464 clip_node->combined_clip_in_target_space;
465 gfx::Transform target_to_content;
466 target_to_content.Translate(-layer->offset_to_transform_parent().x(),
467 -layer->offset_to_transform_parent().y());
468 target_to_content.PreconcatTransform(
469 transform_tree.FromScreen(transform_node->id));
470
471 gfx::Rect visible_rect =
472 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
473 target_to_content, combined_clip_rect_in_target_space));
474 visible_rect.Intersect(gfx::Rect(layer_bounds));
475 layer->set_visible_layer_rect(visible_rect);
476 } else {
477 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
478 }
479 continue;
480 }
481 448
482 // When both the layer and the target are unclipped, we only have to apply 449 // When both the layer and the target are unclipped, we only have to apply
483 // the viewport clip. 450 // the viewport clip.
484 const bool fully_visible = 451 const bool fully_visible =
485 !clip_node->layers_are_clipped && 452 !clip_node->layers_are_clipped &&
486 !effect_tree.Node(clip_node->target_effect_id)->surface_is_clipped; 453 !effect_tree.Node(clip_node->target_effect_id)->surface_is_clipped;
487 454
488 if (fully_visible) { 455 if (fully_visible) {
489 if (!transform_node->ancestors_are_invertible) { 456 if (!transform_node->ancestors_are_invertible) {
490 // An animated singular transform may become non-singular during the 457 // An animated singular transform may become non-singular during the
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 676
710 bool layer_is_drawn = 677 bool layer_is_drawn =
711 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn; 678 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
712 679
713 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees)) 680 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees))
714 visible_layer_list->push_back(layer_impl); 681 visible_layer_list->push_back(layer_impl);
715 } 682 }
716 } 683 }
717 684
718 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, 685 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree,
719 bool non_root_surfaces_enabled,
720 LayerImpl* layer) { 686 LayerImpl* layer) {
721 if (!non_root_surfaces_enabled) {
722 layer->SetHasRenderSurface(IsRootLayer(layer));
723 return;
724 }
725
726 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); 687 EffectNode* node = effect_tree->Node(layer->effect_tree_index());
727 688
728 if (node->owning_layer_id == layer->id() && node->has_render_surface) 689 if (node->owning_layer_id == layer->id() && node->has_render_surface)
729 layer->SetHasRenderSurface(true); 690 layer->SetHasRenderSurface(true);
730 else 691 else
731 layer->SetHasRenderSurface(false); 692 layer->SetHasRenderSurface(false);
732 } 693 }
733 } // namespace 694 } // namespace
734 695
735 template <typename LayerType> 696 template <typename LayerType>
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 769
809 void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node, 770 void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
810 gfx::Transform* transform) { 771 gfx::Transform* transform) {
811 DCHECK(effect_node->has_render_surface); 772 DCHECK(effect_node->has_render_surface);
812 if (effect_node->surface_contents_scale.x() != 0.0 && 773 if (effect_node->surface_contents_scale.x() != 0.0 &&
813 effect_node->surface_contents_scale.y() != 0.0) 774 effect_node->surface_contents_scale.y() != 0.0)
814 transform->Scale(1.0 / effect_node->surface_contents_scale.x(), 775 transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
815 1.0 / effect_node->surface_contents_scale.y()); 776 1.0 / effect_node->surface_contents_scale.y());
816 } 777 }
817 778
818 void ComputeClips(PropertyTrees* property_trees, 779 void ComputeClips(PropertyTrees* property_trees) {
819 bool non_root_surfaces_enabled) {
820 ClipTree* clip_tree = &property_trees->clip_tree; 780 ClipTree* clip_tree = &property_trees->clip_tree;
821 if (!clip_tree->needs_update()) 781 if (!clip_tree->needs_update())
822 return; 782 return;
823 for (int i = ClipTree::kViewportNodeId; 783 for (int i = ClipTree::kViewportNodeId;
824 i < static_cast<int>(clip_tree->size()); ++i) { 784 i < static_cast<int>(clip_tree->size()); ++i) {
825 ClipNode* clip_node = clip_tree->Node(i); 785 ClipNode* clip_node = clip_tree->Node(i);
826 786
827 if (clip_node->id == ClipTree::kViewportNodeId) { 787 if (clip_node->id == ClipTree::kViewportNodeId) {
828 ResetIfHasNanCoordinate(&clip_node->clip); 788 ResetIfHasNanCoordinate(&clip_node->clip);
829 clip_node->clip_in_target_space = clip_node->clip; 789 clip_node->clip_in_target_space = clip_node->clip;
(...skipping 22 matching lines...) Expand all
852 // target space, the relative sizes and positions of B and C can shift. 812 // target space, the relative sizes and positions of B and C can shift.
853 // Since it's the relationship in target space that matters, that's where we 813 // Since it's the relationship in target space that matters, that's where we
854 // must combine clips. For each clip node, we save the clip rects in its 814 // must combine clips. For each clip node, we save the clip rects in its
855 // target space. So, we need to get the ancestor clip rect in the current 815 // target space. So, we need to get the ancestor clip rect in the current
856 // clip node's target space. 816 // clip node's target space.
857 gfx::RectF parent_combined_clip_in_target_space = 817 gfx::RectF parent_combined_clip_in_target_space =
858 parent_clip_node->combined_clip_in_target_space; 818 parent_clip_node->combined_clip_in_target_space;
859 gfx::RectF parent_clip_in_target_space = 819 gfx::RectF parent_clip_in_target_space =
860 parent_clip_node->clip_in_target_space; 820 parent_clip_node->clip_in_target_space;
861 if (parent_target_transform_node && 821 if (parent_target_transform_node &&
862 parent_target_transform_node->id != clip_node->target_transform_id && 822 parent_target_transform_node->id != clip_node->target_transform_id) {
863 non_root_surfaces_enabled) {
864 success &= property_trees->ComputeTransformFromTarget( 823 success &= property_trees->ComputeTransformFromTarget(
865 clip_node->target_transform_id, parent_clip_node->target_effect_id, 824 clip_node->target_transform_id, parent_clip_node->target_effect_id,
866 &parent_to_current); 825 &parent_to_current);
867 const EffectNode* target_effect_node = 826 const EffectNode* target_effect_node =
868 effect_tree.Node(clip_node->target_effect_id); 827 effect_tree.Node(clip_node->target_effect_id);
869 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current); 828 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current);
870 const EffectNode* parent_target_effect_node = 829 const EffectNode* parent_target_effect_node =
871 effect_tree.Node(parent_clip_node->target_effect_id); 830 effect_tree.Node(parent_clip_node->target_effect_id);
872 ConcatInverseSurfaceContentsScale(parent_target_effect_node, 831 ConcatInverseSurfaceContentsScale(parent_target_effect_node,
873 &parent_to_current); 832 &parent_to_current);
(...skipping 11 matching lines...) Expand all
885 property_trees)); 844 property_trees));
886 } 845 }
887 parent_clip_in_target_space = MathUtil::ProjectClippedRect( 846 parent_clip_in_target_space = MathUtil::ProjectClippedRect(
888 parent_to_current, parent_clip_node->clip_in_target_space); 847 parent_to_current, parent_clip_node->clip_in_target_space);
889 } 848 }
890 // Only nodes affected by ancestor clips will have their clip adjusted due 849 // Only nodes affected by ancestor clips will have their clip adjusted due
891 // to intersecting with an ancestor clip. But, we still need to propagate 850 // to intersecting with an ancestor clip. But, we still need to propagate
892 // the combined clip to our children because if they are clipped, they may 851 // the combined clip to our children because if they are clipped, they may
893 // need to clip using our parent clip and if we don't propagate it here, 852 // need to clip using our parent clip and if we don't propagate it here,
894 // it will be lost. 853 // it will be lost.
895 if (clip_node->resets_clip && non_root_surfaces_enabled) { 854 if (clip_node->resets_clip) {
896 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { 855 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) {
897 gfx::Transform to_target; 856 gfx::Transform to_target;
898 property_trees->GetToTarget(clip_node->transform_id, 857 property_trees->GetToTarget(clip_node->transform_id,
899 clip_node->target_effect_id, &to_target); 858 clip_node->target_effect_id, &to_target);
900 clip_node->clip_in_target_space = 859 clip_node->clip_in_target_space =
901 MathUtil::MapClippedRect(to_target, clip_node->clip); 860 MathUtil::MapClippedRect(to_target, clip_node->clip);
902 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); 861 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space);
903 clip_node->combined_clip_in_target_space = 862 clip_node->combined_clip_in_target_space =
904 gfx::IntersectRects(clip_node->clip_in_target_space, 863 gfx::IntersectRects(clip_node->clip_in_target_space,
905 parent_combined_clip_in_target_space); 864 parent_combined_clip_in_target_space);
906 } else { 865 } else {
907 DCHECK(!target_is_clipped); 866 DCHECK(!target_is_clipped);
908 DCHECK(!clip_node->layers_are_clipped); 867 DCHECK(!clip_node->layers_are_clipped);
909 clip_node->combined_clip_in_target_space = 868 clip_node->combined_clip_in_target_space =
910 parent_combined_clip_in_target_space; 869 parent_combined_clip_in_target_space;
911 } 870 }
912 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space); 871 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space);
913 continue; 872 continue;
914 } 873 }
915 bool use_only_parent_clip = 874 bool use_only_parent_clip =
916 clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP; 875 clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP;
917 if (use_only_parent_clip) { 876 if (use_only_parent_clip) {
918 clip_node->combined_clip_in_target_space = 877 clip_node->combined_clip_in_target_space =
919 parent_combined_clip_in_target_space; 878 parent_combined_clip_in_target_space;
920 if (!non_root_surfaces_enabled) { 879 if (!target_is_clipped) {
921 clip_node->clip_in_target_space =
922 parent_clip_node->clip_in_target_space;
923 } else if (!target_is_clipped) {
924 clip_node->clip_in_target_space = parent_clip_in_target_space; 880 clip_node->clip_in_target_space = parent_clip_in_target_space;
925 } else { 881 } else {
926 // Render Surface applies clip and the owning layer itself applies 882 // Render Surface applies clip and the owning layer itself applies
927 // no clip. So, clip_in_target_space is not used and hence we can set 883 // no clip. So, clip_in_target_space is not used and hence we can set
928 // it to an empty rect. 884 // it to an empty rect.
929 clip_node->clip_in_target_space = gfx::RectF(); 885 clip_node->clip_in_target_space = gfx::RectF();
930 } 886 }
931 } else { 887 } else {
932 gfx::Transform source_to_target; 888 gfx::Transform source_to_target;
933 889
934 if (!non_root_surfaces_enabled) { 890 if (transform_tree.ContentTargetId(transform_node->id) ==
935 source_to_target = transform_tree.ToScreen(clip_node->transform_id); 891 clip_node->target_transform_id) {
936 } else if (transform_tree.ContentTargetId(transform_node->id) ==
937 clip_node->target_transform_id) {
938 property_trees->GetToTarget(clip_node->transform_id, 892 property_trees->GetToTarget(clip_node->transform_id,
939 clip_node->target_effect_id, 893 clip_node->target_effect_id,
940 &source_to_target); 894 &source_to_target);
941 } else { 895 } else {
942 success = property_trees->GetToTarget( 896 success = property_trees->GetToTarget(
943 transform_node->id, clip_node->target_effect_id, &source_to_target); 897 transform_node->id, clip_node->target_effect_id, &source_to_target);
944 // source_to_target computation should be successful as target is an 898 // source_to_target computation should be successful as target is an
945 // ancestor of the transform node. 899 // ancestor of the transform node.
946 DCHECK(success); 900 DCHECK(success);
947 } 901 }
948 902
949 gfx::RectF source_clip_in_target_space = 903 gfx::RectF source_clip_in_target_space =
950 MathUtil::MapClippedRect(source_to_target, clip_node->clip); 904 MathUtil::MapClippedRect(source_to_target, clip_node->clip);
951 905
952 // With surfaces disabled, the only case where we use only the local clip 906 // With surfaces disabled, the only case where we use only the local clip
953 // for layer clipping is the case where no non-viewport ancestor node 907 // for layer clipping is the case where no non-viewport ancestor node
954 // applies a local clip. 908 // applies a local clip.
955 bool layer_clipping_uses_only_local_clip = 909 bool layer_clipping_uses_only_local_clip =
956 non_root_surfaces_enabled 910 clip_node->layer_clipping_uses_only_local_clip;
957 ? clip_node->layer_clipping_uses_only_local_clip
958 : !parent_clip_node->layers_are_clipped_when_surfaces_disabled;
959 if (!layer_clipping_uses_only_local_clip) { 911 if (!layer_clipping_uses_only_local_clip) {
960 clip_node->clip_in_target_space = gfx::IntersectRects( 912 clip_node->clip_in_target_space = gfx::IntersectRects(
961 parent_clip_in_target_space, source_clip_in_target_space); 913 parent_clip_in_target_space, source_clip_in_target_space);
962 } else { 914 } else {
963 clip_node->clip_in_target_space = source_clip_in_target_space; 915 clip_node->clip_in_target_space = source_clip_in_target_space;
964 } 916 }
965 917
966 clip_node->combined_clip_in_target_space = gfx::IntersectRects( 918 clip_node->combined_clip_in_target_space = gfx::IntersectRects(
967 parent_combined_clip_in_target_space, source_clip_in_target_space); 919 parent_combined_clip_in_target_space, source_clip_in_target_space);
968 } 920 }
969 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); 921 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space);
970 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space); 922 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space);
971 } 923 }
972 clip_tree->set_needs_update(false); 924 clip_tree->set_needs_update(false);
973 } 925 }
974 926
975 void ComputeTransforms(TransformTree* transform_tree) { 927 void ComputeTransforms(TransformTree* transform_tree) {
976 if (!transform_tree->needs_update()) 928 if (!transform_tree->needs_update())
977 return; 929 return;
978 for (int i = TransformTree::kContentsRootNodeId; 930 for (int i = TransformTree::kContentsRootNodeId;
979 i < static_cast<int>(transform_tree->size()); ++i) 931 i < static_cast<int>(transform_tree->size()); ++i)
980 transform_tree->UpdateTransforms(i); 932 transform_tree->UpdateTransforms(i);
981 transform_tree->set_needs_update(false); 933 transform_tree->set_needs_update(false);
982 } 934 }
983 935
984 void UpdateRenderTarget(EffectTree* effect_tree, 936 void UpdateRenderTarget(EffectTree* effect_tree) {
985 bool can_render_to_separate_surface) {
986 for (int i = EffectTree::kContentsRootNodeId; 937 for (int i = EffectTree::kContentsRootNodeId;
987 i < static_cast<int>(effect_tree->size()); ++i) { 938 i < static_cast<int>(effect_tree->size()); ++i) {
988 EffectNode* node = effect_tree->Node(i); 939 EffectNode* node = effect_tree->Node(i);
989 if (i == EffectTree::kContentsRootNodeId) { 940 if (i == EffectTree::kContentsRootNodeId) {
990 // Render target of the node corresponding to root is itself. 941 // Render target of the node corresponding to root is itself.
991 node->target_id = EffectTree::kContentsRootNodeId; 942 node->target_id = EffectTree::kContentsRootNodeId;
992 } else if (!can_render_to_separate_surface) {
993 node->target_id = EffectTree::kContentsRootNodeId;
994 } else if (effect_tree->parent(node)->has_render_surface) { 943 } else if (effect_tree->parent(node)->has_render_surface) {
995 node->target_id = node->parent_id; 944 node->target_id = node->parent_id;
996 } else { 945 } else {
997 node->target_id = effect_tree->parent(node)->target_id; 946 node->target_id = effect_tree->parent(node)->target_id;
998 } 947 }
999 } 948 }
1000 } 949 }
1001 950
1002 void ComputeEffects(EffectTree* effect_tree) { 951 void ComputeEffects(EffectTree* effect_tree) {
1003 if (!effect_tree->needs_update()) 952 if (!effect_tree->needs_update())
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 static void ComputeLayerClipRect(const PropertyTrees* property_trees, 994 static void ComputeLayerClipRect(const PropertyTrees* property_trees,
1046 const LayerImpl* layer) { 995 const LayerImpl* layer) {
1047 const EffectTree* effect_tree = &property_trees->effect_tree; 996 const EffectTree* effect_tree = &property_trees->effect_tree;
1048 const ClipTree* clip_tree = &property_trees->clip_tree; 997 const ClipTree* clip_tree = &property_trees->clip_tree;
1049 const ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); 998 const ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index());
1050 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); 999 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index());
1051 const EffectNode* target_node = 1000 const EffectNode* target_node =
1052 effect_node->has_render_surface 1001 effect_node->has_render_surface
1053 ? effect_node 1002 ? effect_node
1054 : effect_tree->Node(effect_node->target_id); 1003 : effect_tree->Node(effect_node->target_id);
1055 // TODO(weiliangc): When effect node has up to date render surface info on
1056 // compositor thread, no need to check for resourceless draw mode
1057 if (!property_trees->non_root_surfaces_enabled) {
1058 target_node = effect_tree->Node(1);
1059 }
1060
1061 bool include_viewport_clip = false; 1004 bool include_viewport_clip = false;
1062 bool include_expanding_clips = false; 1005 bool include_expanding_clips = false;
1063 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip( 1006 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip(
1064 property_trees, include_viewport_clip, include_expanding_clips, 1007 property_trees, include_viewport_clip, include_expanding_clips,
1065 layer->clip_tree_index(), target_node->id); 1008 layer->clip_tree_index(), target_node->id);
1066 1009
1067 bool is_clipped_from_clip_tree = 1010 bool is_clipped_from_clip_tree = clip_node->layers_are_clipped;
1068 property_trees->non_root_surfaces_enabled
1069 ? clip_node->layers_are_clipped
1070 : clip_node->layers_are_clipped_when_surfaces_disabled;
1071 DCHECK_EQ(is_clipped_from_clip_tree, accumulated_clip_rect.is_clipped); 1011 DCHECK_EQ(is_clipped_from_clip_tree, accumulated_clip_rect.is_clipped);
1072 1012
1073 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; 1013 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect;
1074 1014
1075 DCHECK(layer->clip_rect() == gfx::ToEnclosingRect(accumulated_clip)) 1015 DCHECK(layer->clip_rect() == gfx::ToEnclosingRect(accumulated_clip))
1076 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index() 1016 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index()
1077 << " layer clip: " << layer->clip_rect().ToString() << " v.s. " 1017 << " layer clip: " << layer->clip_rect().ToString() << " v.s. "
1078 << gfx::ToEnclosingRect(accumulated_clip).ToString() 1018 << gfx::ToEnclosingRect(accumulated_clip).ToString()
1079 << " and clip node clip: " 1019 << " and clip node clip: "
1080 << gfx::ToEnclosingRect(clip_node->clip_in_target_space).ToString(); 1020 << gfx::ToEnclosingRect(clip_node->clip_in_target_space).ToString();
1081 } 1021 }
1082 1022
1083 static void ComputeVisibleRectsInternal( 1023 static void ComputeVisibleRectsInternal(
1084 LayerImpl* root_layer, 1024 LayerImpl* root_layer,
1085 PropertyTrees* property_trees, 1025 PropertyTrees* property_trees,
1086 bool can_render_to_separate_surface,
1087 std::vector<LayerImpl*>* visible_layer_list) { 1026 std::vector<LayerImpl*>* visible_layer_list) {
1088 if (property_trees->non_root_surfaces_enabled !=
1089 can_render_to_separate_surface) {
1090 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
1091 property_trees->transform_tree.set_needs_update(true);
1092 }
1093 if (property_trees->transform_tree.needs_update()) { 1027 if (property_trees->transform_tree.needs_update()) {
1094 property_trees->clip_tree.set_needs_update(true); 1028 property_trees->clip_tree.set_needs_update(true);
1095 property_trees->effect_tree.set_needs_update(true); 1029 property_trees->effect_tree.set_needs_update(true);
1096 } 1030 }
1097 UpdateRenderTarget(&property_trees->effect_tree, 1031 UpdateRenderTarget(&property_trees->effect_tree);
1098 property_trees->non_root_surfaces_enabled);
1099 ComputeTransforms(&property_trees->transform_tree); 1032 ComputeTransforms(&property_trees->transform_tree);
1100 // Computation of clips uses surface contents scale which is updated while 1033 // Computation of clips uses surface contents scale which is updated while
1101 // computing effects. So, ComputeEffects should be before ComputeClips. 1034 // computing effects. So, ComputeEffects should be before ComputeClips.
1102 ComputeEffects(&property_trees->effect_tree); 1035 ComputeEffects(&property_trees->effect_tree);
1103 ComputeClips(property_trees, can_render_to_separate_surface); 1036 ComputeClips(property_trees);
1104 1037
1105 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), property_trees, 1038 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), property_trees,
1106 visible_layer_list); 1039 visible_layer_list);
1107 CalculateClipRects(*visible_layer_list, property_trees, 1040 CalculateClipRects(*visible_layer_list, property_trees);
1108 can_render_to_separate_surface); 1041 CalculateVisibleRects(*visible_layer_list, property_trees);
1109 CalculateVisibleRects(*visible_layer_list, property_trees,
1110 can_render_to_separate_surface);
1111 } 1042 }
1112 1043
1113 void UpdatePropertyTrees(PropertyTrees* property_trees, 1044 void UpdatePropertyTrees(PropertyTrees* property_trees) {
1114 bool can_render_to_separate_surface) {
1115 if (property_trees->non_root_surfaces_enabled !=
1116 can_render_to_separate_surface) {
1117 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
1118 property_trees->transform_tree.set_needs_update(true);
1119 }
1120 if (property_trees->transform_tree.needs_update()) { 1045 if (property_trees->transform_tree.needs_update()) {
1121 property_trees->clip_tree.set_needs_update(true); 1046 property_trees->clip_tree.set_needs_update(true);
1122 property_trees->effect_tree.set_needs_update(true); 1047 property_trees->effect_tree.set_needs_update(true);
1123 } 1048 }
1124 ComputeTransforms(&property_trees->transform_tree); 1049 ComputeTransforms(&property_trees->transform_tree);
1125 // Computation of clips uses surface contents scale which is updated while 1050 // Computation of clips uses surface contents scale which is updated while
1126 // computing effects. So, ComputeEffects should be before ComputeClips. 1051 // computing effects. So, ComputeEffects should be before ComputeClips.
1127 ComputeEffects(&property_trees->effect_tree); 1052 ComputeEffects(&property_trees->effect_tree);
1128 ComputeClips(property_trees, can_render_to_separate_surface); 1053 ComputeClips(property_trees);
1129 } 1054 }
1130 1055
1131 void BuildPropertyTreesAndComputeVisibleRects( 1056 void BuildPropertyTreesAndComputeVisibleRects(
1132 LayerImpl* root_layer, 1057 LayerImpl* root_layer,
1133 const LayerImpl* page_scale_layer, 1058 const LayerImpl* page_scale_layer,
1134 const LayerImpl* inner_viewport_scroll_layer, 1059 const LayerImpl* inner_viewport_scroll_layer,
1135 const LayerImpl* outer_viewport_scroll_layer, 1060 const LayerImpl* outer_viewport_scroll_layer,
1136 const LayerImpl* overscroll_elasticity_layer, 1061 const LayerImpl* overscroll_elasticity_layer,
1137 const gfx::Vector2dF& elastic_overscroll, 1062 const gfx::Vector2dF& elastic_overscroll,
1138 float page_scale_factor, 1063 float page_scale_factor,
1139 float device_scale_factor, 1064 float device_scale_factor,
1140 const gfx::Rect& viewport, 1065 const gfx::Rect& viewport,
1141 const gfx::Transform& device_transform, 1066 const gfx::Transform& device_transform,
1142 bool can_render_to_separate_surface,
1143 PropertyTrees* property_trees, 1067 PropertyTrees* property_trees,
1144 LayerImplList* visible_layer_list) { 1068 LayerImplList* visible_layer_list) {
1145 PropertyTreeBuilder::BuildPropertyTrees( 1069 PropertyTreeBuilder::BuildPropertyTrees(
1146 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1070 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1147 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1071 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1148 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1072 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1149 device_transform, property_trees); 1073 device_transform, property_trees);
1150 ComputeVisibleRects(root_layer, property_trees, 1074 ComputeVisibleRects(root_layer, property_trees, visible_layer_list);
1151 can_render_to_separate_surface, visible_layer_list);
1152 } 1075 }
1153 1076
1154 void VerifyClipTreeCalculations(const LayerImplList& layer_list, 1077 void VerifyClipTreeCalculations(const LayerImplList& layer_list,
1155 PropertyTrees* property_trees) { 1078 PropertyTrees* property_trees) {
1156 if (property_trees->non_root_surfaces_enabled) { 1079 ComputeClipsWithEffectTree(property_trees);
1157 ComputeClipsWithEffectTree(property_trees);
1158 }
1159 for (auto* layer : layer_list) 1080 for (auto* layer : layer_list)
1160 ComputeLayerClipRect(property_trees, layer); 1081 ComputeLayerClipRect(property_trees, layer);
1161 } 1082 }
1162 1083
1163 void ComputeVisibleRects(LayerImpl* root_layer, 1084 void ComputeVisibleRects(LayerImpl* root_layer,
1164 PropertyTrees* property_trees, 1085 PropertyTrees* property_trees,
1165 bool can_render_to_separate_surface,
1166 LayerImplList* visible_layer_list) { 1086 LayerImplList* visible_layer_list) {
1167 for (auto* layer : *root_layer->layer_tree_impl()) { 1087 for (auto* layer : *root_layer->layer_tree_impl()) {
1168 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, 1088 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, layer);
1169 can_render_to_separate_surface, layer);
1170 EffectNode* node = 1089 EffectNode* node =
1171 property_trees->effect_tree.Node(layer->effect_tree_index()); 1090 property_trees->effect_tree.Node(layer->effect_tree_index());
1172 if (node->owning_layer_id == layer->id()) { 1091 if (node->owning_layer_id == layer->id()) {
1173 node->render_surface = layer->render_surface(); 1092 node->render_surface = layer->render_surface();
1174 if (node->render_surface) 1093 if (node->render_surface)
1175 node->render_surface->set_effect_tree_index(node->id); 1094 node->render_surface->set_effect_tree_index(node->id);
1176 } 1095 }
1177 #if DCHECK_IS_ON() 1096 #if DCHECK_IS_ON()
1178 if (can_render_to_separate_surface) 1097 ValidateRenderSurfaceForLayer(layer);
1179 ValidateRenderSurfaceForLayer(layer);
1180 #endif 1098 #endif
1181 } 1099 }
1182 ComputeVisibleRectsInternal(root_layer, property_trees, 1100 ComputeVisibleRectsInternal(root_layer, property_trees,
1183 can_render_to_separate_surface,
1184 visible_layer_list); 1101 visible_layer_list);
1185 } 1102 }
1186 1103
1187 gfx::Rect ComputeLayerVisibleRectDynamic(const PropertyTrees* property_trees, 1104 gfx::Rect ComputeLayerVisibleRectDynamic(const PropertyTrees* property_trees,
1188 const LayerImpl* layer) { 1105 const LayerImpl* layer) {
1189 int effect_ancestor_with_copy_request = 1106 int effect_ancestor_with_copy_request =
1190 property_trees->effect_tree.ClosestAncestorWithCopyRequest( 1107 property_trees->effect_tree.ClosestAncestorWithCopyRequest(
1191 layer->effect_tree_index()); 1108 layer->effect_tree_index());
1192 bool non_root_copy_request = 1109 bool non_root_copy_request =
1193 effect_ancestor_with_copy_request > EffectTree::kContentsRootNodeId; 1110 effect_ancestor_with_copy_request > EffectTree::kContentsRootNodeId;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); 1169 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees);
1253 } 1170 }
1254 1171
1255 gfx::Transform DrawTransform(const LayerImpl* layer, 1172 gfx::Transform DrawTransform(const LayerImpl* layer,
1256 const TransformTree& transform_tree, 1173 const TransformTree& transform_tree,
1257 const EffectTree& effect_tree) { 1174 const EffectTree& effect_tree) {
1258 // TransformTree::ToTarget computes transform between the layer's transform 1175 // TransformTree::ToTarget computes transform between the layer's transform
1259 // node and surface's transform node and scales it by the surface's content 1176 // node and surface's transform node and scales it by the surface's content
1260 // scale. 1177 // scale.
1261 gfx::Transform xform; 1178 gfx::Transform xform;
1262 if (transform_tree.property_trees()->non_root_surfaces_enabled) 1179 transform_tree.property_trees()->GetToTarget(
1263 transform_tree.property_trees()->GetToTarget( 1180 layer->transform_tree_index(), layer->render_target_effect_tree_index(),
1264 layer->transform_tree_index(), layer->render_target_effect_tree_index(), 1181 &xform);
1265 &xform);
1266 else
1267 xform = transform_tree.ToScreen(layer->transform_tree_index());
1268 if (layer->should_flatten_transform_from_property_tree()) 1182 if (layer->should_flatten_transform_from_property_tree())
1269 xform.FlattenTo2d(); 1183 xform.FlattenTo2d();
1270 xform.Translate(layer->offset_to_transform_parent().x(), 1184 xform.Translate(layer->offset_to_transform_parent().x(),
1271 layer->offset_to_transform_parent().y()); 1185 layer->offset_to_transform_parent().y());
1272 return xform; 1186 return xform;
1273 } 1187 }
1274 1188
1275 static void SetSurfaceDrawTransform(const PropertyTrees* property_trees, 1189 static void SetSurfaceDrawTransform(const PropertyTrees* property_trees,
1276 RenderSurfaceImpl* render_surface) { 1190 RenderSurfaceImpl* render_surface) {
1277 const TransformTree& transform_tree = property_trees->transform_tree; 1191 const TransformTree& transform_tree = property_trees->transform_tree;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 1328
1415 layer->draw_properties().screen_space_transform = 1329 layer->draw_properties().screen_space_transform =
1416 ScreenSpaceTransformInternal(layer, property_trees->transform_tree); 1330 ScreenSpaceTransformInternal(layer, property_trees->transform_tree);
1417 layer->draw_properties().target_space_transform = DrawTransform( 1331 layer->draw_properties().target_space_transform = DrawTransform(
1418 layer, property_trees->transform_tree, property_trees->effect_tree); 1332 layer, property_trees->transform_tree, property_trees->effect_tree);
1419 layer->draw_properties().screen_space_transform_is_animating = 1333 layer->draw_properties().screen_space_transform_is_animating =
1420 transform_node->to_screen_is_potentially_animated; 1334 transform_node->to_screen_is_potentially_animated;
1421 1335
1422 layer->draw_properties().opacity = 1336 layer->draw_properties().opacity =
1423 LayerDrawOpacity(layer, property_trees->effect_tree); 1337 LayerDrawOpacity(layer, property_trees->effect_tree);
1424 if (property_trees->non_root_surfaces_enabled) { 1338 layer->draw_properties().is_clipped = clip_node->layers_are_clipped;
1425 layer->draw_properties().is_clipped = clip_node->layers_are_clipped;
1426 } else {
1427 layer->draw_properties().is_clipped =
1428 clip_node->layers_are_clipped_when_surfaces_disabled;
1429 }
1430 1339
1431 gfx::Rect bounds_in_target_space = MathUtil::MapEnclosingClippedRect( 1340 gfx::Rect bounds_in_target_space = MathUtil::MapEnclosingClippedRect(
1432 layer->draw_properties().target_space_transform, 1341 layer->draw_properties().target_space_transform,
1433 gfx::Rect(layer->bounds())); 1342 gfx::Rect(layer->bounds()));
1434 layer->draw_properties().drawable_content_rect = LayerDrawableContentRect( 1343 layer->draw_properties().drawable_content_rect = LayerDrawableContentRect(
1435 layer, bounds_in_target_space, layer->draw_properties().clip_rect); 1344 layer, bounds_in_target_space, layer->draw_properties().clip_rect);
1436 } 1345 }
1437 1346
1438 void ComputeMaskDrawProperties(LayerImpl* mask_layer, 1347 void ComputeMaskDrawProperties(LayerImpl* mask_layer,
1439 const PropertyTrees* property_trees) { 1348 const PropertyTrees* property_trees) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1559 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1468 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1560 const Layer* overscroll_elasticity_layer, 1469 const Layer* overscroll_elasticity_layer,
1561 const gfx::Vector2dF& elastic_overscroll) { 1470 const gfx::Vector2dF& elastic_overscroll) {
1562 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1471 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1563 elastic_overscroll); 1472 elastic_overscroll);
1564 } 1473 }
1565 1474
1566 } // namespace draw_property_utils 1475 } // namespace draw_property_utils
1567 1476
1568 } // namespace cc 1477 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/layer_tree_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698