Revert of Enable BeginFrame scheduling on aura (patchset #15 id:270001 of https://codereview.chromium.org/1016033006/)
Reason for revert:
Making Autofill interactive tests incredibly flaky again:
http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20(1)
http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Ozone%20Tests%20%281%29/
Original issue's description:
> Enable BeginFrame scheduling on aura
>
> This cl is last partial cl from https://codereview.chromium.org/775143003/
> for easy review.
> Until now, BeginFrame is initiated by each renderer process.
> With this cl, BeginFrame is scheduled from parent(browser) cc scheduler
> to child(renderer) cc scheduler.
> For more detailed information, please see this (http://goo.gl/D1Qxrr)
>
> Also, --enable-begin-frame-scheduling is no longer needed because all platform except Mac
> uses it as a default.
>
> R=brianderson@chromium.org, danakj@chromium.org, mithro@mithis.com
> BUG=372086
>
> Committed: https://crrev.com/17dd2f109f3155ebf183627b63df25f97f34b67f
> Cr-Commit-Position: refs/heads/master@{#322622}
>
> Committed: https://crrev.com/62a759e582743bca13f27d1ce5db3dc2fe66fbb6
> Cr-Commit-Position: refs/heads/master@{#328170}
TBR=brianderson@chromium.org,danakj@chromium.org,mithro@mithis.com,sievers@chromium.org,oshima@chromium.org,boliu@chromium.org,simonhong@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=372086
Review URL: https://codereview.chromium.org/1124523003
Cr-Commit-Position: refs/heads/master@{#328267}
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc
index 49cc4dd3..8520816 100644
--- a/android_webview/lib/main/aw_main_delegate.cc
+++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -60,6 +60,7 @@
BrowserViewRenderer::CalculateTileMemoryPolicy();
base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
+ cl->AppendSwitch(switches::kEnableBeginFrameScheduling);
// WebView uses the Android system's scrollbars and overscroll glow.
cl->AppendSwitch(switches::kDisableOverscrollEdgeEffect);
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc
index 1a8ab36..e28472e 100644
--- a/ash/display/display_controller.cc
+++ b/ash/display/display_controller.cc
@@ -37,6 +37,7 @@
#include "ui/aura/window_tracker.h"
#include "ui/aura/window_tree_host.h"
#include "ui/compositor/compositor.h"
+#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/gfx/display.h"
#include "ui/gfx/screen.h"
#include "ui/wm/core/coordinate_conversion.h"
@@ -150,9 +151,9 @@
DisplayMode mode =
GetDisplayManager()->GetActiveModeForDisplayId(display.id());
if (mode.refresh_rate > 0.0f) {
- host->compositor()->SetAuthoritativeVSyncInterval(
- base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
- mode.refresh_rate));
+ host->compositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
+ base::TimeDelta::FromMicroseconds(
+ base::Time::kMicrosecondsPerSecond / mode.refresh_rate));
}
// Just movnig the display requires the full redraw.
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc
index e76c532..bf31bf3 100644
--- a/chrome/browser/chromeos/login/chrome_restart_request.cc
+++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -96,6 +96,7 @@
::switches::kDisableThreadedScrolling,
::switches::kDisableTouchDragDrop,
::switches::kDisableTouchEditing,
+ ::switches::kEnableBeginFrameScheduling,
::switches::kEnableBlinkFeatures,
::switches::kEnableCompositorAnimationTimelines,
::switches::kEnableDelegatedRenderer,
diff --git a/content/browser/android/content_startup_flags.cc b/content/browser/android/content_startup_flags.cc
index 93426d8..e679825 100644
--- a/content/browser/android/content_startup_flags.cc
+++ b/content/browser/android/content_startup_flags.cc
@@ -54,6 +54,8 @@
parsed_command_line->AppendSwitch(switches::kSingleProcess);
}
+ parsed_command_line->AppendSwitch(switches::kEnableBeginFrameScheduling);
+
parsed_command_line->AppendSwitch(switches::kEnablePinch);
parsed_command_line->AppendSwitch(switches::kEnableOverlayFullscreenVideo);
parsed_command_line->AppendSwitch(switches::kEnableOverlayScrollbar);
diff --git a/content/browser/compositor/browser_compositor_output_surface.cc b/content/browser/compositor/browser_compositor_output_surface.cc
index a7181842..6839457 100644
--- a/content/browser/compositor/browser_compositor_output_surface.cc
+++ b/content/browser/compositor/browser_compositor_output_surface.cc
@@ -15,17 +15,21 @@
BrowserCompositorOutputSurface::BrowserCompositorOutputSurface(
const scoped_refptr<cc::ContextProvider>& context_provider,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator)
: OutputSurface(context_provider),
+ vsync_manager_(vsync_manager),
reflector_(nullptr) {
overlay_candidate_validator_ = overlay_candidate_validator.Pass();
Initialize();
}
BrowserCompositorOutputSurface::BrowserCompositorOutputSurface(
- scoped_ptr<cc::SoftwareOutputDevice> software_device)
+ scoped_ptr<cc::SoftwareOutputDevice> software_device,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
: OutputSurface(software_device.Pass()),
+ vsync_manager_(vsync_manager),
reflector_(nullptr) {
Initialize();
}
@@ -34,6 +38,9 @@
if (reflector_)
reflector_->DetachFromOutputSurface();
DCHECK(!reflector_);
+ if (!HasClient())
+ return;
+ vsync_manager_->RemoveObserver(this);
}
void BrowserCompositorOutputSurface::Initialize() {
@@ -41,13 +48,29 @@
capabilities_.adjust_deadline_for_parent = false;
}
-void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu(
+bool BrowserCompositorOutputSurface::BindToClient(
+ cc::OutputSurfaceClient* client) {
+ if (!OutputSurface::BindToClient(client))
+ return false;
+ // Don't want vsync notifications until there is a client.
+ vsync_manager_->AddObserver(this);
+ return true;
+}
+
+void BrowserCompositorOutputSurface::OnUpdateVSyncParameters(
base::TimeTicks timebase,
base::TimeDelta interval) {
DCHECK(HasClient());
CommitVSyncParameters(timebase, interval);
}
+void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu(
+ base::TimeTicks timebase,
+ base::TimeDelta interval) {
+ DCHECK(HasClient());
+ vsync_manager_->UpdateVSyncParameters(timebase, interval);
+}
+
void BrowserCompositorOutputSurface::SetReflector(ReflectorImpl* reflector) {
// Software mirroring is done by doing a GL copy out of the framebuffer - if
// we have overlays then that data will be missing.
diff --git a/content/browser/compositor/browser_compositor_output_surface.h b/content/browser/compositor/browser_compositor_output_surface.h
index dc63b68..615a54e3 100644
--- a/content/browser/compositor/browser_compositor_output_surface.h
+++ b/content/browser/compositor/browser_compositor_output_surface.h
@@ -8,6 +8,7 @@
#include "base/threading/non_thread_safe.h"
#include "cc/output/output_surface.h"
#include "content/common/content_export.h"
+#include "ui/compositor/compositor_vsync_manager.h"
namespace cc {
class SoftwareOutputDevice;
@@ -20,12 +21,19 @@
class WebGraphicsContext3DCommandBufferImpl;
class CONTENT_EXPORT BrowserCompositorOutputSurface
- : public cc::OutputSurface {
+ : public cc::OutputSurface,
+ public ui::CompositorVSyncManager::Observer {
public:
~BrowserCompositorOutputSurface() override;
+ // cc::OutputSurface implementation.
+ bool BindToClient(cc::OutputSurfaceClient* client) override;
cc::OverlayCandidateValidator* GetOverlayCandidateValidator() const override;
+ // ui::CompositorOutputSurface::Observer implementation.
+ void OnUpdateVSyncParameters(base::TimeTicks timebase,
+ base::TimeDelta interval) override;
+
void OnUpdateVSyncParametersFromGpu(base::TimeTicks tiembase,
base::TimeDelta interval);
@@ -41,13 +49,16 @@
// Constructor used by the accelerated implementation.
BrowserCompositorOutputSurface(
const scoped_refptr<cc::ContextProvider>& context,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator);
// Constructor used by the software implementation.
- explicit BrowserCompositorOutputSurface(
- scoped_ptr<cc::SoftwareOutputDevice> software_device);
+ BrowserCompositorOutputSurface(
+ scoped_ptr<cc::SoftwareOutputDevice> software_device,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager);
+ scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
ReflectorImpl* reflector_;
private:
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc
index 98d7ac17..f45e7f4 100644
--- a/content/browser/compositor/delegated_frame_host.cc
+++ b/content/browser/compositor/delegated_frame_host.cc
@@ -888,10 +888,13 @@
DCHECK(!compositor_);
}
-void DelegatedFrameHost::SetVSyncParameters(base::TimeTicks timebase,
- base::TimeDelta interval) {
+void DelegatedFrameHost::OnUpdateVSyncParameters(
+ base::TimeTicks timebase,
+ base::TimeDelta interval) {
vsync_timebase_ = timebase;
vsync_interval_ = interval;
+ if (client_->DelegatedFrameHostIsVisible())
+ client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval);
}
////////////////////////////////////////////////////////////////////////////////
@@ -917,6 +920,8 @@
surface_factory_->Destroy(surface_id_);
if (resource_collection_.get())
resource_collection_->SetClient(NULL);
+
+ DCHECK(!vsync_manager_.get());
}
void DelegatedFrameHost::RunOnCommitCallbacks() {
@@ -943,6 +948,9 @@
return;
compositor_ = compositor;
compositor_->AddObserver(this);
+ DCHECK(!vsync_manager_.get());
+ vsync_manager_ = compositor_->vsync_manager();
+ vsync_manager_->AddObserver(this);
}
void DelegatedFrameHost::ResetCompositor() {
@@ -955,6 +963,10 @@
}
if (compositor_->HasObserver(this))
compositor_->RemoveObserver(this);
+ if (vsync_manager_.get()) {
+ vsync_manager_->RemoveObserver(this);
+ vsync_manager_ = NULL;
+ }
compositor_ = nullptr;
}
diff --git a/content/browser/compositor/delegated_frame_host.h b/content/browser/compositor/delegated_frame_host.h
index 917623e..f208c26 100644
--- a/content/browser/compositor/delegated_frame_host.h
+++ b/content/browser/compositor/delegated_frame_host.h
@@ -18,6 +18,7 @@
#include "content/public/browser/render_process_host.h"
#include "ui/compositor/compositor.h"
#include "ui/compositor/compositor_observer.h"
+#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_owner_delegate.h"
#include "ui/gfx/geometry/rect_conversions.h"
@@ -60,6 +61,10 @@
int output_surface_id,
const cc::CompositorFrameAck& ack) = 0;
virtual void DelegatedFrameHostOnLostCompositorResources() = 0;
+
+ virtual void DelegatedFrameHostUpdateVSyncParameters(
+ const base::TimeTicks& timebase,
+ const base::TimeDelta& interval) = 0;
};
// The DelegatedFrameHost is used to host all of the RenderWidgetHostView state
@@ -68,6 +73,7 @@
// the ui::Compositor associated with its DelegatedFrameHostClient.
class CONTENT_EXPORT DelegatedFrameHost
: public ui::CompositorObserver,
+ public ui::CompositorVSyncManager::Observer,
public ui::LayerOwnerDelegate,
public ImageTransportFactoryObserver,
public DelegatedFrameEvictorClient,
@@ -93,7 +99,6 @@
gfx::Size GetRequestedRendererSize() const;
void SetCompositor(ui::Compositor* compositor);
void ResetCompositor();
- void SetVSyncParameters(base::TimeTicks timebase, base::TimeDelta interval);
// Note: |src_subset| is specified in DIP dimensions while |output_size|
// expects pixels.
void CopyFromCompositingSurface(const gfx::Rect& src_subrect,
@@ -153,6 +158,10 @@
void OnCompositingLockStateChanged(ui::Compositor* compositor) override;
void OnCompositingShuttingDown(ui::Compositor* compositor) override;
+ // Overridden from ui::CompositorVSyncManager::Observer:
+ void OnUpdateVSyncParameters(base::TimeTicks timebase,
+ base::TimeDelta interval) override;
+
// Overridden from ui::LayerOwnerObserver:
void OnLayerRecreated(ui::Layer* old_layer, ui::Layer* new_layer) override;
@@ -234,8 +243,11 @@
std::vector<base::Closure> on_compositing_did_commit_callbacks_;
+ // The vsync manager we are observing for changes, if any.
+ scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
+
// The current VSync timebase and interval. These are zero until the first
- // call to UpdateVSyncParameters().
+ // call to OnUpdateVSyncParameters().
base::TimeTicks vsync_timebase_;
base::TimeDelta vsync_interval_;
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
index b4a2596..09a8b7280 100644
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
@@ -18,9 +18,11 @@
GpuBrowserCompositorOutputSurface::GpuBrowserCompositorOutputSurface(
const scoped_refptr<ContextProviderCommandBuffer>& context,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator)
: BrowserCompositorOutputSurface(context,
+ vsync_manager,
overlay_candidate_validator.Pass()),
#if defined(OS_MACOSX)
should_show_frames_state_(SHOULD_SHOW_FRAMES),
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.h b/content/browser/compositor/gpu_browser_compositor_output_surface.h
index b1c8259..2b3d2b7 100644
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.h
@@ -8,6 +8,10 @@
#include "base/cancelable_callback.h"
#include "content/browser/compositor/browser_compositor_output_surface.h"
+namespace ui {
+class CompositorVSyncManager;
+}
+
namespace content {
class CommandBufferProxyImpl;
class BrowserCompositorOverlayCandidateValidator;
@@ -20,6 +24,7 @@
public:
GpuBrowserCompositorOutputSurface(
const scoped_refptr<ContextProviderCommandBuffer>& context,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator);
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 330aaa84..151ba00 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -280,12 +280,13 @@
scoped_ptr<BrowserCompositorOutputSurface> surface;
if (!create_gpu_output_surface) {
surface = make_scoped_ptr(new SoftwareBrowserCompositorOutputSurface(
- CreateSoftwareOutputDevice(compositor.get())));
+ CreateSoftwareOutputDevice(compositor.get()),
+ compositor->vsync_manager()));
} else {
DCHECK(context_provider);
if (!data->surface_id) {
surface = make_scoped_ptr(new OffscreenBrowserCompositorOutputSurface(
- context_provider,
+ context_provider, compositor->vsync_manager(),
scoped_ptr<BrowserCompositorOverlayCandidateValidator>()));
} else
#if defined(USE_OZONE)
@@ -293,14 +294,14 @@
->CanShowPrimaryPlaneAsOverlay()) {
surface =
make_scoped_ptr(new GpuSurfacelessBrowserCompositorOutputSurface(
- context_provider, data->surface_id,
+ context_provider, data->surface_id, compositor->vsync_manager(),
CreateOverlayCandidateValidator(compositor->widget()), GL_RGB,
BrowserGpuMemoryBufferManager::current()));
} else
#endif
{
surface = make_scoped_ptr(new GpuBrowserCompositorOutputSurface(
- context_provider,
+ context_provider, compositor->vsync_manager(),
CreateOverlayCandidateValidator(compositor->widget())));
}
}
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
index 041a41c..ff77fa9 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
@@ -20,11 +20,13 @@
GpuSurfacelessBrowserCompositorOutputSurface(
const scoped_refptr<ContextProviderCommandBuffer>& context,
int surface_id,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator,
unsigned internalformat,
BrowserGpuMemoryBufferManager* gpu_memory_buffer_manager)
: GpuBrowserCompositorOutputSurface(context,
+ vsync_manager,
overlay_candidate_validator.Pass()),
internalformat_(internalformat),
gpu_memory_buffer_manager_(gpu_memory_buffer_manager) {
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
index ff66d02..7f634dd 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
@@ -19,6 +19,7 @@
GpuSurfacelessBrowserCompositorOutputSurface(
const scoped_refptr<ContextProviderCommandBuffer>& context,
int surface_id,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator,
unsigned internalformat,
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
index 0e528d9..9fa5026 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -29,9 +29,11 @@
OffscreenBrowserCompositorOutputSurface::
OffscreenBrowserCompositorOutputSurface(
const scoped_refptr<ContextProviderCommandBuffer>& context,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator)
: BrowserCompositorOutputSurface(context,
+ vsync_manager,
overlay_candidate_validator.Pass()),
fbo_(0),
is_backbuffer_discarded_(false),
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.h b/content/browser/compositor/offscreen_browser_compositor_output_surface.h
index 1672101..e9fbe6d 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.h
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.h
@@ -9,6 +9,10 @@
#include "base/memory/weak_ptr.h"
#include "content/browser/compositor/browser_compositor_output_surface.h"
+namespace ui {
+class CompositorVSyncManager;
+}
+
namespace content {
class CommandBufferProxyImpl;
@@ -17,6 +21,7 @@
public:
OffscreenBrowserCompositorOutputSurface(
const scoped_refptr<ContextProviderCommandBuffer>& context,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
scoped_ptr<BrowserCompositorOverlayCandidateValidator>
overlay_candidate_validator);
diff --git a/content/browser/compositor/reflector_impl_unittest.cc b/content/browser/compositor/reflector_impl_unittest.cc
index 231015f..867a9de1 100644
--- a/content/browser/compositor/reflector_impl_unittest.cc
+++ b/content/browser/compositor/reflector_impl_unittest.cc
@@ -69,9 +69,11 @@
class TestOutputSurface : public BrowserCompositorOutputSurface {
public:
- explicit TestOutputSurface(
- const scoped_refptr<cc::ContextProvider>& context_provider)
+ TestOutputSurface(
+ const scoped_refptr<cc::ContextProvider>& context_provider,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
: BrowserCompositorOutputSurface(context_provider,
+ vsync_manager,
CreateTestValidatorOzone().Pass()) {}
void SetFlip(bool flip) { capabilities_.flipped_output_surface = flip; }
@@ -111,7 +113,9 @@
context_provider_ = cc::TestContextProvider::Create(
cc::TestWebGraphicsContext3D::Create().Pass());
output_surface_ =
- scoped_ptr<TestOutputSurface>(new TestOutputSurface(context_provider_));
+ scoped_ptr<TestOutputSurface>(
+ new TestOutputSurface(context_provider_,
+ compositor_->vsync_manager())).Pass();
CHECK(output_surface_->BindToClient(&output_surface_client_));
mirroring_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
diff --git a/content/browser/compositor/software_browser_compositor_output_surface.cc b/content/browser/compositor/software_browser_compositor_output_surface.cc
index 5e5e9bbf..c2b70d4 100644
--- a/content/browser/compositor/software_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/software_browser_compositor_output_surface.cc
@@ -17,8 +17,10 @@
namespace content {
SoftwareBrowserCompositorOutputSurface::SoftwareBrowserCompositorOutputSurface(
- scoped_ptr<cc::SoftwareOutputDevice> software_device)
- : BrowserCompositorOutputSurface(software_device.Pass()),
+ scoped_ptr<cc::SoftwareOutputDevice> software_device,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
+ : BrowserCompositorOutputSurface(software_device.Pass(),
+ vsync_manager),
weak_factory_(this) {
}
diff --git a/content/browser/compositor/software_browser_compositor_output_surface.h b/content/browser/compositor/software_browser_compositor_output_surface.h
index 520aca89..68776ca 100644
--- a/content/browser/compositor/software_browser_compositor_output_surface.h
+++ b/content/browser/compositor/software_browser_compositor_output_surface.h
@@ -13,13 +13,18 @@
class SoftwareOutputDevice;
}
+namespace ui {
+class CompositorVSyncManager;
+}
+
namespace content {
class CONTENT_EXPORT SoftwareBrowserCompositorOutputSurface
: public BrowserCompositorOutputSurface {
public:
SoftwareBrowserCompositorOutputSurface(
- scoped_ptr<cc::SoftwareOutputDevice> software_device);
+ scoped_ptr<cc::SoftwareOutputDevice> software_device,
+ const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager);
~SoftwareBrowserCompositorOutputSurface() override;
diff --git a/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc b/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc
index 7dc2e28..68534f0c 100644
--- a/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc
+++ b/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc
@@ -104,7 +104,9 @@
SoftwareBrowserCompositorOutputSurfaceTest::CreateSurface(
scoped_ptr<cc::SoftwareOutputDevice> device) {
return scoped_ptr<content::BrowserCompositorOutputSurface>(
- new content::SoftwareBrowserCompositorOutputSurface(device.Pass()));
+ new content::SoftwareBrowserCompositorOutputSurface(
+ device.Pass(),
+ compositor_->vsync_manager()));
}
TEST_F(SoftwareBrowserCompositorOutputSurfaceTest, NoVSyncProvider) {
diff --git a/content/browser/renderer_host/begin_frame_observer_proxy.cc b/content/browser/renderer_host/begin_frame_observer_proxy.cc
index 06baa18b..7a6651f 100644
--- a/content/browser/renderer_host/begin_frame_observer_proxy.cc
+++ b/content/browser/renderer_host/begin_frame_observer_proxy.cc
@@ -14,7 +14,6 @@
}
BeginFrameObserverProxy::~BeginFrameObserverProxy() {
- DCHECK(!compositor_);
}
void BeginFrameObserverProxy::SetNeedsBeginFrames(bool needs_begin_frames) {
@@ -39,7 +38,6 @@
DCHECK(compositor);
compositor_ = compositor;
- compositor_->AddObserver(this);
if (needs_begin_frames_)
StartObservingBeginFrames();
}
@@ -47,7 +45,6 @@
void BeginFrameObserverProxy::ResetCompositor() {
if (!compositor_)
return;
- compositor_->RemoveObserver(this);
if (needs_begin_frames_)
StopObservingBeginFrames();
@@ -60,11 +57,6 @@
last_sent_begin_frame_args_ = args;
}
-void BeginFrameObserverProxy::OnCompositingShuttingDown(
- ui::Compositor* compositor) {
- ResetCompositor();
-}
-
void BeginFrameObserverProxy::StartObservingBeginFrames() {
DCHECK(compositor_);
compositor_->AddBeginFrameObserver(this);
diff --git a/content/browser/renderer_host/begin_frame_observer_proxy.h b/content/browser/renderer_host/begin_frame_observer_proxy.h
index 291d8bb8..fd2aa6d 100644
--- a/content/browser/renderer_host/begin_frame_observer_proxy.h
+++ b/content/browser/renderer_host/begin_frame_observer_proxy.h
@@ -25,8 +25,7 @@
// This class is used to manage all of the RenderWidgetHostView state and
// functionality that is associated with BeginFrame message handling.
class CONTENT_EXPORT BeginFrameObserverProxy
- : public ui::CompositorBeginFrameObserver,
- public ui::CompositorObserver {
+ : public ui::CompositorBeginFrameObserver {
public:
explicit BeginFrameObserverProxy(BeginFrameObserverProxyClient* client);
~BeginFrameObserverProxy() override;
@@ -39,17 +38,6 @@
// Overridden from ui::CompositorBeginFrameObserver:
void OnSendBeginFrame(const cc::BeginFrameArgs& args) override;
- // Overridden from ui::CompositorObserver:
- // TODO(simonhong): Stop overriding ui::CompositorObserver. We need to make
- // sure that this class should be destroyed before ui::Compositor.
- void OnCompositingDidCommit(ui::Compositor* compositor) override {}
- void OnCompositingStarted(ui::Compositor* compositor,
- base::TimeTicks start_time) override {}
- void OnCompositingEnded(ui::Compositor* compositor) override {}
- void OnCompositingAborted(ui::Compositor* compositor) override {}
- void OnCompositingLockStateChanged(ui::Compositor* compositor) override {}
- void OnCompositingShuttingDown(ui::Compositor* compositor) override;
-
private:
void StartObservingBeginFrames();
void StopObservingBeginFrames();
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 988e394..25a4fa3 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1240,6 +1240,7 @@
switches::kDisableTouchEditing,
switches::kDisableV8IdleTasks,
switches::kDomAutomationController,
+ switches::kEnableBeginFrameScheduling,
switches::kEnableBleedingEdgeRenderingFastPaths,
switches::kEnableBlinkFeatures,
switches::kEnableBrowserSideNavigation,
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 ac035cf..fd85fcc 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -66,6 +66,7 @@
#include "ui/base/hit_test.h"
#include "ui/base/ime/input_method.h"
#include "ui/base/ui_base_types.h"
+#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/compositor/dip_util.h"
#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event.h"
@@ -443,7 +444,6 @@
has_snapped_to_boundary_(false),
touch_editing_client_(NULL),
is_guest_view_hack_(is_guest_view_hack),
- begin_frame_observer_proxy_(this),
weak_ptr_factory_(this) {
if (!is_guest_view_hack_)
host_->SetView(this);
@@ -473,8 +473,6 @@
// RenderWidgetHostViewAndroid should also be moved at the same time.
IPC_MESSAGE_HANDLER(ViewHostMsg_TextInputStateChanged,
OnTextInputStateChanged)
- IPC_MESSAGE_HANDLER(ViewHostMsg_SetNeedsBeginFrames,
- OnSetNeedsBeginFrames)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -704,15 +702,6 @@
return this;
}
-void RenderWidgetHostViewAura::OnSetNeedsBeginFrames(bool needs_begin_frames) {
- begin_frame_observer_proxy_.SetNeedsBeginFrames(needs_begin_frames);
-}
-
-void RenderWidgetHostViewAura::SendBeginFrame(const cc::BeginFrameArgs& args) {
- delegated_frame_host_->SetVSyncParameters(args.frame_time, args.interval);
- host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args));
-}
-
void RenderWidgetHostViewAura::SetKeyboardFocus() {
#if defined(OS_WIN)
if (CanFocus()) {
@@ -2640,8 +2629,6 @@
#endif
delegated_frame_host_->SetCompositor(window_->GetHost()->compositor());
- if (window_->GetHost()->compositor())
- begin_frame_observer_proxy_.SetCompositor(window_->GetHost()->compositor());
}
void RenderWidgetHostViewAura::RemovingFromRootWindow() {
@@ -2654,7 +2641,6 @@
window_->GetHost()->RemoveObserver(this);
delegated_frame_host_->ResetCompositor();
- begin_frame_observer_proxy_.ResetCompositor();
#if defined(OS_WIN)
// Update the legacy window's parent temporarily to the desktop window. It
@@ -2766,6 +2752,12 @@
host_->ScheduleComposite();
}
+void RenderWidgetHostViewAura::DelegatedFrameHostUpdateVSyncParameters(
+ const base::TimeTicks& timebase,
+ const base::TimeDelta& interval) {
+ host_->UpdateVSyncParameters(timebase, interval);
+}
+
void RenderWidgetHostViewAura::OnDidNavigateMainFrameToNewPage() {
ui::GestureRecognizer::Get()->CancelActiveTouches(window_);
}
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index f3f6869b..69fe6612 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -20,7 +20,6 @@
#include "content/browser/compositor/delegated_frame_host.h"
#include "content/browser/compositor/image_transport_factory.h"
#include "content/browser/compositor/owned_mailbox.h"
-#include "content/browser/renderer_host/begin_frame_observer_proxy.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "content/common/content_export.h"
#include "content/common/cursors/webcursor.h"
@@ -81,7 +80,6 @@
class CONTENT_EXPORT RenderWidgetHostViewAura
: public RenderWidgetHostViewBase,
public DelegatedFrameHostClient,
- public BeginFrameObserverProxyClient,
public ui::TextInputClient,
public gfx::DisplayObserver,
public aura::WindowTreeHostObserver,
@@ -473,9 +471,9 @@
int output_surface_id,
const cc::CompositorFrameAck& ack) override;
void DelegatedFrameHostOnLostCompositorResources() override;
-
- // BeginFrameObserverProxyClient implementation.
- void SendBeginFrame(const cc::BeginFrameArgs& args) override;
+ void DelegatedFrameHostUpdateVSyncParameters(
+ const base::TimeTicks& timebase,
+ const base::TimeDelta& interval) override;
// Detaches |this| from the input method object.
void DetachFromInputMethod();
@@ -498,9 +496,6 @@
// Helper function to set keyboard focus to the main window.
void SetKeyboardFocus();
- // Called when RenderWidget wants to start BeginFrame scheduling or stop.
- void OnSetNeedsBeginFrames(bool needs_begin_frames);
-
RenderFrameHostImpl* GetFocusedFrame();
// Returns true if the |event| passed in can be forwarded to the renderer.
@@ -675,8 +670,6 @@
// compositing surface and showing the disambiguation popup.
gfx::Vector2dF disambiguation_scroll_offset_;
- BeginFrameObserverProxy begin_frame_observer_proxy_;
-
base::WeakPtrFactory<RenderWidgetHostViewAura> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAura);
};
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 18fd462d..4990269 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -491,6 +491,9 @@
int output_surface_id,
const cc::CompositorFrameAck& ack) override;
void DelegatedFrameHostOnLostCompositorResources() override;
+ void DelegatedFrameHostUpdateVSyncParameters(
+ const base::TimeTicks& timebase,
+ const base::TimeDelta& interval) override;
// AcceleratedWidgetMacNSView implementation.
NSView* AcceleratedWidgetGetNSView() const override;
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 0e1e67b..22707f03b 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -459,6 +459,12 @@
render_widget_host_->ScheduleComposite();
}
+void RenderWidgetHostViewMac::DelegatedFrameHostUpdateVSyncParameters(
+ const base::TimeTicks& timebase,
+ const base::TimeDelta& interval) {
+ render_widget_host_->UpdateVSyncParameters(timebase, interval);
+}
+
////////////////////////////////////////////////////////////////////////////////
// AcceleratedWidgetMacNSView, public:
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 29b713f2..43c7174f 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -295,6 +295,9 @@
// Enable the experimental Credential Manager JavaScript API.
const char kEnableCredentialManagerAPI[] = "enable-credential-manager-api";
+// Use a BeginFrame signal from browser to renderer to schedule rendering.
+const char kEnableBeginFrameScheduling[] = "enable-begin-frame-scheduling";
+
// Enable the creation of compositing layers when it would prevent LCD text.
const char kEnablePreferCompositingToLCDText[] =
"enable-prefer-compositing-to-lcd-text";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index d50bdac5..c056b6b 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -92,6 +92,7 @@
CONTENT_EXPORT extern const char kEnableBleedingEdgeRenderingFastPaths[];
CONTENT_EXPORT extern const char kEnableCompositorAnimationTimelines[];
CONTENT_EXPORT extern const char kEnableCredentialManagerAPI[];
+CONTENT_EXPORT extern const char kEnableBeginFrameScheduling[];
CONTENT_EXPORT extern const char kEnablePreferCompositingToLCDText[];
CONTENT_EXPORT extern const char kEnableBlinkFeatures[];
CONTENT_EXPORT extern const char kEnableBrowserSideNavigation[];
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 6eb57c9c..f3f6489 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -233,13 +233,12 @@
settings.use_compositor_animation_timelines = true;
blink::WebRuntimeFeatures::enableCompositorAnimationTimelines(true);
}
-#if !defined(OS_MACOSX)
- if (!widget_->for_oopif()) {
+ if (cmd->HasSwitch(switches::kEnableBeginFrameScheduling) &&
+ !widget_->for_oopif()) {
// TODO(simonhong): Apply BeginFrame scheduling for OOPIF.
// See crbug.com/471411.
settings.use_external_begin_frame_source = true;
}
-#endif
settings.default_tile_size = CalculateDefaultTileSize(widget_);
if (cmd->HasSwitch(switches::kDefaultTileWidth)) {
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index 9002d5e92..a0944fe 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -20,6 +20,8 @@
"compositor_observer.h",
"compositor_switches.cc",
"compositor_switches.h",
+ "compositor_vsync_manager.cc",
+ "compositor_vsync_manager.h",
"debug_utils.cc",
"debug_utils.h",
"dip_util.cc",
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 67a937e..c50f9ef 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -27,6 +27,7 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/compositor/compositor_switches.h"
+#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/compositor/dip_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animator_collection.h"
@@ -72,6 +73,7 @@
widget_(widget),
surface_id_allocator_(context_factory->CreateSurfaceIdAllocator()),
task_runner_(task_runner),
+ vsync_manager_(new CompositorVSyncManager()),
device_scale_factor_(0.0f),
last_started_frame_(0),
last_ended_frame_(0),
@@ -255,9 +257,8 @@
return host_->visible();
}
-void Compositor::SetAuthoritativeVSyncInterval(
- const base::TimeDelta& interval) {
- host_->SetAuthoritativeVSyncInterval(interval);
+scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const {
+ return vsync_manager_;
}
void Compositor::AddObserver(CompositorObserver* observer) {
diff --git a/ui/compositor/compositor.gyp b/ui/compositor/compositor.gyp
index 41950aa..92f5ef4e 100644
--- a/ui/compositor/compositor.gyp
+++ b/ui/compositor/compositor.gyp
@@ -38,6 +38,8 @@
'compositor_observer.h',
'compositor_switches.cc',
'compositor_switches.h',
+ 'compositor_vsync_manager.cc',
+ 'compositor_vsync_manager.h',
'debug_utils.cc',
'debug_utils.h',
'dip_util.cc',
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index 7965b15e..cf115b0 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -220,17 +220,12 @@
// Gets the visibility of the underlying compositor.
bool IsVisible();
- // The "authoritative" vsync interval, if provided, will override interval
- // reported from 3D context. This is typically the value reported by a more
- // reliable source, e.g, the platform display configuration.
- // In the particular case of ChromeOS -- this is the value queried through
- // XRandR, which is more reliable than the value queried through the 3D
- // context.
- void SetAuthoritativeVSyncInterval(const base::TimeDelta& interval);
-
// Returns the widget for this compositor.
gfx::AcceleratedWidget widget() const { return widget_; }
+ // Returns the vsync manager for this compositor.
+ scoped_refptr<CompositorVSyncManager> vsync_manager() const;
+
// Returns the main thread task runner this compositor uses. Users of the
// compositor generally shouldn't use this.
scoped_refptr<base::SingleThreadTaskRunner> task_runner() const {
@@ -342,6 +337,9 @@
scoped_ptr<cc::LayerTreeHost> host_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+ // The manager of vsync parameters for this compositor.
+ scoped_refptr<CompositorVSyncManager> vsync_manager_;
+
// The device scale factor of the monitor that this compositor is compositing
// layers on.
float device_scale_factor_;
diff --git a/ui/compositor/compositor_vsync_manager.cc b/ui/compositor/compositor_vsync_manager.cc
new file mode 100644
index 0000000..f51847c
--- /dev/null
+++ b/ui/compositor/compositor_vsync_manager.cc
@@ -0,0 +1,46 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/compositor/compositor_vsync_manager.h"
+
+namespace ui {
+
+CompositorVSyncManager::CompositorVSyncManager()
+ : authoritative_vsync_interval_(base::TimeDelta::FromSeconds(0)) {
+}
+
+CompositorVSyncManager::~CompositorVSyncManager() {}
+
+void CompositorVSyncManager::SetAuthoritativeVSyncInterval(
+ base::TimeDelta interval) {
+ authoritative_vsync_interval_ = interval;
+ last_interval_ = interval;
+ NotifyObservers(last_timebase_, last_interval_);
+}
+
+void CompositorVSyncManager::UpdateVSyncParameters(base::TimeTicks timebase,
+ base::TimeDelta interval) {
+ if (authoritative_vsync_interval_ != base::TimeDelta::FromSeconds(0))
+ interval = authoritative_vsync_interval_;
+ last_timebase_ = timebase;
+ last_interval_ = interval;
+ NotifyObservers(timebase, interval);
+}
+
+void CompositorVSyncManager::AddObserver(Observer* observer) {
+ observer_list_.AddObserver(observer);
+ observer->OnUpdateVSyncParameters(last_timebase_, last_interval_);
+}
+
+void CompositorVSyncManager::RemoveObserver(Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
+
+void CompositorVSyncManager::NotifyObservers(base::TimeTicks timebase,
+ base::TimeDelta interval) {
+ FOR_EACH_OBSERVER(CompositorVSyncManager::Observer, observer_list_,
+ OnUpdateVSyncParameters(timebase, interval));
+}
+
+} // namespace ui
diff --git a/ui/compositor/compositor_vsync_manager.h b/ui/compositor/compositor_vsync_manager.h
new file mode 100644
index 0000000..7e9e07b
--- /dev/null
+++ b/ui/compositor/compositor_vsync_manager.h
@@ -0,0 +1,65 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
+#define UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
+
+#include "base/memory/ref_counted.h"
+#include "base/observer_list.h"
+#include "base/synchronization/lock.h"
+#include "base/time/time.h"
+#include "ui/compositor/compositor_export.h"
+
+namespace ui {
+
+// This class manages vsync parameters for a compositor. It merges updates of
+// the parameters from different sources and sends the merged updates to
+// observers which register to it.
+class COMPOSITOR_EXPORT CompositorVSyncManager
+ : public base::RefCounted<CompositorVSyncManager> {
+ public:
+ class Observer {
+ public:
+ virtual void OnUpdateVSyncParameters(base::TimeTicks timebase,
+ base::TimeDelta interval) = 0;
+ };
+
+ CompositorVSyncManager();
+
+ // The "authoritative" vsync interval, if provided, will override |interval|
+ // as reported by UpdateVSyncParameters() whenever it is called. This is
+ // typically the value reported by a more reliable source, e.g. the platform
+ // display configuration. In the particular case of ChromeOS -- this is the
+ // value queried through XRandR, which is more reliable than the value
+ // queried through the 3D context.
+ void SetAuthoritativeVSyncInterval(base::TimeDelta interval);
+
+ // The vsync parameters consist of |timebase|, which is the platform timestamp
+ // of the last vsync, and |interval|, which is the interval between vsyncs.
+ // |interval| may be overriden by SetAuthoritativeVSyncInterval() above.
+ void UpdateVSyncParameters(base::TimeTicks timebase,
+ base::TimeDelta interval);
+
+ void AddObserver(Observer* observer);
+ void RemoveObserver(Observer* observer);
+
+ private:
+ friend class base::RefCounted<CompositorVSyncManager>;
+
+ ~CompositorVSyncManager();
+
+ void NotifyObservers(base::TimeTicks timebase, base::TimeDelta interval);
+
+ ObserverList<Observer> observer_list_;
+
+ base::TimeTicks last_timebase_;
+ base::TimeDelta last_interval_;
+ base::TimeDelta authoritative_vsync_interval_;
+
+ DISALLOW_COPY_AND_ASSIGN(CompositorVSyncManager);
+};
+
+} // namespace ui
+
+#endif // UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_