Index: cc/trees/layer_tree_host_impl.cc |
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
index f51c61ac2fd55faa576b0ea64255d26d90705fd5..f376998427462de90d39825bb1aaa0dd58270088 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -116,6 +116,21 @@ class ViewportAnchor { |
gfx::ScrollOffset viewport_in_content_coordinates_; |
}; |
+template <typename Object> |
+class ScopedCaller { |
danakj
2015/02/05 20:45:49
did you look around in base/ for something like th
vmpstr
2015/02/05 21:41:32
I couldn't really find anything that would do a si
|
+ public: |
+ using Function = void (Object::*)(); |
+ ScopedCaller(Object* object, Function on_entry, Function on_exit) |
+ : object_(object), on_exit_(on_exit) { |
+ (object_->*on_entry)(); |
+ } |
+ |
+ ~ScopedCaller() { (object_->*on_exit_)(); } |
+ |
+ private: |
+ Object* object_; |
+ Function on_exit_; |
+}; |
void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { |
if (visible) { |
@@ -1611,7 +1626,9 @@ void LayerTreeHostImpl::SetUseGpuRasterization(bool use_gpu) { |
// Clean up and replace existing tile manager with another one that uses |
// appropriate rasterizer. |
- ReleaseTreeResources(); |
+ ScopedCaller<LayerTreeHostImpl> scoped_release_resources( |
+ this, &LayerTreeHostImpl::ReleaseTreeResources, |
+ &LayerTreeHostImpl::RecreateTreeResources); |
if (tile_manager_) { |
DestroyTileManager(); |
CreateAndSetTileManager(); |
@@ -1934,6 +1951,14 @@ void LayerTreeHostImpl::ReleaseTreeResources() { |
EvictAllUIResources(); |
} |
+void LayerTreeHostImpl::RecreateTreeResources() { |
+ active_tree_->RecreateResources(); |
+ if (pending_tree_) |
+ pending_tree_->RecreateResources(); |
+ if (recycle_tree_) |
+ recycle_tree_->RecreateResources(); |
+} |
+ |
void LayerTreeHostImpl::CreateAndSetRenderer() { |
DCHECK(!renderer_); |
DCHECK(output_surface_); |
@@ -2125,8 +2150,12 @@ bool LayerTreeHostImpl::InitializeRenderer( |
resource_provider_ = nullptr; |
output_surface_ = nullptr; |
- if (!output_surface->BindToClient(this)) |
+ if (!output_surface->BindToClient(this)) { |
+ // Avoid recreating tree resources because we might not have enough |
+ // information to do this yet (eg. we don't have a TileManager at this |
+ // point). |
return false; |
+ } |
output_surface_ = output_surface.Pass(); |
resource_provider_ = ResourceProvider::Create( |
@@ -2143,6 +2172,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
if (settings_.impl_side_painting) |
CreateAndSetTileManager(); |
+ RecreateTreeResources(); |
// Initialize vsync parameters to sane values. |
const base::TimeDelta display_refresh_interval = |
@@ -2183,7 +2213,9 @@ void LayerTreeHostImpl::DeferredInitialize() { |
DCHECK(settings_.impl_side_painting); |
DCHECK(output_surface_->context_provider()); |
- ReleaseTreeResources(); |
+ ScopedCaller<LayerTreeHostImpl> scoped_release_resources( |
enne (OOO)
2015/02/05 20:43:52
This seems like overkill. Neither of the function
vmpstr
2015/02/05 21:41:32
It's ReleaseResources is also implemented in textu
|
+ this, &LayerTreeHostImpl::ReleaseTreeResources, |
+ &LayerTreeHostImpl::RecreateTreeResources); |
renderer_ = nullptr; |
DestroyTileManager(); |
@@ -2201,7 +2233,9 @@ void LayerTreeHostImpl::ReleaseGL() { |
DCHECK(settings_.impl_side_painting); |
DCHECK(output_surface_->context_provider()); |
- ReleaseTreeResources(); |
+ ScopedCaller<LayerTreeHostImpl> scoped_release_resources( |
+ this, &LayerTreeHostImpl::ReleaseTreeResources, |
+ &LayerTreeHostImpl::RecreateTreeResources); |
renderer_ = nullptr; |
DestroyTileManager(); |