| Index: ui/gl/gl_surface_glx.cc
|
| diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc
|
| index b131b380a61dbcaf2b257b0a18a6844732164200..10f06815ac07be5ff653b4a0d91388503b2a3b30 100644
|
| --- a/ui/gl/gl_surface_glx.cc
|
| +++ b/ui/gl/gl_surface_glx.cc
|
| @@ -56,6 +56,19 @@ bool g_glx_get_msc_rate_oml_supported = false;
|
|
|
| bool g_glx_sgi_video_sync_supported = false;
|
|
|
| +static const base::TimeDelta kGetVSyncParametersMinPeriod =
|
| +#if defined(OS_LINUX)
|
| + // See crbug.com/373489
|
| + // On Linux, querying the vsync parameters might burn CPU for up to an
|
| + // entire vsync, so we only query periodically to reduce CPU usage.
|
| + // 5 seconds is chosen somewhat abitrarily as a balance between:
|
| + // a) Drift in the phase of our signal.
|
| + // b) Potential janks from periodically pegging the CPU.
|
| + base::TimeDelta::FromSeconds(5);
|
| +#else
|
| + base::TimeDelta::FromSeconds(0);
|
| +#endif
|
| +
|
| class OMLSyncControlVSyncProvider
|
| : public gfx::SyncControlVSyncProvider {
|
| public:
|
| @@ -257,6 +270,14 @@ class SGIVideoSyncVSyncProvider
|
|
|
| virtual void GetVSyncParameters(
|
| const VSyncProvider::UpdateVSyncCallback& callback) OVERRIDE {
|
| + if (kGetVSyncParametersMinPeriod > base::TimeDelta()) {
|
| + base::TimeTicks now = base::TimeTicks::Now();
|
| + base::TimeDelta delta = now - last_get_vsync_parameters_time_;
|
| + if (delta < kGetVSyncParametersMinPeriod)
|
| + return;
|
| + last_get_vsync_parameters_time_ = now;
|
| + }
|
| +
|
| // Only one outstanding request per surface.
|
| if (!pending_callback_) {
|
| pending_callback_.reset(
|
| @@ -292,6 +313,8 @@ class SGIVideoSyncVSyncProvider
|
| base::CancellationFlag* cancel_vsync_flag_;
|
| base::Lock* vsync_lock_;
|
|
|
| + base::TimeTicks last_get_vsync_parameters_time_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(SGIVideoSyncVSyncProvider);
|
| };
|
|
|
|
|