Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(768)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 236193013: Android: Consolidate and simplify VSync logic (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/android/sys_utils.h" 9 #include "base/android/sys_utils.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 const float device_scale_factor = content_view_core_->GetDpiScale(); 524 const float device_scale_factor = content_view_core_->GetDpiScale();
525 if (overscroll_effect_->OnOverscrolled( 525 if (overscroll_effect_->OnOverscrolled(
526 content_view_core_->GetLayer(), 526 content_view_core_->GetLayer(),
527 base::TimeTicks::Now(), 527 base::TimeTicks::Now(),
528 gfx::ScaleVector2d(params.accumulated_overscroll, 528 gfx::ScaleVector2d(params.accumulated_overscroll,
529 device_scale_factor), 529 device_scale_factor),
530 gfx::ScaleVector2d(params.latest_overscroll_delta, 530 gfx::ScaleVector2d(params.latest_overscroll_delta,
531 device_scale_factor), 531 device_scale_factor),
532 gfx::ScaleVector2d(params.current_fling_velocity, 532 gfx::ScaleVector2d(params.current_fling_velocity,
533 device_scale_factor))) { 533 device_scale_factor))) {
534 content_view_core_->SetNeedsAnimate(); 534 SetNeedsAnimate();
535 } 535 }
536 } 536 }
537 537
538 void RenderWidgetHostViewAndroid::SendBeginFrame( 538 void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(bool enabled) {
539 const cc::BeginFrameArgs& args) { 539 if (enabled == needs_begin_frame_)
540 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame");
541 if (!host_)
542 return; 540 return;
543 541
544 if (flush_input_requested_) {
545 flush_input_requested_ = false;
546 host_->FlushInput();
547 content_view_core_->RemoveBeginFrameSubscriber();
548 }
549
550 host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args));
551 }
552
553 void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(bool enabled) {
554 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame", 542 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame",
555 "enabled", enabled); 543 "enabled", enabled);
556 // ContentViewCoreImpl handles multiple subscribers to the BeginFrame, so 544 if (content_view_core_ && enabled)
557 // we have to make sure calls to ContentViewCoreImpl's 545 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
558 // {Add,Remove}BeginFrameSubscriber are balanced, even if 546
559 // RenderWidgetHostViewAndroid's may not be. 547 needs_begin_frame_ = enabled;
560 if (content_view_core_ && needs_begin_frame_ != enabled) {
561 if (enabled)
562 content_view_core_->AddBeginFrameSubscriber();
563 else
564 content_view_core_->RemoveBeginFrameSubscriber();
565 needs_begin_frame_ = enabled;
566 }
567 } 548 }
568 549
569 void RenderWidgetHostViewAndroid::OnStartContentIntent( 550 void RenderWidgetHostViewAndroid::OnStartContentIntent(
570 const GURL& content_url) { 551 const GURL& content_url) {
571 if (content_view_core_) 552 if (content_view_core_)
572 content_view_core_->StartContentIntent(content_url); 553 content_view_core_->StartContentIntent(content_url);
573 } 554 }
574 555
575 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( 556 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted(
576 const base::string16& result) { 557 const base::string16& result) {
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 void RenderWidgetHostViewAndroid::RemoveLayers() { 1057 void RenderWidgetHostViewAndroid::RemoveLayers() {
1077 if (!content_view_core_) 1058 if (!content_view_core_)
1078 return; 1059 return;
1079 if (!layer_.get()) 1060 if (!layer_.get())
1080 return; 1061 return;
1081 1062
1082 content_view_core_->RemoveLayer(layer_); 1063 content_view_core_->RemoveLayer(layer_);
1083 overscroll_effect_->Disable(); 1064 overscroll_effect_->Disable();
1084 } 1065 }
1085 1066
1067 void RenderWidgetHostViewAndroid::SetNeedsAnimate() {
1068 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
1069 }
1070
1086 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { 1071 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
1087 return overscroll_effect_->Animate(frame_time); 1072 return overscroll_effect_->Animate(frame_time);
1088 } 1073 }
1089 1074
1090 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( 1075 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
1091 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 1076 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
1092 int gpu_host_id) { 1077 int gpu_host_id) {
1093 NOTREACHED(); 1078 NOTREACHED();
1094 } 1079 }
1095 1080
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 if (compositor) 1172 if (compositor)
1188 return compositor->HandleInputEvent(input_event); 1173 return compositor->HandleInputEvent(input_event);
1189 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 1174 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
1190 } 1175 }
1191 1176
1192 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { 1177 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() {
1193 if (flush_input_requested_ || !content_view_core_) 1178 if (flush_input_requested_ || !content_view_core_)
1194 return; 1179 return;
1195 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); 1180 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput");
1196 flush_input_requested_ = true; 1181 flush_input_requested_ = true;
1197 content_view_core_->AddBeginFrameSubscriber();
1198 } 1182 }
1199 1183
1200 void RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManagerIfNeeded() { 1184 void RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManagerIfNeeded() {
1201 if (!host_ || host_->accessibility_mode() != AccessibilityModeComplete) 1185 if (!host_ || host_->accessibility_mode() != AccessibilityModeComplete)
1202 return; 1186 return;
1203 1187
1204 if (!GetBrowserAccessibilityManager()) { 1188 if (!GetBrowserAccessibilityManager()) {
1205 base::android::ScopedJavaLocalRef<jobject> obj; 1189 base::android::ScopedJavaLocalRef<jobject> obj;
1206 if (content_view_core_) 1190 if (content_view_core_)
1207 obj = content_view_core_->GetJavaObject(); 1191 obj = content_view_core_->GetJavaObject();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 void RenderWidgetHostViewAndroid::SendKeyEvent( 1262 void RenderWidgetHostViewAndroid::SendKeyEvent(
1279 const NativeWebKeyboardEvent& event) { 1263 const NativeWebKeyboardEvent& event) {
1280 if (host_) 1264 if (host_)
1281 host_->ForwardKeyboardEvent(event); 1265 host_->ForwardKeyboardEvent(event);
1282 } 1266 }
1283 1267
1284 void RenderWidgetHostViewAndroid::SendTouchEvent( 1268 void RenderWidgetHostViewAndroid::SendTouchEvent(
1285 const blink::WebTouchEvent& event) { 1269 const blink::WebTouchEvent& event) {
1286 if (host_) 1270 if (host_)
1287 host_->ForwardTouchEventWithLatencyInfo(event, CreateLatencyInfo(event)); 1271 host_->ForwardTouchEventWithLatencyInfo(event, CreateLatencyInfo(event));
1272
1273 // Send a proactive BeginFrame on the next vsync to reduce latency.
1274 // This is good enough as long as the first touch event has Begin semantics
1275 // and the actual scroll happens on the next vsync.
1276 // TODO: Is this actually still needed?
1277 if (content_view_core_) {
1278 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
1279 }
1288 } 1280 }
1289 1281
1290 void RenderWidgetHostViewAndroid::SendMouseEvent( 1282 void RenderWidgetHostViewAndroid::SendMouseEvent(
1291 const blink::WebMouseEvent& event) { 1283 const blink::WebMouseEvent& event) {
1292 if (host_) 1284 if (host_)
1293 host_->ForwardMouseEvent(event); 1285 host_->ForwardMouseEvent(event);
1294 } 1286 }
1295 1287
1296 void RenderWidgetHostViewAndroid::SendMouseWheelEvent( 1288 void RenderWidgetHostViewAndroid::SendMouseWheelEvent(
1297 const blink::WebMouseWheelEvent& event) { 1289 const blink::WebMouseWheelEvent& event) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 if (content_view_core_) 1336 if (content_view_core_)
1345 obj = content_view_core_->GetJavaObject(); 1337 obj = content_view_core_->GetJavaObject();
1346 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1338 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1347 SetContentViewCore(obj); 1339 SetContentViewCore(obj);
1348 } 1340 }
1349 1341
1350 AttachLayers(); 1342 AttachLayers();
1351 if (content_view_core_ && !using_synchronous_compositor_) { 1343 if (content_view_core_ && !using_synchronous_compositor_) {
1352 content_view_core_->GetWindowAndroid()->AddObserver(this); 1344 content_view_core_->GetWindowAndroid()->AddObserver(this);
1353 observing_root_window_ = true; 1345 observing_root_window_ = true;
1346 if (needs_begin_frame_)
1347 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
1354 } 1348 }
1355 1349
1356 if (resize && content_view_core_) 1350 if (resize && content_view_core_)
1357 WasResized(); 1351 WasResized();
1358 } 1352 }
1359 1353
1360 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1354 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1361 while (!ack_callbacks_.empty()) { 1355 while (!ack_callbacks_.empty()) {
1362 ack_callbacks_.front().Run(); 1356 ack_callbacks_.front().Run();
1363 ack_callbacks_.pop(); 1357 ack_callbacks_.pop();
(...skipping 15 matching lines...) Expand all
1379 RunAckCallbacks(); 1373 RunAckCallbacks();
1380 } 1374 }
1381 1375
1382 void RenderWidgetHostViewAndroid::OnWillDestroyWindow() { 1376 void RenderWidgetHostViewAndroid::OnWillDestroyWindow() {
1383 // crbug.com/324341 1377 // crbug.com/324341
1384 // WindowAndroid and Compositor should outlive all WebContents. 1378 // WindowAndroid and Compositor should outlive all WebContents.
1385 NOTREACHED(); 1379 NOTREACHED();
1386 observing_root_window_ = false; 1380 observing_root_window_ = false;
1387 } 1381 }
1388 1382
1383 void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time,
1384 base::TimeDelta vsync_period) {
1385 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::OnVSync");
1386 if (!host_)
1387 return;
1388
1389 if (flush_input_requested_) {
1390 flush_input_requested_ = false;
1391 host_->FlushInput();
1392 }
1393
1394 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame");
1395 base::TimeTicks display_time = frame_time + vsync_period;
1396
1397 // TODO(brianderson): Use adaptive draw-time estimation.
1398 base::TimeDelta estimated_browser_composite_time =
1399 base::TimeDelta::FromMicroseconds(
1400 (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60));
1401
1402 base::TimeTicks deadline = display_time - estimated_browser_composite_time;
1403
1404 host_->Send(new ViewMsg_BeginFrame(
1405 host_->GetRoutingID(),
1406 cc::BeginFrameArgs::Create(frame_time, deadline, vsync_period)));
1407
1408 // TODO(sievers): This should use the LayerTreeHostClient callback
1409 bool needs_animate = Animate(frame_time);
1410 if (needs_begin_frame_ || needs_animate)
1411 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
1412 }
1413
1389 void RenderWidgetHostViewAndroid::OnLostResources() { 1414 void RenderWidgetHostViewAndroid::OnLostResources() {
1390 ReleaseLocksOnSurface(); 1415 ReleaseLocksOnSurface();
1391 if (layer_.get()) 1416 if (layer_.get())
1392 DestroyDelegatedContent(); 1417 DestroyDelegatedContent();
1393 DCHECK(ack_callbacks_.empty()); 1418 DCHECK(ack_callbacks_.empty());
1394 } 1419 }
1395 1420
1396 // static 1421 // static
1397 void 1422 void
1398 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( 1423 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback(
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1505 // RenderWidgetHostView, public: 1530 // RenderWidgetHostView, public:
1506 1531
1507 // static 1532 // static
1508 RenderWidgetHostView* 1533 RenderWidgetHostView*
1509 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1534 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1510 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1535 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1511 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1536 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1512 } 1537 }
1513 1538
1514 } // namespace content 1539 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698