| Index: cc/trees/property_tree.cc
|
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
|
| index dd449d033aec7b00f7b03d73fb1a607fdebb7f01..1b0b5954a547fef475042fc8985caa199747098d 100644
|
| --- a/cc/trees/property_tree.cc
|
| +++ b/cc/trees/property_tree.cc
|
| @@ -991,6 +991,79 @@ void EffectTree::ResetChangeTracking() {
|
| }
|
| }
|
|
|
| +EffectTree::StableIdRenderSurfaceList
|
| +EffectTree::CreateStableIdRenderSurfaceList() const {
|
| + StableIdRenderSurfaceList stable_id_render_surface_list;
|
| + for (int id = kContentsRootNodeId; id < static_cast<int>(size()); ++id) {
|
| + const EffectNode* node = Node(id);
|
| + if (node->render_surface) {
|
| + stable_id_render_surface_list.push_back(
|
| + std::make_pair(node->owning_layer_id, node->render_surface));
|
| + }
|
| + }
|
| + std::sort(stable_id_render_surface_list.begin(),
|
| + stable_id_render_surface_list.end());
|
| + return stable_id_render_surface_list;
|
| +}
|
| +
|
| +void EffectTree::UpdateRenderSurfaceEffectIds(
|
| + const EffectTree::StableIdRenderSurfaceList& stable_id_render_surface_list,
|
| + LayerTreeImpl* layer_tree_impl) {
|
| + // Make a list of {stable id, node id} pairs for nodes that are supposed to
|
| + // have surfaces.
|
| + std::vector<std::pair<int, int>> stable_id_node_id_list;
|
| + for (int id = kContentsRootNodeId; id < static_cast<int>(size()); ++id) {
|
| + const EffectNode* node = Node(id);
|
| + if (node->has_render_surface) {
|
| + stable_id_node_id_list.push_back(
|
| + std::make_pair(node->owning_layer_id, node->id));
|
| + }
|
| + }
|
| +
|
| + // Sort by stable id so that we can process the two lists cosequentially.
|
| + std::sort(stable_id_node_id_list.begin(), stable_id_node_id_list.end());
|
| +
|
| + auto surface_list_it = stable_id_render_surface_list.begin();
|
| + auto node_id_list_it = stable_id_node_id_list.begin();
|
| + while (surface_list_it != stable_id_render_surface_list.end() &&
|
| + node_id_list_it != stable_id_node_id_list.end()) {
|
| + if (surface_list_it->first == node_id_list_it->first) {
|
| + RenderSurfaceImpl* surface = surface_list_it->second;
|
| + int node_id = node_id_list_it->second;
|
| + Node(node_id)->render_surface = surface;
|
| + surface->set_effect_tree_index(node_id);
|
| + surface_list_it++;
|
| + node_id_list_it++;
|
| + continue;
|
| + }
|
| +
|
| + if (surface_list_it->first > node_id_list_it->first) {
|
| + node_id_list_it++;
|
| + continue;
|
| + }
|
| +
|
| + // If we reach here, there's no longer an effect node with stable id
|
| + // |surface_list_it->first| that has a render surface. If there's no longer
|
| + // any corresponding layer either, there's nothing more to do since the
|
| + // surface owned by that layer would have been destroyed when the layer was
|
| + // destroyed. But if the layer still exists, we need to destroy the surface
|
| + // since it now has an invalid effect node id.
|
| + if (LayerImpl* layer_impl =
|
| + layer_tree_impl->LayerById(surface_list_it->first)) {
|
| + layer_impl->SetHasRenderSurface(false);
|
| + }
|
| + surface_list_it++;
|
| + }
|
| +
|
| + while (surface_list_it != stable_id_render_surface_list.end()) {
|
| + if (LayerImpl* layer_impl =
|
| + layer_tree_impl->LayerById(surface_list_it->first)) {
|
| + layer_impl->SetHasRenderSurface(false);
|
| + }
|
| + surface_list_it++;
|
| + }
|
| +}
|
| +
|
| void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations(
|
| TransformNode* node,
|
| TransformNode* parent_node) {
|
| @@ -1520,6 +1593,7 @@ void PropertyTrees::clear() {
|
| full_tree_damaged = false;
|
| changed = false;
|
| non_root_surfaces_enabled = true;
|
| + sequence_number++;
|
|
|
| #if DCHECK_IS_ON()
|
| PropertyTrees tree;
|
|
|