Index: content/browser/renderer_host/delegated_frame_host.cc |
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc |
index 2f9b767e4bb39b200a1af851c531b66791734b34..a844d65c25fac8c0edf4de89211ff54d819d73a6 100644 |
--- a/content/browser/renderer_host/delegated_frame_host.cc |
+++ b/content/browser/renderer_host/delegated_frame_host.cc |
@@ -59,8 +59,6 @@ DelegatedFrameHost::DelegatedFrameHost(const cc::FrameSinkId& frame_sink_id, |
factory->GetContextFactoryPrivate()->GetSurfaceManager()->RegisterFrameSinkId( |
frame_sink_id_); |
CreateCompositorFrameSinkSupport(); |
- begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this); |
- client_->SetBeginFrameSource(begin_frame_source_.get()); |
} |
void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
@@ -231,6 +229,27 @@ bool DelegatedFrameHost::TransformPointToCoordSpaceForView( |
transformed_point); |
} |
+void DelegatedFrameHost::SetNeedsBeginFrames(bool needs_begin_frames) { |
+ needs_begin_frame_ = needs_begin_frames; |
+ support_->SetNeedsBeginFrame(needs_begin_frames); |
+} |
+ |
+void DelegatedFrameHost::BeginFrameDidNotSwap(const cc::BeginFrameAck& ack) { |
+ DidFinishFrame(ack); |
+ |
+ cc::BeginFrameAck modified_ack = ack; |
+ if (skipped_frames_) { |
+ // If we skipped the last frame(s), we didn't incorporate the last |
+ // CompositorFrame's damage, so need to wait for the next one before |
+ // confirming newer sequence numbers. |
+ modified_ack.has_damage = false; |
+ modified_ack.latest_confirmed_sequence_number = |
+ latest_confirmed_begin_frame_sequence_number_; |
+ } |
+ |
+ support_->BeginFrameDidNotSwap(modified_ack); |
+} |
+ |
bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { |
// Should skip a frame only when another frame from the renderer is guaranteed |
// to replace it. Otherwise may cause hangs when the renderer is waiting for |
@@ -379,6 +398,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
DCHECK(!resize_lock_ || !client_->IsAutoResizeEnabled()); |
#endif |
float frame_device_scale_factor = frame.metadata.device_scale_factor; |
+ cc::BeginFrameAck ack(frame.metadata.begin_frame_ack); |
DCHECK(!frame.render_pass_list.empty()); |
@@ -404,6 +424,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
client_->DelegatedFrameHostSendReclaimCompositorResources( |
compositor_frame_sink_id, true /* is_swap_ack*/, resources); |
skipped_frames_ = true; |
+ BeginFrameDidNotSwap(ack); |
return; |
} |
@@ -482,6 +503,8 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
client_->DelegatedFrameHostIsVisible()); |
} |
// Note: the frame may have been evicted immediately. |
+ |
+ DidFinishFrame(ack); |
} |
void DelegatedFrameHost::ClearDelegatedFrame() { |
@@ -512,7 +535,7 @@ void DelegatedFrameHost::WillDrawSurface(const cc::LocalSurfaceId& id, |
} |
void DelegatedFrameHost::OnBeginFrame(const cc::BeginFrameArgs& args) { |
- begin_frame_source_->OnBeginFrame(args); |
+ client_->OnBeginFrame(args); |
} |
void DelegatedFrameHost::EvictDelegatedFrame() { |
@@ -756,7 +779,6 @@ DelegatedFrameHost::~DelegatedFrameHost() { |
ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
factory->GetContextFactory()->RemoveObserver(this); |
- begin_frame_source_.reset(); |
ResetCompositorFrameSinkSupport(); |
factory->GetContextFactoryPrivate() |
@@ -822,37 +844,6 @@ void DelegatedFrameHost::UnlockResources() { |
delegated_frame_evictor_->UnlockFrame(); |
} |
-void DelegatedFrameHost::OnNeedsBeginFrames(bool needs_begin_frames) { |
- needs_begin_frame_ = needs_begin_frames; |
- support_->SetNeedsBeginFrame(needs_begin_frames); |
-} |
- |
-void DelegatedFrameHost::OnDidFinishFrame(const cc::BeginFrameAck& ack) { |
- if (ack.source_id != latest_confirmed_begin_frame_source_id_) { |
- // Source changed, we don't know our freshness anymore. |
- latest_confirmed_begin_frame_sequence_number_ = |
- cc::BeginFrameArgs::kInvalidFrameNumber; |
- } |
- |
- cc::BeginFrameAck modified_ack = ack; |
- if (skipped_frames_) { |
- // If we skipped the last frame(s), we didn't incorporate the last |
- // CompositorFrame's damage, so need to wait for the next one before |
- // confirming newer sequence numbers. |
- modified_ack.has_damage = false; |
- modified_ack.latest_confirmed_sequence_number = |
- latest_confirmed_begin_frame_sequence_number_; |
- } else { |
- latest_confirmed_begin_frame_source_id_ = modified_ack.source_id; |
- latest_confirmed_begin_frame_sequence_number_ = |
- modified_ack.latest_confirmed_sequence_number; |
- } |
- |
- // If there was damage, the unmodified ack was sent with the CompositorFrame. |
- if (!modified_ack.has_damage) |
- support_->BeginFrameDidNotSwap(modified_ack); |
-} |
- |
void DelegatedFrameHost::CreateCompositorFrameSinkSupport() { |
DCHECK(!support_); |
ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
@@ -875,4 +866,18 @@ void DelegatedFrameHost::ResetCompositorFrameSinkSupport() { |
support_.reset(); |
} |
+void DelegatedFrameHost::DidFinishFrame(const cc::BeginFrameAck& ack) { |
+ if (ack.source_id != latest_confirmed_begin_frame_source_id_) { |
+ // Source changed, we don't know our freshness anymore. |
+ latest_confirmed_begin_frame_sequence_number_ = |
+ cc::BeginFrameArgs::kInvalidFrameNumber; |
+ } |
+ |
+ if (!skipped_frames_) { |
+ latest_confirmed_begin_frame_source_id_ = ack.source_id; |
+ latest_confirmed_begin_frame_sequence_number_ = |
+ ack.latest_confirmed_sequence_number; |
+ } |
+} |
+ |
} // namespace content |