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

Unified Diff: cc/trees/draw_property_utils.cc

Issue 1855013002: cc : Stop calculating visible rects on main thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/draw_property_utils.cc
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index f6e4b14d92457a9fd68b5102fbc19cfff830b94c..96c5651bbf24eb142bbc897d2210e3bb81adbd0f 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -73,10 +73,11 @@ static void ValidateRenderSurfacesRecursive(Layer* layer) {
#endif
template <typename LayerType>
-void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list,
- const ClipTree& clip_tree,
- const TransformTree& transform_tree,
- bool non_root_surfaces_enabled) {
+void CalculateVisibleRects(
+ const typename LayerType::LayerListType& visible_layer_list,
+ const ClipTree& clip_tree,
+ const TransformTree& transform_tree,
+ bool non_root_surfaces_enabled) {
for (auto& layer : visible_layer_list) {
gfx::Size layer_bounds = layer->bounds();
const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
@@ -441,40 +442,6 @@ static bool LayerNeedsUpdate(LayerType* layer,
return true;
}
-void FindLayersThatNeedUpdates(Layer* layer,
- const TransformTree& transform_tree,
- const EffectTree& effect_tree,
- LayerList* update_layer_list,
- std::vector<Layer*>* visible_layer_list) {
- DCHECK_GE(layer->effect_tree_index(), 0);
- bool layer_is_drawn =
- effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
-
- if (!IsRootLayer(layer) &&
- SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
- return;
-
- if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) {
- visible_layer_list->push_back(layer);
- update_layer_list->push_back(layer);
- }
-
- // Append mask layers to the update layer list. They don't have valid visible
- // rects, so need to get added after the above calculation. Replica layers
- // don't need to be updated.
- if (Layer* mask_layer = layer->mask_layer())
- update_layer_list->push_back(mask_layer);
- if (Layer* replica_layer = layer->replica_layer()) {
- if (Layer* mask_layer = replica_layer->mask_layer())
- update_layer_list->push_back(mask_layer);
- }
-
- for (size_t i = 0; i < layer->children().size(); ++i) {
- FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
- update_layer_list, visible_layer_list);
- }
-}
-
void FindLayersThatNeedUpdates(LayerImpl* layer,
const TransformTree& transform_tree,
const EffectTree& effect_tree,
@@ -690,13 +657,12 @@ void ComputeEffects(EffectTree* effect_tree) {
effect_tree->set_needs_update(false);
}
-template <typename LayerType>
static void ComputeVisibleRectsInternal(
- LayerType* root_layer,
+ LayerImpl* root_layer,
PropertyTrees* property_trees,
bool can_render_to_separate_surface,
- typename LayerType::LayerListType* update_layer_list,
- std::vector<LayerType*>* visible_layer_list) {
+ LayerImplList* update_layer_list,
+ std::vector<LayerImpl*>* visible_layer_list) {
if (property_trees->non_root_surfaces_enabled !=
can_render_to_separate_surface) {
property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
@@ -712,37 +678,67 @@ static void ComputeVisibleRectsInternal(
FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree,
property_trees->effect_tree, update_layer_list,
visible_layer_list);
- CalculateVisibleRects<LayerType>(
+ CalculateVisibleRects<LayerImpl>(
*visible_layer_list, property_trees->clip_tree,
property_trees->transform_tree, can_render_to_separate_surface);
}
-void BuildPropertyTreesAndComputeVisibleRects(
- Layer* root_layer,
- const Layer* page_scale_layer,
- const Layer* inner_viewport_scroll_layer,
- const Layer* outer_viewport_scroll_layer,
- const Layer* overscroll_elasticity_layer,
- const gfx::Vector2dF& elastic_overscroll,
- float page_scale_factor,
- float device_scale_factor,
- const gfx::Rect& viewport,
- const gfx::Transform& device_transform,
- bool can_render_to_separate_surface,
- PropertyTrees* property_trees,
- LayerList* update_layer_list) {
- PropertyTreeBuilder::BuildPropertyTrees(
- root_layer, page_scale_layer, inner_viewport_scroll_layer,
- outer_viewport_scroll_layer, overscroll_elasticity_layer,
- elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
- device_transform, property_trees);
+void UpdateRenderSurfaces(Layer* root_layer, PropertyTrees* property_trees) {
UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree,
root_layer);
#if DCHECK_IS_ON()
ValidateRenderSurfacesRecursive(root_layer);
#endif
- ComputeVisibleRects(root_layer, property_trees,
- can_render_to_separate_surface, update_layer_list);
+}
+
+void UpdatePropertyTrees(PropertyTrees* property_trees,
+ bool can_render_to_separate_surface) {
+ if (property_trees->non_root_surfaces_enabled !=
+ can_render_to_separate_surface) {
+ property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
+ property_trees->transform_tree.set_needs_update(true);
+ }
+ if (property_trees->transform_tree.needs_update())
+ property_trees->clip_tree.set_needs_update(true);
+ ComputeTransforms(&property_trees->transform_tree);
+ ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
+ can_render_to_separate_surface);
+ ComputeEffects(&property_trees->effect_tree);
+}
+
+void FindLayersThatNeedUpdates(Layer* layer,
+ const TransformTree& transform_tree,
+ const EffectTree& effect_tree,
+ LayerList* update_layer_list) {
+ DCHECK_GE(layer->effect_tree_index(), 0);
+ bool layer_is_drawn =
+ effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
+
+ if (!IsRootLayer(layer) &&
+ SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
+ return;
+
+ if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree))
+ update_layer_list->push_back(layer);
+ if (Layer* mask_layer = layer->mask_layer())
+ update_layer_list->push_back(mask_layer);
+ if (Layer* replica_layer = layer->replica_layer()) {
+ if (Layer* mask_layer = replica_layer->mask_layer())
+ update_layer_list->push_back(mask_layer);
+ }
+
+ for (size_t i = 0; i < layer->children().size(); ++i) {
+ FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
+ update_layer_list);
+ }
+}
+
+void ComputeVisibleRectsForTesting(PropertyTrees* property_trees,
+ bool can_render_to_separate_surface,
+ LayerList* update_layer_list) {
+ CalculateVisibleRects<Layer>(*update_layer_list, property_trees->clip_tree,
+ property_trees->transform_tree,
+ can_render_to_separate_surface);
}
void BuildPropertyTreesAndComputeVisibleRects(
@@ -768,16 +764,6 @@ void BuildPropertyTreesAndComputeVisibleRects(
can_render_to_separate_surface, visible_layer_list);
}
-void ComputeVisibleRects(Layer* root_layer,
- PropertyTrees* property_trees,
- bool can_render_to_separate_surface,
- LayerList* update_layer_list) {
- std::vector<Layer*> visible_layer_list;
- ComputeVisibleRectsInternal(root_layer, property_trees,
- can_render_to_separate_surface, update_layer_list,
- &visible_layer_list);
-}
-
void ComputeVisibleRects(LayerImpl* root_layer,
PropertyTrees* property_trees,
bool can_render_to_separate_surface,
« 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