Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| index 1000c12f3f4f68d67ca1f1d5ad571e50f92963a4..3a06ae7fd5ffb637a7e0afd0e5fe539e16171973 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| @@ -387,6 +387,8 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, |
| is_loading_(false), |
| has_composition_text_(false), |
| begin_frame_source_(nullptr), |
| + latest_confirmed_begin_frame_sequence_number_( |
| + cc::BeginFrameArgs::kInvalidFrameNumber), |
| needs_begin_frames_(false), |
| needs_flush_input_(false), |
| added_frame_observer_(false), |
| @@ -675,8 +677,13 @@ void RenderWidgetHostViewAura::UpdateNeedsBeginFramesInternal() { |
| begin_frame_source_->RemoveObserver(this); |
| } |
| -void RenderWidgetHostViewAura::OnBeginFrame( |
| - const cc::BeginFrameArgs& args) { |
| +void RenderWidgetHostViewAura::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| + if (args.source_id != last_begin_frame_args_.source_id) { |
| + // Source changed, we don't know our freshness anymore. |
| + latest_confirmed_begin_frame_sequence_number_ = |
| + cc::BeginFrameArgs::kInvalidFrameNumber; |
| + } |
| + |
| needs_flush_input_ = false; |
| host_->FlushInput(); |
| UpdateNeedsBeginFramesInternal(); |
| @@ -950,6 +957,37 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame( |
| } |
| selection_controller_->OnSelectionBoundsChanged(selection.start, |
| selection.end); |
| + |
| + cc::BeginFrameAck ack(frame.metadata.begin_frame_ack); |
| + DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); |
| + // The CompositorFrame's damage was only incorporated if it wasn't skipped. |
| + if (delegated_frame_host_->skipped_frames()) { |
|
piman
2017/03/14 20:06:44
delegated_frame_host_ may not exist (e.g. if IsMus
Eric Seckler
2017/03/15 11:56:48
Code moved, checks aren't necessary anymore.
|
| + ack.has_damage = false; |
| + ack.latest_confirmed_sequence_number = |
| + latest_confirmed_begin_frame_sequence_number_; |
| + } else { |
| + DCHECK(ack.has_damage); |
| + latest_confirmed_begin_frame_sequence_number_ = |
| + ack.latest_confirmed_sequence_number; |
| + } |
|
piman
2017/03/14 20:06:44
Could it be useful to move this logic to Delegated
Eric Seckler
2017/03/15 11:56:48
Sounds good, done. I'll add the actual calls to Di
|
| + |
| + if (begin_frame_source_) |
| + begin_frame_source_->DidFinishFrame(this, ack); |
| +} |
| + |
| +void RenderWidgetHostViewAura::OnBeginFrameDidNotSwap( |
| + const cc::BeginFrameAck& ack) { |
| + DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); |
| + DCHECK(!ack.has_damage); |
| + cc::BeginFrameAck modified_ack = ack; |
| + if (delegated_frame_host_->skipped_frames()) { |
|
piman
2017/03/14 20:06:44
ditto, delegated_frame_host_ may not exist
Eric Seckler
2017/03/15 11:56:48
Gone, too.
|
| + // If DelegatedFrameHost skipped the last frame(s), we need to wait for a |
| + // newly submitted CompositorFrame before confirming newer sequence numbers. |
| + modified_ack.latest_confirmed_sequence_number = |
| + latest_confirmed_begin_frame_sequence_number_; |
| + } |
| + if (begin_frame_source_) |
| + begin_frame_source_->DidFinishFrame(this, modified_ack); |
| } |
| void RenderWidgetHostViewAura::ClearCompositorFrame() { |