Index: content/browser/compositor/delegated_frame_host.cc |
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc |
index e09c38ebc6589ccc1ec5a9ef82e6bc7703ce974a..cbf43b5237810e353f556bbbc6bea2dc1aeaef69 100644 |
--- a/content/browser/compositor/delegated_frame_host.cc |
+++ b/content/browser/compositor/delegated_frame_host.cc |
@@ -79,6 +79,7 @@ void DelegatedFrameHostClient::RequestCopyOfOutput( |
DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) |
: client_(client), |
+ compositor_(nullptr), |
use_surfaces_(UseSurfacesEnabled()), |
last_output_surface_id_(0), |
pending_delegated_ack_count_(0), |
@@ -94,14 +95,12 @@ void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
if (surface_id_.is_null() && !frame_provider_.get() && |
!released_front_lock_.get()) { |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (compositor) |
- released_front_lock_ = compositor->GetCompositorLock(); |
+ if (compositor_) |
+ released_front_lock_ = compositor_->GetCompositorLock(); |
} |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (compositor) { |
- compositor->SetLatencyInfo(latency_info); |
+ if (compositor_) { |
+ compositor_->SetLatencyInfo(latency_info); |
} |
} |
@@ -117,12 +116,7 @@ void DelegatedFrameHost::WasHidden() { |
void DelegatedFrameHost::MaybeCreateResizeLock() { |
if (!client_->ShouldCreateResizeLock()) |
return; |
- DCHECK(client_->GetCompositor()); |
- |
- // Listen to changes in the compositor lock state. |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (!compositor->HasObserver(this)) |
- compositor->AddObserver(this); |
+ DCHECK(compositor_); |
bool defer_compositor_lock = |
can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || |
@@ -147,8 +141,7 @@ bool DelegatedFrameHost::ShouldCreateResizeLock() { |
if (desired_size == current_frame_size_in_dip_ || desired_size.IsEmpty()) |
return false; |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (!compositor) |
+ if (!compositor_) |
return false; |
return true; |
@@ -225,13 +218,11 @@ void DelegatedFrameHost::CopyFromCompositingSurfaceToVideoFrame( |
} |
bool DelegatedFrameHost::CanCopyToBitmap() const { |
- return client_->GetCompositor() && |
- client_->GetLayer()->has_external_content(); |
+ return compositor_ && client_->GetLayer()->has_external_content(); |
} |
bool DelegatedFrameHost::CanCopyToVideoFrame() const { |
- return client_->GetCompositor() && |
- client_->GetLayer()->has_external_content(); |
+ return compositor_ && client_->GetLayer()->has_external_content(); |
} |
bool DelegatedFrameHost::CanSubscribeFrame() const { |
@@ -283,11 +274,6 @@ void DelegatedFrameHost::CheckResizeLock() { |
// the release of the lock until we've kicked a frame with the new texture, to |
// avoid resizing the UI before we have a chance to draw a "good" frame. |
resize_lock_->UnlockCompositor(); |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (compositor) { |
- if (!compositor->HasObserver(this)) |
- compositor->AddObserver(this); |
- } |
} |
void DelegatedFrameHost::DidReceiveFrameFromRenderer( |
@@ -385,8 +371,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
} |
last_output_surface_id_ = output_surface_id; |
} |
- ui::Compositor* compositor = client_->GetCompositor(); |
- bool immediate_ack = !compositor; |
+ bool immediate_ack = !compositor_; |
if (frame_size.IsEmpty()) { |
DCHECK(frame_data->resource_list.empty()); |
EvictDelegatedFrame(); |
@@ -430,7 +415,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
immediate_ack = true; |
cc::SurfaceFactory::DrawCallback ack_callback; |
- if (compositor && !immediate_ack) { |
+ if (compositor_ && !immediate_ack) { |
ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, |
AsWeakPtr(), output_surface_id); |
} |
@@ -472,12 +457,12 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
} else if (!use_surfaces_) { |
std::vector<ui::LatencyInfo>::const_iterator it; |
for (it = latency_info.begin(); it != latency_info.end(); ++it) |
- compositor->SetLatencyInfo(*it); |
+ compositor_->SetLatencyInfo(*it); |
// If we've previously skipped any latency infos add them. |
for (it = skipped_latency_info_list_.begin(); |
it != skipped_latency_info_list_.end(); |
++it) |
- compositor->SetLatencyInfo(*it); |
+ compositor_->SetLatencyInfo(*it); |
skipped_latency_info_list_.clear(); |
AddOnCommitCallbackAndDisableLocks( |
base::Bind(&DelegatedFrameHost::SendDelegatedFrameAck, |
@@ -924,6 +909,12 @@ void DelegatedFrameHost::OnCompositingLockStateChanged( |
} |
} |
+void DelegatedFrameHost::OnCompositingShuttingDown(ui::Compositor* compositor) { |
+ DCHECK_EQ(compositor, compositor_); |
+ ResetCompositor(); |
+ DCHECK(!compositor_); |
+} |
+ |
void DelegatedFrameHost::OnUpdateVSyncParameters( |
base::TimeTicks timebase, |
base::TimeDelta interval) { |
@@ -951,6 +942,7 @@ void DelegatedFrameHost::OnLostResources() { |
// DelegatedFrameHost, private: |
DelegatedFrameHost::~DelegatedFrameHost() { |
+ DCHECK(!compositor_); |
ImageTransportFactory::GetInstance()->RemoveObserver(this); |
if (!surface_id_.is_null()) |
@@ -972,38 +964,37 @@ void DelegatedFrameHost::RunOnCommitCallbacks() { |
void DelegatedFrameHost::AddOnCommitCallbackAndDisableLocks( |
const base::Closure& callback) { |
- ui::Compositor* compositor = client_->GetCompositor(); |
- DCHECK(compositor); |
- |
- if (!compositor->HasObserver(this)) |
- compositor->AddObserver(this); |
+ DCHECK(compositor_); |
can_lock_compositor_ = NO_PENDING_COMMIT; |
if (!callback.is_null()) |
on_compositing_did_commit_callbacks_.push_back(callback); |
} |
-void DelegatedFrameHost::AddedToWindow() { |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (compositor) { |
- DCHECK(!vsync_manager_.get()); |
- vsync_manager_ = compositor->vsync_manager(); |
- vsync_manager_->AddObserver(this); |
- } |
+void DelegatedFrameHost::SetCompositor(ui::Compositor* compositor) { |
+ DCHECK(!compositor_); |
+ if (!compositor) |
+ return; |
+ compositor_ = compositor; |
+ compositor_->AddObserver(this); |
+ DCHECK(!vsync_manager_.get()); |
+ vsync_manager_ = compositor_->vsync_manager(); |
+ vsync_manager_->AddObserver(this); |
} |
-void DelegatedFrameHost::RemovingFromWindow() { |
+void DelegatedFrameHost::ResetCompositor() { |
+ if (!compositor_) |
+ return; |
RunOnCommitCallbacks(); |
resize_lock_.reset(); |
client_->GetHost()->WasResized(); |
- ui::Compositor* compositor = client_->GetCompositor(); |
- if (compositor && compositor->HasObserver(this)) |
- compositor->RemoveObserver(this); |
- |
+ if (compositor_->HasObserver(this)) |
+ compositor_->RemoveObserver(this); |
if (vsync_manager_.get()) { |
vsync_manager_->RemoveObserver(this); |
vsync_manager_ = NULL; |
} |
+ compositor_ = nullptr; |
} |
void DelegatedFrameHost::LockResources() { |