| Index: cc/trees/layer_tree_host_common.cc
|
| diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
|
| index 784b3db94a85cb900fe66c22cb4b9fd0aa4411b7..453a6f348abca713a2f92e97dad4cf0ab804ad78 100644
|
| --- a/cc/trees/layer_tree_host_common.cc
|
| +++ b/cc/trees/layer_tree_host_common.cc
|
| @@ -587,6 +587,19 @@ static bool SubtreeShouldRenderToSeparateSurface(
|
| return true;
|
| }
|
|
|
| + // If the layer has blending.
|
| + // TODO(rosca): this is temporary, until blending is implemented for other
|
| + // types of quads than RenderPassDrawQuad. Layers having descendants that draw
|
| + // content will still create a separate rendering surface.
|
| + if (!layer->uses_default_blend_mode()) {
|
| + TRACE_EVENT_INSTANT0(
|
| + "cc",
|
| + "LayerTreeHostCommon::SubtreeShouldRenderToSeparateSurface blending",
|
| + TRACE_EVENT_SCOPE_THREAD);
|
| + DCHECK(!is_root);
|
| + return true;
|
| + }
|
| +
|
| // If the layer clips its descendants but it is not axis-aligned with respect
|
| // to its parent.
|
| bool layer_clips_external_content =
|
| @@ -629,6 +642,19 @@ static bool SubtreeShouldRenderToSeparateSurface(
|
| // be used as a contributing surface in order to apply correctly.
|
| //
|
|
|
| + // If the layer has isolation.
|
| + // TODO(rosca): to be optimized - create separate rendering surface only when
|
| + // the blending descendants might have access to the content behind this layer
|
| + // (layer has transparent background or descendants overflow).
|
| + // https://code.google.com/p/chromium/issues/detail?id=301738
|
| + if (layer->is_root_for_isolated_group()) {
|
| + TRACE_EVENT_INSTANT0(
|
| + "cc",
|
| + "LayerTreeHostCommon::SubtreeShouldRenderToSeparateSurface isolation",
|
| + TRACE_EVENT_SCOPE_THREAD);
|
| + return true;
|
| + }
|
| +
|
| // If we force it.
|
| if (layer->force_render_surface())
|
| return true;
|
| @@ -2034,6 +2060,16 @@ static void CalculateDrawPropertiesInternal(
|
| return;
|
| }
|
|
|
| + // Layers having a non-default blend mode will blend with the content
|
| + // inside its parent's render target. This render target should be
|
| + // either root_for_isolated_group, or the root of the layer tree.
|
| + // Otherwise, this layer will use an incomplete backdrop, limited to its
|
| + // render target and the blending result will be incorrect.
|
| + DCHECK(layer->uses_default_blend_mode() || IsRootLayer(layer) ||
|
| + !layer->parent()->render_target() ||
|
| + IsRootLayer(layer->parent()->render_target()) ||
|
| + layer->parent()->render_target()->is_root_for_isolated_group());
|
| +
|
| render_surface->SetContentRect(clipped_content_rect);
|
|
|
| // The owning layer's screen_space_transform has a scale from content to
|
|
|