OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/browser_compositor_view_mac.h" | 5 #include "content/browser/renderer_host/browser_compositor_view_mac.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 // Compute the frame size based on the root render pass rect size. | 272 // Compute the frame size based on the root render pass rect size. |
273 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); | 273 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
274 float scale_factor = frame.metadata.device_scale_factor; | 274 float scale_factor = frame.metadata.device_scale_factor; |
275 gfx::Size pixel_size = root_pass->output_rect.size(); | 275 gfx::Size pixel_size = root_pass->output_rect.size(); |
276 gfx::Size dip_size = gfx::ConvertSizeToDIP(scale_factor, pixel_size); | 276 gfx::Size dip_size = gfx::ConvertSizeToDIP(scale_factor, pixel_size); |
277 root_layer_->SetBounds(gfx::Rect(dip_size)); | 277 root_layer_->SetBounds(gfx::Rect(dip_size)); |
278 if (recyclable_compositor_) { | 278 if (recyclable_compositor_) { |
279 recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor, | 279 recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor, |
280 pixel_size); | 280 pixel_size); |
281 } | 281 } |
| 282 uint64_t begin_frame_source_id = frame.metadata.begin_frame_source_id; |
| 283 uint64_t begin_frame_number = frame.metadata.begin_frame_number; |
| 284 uint64_t latest_confirmed_frame = frame.metadata.latest_confirmed_frame; |
| 285 |
282 delegated_frame_host_->SwapDelegatedFrame(compositor_frame_sink_id, | 286 delegated_frame_host_->SwapDelegatedFrame(compositor_frame_sink_id, |
283 std::move(frame)); | 287 std::move(frame)); |
| 288 |
| 289 // The CompositorFrame's damage was only incorporated if it wasn't skipped. |
| 290 bool has_damage = false; |
| 291 if (!delegated_frame_host_->skipped_frames()) { |
| 292 latest_confirmed_frame_ = latest_confirmed_frame; |
| 293 has_damage = true; |
| 294 } |
| 295 |
| 296 cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number, |
| 297 latest_confirmed_frame_, 0, has_damage); |
| 298 if (begin_frame_source_) |
| 299 begin_frame_source_->DidFinishFrame(this, ack); |
| 300 } |
| 301 |
| 302 void BrowserCompositorMac::OnBeginFrameDidNotDraw( |
| 303 const cc::BeginFrameAck& ack) { |
| 304 // DelegatedFrameHost may have skipped the last frame(s). |
| 305 cc::BeginFrameAck modified_ack = ack; |
| 306 modified_ack.latest_confirmed_frame = latest_confirmed_frame_; |
| 307 if (begin_frame_source_) |
| 308 begin_frame_source_->DidFinishFrame(this, modified_ack); |
284 } | 309 } |
285 | 310 |
286 void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { | 311 void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { |
287 has_transparent_background_ = transparent; | 312 has_transparent_background_ = transparent; |
288 if (recyclable_compositor_) { | 313 if (recyclable_compositor_) { |
289 recyclable_compositor_->compositor()->SetHostHasTransparentBackground( | 314 recyclable_compositor_->compositor()->SetHostHasTransparentBackground( |
290 has_transparent_background_); | 315 has_transparent_background_); |
291 } | 316 } |
292 } | 317 } |
293 | 318 |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 | 478 |
454 bool BrowserCompositorMac::IsAutoResizeEnabled() const { | 479 bool BrowserCompositorMac::IsAutoResizeEnabled() const { |
455 NOTREACHED(); | 480 NOTREACHED(); |
456 return false; | 481 return false; |
457 } | 482 } |
458 | 483 |
459 //////////////////////////////////////////////////////////////////////////////// | 484 //////////////////////////////////////////////////////////////////////////////// |
460 // cc::BeginFrameSourceBase, public: | 485 // cc::BeginFrameSourceBase, public: |
461 | 486 |
462 void BrowserCompositorMac::OnBeginFrame(const cc::BeginFrameArgs& args) { | 487 void BrowserCompositorMac::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| 488 if (args.source_id != last_begin_frame_args_.source_id) { |
| 489 // Consider us up to date up to the previous BeginFrame. |
| 490 DCHECK_LT(cc::BeginFrameArgs::kInvalidFrameNumber, args.sequence_number); |
| 491 latest_confirmed_frame_ = args.sequence_number - 1; |
| 492 } |
| 493 |
463 client_->BrowserCompositorMacSendBeginFrame(args); | 494 client_->BrowserCompositorMacSendBeginFrame(args); |
464 last_begin_frame_args_ = args; | 495 last_begin_frame_args_ = args; |
465 } | 496 } |
466 | 497 |
467 const cc::BeginFrameArgs& BrowserCompositorMac::LastUsedBeginFrameArgs() const { | 498 const cc::BeginFrameArgs& BrowserCompositorMac::LastUsedBeginFrameArgs() const { |
468 return last_begin_frame_args_; | 499 return last_begin_frame_args_; |
469 } | 500 } |
470 | 501 |
471 void BrowserCompositorMac::OnBeginFrameSourcePausedChanged(bool paused) { | 502 void BrowserCompositorMac::OnBeginFrameSourcePausedChanged(bool paused) { |
472 // Only used on Android WebView. | 503 // Only used on Android WebView. |
473 } | 504 } |
474 | 505 |
475 } // namespace content | 506 } // namespace content |
OLD | NEW |