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..28f250315b24439ef6ce9f3856ffc52380001f32 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" |
@@ -1815,23 +1817,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); |
} |
+ layer->SetRenderSurfaceActive(render_to_separate_surface); |
+ |
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); |
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 +2010,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 +2385,65 @@ static void ProcessCalcDrawPropsInputs( |
data_for_recursion->subtree_is_visible_from_ancestor = true; |
} |
+template <typename LayerType> |
+void CreateOrDestroyRenderSurface(LayerType* type, gfx::Transform* t) { |
+} |
+ |
+template <> |
+void CreateOrDestroyRenderSurface<LayerImpl>(LayerImpl* layer, |
+ gfx::Transform* transform) { |
+ if (SubtreeShouldRenderToSeparateSurface<LayerImpl>( |
+ layer, |
+ transform->IsIdentity() || transform->Preserves2dAxisAlignment())) { |
+ transform->MakeIdentity(); |
+ if (!layer->render_surface()) { |
+ layer->CreateRenderSurface(); |
+ } |
+ return; |
+ } |
+ if (layer->render_surface()) |
+ layer->ClearRenderSurface(); |
+} |
+ |
+template <> |
+void CreateOrDestroyRenderSurface<Layer>(Layer* layer, |
+ gfx::Transform* transform) { |
+ if (SubtreeShouldRenderToSeparateSurface<Layer>( |
+ 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); |
+} |
+ |
+template <typename LayerType> |
+static void CreateRenderSurfaces(LayerType* layer, |
+ const gfx::Transform& parent_transform) { |
+ gfx::Transform transformForChildren = layer->transform(); |
+ transformForChildren *= parent_transform; |
+ CreateOrDestroyRenderSurface(layer, &transformForChildren); |
+ |
+ for (size_t i = 0; i < layer->children().size(); ++i) { |
+ CreateRenderSurfaces<LayerType>(layer->children()[i], transformForChildren); |
+ } |
+} |
+ |
+void LayerTreeHostCommon::CalculateDrawProperties( |
+ CalcDrawPropsImplInputsForTesting* inputs) { |
+ CreateRenderSurfaces(inputs->root_layer, gfx::Transform()); |
+ CalculateDrawProperties(static_cast<CalcDrawPropsImplInputs*>(inputs)); |
+} |
+ |
void LayerTreeHostCommon::CalculateDrawProperties( |
CalcDrawPropsMainInputs* inputs) { |
+ CreateRenderSurfaces(inputs->root_layer, gfx::Transform()); |
LayerList dummy_layer_list; |
SubtreeGlobals<Layer> globals; |
DataForRecursion<Layer> data_for_recursion; |