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 c69d8ea02e2632fe793ef3a3b18a7269969dbec1..1212691b3d3be2e908eb690b6021ada58c9884a0 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -172,6 +172,7 @@ LayerTreeHostImpl::LayerTreeHostImpl( |
: client_(client), |
proxy_(proxy), |
current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
+ output_surface_(nullptr), |
content_is_suitable_for_gpu_rasterization_(true), |
has_gpu_rasterization_trigger_(false), |
use_gpu_rasterization_(false), |
@@ -285,6 +286,13 @@ LayerTreeHostImpl::~LayerTreeHostImpl() { |
} |
CleanUpTileManager(); |
+ renderer_ = nullptr; |
+ resource_provider_ = nullptr; |
+ |
+ if (output_surface_) { |
+ output_surface_->DetachFromClient(); |
+ output_surface_ = nullptr; |
+ } |
} |
void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { |
@@ -1562,7 +1570,7 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame) { |
scoped_ptr<SoftwareRenderer> temp_software_renderer = |
SoftwareRenderer::Create(this, &settings_.renderer_settings, |
- output_surface_.get(), NULL); |
+ output_surface_, NULL); |
temp_software_renderer->DrawFrame(&frame->render_passes, |
device_scale_factor_, |
DeviceViewport(), |
@@ -1624,7 +1632,7 @@ bool LayerTreeHostImpl::CanUseGpuRasterization() { |
ContextProvider* context_provider = |
output_surface_->worker_context_provider(); |
- base::AutoLock context_lock(*context_provider->GetLock()); |
+ ContextProvider::ScopedContextLock scoped_context(context_provider); |
if (!context_provider->GrContext()) |
return false; |
@@ -2008,18 +2016,18 @@ void LayerTreeHostImpl::CreateAndSetRenderer() { |
DCHECK(resource_provider_); |
if (output_surface_->capabilities().delegated_rendering) { |
- renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings, |
- output_surface_.get(), |
- resource_provider_.get()); |
+ renderer_ = |
+ DelegatingRenderer::Create(this, &settings_.renderer_settings, |
+ output_surface_, resource_provider_.get()); |
} else if (output_surface_->context_provider()) { |
renderer_ = GLRenderer::Create( |
- this, &settings_.renderer_settings, output_surface_.get(), |
+ this, &settings_.renderer_settings, output_surface_, |
resource_provider_.get(), texture_mailbox_deleter_.get(), |
settings_.renderer_settings.highp_threshold_min); |
} else if (output_surface_->software_device()) { |
- renderer_ = SoftwareRenderer::Create(this, &settings_.renderer_settings, |
- output_surface_.get(), |
- resource_provider_.get()); |
+ renderer_ = |
+ SoftwareRenderer::Create(this, &settings_.renderer_settings, |
+ output_surface_, resource_provider_.get()); |
} |
DCHECK(renderer_); |
@@ -2148,8 +2156,7 @@ void LayerTreeHostImpl::CleanUpTileManager() { |
single_thread_synchronous_task_graph_runner_ = nullptr; |
} |
-bool LayerTreeHostImpl::InitializeRenderer( |
- scoped_ptr<OutputSurface> output_surface) { |
+bool LayerTreeHostImpl::InitializeRenderer(OutputSurface* output_surface) { |
TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); |
// Since we will create a new resource provider, we cannot continue to use |
@@ -2161,7 +2168,14 @@ bool LayerTreeHostImpl::InitializeRenderer( |
renderer_ = nullptr; |
CleanUpTileManager(); |
resource_provider_ = nullptr; |
- output_surface_ = nullptr; |
+ |
+ // Detach from the old output surface and reset |output_surface_| pointer |
+ // as this surface is going to be destroyed independent of if binding the |
+ // new output surface succeeds or not. |
+ if (output_surface_) { |
+ output_surface_->DetachFromClient(); |
+ output_surface_ = nullptr; |
+ } |
if (!output_surface->BindToClient(this)) { |
// Avoid recreating tree resources because we might not have enough |
@@ -2170,9 +2184,9 @@ bool LayerTreeHostImpl::InitializeRenderer( |
return false; |
} |
- output_surface_ = output_surface.Pass(); |
+ output_surface_ = output_surface; |
resource_provider_ = ResourceProvider::Create( |
- output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, |
+ output_surface_, shared_bitmap_manager_, gpu_memory_buffer_manager_, |
proxy_->blocking_main_thread_task_runner(), |
settings_.renderer_settings.highp_threshold_min, |
settings_.renderer_settings.use_rgba_4444_textures, |