Chromium Code Reviews| 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 840a32b2ef4a59037f22e33e251c9edee72bc649..0d94d15ed8695529768f2cfd81315665d5cca1cd 100644 |
| --- a/cc/trees/layer_tree_host_common.cc |
| +++ b/cc/trees/layer_tree_host_common.cc |
| @@ -14,7 +14,9 @@ |
| #include "cc/layers/layer_iterator.h" |
| #include "cc/layers/render_surface.h" |
| #include "cc/layers/render_surface_impl.h" |
| +#include "cc/test/fake_layer_tree_host_impl.h" |
| #include "cc/trees/layer_sorter.h" |
| +#include "cc/trees/layer_tree_host.h" |
| #include "cc/trees/layer_tree_impl.h" |
| #include "ui/gfx/rect_conversions.h" |
| #include "ui/gfx/transform.h" |
| @@ -548,9 +550,8 @@ static inline void SavePaintPropertiesLayer(Layer* layer) { |
| layer->replica_layer()->mask_layer()->SavePaintProperties(); |
| } |
| -template <typename LayerType> |
| static bool SubtreeShouldRenderToSeparateSurface( |
| - LayerType* layer, |
| + Layer* layer, |
| bool axis_aligned_with_respect_to_parent) { |
| // |
| // A layer and its descendants should render onto a new RenderSurfaceImpl if |
| @@ -1815,23 +1816,25 @@ static void CalculateDrawPropertiesInternal( |
| bool render_to_separate_surface; |
| if (globals.can_render_to_separate_surface) { |
| - render_to_separate_surface = SubtreeShouldRenderToSeparateSurface( |
| - layer, combined_transform.Preserves2dAxisAlignment()); |
| + render_to_separate_surface = layer->ShouldHaveRenderSurface(); |
| } else { |
| - render_to_separate_surface = IsRootLayer(layer); |
| + render_to_separate_surface = |
| + layer->ShouldHaveRenderSurface() && IsRootLayer(layer); |
|
danakj
2014/08/26 18:06:13
the root has to have a surface, and nothing else i
awoloszyn
2014/08/28 19:31:43
We may still have a render-surface if !globals.can
|
| } |
| + layer->SetRenderSurfaceActive(render_to_separate_surface); |
|
danakj
2014/08/26 18:06:13
The RS computation decides if the render surface s
awoloszyn
2014/08/28 19:31:43
Done.
|
| + |
| if (render_to_separate_surface) { |
| // Check back-face visibility before continuing with this surface and its |
| // subtree |
| if (!layer->double_sided() && TransformToParentIsKnown(layer) && |
| IsSurfaceBackFaceVisible(layer, combined_transform)) { |
| - layer->ClearRenderSurfaceLayerList(); |
| + layer->SetRenderSurfaceActive(false); |
|
danakj
2014/08/26 18:06:13
And since the RS exists or not correctly, we shoul
awoloszyn
2014/08/28 19:31:43
Done.
|
| return; |
| } |
| typename LayerType::RenderSurfaceType* render_surface = |
| - CreateOrReuseRenderSurface(layer); |
| - |
| + layer->render_surface(); |
| + render_surface->ClearLayerLists(); |
| if (IsRootLayer(layer)) { |
| // The root layer's render surface size is predetermined and so the root |
| // layer can't directly support non-identity transforms. It should just |
| @@ -2006,8 +2009,6 @@ static void CalculateDrawPropertiesInternal( |
| animating_opacity_to_screen; |
| data_for_children.parent_matrix = combined_transform; |
| - layer->ClearRenderSurface(); |
| - |
| // Layers without render_surfaces directly inherit the ancestor's clip |
| // status. |
| layer_or_ancestor_clips_descendants = ancestor_clips_subtree; |
| @@ -2383,8 +2384,38 @@ static void ProcessCalcDrawPropsInputs( |
| data_for_recursion->subtree_is_visible_from_ancestor = true; |
| } |
| +void CreateOrDestroyRenderSurface(Layer* layer, gfx::Transform* transform) { |
| + if (SubtreeShouldRenderToSeparateSurface( |
| + layer, |
| + transform->IsIdentity() || transform->Preserves2dAxisAlignment())) { |
| + transform->MakeIdentity(); |
| + layer->SetShouldHaveRenderSurface(true); |
| + if (!layer->render_surface()) { |
| + layer->CreateRenderSurface(); |
| + } |
| + return; |
| + } |
| + if (layer->render_surface()) |
| + layer->ClearRenderSurface(); |
| + layer->SetShouldHaveRenderSurface(false); |
| +} |
| + |
| +static void CreateRenderSurfaces(Layer* layer, |
| + const gfx::Transform& parent_transform) { |
| + if (!layer) |
| + return; |
| + gfx::Transform transformForChildren = layer->transform(); |
| + transformForChildren *= parent_transform; |
| + CreateOrDestroyRenderSurface(layer, &transformForChildren); |
| + |
| + for (size_t i = 0; i < layer->children().size(); ++i) { |
| + CreateRenderSurfaces(layer->children()[i], transformForChildren); |
| + } |
| +} |
| + |
| void LayerTreeHostCommon::CalculateDrawProperties( |
| CalcDrawPropsMainInputs* inputs) { |
| + CreateRenderSurfaces(inputs->root_layer, gfx::Transform()); |
| LayerList dummy_layer_list; |
| SubtreeGlobals<Layer> globals; |
| DataForRecursion<Layer> data_for_recursion; |