Index: cc/trees/draw_property_utils.cc |
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc |
index 605bca37d9eb7a22c1675cf580a95d62e39dbb62..a562c2f02bcb41899a7a1ce7932fae43da00c2b7 100644 |
--- a/cc/trees/draw_property_utils.cc |
+++ b/cc/trees/draw_property_utils.cc |
@@ -430,6 +430,7 @@ void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, |
layer->SetHasRenderSurface(IsRootLayer(layer)); |
return; |
} |
+ |
EffectNode* node = effect_tree->Node(layer->effect_tree_index()); |
if (node->owner_id == layer->id() && node->data.has_render_surface) |
@@ -601,6 +602,23 @@ void ComputeTransforms(TransformTree* transform_tree) { |
transform_tree->set_needs_update(false); |
} |
+void UpdateRenderTarget(EffectTree* effect_tree, |
+ bool can_render_to_separate_surface) { |
+ for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { |
+ EffectNode* node = effect_tree->Node(i); |
+ if (i == 1) { |
+ // Render target on the first effect node is root. |
+ node->data.target_id = 0; |
+ } else if (!can_render_to_separate_surface) { |
+ node->data.target_id = 1; |
+ } else if (effect_tree->parent(node)->data.has_render_surface) { |
+ node->data.target_id = node->parent_id; |
+ } else { |
+ node->data.target_id = effect_tree->parent(node)->data.target_id; |
+ } |
+ } |
+} |
+ |
void ComputeEffects(EffectTree* effect_tree) { |
if (!effect_tree->needs_update()) |
return; |
@@ -622,6 +640,8 @@ static void ComputeVisibleRectsInternal( |
} |
if (property_trees->transform_tree.needs_update()) |
property_trees->clip_tree.set_needs_update(true); |
+ UpdateRenderTarget(&property_trees->effect_tree, |
+ property_trees->non_root_surfaces_enabled); |
ComputeTransforms(&property_trees->transform_tree); |
ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, |
can_render_to_separate_surface); |
@@ -723,6 +743,10 @@ void ComputeVisibleRects(LayerImpl* root_layer, |
for (auto* layer : *root_layer->layer_tree_impl()) { |
UpdateRenderSurfaceForLayer(&property_trees->effect_tree, |
can_render_to_separate_surface, layer); |
+ EffectNode* node = |
+ property_trees->effect_tree.Node(layer->effect_tree_index()); |
+ if (node->owner_id == layer->id()) |
+ node->data.render_surface = layer->render_surface(); |
#if DCHECK_IS_ON() |
if (can_render_to_separate_surface) |
ValidateRenderSurfaceForLayer(layer); |
@@ -910,7 +934,7 @@ static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) { |
return 0.f; |
const EffectNode* target_node = |
- tree.Node(layer->render_target()->effect_tree_index()); |
+ tree.Node(layer->render_target()->EffectTreeIndex()); |
const EffectNode* node = tree.Node(layer->effect_tree_index()); |
if (node == target_node) |
return 1.f; |