Index: cc/layers/layer_impl.cc |
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc |
index e6e60f5f3ef7cc1e474c2b5c4a2aef192906b3b7..893d21b8fcc2e9f53978054296c8e8702c44f37f 100644 |
--- a/cc/layers/layer_impl.cc |
+++ b/cc/layers/layer_impl.cc |
@@ -69,7 +69,8 @@ LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, int id) |
needs_push_properties_(false), |
num_dependents_need_push_properties_(0), |
sorting_context_id_(0), |
- current_draw_mode_(DRAW_MODE_NONE) { |
+ current_draw_mode_(DRAW_MODE_NONE), |
+ active_render_surface_(NULL) { |
DCHECK_GT(layer_id_, 0); |
DCHECK(layer_tree_impl_); |
layer_tree_impl_->RegisterLayer(this); |
@@ -237,19 +238,20 @@ void LayerImpl::TakeCopyRequestsAndTransformToTarget( |
} |
void LayerImpl::CreateRenderSurface() { |
- DCHECK(!draw_properties_.render_surface); |
- draw_properties_.render_surface = |
- make_scoped_ptr(new RenderSurfaceImpl(this)); |
+ DCHECK(!render_surface_); |
+ render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); |
draw_properties_.render_target = this; |
+ SetRenderSurfaceActive(true); |
} |
void LayerImpl::ClearRenderSurface() { |
- draw_properties_.render_surface.reset(); |
+ SetRenderSurfaceActive(false); |
+ render_surface_.reset(); |
} |
void LayerImpl::ClearRenderSurfaceLayerList() { |
- if (draw_properties_.render_surface) |
- draw_properties_.render_surface->layer_list().clear(); |
+ if (render_surface_) |
+ render_surface_->layer_list().clear(); |
} |
void LayerImpl::PopulateSharedQuadState(SharedQuadState* state) const { |
@@ -541,6 +543,7 @@ void LayerImpl::PushPropertiesTo(LayerImpl* layer) { |
layer->SetSentScrollDelta(gfx::Vector2d()); |
layer->Set3dSortingContextId(sorting_context_id_); |
layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_); |
+ layer->SetShouldHaveRenderSurface(ShouldHaveRenderSurface()); |
LayerImpl* scroll_parent = NULL; |
if (scroll_parent_) { |
@@ -717,8 +720,8 @@ void LayerImpl::ResetAllChangeTrackingForSubtree() { |
update_rect_ = gfx::RectF(); |
damage_rect_ = gfx::RectF(); |
- if (draw_properties_.render_surface) |
- draw_properties_.render_surface->ResetPropertyChangedFlag(); |
+ if (render_surface_) |
+ render_surface_->ResetPropertyChangedFlag(); |
if (mask_layer_) |
mask_layer_->ResetAllChangeTrackingForSubtree(); |
@@ -1541,4 +1544,29 @@ void LayerImpl::NotifyAnimationFinished( |
layer_tree_impl_->InputScrollAnimationFinished(); |
} |
+void LayerImpl::SetRenderSurfaceActive(bool active) { |
+ if (active == !!active_render_surface_) { |
+ return; |
+ } |
+ |
+ if (active) { |
+ active_render_surface_ = render_surface_.get(); |
+ return; |
+ } |
+ if (active_render_surface_) { |
+ active_render_surface_->ClearLayerLists(); |
+ } |
+ active_render_surface_ = NULL; |
+} |
+ |
+void LayerImpl::SetShouldHaveRenderSurface(bool should_have_render_surface) { |
+ if (ShouldHaveRenderSurface() == should_have_render_surface) |
+ return; |
+ if (should_have_render_surface) { |
+ CreateRenderSurface(); |
+ return; |
+ } |
+ ClearRenderSurface(); |
+} |
+ |
} // namespace cc |