Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
index f80585a0f84bda8df033495a7f234670204f27c7..18fde6b83a170e67d4b645d7ab1e82fcb886602e 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -26,6 +26,7 @@ |
#include "base/strings/sys_string_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/sys_info.h" |
+#include "cc/base/switches.h" |
#import "content/browser/accessibility/browser_accessibility_cocoa.h" |
#include "content/browser/accessibility/browser_accessibility_manager_mac.h" |
#import "content/browser/cocoa/system_hotkey_helper_mac.h" |
@@ -511,6 +512,7 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
allow_pause_for_resize_or_repaint_(true), |
weak_factory_(this), |
fullscreen_parent_host_view_(NULL), |
+ needs_begin_frame_(false), |
software_frame_weak_ptr_factory_(this) { |
software_frame_manager_.reset(new SoftwareFrameManager( |
software_frame_weak_ptr_factory_.GetWeakPtr())); |
@@ -550,6 +552,10 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
} |
RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
+ if (display_link_) { |
+ DCHECK(needs_begin_frame_); |
+ display_link_->RemoveObserver(this); |
+ } |
gfx::Screen::GetScreenFor(cocoa_view_)->RemoveObserver(this); |
// This is being called from |cocoa_view_|'s destructor, so invalidate the |
@@ -651,7 +657,10 @@ void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { |
browser_compositor_view_.reset(new BrowserCompositorViewMac(this)); |
delegated_frame_host_->AddedToWindow(); |
- delegated_frame_host_->WasShown(); |
+ delegated_frame_host_->WasShown(ui::LatencyInfo()); |
brianderson
2014/09/04 18:45:46
Why pass ui::LatencyInfo() now?
|
+ |
+ if (needs_begin_frame_) |
+ GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_); |
} |
void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { |
@@ -663,6 +672,11 @@ void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { |
delegated_frame_host_->WasHidden(); |
delegated_frame_host_->RemovingFromWindow(); |
browser_compositor_view_.reset(); |
+ |
+ if (needs_begin_frame_) { |
+ GetCompositor()->RemoveBeginFrameObserver(this); |
+ needs_begin_frame_ = false; |
+ } |
} |
void RenderWidgetHostViewMac::EnsureSoftwareLayer() { |
@@ -734,6 +748,7 @@ bool RenderWidgetHostViewMac::OnMessageReceived(const IPC::Message& message) { |
IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewMac, message) |
IPC_MESSAGE_HANDLER(ViewHostMsg_PluginFocusChanged, OnPluginFocusChanged) |
IPC_MESSAGE_HANDLER(ViewHostMsg_StartPluginIme, OnStartPluginIme) |
+ IPC_MESSAGE_HANDLER(ViewHostMsg_SetNeedsBeginFrame, OnSetNeedsBeginFrame) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -858,20 +873,27 @@ void RenderWidgetHostViewMac::UpdateDisplayLink() { |
// Note that on some headless systems, the display link will fail to be |
// created, so this should not be a fatal error. |
LOG(ERROR) << "Failed to create display link."; |
+ return; |
} |
+ |
+ display_link_->AddObserver(this); |
} |
-void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { |
- if (!render_widget_host_ || !display_link_) |
- return; |
+void RenderWidgetHostViewMac::OnSetNeedsBeginFrame(bool enabled) { |
+ DCHECK(display_link_); |
- if (!display_link_->GetVSyncParameters(&vsync_timebase_, &vsync_interval_)) { |
- vsync_timebase_ = base::TimeTicks(); |
- vsync_interval_ = base::TimeDelta(); |
+ if (needs_begin_frame_ == enabled) |
return; |
- } |
- render_widget_host_->UpdateVSyncParameters(vsync_timebase_, vsync_interval_); |
+ TRACE_EVENT1("cc", "RenderWidgetHostViewMac::OnSetNeedsBeginFrame", |
+ "enabled", enabled); |
+ |
+ needs_begin_frame_ = enabled; |
+ |
+ if (enabled) |
+ GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_); |
+ else |
+ DCHECK(!GetCompsoitr()); |
brianderson
2014/09/04 18:45:46
RemoveBeginFrameObserver?
|
} |
void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { |
@@ -1858,8 +1880,6 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
scale_factor, pixel_size); |
} |
- SendVSyncParametersToRenderer(); |
- |
delegated_frame_host_->SwapDelegatedFrame( |
output_surface_id, |
frame->delegated_frame_data.Pass(), |
@@ -2014,7 +2034,6 @@ void RenderWidgetHostViewMac::ShutdownHost() { |
void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
EnsureCompositedIOSurfaceLayer(); |
- SendVSyncParametersToRenderer(); |
// Delete software backingstore and layer. |
software_frame_manager_->DiscardCurrentFrame(); |
@@ -2029,7 +2048,6 @@ void RenderWidgetHostViewMac::GotSoftwareFrame() { |
EnsureSoftwareLayer(); |
LayoutLayers(); |
- SendVSyncParametersToRenderer(); |
// Draw the contents of the frame immediately. It is critical that this |
// happen before the frame be acked, otherwise the new frame will likely be |
@@ -2342,6 +2360,33 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
UpdateScreenInfo(cocoa_view_); |
} |
+void RenderWidgetHostViewMac::OnSendBeginFrame( |
+ const cc::BeginFrameArgs& args) { |
+ DCHECK(display_link_); |
+ DCHECK(render_widget_host_); |
+ TRACE_EVENT0("cc", "RenderWidgetHostViewMac::OnSendBeginFrame"); |
+ |
+ delegated_frame_host_->UpdateVSyncParameters(args); |
+ |
+ render_widget_host_->Send( |
+ new ViewMsg_BeginFrame(render_widget_host_->GetRoutingID(), args)); |
+ last_begin_frame_args_ = args; |
+ vsync_timebase_ = args.frame_time; |
+ vsync_interval_ = args.interval; |
+} |
+ |
+void RenderWidgetHostViewMac::OnVSync(base::TimeTicks timebase, |
+ base::TimeDelta interval) { |
+ DCHECK(display_link_); |
+ |
+ if (!GetCompositor()) |
+ return; |
+ |
+ GetCompositor()->StartBeginFrame(cc::BeginFrameArgs::Create(timebase, |
+ timebase + interval, |
+ interval)); |
+} |
+ |
} // namespace content |
// RenderWidgetHostViewCocoa --------------------------------------------------- |