Index: content/browser/renderer_host/browser_compositor_view_mac.mm |
diff --git a/content/browser/renderer_host/browser_compositor_view_mac.mm b/content/browser/renderer_host/browser_compositor_view_mac.mm |
index 93944dc85ad8f932bca73699111991cfd9af903f..20b50133b69a7b69dbf79ed7db510249a5ee3f65 100644 |
--- a/content/browser/renderer_host/browser_compositor_view_mac.mm |
+++ b/content/browser/renderer_host/browser_compositor_view_mac.mm |
@@ -279,8 +279,33 @@ void BrowserCompositorMac::SwapCompositorFrame( |
recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor, |
pixel_size); |
} |
+ uint64_t begin_frame_source_id = frame.metadata.begin_frame_source_id; |
+ uint64_t begin_frame_number = frame.metadata.begin_frame_number; |
+ uint64_t latest_confirmed_frame = frame.metadata.latest_confirmed_frame; |
+ |
delegated_frame_host_->SwapDelegatedFrame(compositor_frame_sink_id, |
std::move(frame)); |
+ |
+ // The CompositorFrame's damage was only incorporated if it wasn't skipped. |
+ bool has_damage = false; |
+ if (!delegated_frame_host_->skipped_frames()) { |
+ latest_confirmed_frame_ = latest_confirmed_frame; |
+ has_damage = true; |
+ } |
+ |
+ cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number, |
+ latest_confirmed_frame_, 0, has_damage); |
+ if (begin_frame_source_) |
+ begin_frame_source_->DidFinishFrame(this, ack); |
+} |
+ |
+void BrowserCompositorMac::OnBeginFrameDidNotDraw( |
+ const cc::BeginFrameAck& ack) { |
+ // DelegatedFrameHost may have skipped the last frame(s). |
+ cc::BeginFrameAck modified_ack = ack; |
+ modified_ack.latest_confirmed_frame = latest_confirmed_frame_; |
+ if (begin_frame_source_) |
+ begin_frame_source_->DidFinishFrame(this, modified_ack); |
} |
void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { |
@@ -460,6 +485,12 @@ bool BrowserCompositorMac::IsAutoResizeEnabled() const { |
// cc::BeginFrameSourceBase, public: |
void BrowserCompositorMac::OnBeginFrame(const cc::BeginFrameArgs& args) { |
+ if (args.source_id != last_begin_frame_args_.source_id) { |
+ // Consider us up to date up to the previous BeginFrame. |
+ DCHECK_LT(cc::BeginFrameArgs::kInvalidFrameNumber, args.sequence_number); |
+ latest_confirmed_frame_ = args.sequence_number - 1; |
+ } |
+ |
client_->BrowserCompositorMacSendBeginFrame(args); |
last_begin_frame_args_ = args; |
} |