Index: cc/trees/property_tree_builder.cc |
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
index 291c6eb66081e2dd15dab93385ffa09480b2da66..359bb1d87d80243a30596dd1d3b7f9178878507c 100644 |
--- a/cc/trees/property_tree_builder.cc |
+++ b/cc/trees/property_tree_builder.cc |
@@ -44,6 +44,7 @@ struct DataForRecursion { |
int clip_tree_parent; |
int effect_tree_parent; |
int scroll_tree_parent; |
+ int closest_ancestor_with_cached_render_surface; |
int closest_ancestor_with_copy_request; |
uint32_t main_thread_scrolling_reasons; |
SkColor safe_opaque_background_color; |
@@ -581,6 +582,14 @@ static inline bool DoubleSided(LayerImpl* layer) { |
return layer->test_properties()->double_sided; |
} |
+static inline bool CacheRenderSurface(Layer* layer) { |
+ return layer->cache_render_surface(); |
+} |
+ |
+static inline bool CacheRenderSurface(LayerImpl* layer) { |
+ return layer->test_properties()->cache_render_surface; |
+} |
+ |
static inline bool ForceRenderSurface(Layer* layer) { |
return layer->force_render_surface_for_testing(); |
} |
@@ -787,6 +796,10 @@ bool ShouldCreateRenderSurface(LayerType* layer, |
if (ForceRenderSurface(layer)) |
return true; |
+ // If we cache it. |
+ if (CacheRenderSurface(layer)) |
+ return true; |
+ |
// If we'll make a copy of the layer's contents. |
if (HasCopyRequest(layer)) |
return true; |
@@ -893,6 +906,7 @@ bool AddEffectNodeIfNeeded( |
node->blend_mode = BlendMode(layer); |
node->unscaled_mask_target_size = layer->bounds(); |
node->has_render_surface = should_create_render_surface; |
+ node->cache_render_surface = CacheRenderSurface(layer); |
node->has_copy_request = HasCopyRequest(layer); |
node->filters = Filters(layer); |
node->background_filters = BackgroundFilters(layer); |
@@ -905,6 +919,10 @@ bool AddEffectNodeIfNeeded( |
node->is_currently_animating_filter = FilterIsAnimating(layer); |
node->effect_changed = PropertyChanged(layer); |
node->subtree_has_copy_request = SubtreeHasCopyRequest(layer); |
+ node->closest_ancestor_with_cached_render_surface_id = |
+ CacheRenderSurface(layer) |
+ ? node_id |
+ : data_from_ancestor.closest_ancestor_with_cached_render_surface; |
node->closest_ancestor_with_copy_request_id = |
HasCopyRequest(layer) |
? node_id |
@@ -938,6 +956,8 @@ bool AddEffectNodeIfNeeded( |
node->clip_id = ClipTree::kViewportNodeId; |
} |
+ data_for_children->closest_ancestor_with_cached_render_surface = |
+ node->closest_ancestor_with_cached_render_surface_id; |
data_for_children->closest_ancestor_with_copy_request = |
node->closest_ancestor_with_copy_request_id; |
data_for_children->effect_tree_parent = node_id; |
@@ -1238,6 +1258,8 @@ void BuildPropertyTreesTopLevelInternal( |
data_for_recursion.clip_tree_parent = ClipTree::kRootNodeId; |
data_for_recursion.effect_tree_parent = EffectTree::kInvalidNodeId; |
data_for_recursion.scroll_tree_parent = ScrollTree::kRootNodeId; |
+ data_for_recursion.closest_ancestor_with_cached_render_surface = |
+ EffectTree::kInvalidNodeId; |
data_for_recursion.closest_ancestor_with_copy_request = |
EffectTree::kInvalidNodeId; |
data_for_recursion.page_scale_layer = page_scale_layer; |