Index: content/browser/android/content_view_core_impl.cc |
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc |
index f3d2bb06f46f6ceb7243384d3c11c9ec0e586057..8beebebbde679d5d8fe5c74b91640f3bdf827501 100644 |
--- a/content/browser/android/content_view_core_impl.cc |
+++ b/content/browser/android/content_view_core_impl.cc |
@@ -14,6 +14,7 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "base/values.h" |
#include "cc/layers/layer.h" |
+#include "cc/output/begin_frame_args.h" |
#include "content/browser/android/interstitial_page_delegate_android.h" |
#include "content/browser/android/load_url_params.h" |
#include "content/browser/android/media_player_manager_impl.h" |
@@ -77,6 +78,10 @@ namespace content { |
namespace { |
+const unsigned int kDefaultVSyncIntervalMicros = 16666u; |
+// TODO(brianderson): Use adaptive draw-time estimation. |
+const float kDefaultBrowserCompositeVSyncFraction = 1.0f / 3; |
+ |
const void* kContentViewUserDataKey = &kContentViewUserDataKey; |
int GetRenderProcessIdFromRenderViewHost(RenderViewHost* host) { |
@@ -158,6 +163,10 @@ ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, jobject obj, |
web_contents_(static_cast<WebContentsImpl*>(web_contents)), |
root_layer_(cc::Layer::Create()), |
tab_crashed_(false), |
+ vsync_interval_(base::TimeDelta::FromMicroseconds( |
+ kDefaultVSyncIntervalMicros)), |
+ expected_browser_composite_time_(base::TimeDelta::FromMicroseconds( |
+ kDefaultVSyncIntervalMicros * kDefaultBrowserCompositeVSyncFraction)), |
view_android_(view_android), |
window_android_(window_android) { |
CHECK(web_contents) << |
@@ -701,7 +710,7 @@ void ContentViewCoreImpl::LoadUrl( |
tab_crashed_ = false; |
} |
-void ContentViewCoreImpl::SetVSyncNotificationEnabled(bool enabled) { |
+void ContentViewCoreImpl::SetNeedsBeginFrame(bool enabled) { |
JNIEnv* env = AttachCurrentThread(); |
ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
if (obj.is_null()) |
@@ -1223,6 +1232,11 @@ void ContentViewCoreImpl::UpdateVSyncParameters(JNIEnv* env, jobject /* obj */, |
host->UpdateVSyncParameters( |
base::TimeTicks::FromInternalValue(timebase_micros), |
base::TimeDelta::FromMicroseconds(interval_micros)); |
+ |
+ vsync_interval_ = |
+ base::TimeDelta::FromMicroseconds(interval_micros); |
+ expected_browser_composite_time_ = |
+ vsync_interval_ * kDefaultBrowserCompositeVSyncFraction; |
} |
void ContentViewCoreImpl::OnVSync(JNIEnv* env, jobject /* obj */, |
@@ -1231,8 +1245,13 @@ void ContentViewCoreImpl::OnVSync(JNIEnv* env, jobject /* obj */, |
if (!view) |
return; |
+ base::TimeTicks frame_time = |
+ base::TimeTicks::FromInternalValue(frame_time_micros); |
+ base::TimeTicks display_time = frame_time + vsync_interval_; |
+ base::TimeTicks deadline = display_time - expected_browser_composite_time_; |
+ |
view->SendBeginFrame( |
- base::TimeTicks::FromInternalValue(frame_time_micros)); |
+ cc::BeginFrameArgs::Create(frame_time, deadline, vsync_interval_)); |
} |
jboolean ContentViewCoreImpl::OnAnimate(JNIEnv* env, jobject /* obj */, |