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 cbf43b5237810e353f556bbbc6bea2dc1aeaef69..356cf3509a0b4a88bb9b86f847bf5769200eed7b 100644 |
--- a/content/browser/compositor/delegated_frame_host.cc |
+++ b/content/browser/compositor/delegated_frame_host.cc |
@@ -53,28 +53,6 @@ void RequireCallback(cc::SurfaceManager* manager, |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
-// DelegatedFrameHostClient |
- |
-bool DelegatedFrameHostClient::ShouldCreateResizeLock() { |
- // On Windows and Linux, holding pointer moves will not help throttling |
- // resizes. |
- // TODO(piman): on Windows we need to block (nested message loop?) the |
- // WM_SIZE event. On Linux we need to throttle at the WM level using |
- // _NET_WM_SYNC_REQUEST. |
- // TODO(ccameron): Mac browser window resizing is incompletely implemented. |
-#if !defined(OS_CHROMEOS) |
- return false; |
-#else |
- return GetDelegatedFrameHost()->ShouldCreateResizeLock(); |
-#endif |
-} |
- |
-void DelegatedFrameHostClient::RequestCopyOfOutput( |
- scoped_ptr<cc::CopyOutputRequest> request) { |
- GetDelegatedFrameHost()->RequestCopyOfOutput(request.Pass()); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
// DelegatedFrameHost |
DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) |
@@ -114,7 +92,7 @@ void DelegatedFrameHost::WasHidden() { |
} |
void DelegatedFrameHost::MaybeCreateResizeLock() { |
- if (!client_->ShouldCreateResizeLock()) |
+ if (!ShouldCreateResizeLock()) |
return; |
DCHECK(compositor_); |
@@ -125,19 +103,18 @@ void DelegatedFrameHost::MaybeCreateResizeLock() { |
if (can_lock_compositor_ == YES_CAN_LOCK) |
can_lock_compositor_ = YES_DID_LOCK; |
- resize_lock_ = client_->CreateResizeLock(defer_compositor_lock); |
+ resize_lock_ = |
+ client_->DelegatedFrameHostCreateResizeLock(defer_compositor_lock); |
} |
bool DelegatedFrameHost::ShouldCreateResizeLock() { |
- RenderWidgetHostImpl* host = client_->GetHost(); |
- |
- if (resize_lock_) |
+ if (!client_->DelegatedFrameCanCreateResizeLock()) |
return false; |
- if (host->auto_resize_enabled()) |
+ if (resize_lock_) |
return false; |
- gfx::Size desired_size = client_->DesiredFrameSize(); |
+ gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); |
if (desired_size == current_frame_size_in_dip_ || desired_size.IsEmpty()) |
return false; |
@@ -147,11 +124,6 @@ bool DelegatedFrameHost::ShouldCreateResizeLock() { |
return true; |
} |
-void DelegatedFrameHost::RequestCopyOfOutput( |
- scoped_ptr<cc::CopyOutputRequest> request) { |
- client_->GetLayer()->RequestCopyOfOutput(request.Pass()); |
-} |
- |
void DelegatedFrameHost::CopyFromCompositingSurface( |
const gfx::Rect& src_subrect, |
const gfx::Size& output_size, |
@@ -175,7 +147,7 @@ void DelegatedFrameHost::CopyFromCompositingSurface( |
callback)); |
if (!src_subrect.IsEmpty()) |
request->set_area(src_subrect); |
- client_->RequestCopyOfOutput(request.Pass()); |
+ RequestCopyOfOutput(request.Pass()); |
} |
void DelegatedFrameHost::CopyFromCompositingSurfaceToVideoFrame( |
@@ -214,15 +186,17 @@ void DelegatedFrameHost::CopyFromCompositingSurfaceToVideoFrame( |
subscriber_texture->target(), |
subscriber_texture->sync_point())); |
} |
- client_->RequestCopyOfOutput(request.Pass()); |
+ RequestCopyOfOutput(request.Pass()); |
} |
bool DelegatedFrameHost::CanCopyToBitmap() const { |
- return compositor_ && client_->GetLayer()->has_external_content(); |
+ return compositor_ && |
+ client_->DelegatedFrameHostGetLayer()->has_external_content(); |
} |
bool DelegatedFrameHost::CanCopyToVideoFrame() const { |
- return compositor_ && client_->GetLayer()->has_external_content(); |
+ return compositor_ && |
+ client_->DelegatedFrameHostGetLayer()->has_external_content(); |
} |
bool DelegatedFrameHost::CanSubscribeFrame() const { |
@@ -252,8 +226,9 @@ bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { |
} |
void DelegatedFrameHost::WasResized() { |
- if (client_->DesiredFrameSize() != current_frame_size_in_dip_ && |
- client_->GetHost()->is_hidden()) |
+ if (client_->DelegatedFrameHostDesiredSizeInDIP() != |
+ current_frame_size_in_dip_ && |
+ !client_->DelegatedFrameHostIsVisible()) |
EvictDelegatedFrame(); |
MaybeCreateResizeLock(); |
} |
@@ -262,7 +237,7 @@ gfx::Size DelegatedFrameHost::GetRequestedRendererSize() const { |
if (resize_lock_) |
return resize_lock_->expected_size(); |
else |
- return client_->DesiredFrameSize(); |
+ return client_->DelegatedFrameHostDesiredSizeInDIP(); |
} |
void DelegatedFrameHost::CheckResizeLock() { |
@@ -306,7 +281,6 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
scoped_ptr<cc::DelegatedFrameData> frame_data, |
float frame_device_scale_factor, |
const std::vector<ui::LatencyInfo>& latency_info) { |
- RenderWidgetHostImpl* host = client_->GetHost(); |
DCHECK(!frame_data->render_pass_list.empty()); |
cc::RenderPass* root_pass = frame_data->render_pass_list.back(); |
@@ -328,9 +302,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), |
latency_info.begin(), latency_info.end()); |
- RenderWidgetHostImpl::SendSwapCompositorFrameAck( |
- host->GetRoutingID(), output_surface_id, |
- host->GetProcess()->GetID(), ack); |
+ client_->DelegatedFrameHostSendCompositorSwapAck(output_surface_id, ack); |
skipped_frames_ = true; |
return; |
} |
@@ -392,7 +364,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
surface_id_ = id_allocator_->GenerateId(); |
surface_factory_->Create(surface_id_); |
// manager must outlive compositors using it. |
- client_->GetLayer()->SetShowSurface( |
+ client_->DelegatedFrameHostGetLayer()->SetShowSurface( |
surface_id_, |
base::Bind(&SatisfyCallback, base::Unretained(manager)), |
base::Bind(&RequireCallback, base::Unretained(manager)), frame_size, |
@@ -410,7 +382,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
latency_info.begin(), |
latency_info.end()); |
- gfx::Size desired_size = client_->DesiredFrameSize(); |
+ gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); |
if (desired_size != frame_size_in_dip && !desired_size.IsEmpty()) |
immediate_ack = true; |
@@ -436,8 +408,8 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
frame_size_in_dip != current_frame_size_in_dip_) { |
frame_provider_ = new cc::DelegatedFrameProvider( |
resource_collection_.get(), frame_data.Pass()); |
- client_->GetLayer()->SetShowDelegatedContent(frame_provider_.get(), |
- frame_size_in_dip); |
+ client_->DelegatedFrameHostGetLayer()->SetShowDelegatedContent( |
+ frame_provider_.get(), frame_size_in_dip); |
} else { |
frame_provider_->SetFrameData(frame_data.Pass()); |
} |
@@ -448,7 +420,8 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
CheckResizeLock(); |
if (!damage_rect_in_dip.IsEmpty()) |
- client_->GetLayer()->OnDelegatedFrameDamage(damage_rect_in_dip); |
+ client_->DelegatedFrameHostGetLayer()->OnDelegatedFrameDamage( |
+ damage_rect_in_dip); |
pending_delegated_ack_count_++; |
@@ -473,21 +446,18 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
} |
DidReceiveFrameFromRenderer(damage_rect); |
if (frame_provider_.get() || !surface_id_.is_null()) |
- delegated_frame_evictor_->SwappedFrame(!host->is_hidden()); |
+ delegated_frame_evictor_->SwappedFrame( |
+ client_->DelegatedFrameHostIsVisible()); |
// Note: the frame may have been evicted immediately. |
} |
void DelegatedFrameHost::SendDelegatedFrameAck(uint32 output_surface_id) { |
- RenderWidgetHostImpl* host = client_->GetHost(); |
cc::CompositorFrameAck ack; |
if (!surface_returned_resources_.empty()) |
ack.resources.swap(surface_returned_resources_); |
if (resource_collection_.get()) |
resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
- RenderWidgetHostImpl::SendSwapCompositorFrameAck(host->GetRoutingID(), |
- output_surface_id, |
- host->GetProcess()->GetID(), |
- ack); |
+ client_->DelegatedFrameHostSendCompositorSwapAck(output_surface_id, ack); |
DCHECK_GT(pending_delegated_ack_count_, 0); |
pending_delegated_ack_count_--; |
} |
@@ -505,8 +475,6 @@ void DelegatedFrameHost::UnusedResourcesAreAvailable() { |
void DelegatedFrameHost::SendReturnedDelegatedResources( |
uint32 output_surface_id) { |
- RenderWidgetHostImpl* host = client_->GetHost(); |
- |
cc::CompositorFrameAck ack; |
if (!surface_returned_resources_.empty()) { |
ack.resources.swap(surface_returned_resources_); |
@@ -516,11 +484,8 @@ void DelegatedFrameHost::SendReturnedDelegatedResources( |
} |
DCHECK(!ack.resources.empty()); |
- RenderWidgetHostImpl::SendReclaimCompositorResources( |
- host->GetRoutingID(), |
- output_surface_id, |
- host->GetProcess()->GetID(), |
- ack); |
+ client_->DelegatedFrameHostSendReclaimCompositorResources(output_surface_id, |
+ ack); |
} |
void DelegatedFrameHost::ReturnResources( |
@@ -535,7 +500,7 @@ void DelegatedFrameHost::ReturnResources( |
} |
void DelegatedFrameHost::EvictDelegatedFrame() { |
- client_->GetLayer()->SetShowSolidColorContent(); |
+ client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent(); |
frame_provider_ = NULL; |
if (!surface_id_.is_null()) { |
surface_factory_->Destroy(surface_id_); |
@@ -870,7 +835,6 @@ void DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo( |
void DelegatedFrameHost::OnCompositingDidCommit( |
ui::Compositor* compositor) { |
- RenderWidgetHostImpl* host = client_->GetHost(); |
if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
can_lock_compositor_ = YES_CAN_LOCK; |
if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
@@ -880,7 +844,7 @@ void DelegatedFrameHost::OnCompositingDidCommit( |
if (resize_lock_ && |
resize_lock_->expected_size() == current_frame_size_in_dip_) { |
resize_lock_.reset(); |
- host->WasResized(); |
+ client_->DelegatedFrameHostResizeLockWasReleased(); |
// We may have had a resize while we had the lock (e.g. if the lock expired, |
// or if the UI still gave us some resizes), so make sure we grab a new lock |
// if necessary. |
@@ -920,22 +884,20 @@ void DelegatedFrameHost::OnUpdateVSyncParameters( |
base::TimeDelta interval) { |
vsync_timebase_ = timebase; |
vsync_interval_ = interval; |
- RenderWidgetHostImpl* host = client_->GetHost(); |
- if (client_->IsVisible()) |
- host->UpdateVSyncParameters(timebase, interval); |
+ if (client_->DelegatedFrameHostIsVisible()) |
+ client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: |
+// DelegatedFrameHost, ImageTransportFactoryObserver implementation: |
void DelegatedFrameHost::OnLostResources() { |
- RenderWidgetHostImpl* host = client_->GetHost(); |
if (frame_provider_.get() || !surface_id_.is_null()) |
EvictDelegatedFrame(); |
idle_frame_subscriber_textures_.clear(); |
yuv_readback_pipeline_.reset(); |
- host->ScheduleComposite(); |
+ client_->DelegatedFrameHostOnLostCompositorResources(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -986,8 +948,10 @@ void DelegatedFrameHost::ResetCompositor() { |
if (!compositor_) |
return; |
RunOnCommitCallbacks(); |
- resize_lock_.reset(); |
- client_->GetHost()->WasResized(); |
+ if (resize_lock_) { |
+ resize_lock_.reset(); |
+ client_->DelegatedFrameHostResizeLockWasReleased(); |
+ } |
if (compositor_->HasObserver(this)) |
compositor_->RemoveObserver(this); |
if (vsync_manager_.get()) { |
@@ -1002,6 +966,14 @@ void DelegatedFrameHost::LockResources() { |
delegated_frame_evictor_->LockFrame(); |
} |
+void DelegatedFrameHost::RequestCopyOfOutput( |
+ scoped_ptr<cc::CopyOutputRequest> request) { |
+ if (!request_copy_of_output_callback_for_testing_.is_null()) |
+ request_copy_of_output_callback_for_testing_.Run(request.Pass()); |
+ else |
+ client_->DelegatedFrameHostGetLayer()->RequestCopyOfOutput(request.Pass()); |
+} |
+ |
void DelegatedFrameHost::UnlockResources() { |
DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
delegated_frame_evictor_->UnlockFrame(); |