| 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 fda8eda50c1fc71635c7d228bf24779b47eb3d8c..aa2e8abeacca6d24d5430b403c14cfce0cef4903 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -173,6 +173,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),
|
| @@ -287,6 +288,13 @@ LayerTreeHostImpl::~LayerTreeHostImpl() {
|
| }
|
|
|
| CleanUpTileManager();
|
| + renderer_ = nullptr;
|
| + resource_provider_ = nullptr;
|
| +
|
| + if (output_surface_) {
|
| + output_surface_->DetachFromClient();
|
| + output_surface_ = nullptr;
|
| + }
|
| }
|
|
|
| void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) {
|
| @@ -1564,7 +1572,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(),
|
| @@ -1626,7 +1634,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;
|
|
|
| @@ -2020,18 +2028,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_);
|
|
|
| @@ -2160,8 +2168,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
|
| @@ -2173,7 +2180,11 @@ bool LayerTreeHostImpl::InitializeRenderer(
|
| renderer_ = nullptr;
|
| CleanUpTileManager();
|
| resource_provider_ = nullptr;
|
| - output_surface_ = nullptr;
|
| +
|
| + if (output_surface_) {
|
| + output_surface_->DetachFromClient();
|
| + output_surface_ = nullptr;
|
| + }
|
|
|
| if (!output_surface->BindToClient(this)) {
|
| // Avoid recreating tree resources because we might not have enough
|
| @@ -2182,9 +2193,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,
|
|
|