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

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
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..8be077aef4b84a6b09bbbe4499d6499e1017e4b7 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -441,40 +441,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 +656,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 +677,76 @@ static void ComputeVisibleRectsInternal(
FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree,
property_trees->effect_tree, update_layer_list,
visible_layer_list);
- CalculateVisibleRects<LayerType>(
- *visible_layer_list, property_trees->clip_tree,
- property_trees->transform_tree, can_render_to_separate_surface);
+ CalculateVisibleRects(*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);
+ }
+
+ // 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.
ajuma 2016/04/04 20:47:18 This comment doesn't apply anymore (since we're no
jaydasika 2016/04/04 21:29:17 Done.
+ 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) {
+ std::vector<Layer*> visible_layer_list;
+ for (auto layer : *update_layer_list) {
+ visible_layer_list.push_back(layer.get());
ajuma 2016/04/04 20:47:17 Can we avoid this copy? Maybe use templating so th
jaydasika 2016/04/04 21:29:16 Done.
+ }
+ CalculateVisibleRects(visible_layer_list, property_trees->clip_tree,
+ property_trees->transform_tree,
+ can_render_to_separate_surface);
}
void BuildPropertyTreesAndComputeVisibleRects(
@@ -768,16 +772,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,

Powered by Google App Engine
This is Rietveld 408576698