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() { |