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..89e0e002fb3fd5b7a60516bda4ae0384f82c0632 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()) { |
+ 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; |
+ } |
+ |
+ if (begin_frame_source_) |
+ begin_frame_source_->DidFinishFrame(this, ack); |
Eric Seckler
2017/03/14 11:13:41
+fsamuel, +brianderson:
Regarding the discussion
Fady Samuel
2017/03/14 11:31:38
Could we do this from Surface::ActivateFrame then,
|
+} |
+ |
+void RenderWidgetHostViewAura::OnBeginFrameDidNotDraw( |
+ 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()) { |
+ // 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() { |