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

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

Issue 2527283003: cc: Introduce BeginFrame sequence numbers and acknowledgements.
Patch Set: Address Sami's comments, DisplayScheduler observes while BFSObservers exist. Created 4 years 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
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 <utility> 9 #include <utility>
10 10
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 #include "content/public/common/content_switches.h" 69 #include "content/public/common/content_switches.h"
70 #include "gpu/command_buffer/client/gles2_implementation.h" 70 #include "gpu/command_buffer/client/gles2_implementation.h"
71 #include "gpu/command_buffer/client/gles2_interface.h" 71 #include "gpu/command_buffer/client/gles2_interface.h"
72 #include "gpu/config/gpu_driver_bug_workaround_type.h" 72 #include "gpu/config/gpu_driver_bug_workaround_type.h"
73 #include "ipc/ipc_message_macros.h" 73 #include "ipc/ipc_message_macros.h"
74 #include "ipc/ipc_message_start.h" 74 #include "ipc/ipc_message_start.h"
75 #include "skia/ext/image_operations.h" 75 #include "skia/ext/image_operations.h"
76 #include "third_party/khronos/GLES2/gl2.h" 76 #include "third_party/khronos/GLES2/gl2.h"
77 #include "third_party/khronos/GLES2/gl2ext.h" 77 #include "third_party/khronos/GLES2/gl2ext.h"
78 #include "third_party/skia/include/core/SkCanvas.h" 78 #include "third_party/skia/include/core/SkCanvas.h"
79 #include "ui/android/delegated_frame_host_android.h"
80 #include "ui/android/window_android.h" 79 #include "ui/android/window_android.h"
81 #include "ui/android/window_android_compositor.h" 80 #include "ui/android/window_android_compositor.h"
82 #include "ui/base/layout.h" 81 #include "ui/base/layout.h"
83 #include "ui/display/display.h" 82 #include "ui/display/display.h"
84 #include "ui/display/screen.h" 83 #include "ui/display/screen.h"
85 #include "ui/events/base_event_utils.h" 84 #include "ui/events/base_event_utils.h"
86 #include "ui/events/blink/blink_event_util.h" 85 #include "ui/events/blink/blink_event_util.h"
87 #include "ui/events/blink/did_overscroll_params.h" 86 #include "ui/events/blink/did_overscroll_params.h"
88 #include "ui/events/blink/web_input_event_traits.h" 87 #include "ui/events/blink/web_input_event_traits.h"
89 #include "ui/events/gesture_detection/gesture_provider_config_helper.h" 88 #include "ui/events/gesture_detection/gesture_provider_config_helper.h"
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 static_cast<RenderWidgetHostViewAndroid*>(widget->GetView()) 430 static_cast<RenderWidgetHostViewAndroid*>(widget->GetView())
432 ->OnLostResources(); 431 ->OnLostResources();
433 } 432 }
434 } 433 }
435 } 434 }
436 435
437 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 436 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
438 RenderWidgetHostImpl* widget_host, 437 RenderWidgetHostImpl* widget_host,
439 ContentViewCoreImpl* content_view_core) 438 ContentViewCoreImpl* content_view_core)
440 : host_(widget_host), 439 : host_(widget_host),
441 outstanding_vsync_requests_(0), 440 begin_frame_source_(nullptr),
441 outstanding_begin_frame_requests_(0),
442 is_showing_(!widget_host->is_hidden()), 442 is_showing_(!widget_host->is_hidden()),
443 is_window_visible_(true), 443 is_window_visible_(true),
444 is_window_activity_started_(true), 444 is_window_activity_started_(true),
445 content_view_core_(nullptr), 445 content_view_core_(nullptr),
446 ime_adapter_android_(this), 446 ime_adapter_android_(this),
447 cached_background_color_(SK_ColorWHITE), 447 cached_background_color_(SK_ColorWHITE),
448 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), 448 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId),
449 gesture_provider_(ui::GetGestureProviderConfig( 449 gesture_provider_(ui::GetGestureProviderConfig(
450 ui::GestureProviderConfigType::CURRENT_PLATFORM), 450 ui::GestureProviderConfigType::CURRENT_PLATFORM),
451 this), 451 this),
452 stylus_text_selector_(this), 452 stylus_text_selector_(this),
453 using_browser_compositor_(CompositorImpl::IsInitialized()), 453 using_browser_compositor_(CompositorImpl::IsInitialized()),
454 synchronous_compositor_client_(nullptr), 454 synchronous_compositor_client_(nullptr),
455 frame_evictor_(new DelegatedFrameEvictor(this)), 455 frame_evictor_(new DelegatedFrameEvictor(this)),
456 locks_on_frame_count_(0), 456 locks_on_frame_count_(0),
457 observing_root_window_(false), 457 observing_root_window_(false),
458 weak_ptr_factory_(this) { 458 weak_ptr_factory_(this) {
459 // Set the layer which will hold the content layer for this view. The content 459 // Set the layer which will hold the content layer for this view. The content
460 // layer is managed by the DelegatedFrameHost. 460 // layer is managed by the DelegatedFrameHost.
461 view_.SetLayer(cc::Layer::Create()); 461 view_.SetLayer(cc::Layer::Create());
462 if (using_browser_compositor_) { 462 if (using_browser_compositor_) {
463 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( 463 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid(
464 &view_, cached_background_color_, 464 &view_, cached_background_color_, this));
465 base::Bind(&RenderWidgetHostViewAndroid::ReturnResources,
466 weak_ptr_factory_.GetWeakPtr())));
467 } 465 }
468 466
469 host_->SetView(this); 467 host_->SetView(this);
470 SetContentViewCore(content_view_core); 468 SetContentViewCore(content_view_core);
471 469
472 if (GetTextInputManager()) 470 if (GetTextInputManager())
473 GetTextInputManager()->AddObserver(this); 471 GetTextInputManager()->AddObserver(this);
474 } 472 }
475 473
476 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 474 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 delegated_frame_host_->UpdateBackgroundColor(color); 797 delegated_frame_host_->UpdateBackgroundColor(color);
800 798
801 if (content_view_core_) 799 if (content_view_core_)
802 content_view_core_->OnBackgroundColorChanged(color); 800 content_view_core_->OnBackgroundColorChanged(color);
803 } 801 }
804 802
805 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { 803 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) {
806 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", 804 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames",
807 "needs_begin_frames", needs_begin_frames); 805 "needs_begin_frames", needs_begin_frames);
808 if (needs_begin_frames) 806 if (needs_begin_frames)
809 RequestVSyncUpdate(PERSISTENT_BEGIN_FRAME); 807 AddBeginFrameRequest(PERSISTENT_BEGIN_FRAME);
810 else 808 else
811 outstanding_vsync_requests_ &= ~PERSISTENT_BEGIN_FRAME; 809 ClearBeginFrameRequest(PERSISTENT_BEGIN_FRAME);
812 } 810 }
813 811
814 void RenderWidgetHostViewAndroid::OnStartContentIntent( 812 void RenderWidgetHostViewAndroid::OnStartContentIntent(
815 const GURL& content_url, bool is_main_frame) { 813 const GURL& content_url, bool is_main_frame) {
816 if (content_view_core_) 814 if (content_view_core_)
817 content_view_core_->StartContentIntent(content_url, is_main_frame); 815 content_view_core_->StartContentIntent(content_url, is_main_frame);
818 } 816 }
819 817
820 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( 818 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted(
821 const base::string16& text, 819 const base::string16& text,
(...skipping 29 matching lines...) Expand all
851 if (!result.succeeded) 849 if (!result.succeeded)
852 return false; 850 return false;
853 851
854 blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( 852 blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent(
855 event, result.moved_beyond_slop_region); 853 event, result.moved_beyond_slop_region);
856 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); 854 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH);
857 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 855 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
858 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); 856 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info);
859 857
860 // Send a proactive BeginFrame for this vsync to reduce scroll latency for 858 // Send a proactive BeginFrame for this vsync to reduce scroll latency for
861 // scroll-inducing touch events. Note that Android's Choreographer ensures 859 // scroll-inducing touch events. Note that even if we weren't observing the
862 // that BeginFrame requests made during ACTION_MOVE dispatch will be honored 860 // BeginFrameSource prior to this, we will receive a (missed) BeginFrame for
863 // in the same vsync phase. 861 // the current vsync phase.
864 if (observing_root_window_ && result.moved_beyond_slop_region) 862 if (observing_root_window_ && result.moved_beyond_slop_region)
865 RequestVSyncUpdate(BEGIN_FRAME); 863 AddBeginFrameRequest(BEGIN_FRAME);
866 864
867 return true; 865 return true;
868 } 866 }
869 867
870 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( 868 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent(
871 const ui::MotionEvent& event) { 869 const ui::MotionEvent& event) {
872 return selection_controller_ && 870 return selection_controller_ &&
873 selection_controller_->WillHandleTouchEvent(event); 871 selection_controller_->WillHandleTouchEvent(event);
874 } 872 }
875 873
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 if (!delegated_frame_host_->HasDelegatedContent()) 1150 if (!delegated_frame_host_->HasDelegatedContent())
1153 return; 1151 return;
1154 1152
1155 frame_evictor_->DiscardedFrame(); 1153 frame_evictor_->DiscardedFrame();
1156 delegated_frame_host_->DestroyDelegatedContent(); 1154 delegated_frame_host_->DestroyDelegatedContent();
1157 } 1155 }
1158 1156
1159 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( 1157 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
1160 uint32_t compositor_frame_sink_id, 1158 uint32_t compositor_frame_sink_id,
1161 cc::CompositorFrame frame) { 1159 cc::CompositorFrame frame) {
1160 uint64_t begin_frame_source_id = frame.metadata.begin_frame_source_id;
1161 uint64_t begin_frame_number = frame.metadata.begin_frame_number;
1162 uint64_t oldest_incorporated_frame = frame.metadata.oldest_incorporated_frame;
1163
1162 InternalSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); 1164 InternalSwapCompositorFrame(compositor_frame_sink_id, std::move(frame));
1165
1166 // DelegatedFrameHostAndroid always submits a frame.
1167 bool has_updates = true;
1168 cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number,
1169 oldest_incorporated_frame, 0, has_updates);
1170 if (begin_frame_source_)
1171 begin_frame_source_->DidFinishFrame(this, ack);
1172 }
1173
1174 void RenderWidgetHostViewAndroid::OnBeginFrameDidNotDraw(
1175 cc::BeginFrameAck ack) {
1176 if (begin_frame_source_)
1177 begin_frame_source_->DidFinishFrame(this, ack);
1163 } 1178 }
1164 1179
1165 void RenderWidgetHostViewAndroid::ClearCompositorFrame() { 1180 void RenderWidgetHostViewAndroid::ClearCompositorFrame() {
1166 DestroyDelegatedContent(); 1181 DestroyDelegatedContent();
1167 } 1182 }
1168 1183
1169 void RenderWidgetHostViewAndroid::RetainFrame(uint32_t compositor_frame_sink_id, 1184 void RenderWidgetHostViewAndroid::RetainFrame(uint32_t compositor_frame_sink_id,
1170 cc::CompositorFrame frame) { 1185 cc::CompositorFrame frame) {
1171 DCHECK(locks_on_frame_count_); 1186 DCHECK(locks_on_frame_count_);
1172 1187
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 1396
1382 view_.GetLayer()->SetHideLayerAndSubtree(false); 1397 view_.GetLayer()->SetHideLayerAndSubtree(false);
1383 1398
1384 frame_evictor_->SetVisible(true); 1399 frame_evictor_->SetVisible(true);
1385 1400
1386 if (overscroll_controller_) 1401 if (overscroll_controller_)
1387 overscroll_controller_->Enable(); 1402 overscroll_controller_->Enable();
1388 1403
1389 host_->WasShown(ui::LatencyInfo()); 1404 host_->WasShown(ui::LatencyInfo());
1390 1405
1391 if (content_view_core_) { 1406 if (content_view_core_ && view_.GetWindowAndroid()) {
1392 StartObservingRootWindow(); 1407 StartObservingRootWindow();
1393 RequestVSyncUpdate(BEGIN_FRAME); 1408 AddBeginFrameRequest(BEGIN_FRAME);
1394 } 1409 }
1395 } 1410 }
1396 1411
1397 void RenderWidgetHostViewAndroid::HideInternal() { 1412 void RenderWidgetHostViewAndroid::HideInternal() {
1398 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) 1413 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_)
1399 << "Hide called when the widget should be shown."; 1414 << "Hide called when the widget should be shown.";
1400 1415
1401 // Only preserve the frontbuffer if the activity was stopped while the 1416 // Only preserve the frontbuffer if the activity was stopped while the
1402 // window is still visible. This avoids visual artificts when transitioning 1417 // window is still visible. This avoids visual artificts when transitioning
1403 // between activities. 1418 // between activities.
(...skipping 22 matching lines...) Expand all
1426 if (overscroll_controller_) 1441 if (overscroll_controller_)
1427 overscroll_controller_->Disable(); 1442 overscroll_controller_->Disable();
1428 1443
1429 RunAckCallbacks(); 1444 RunAckCallbacks();
1430 1445
1431 // Inform the renderer that we are being hidden so it can reduce its resource 1446 // Inform the renderer that we are being hidden so it can reduce its resource
1432 // utilization. 1447 // utilization.
1433 host_->WasHidden(); 1448 host_->WasHidden();
1434 } 1449 }
1435 1450
1436 void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32_t requests) { 1451 void RenderWidgetHostViewAndroid::SetBeginFrameSource(
1437 bool should_request_vsync = !outstanding_vsync_requests_ && requests; 1452 cc::BeginFrameSource* begin_frame_source) {
1438 outstanding_vsync_requests_ |= requests; 1453 if (begin_frame_source_ == begin_frame_source)
1454 return;
1439 1455
1440 // Note that if we're not currently observing the root window, outstanding 1456 if (begin_frame_source_ && outstanding_begin_frame_requests_)
1441 // vsync requests will be pushed if/when we resume observing in 1457 begin_frame_source_->RemoveObserver(this);
1442 // |StartObservingRootWindow()|. 1458 begin_frame_source_ = begin_frame_source;
1443 if (observing_root_window_ && should_request_vsync) { 1459 if (begin_frame_source_ && outstanding_begin_frame_requests_)
1460 begin_frame_source_->AddObserver(this);
1461 }
1462
1463 void RenderWidgetHostViewAndroid::AddBeginFrameRequest(
1464 BeginFrameRequestType request) {
1465 DCHECK(this);
1466 uint32_t requests = outstanding_begin_frame_requests_ | request;
1467
1468 // Note that if we don't currently have a BeginFrameSource, outstanding begin
1469 // frame requests will be pushed if/when we get one during
1470 // |StartObservingRootWindow()| or when the DelegatedFrameHostAndroid sets it.
1471 cc::BeginFrameSource* source = begin_frame_source_;
1472 if (source && requests && !outstanding_begin_frame_requests_) {
1444 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid(); 1473 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid();
1445 DCHECK(windowAndroid); 1474 DCHECK(windowAndroid);
1446 // TODO(boliu): This check should be redundant with 1475 // TODO(boliu): This check should be redundant with |source| check above.
1447 // |observing_root_window_| check above. However we are receiving trickle 1476 // However, there seem to be cases where we are not notified of window
1448 // of crash reports (crbug.com/639868) with no root cause. Should 1477 // destruction, which invalidates the BeginFrameSource. See also related
1449 // investigate more when time allows what corner case is missed. 1478 // crash reports in crbug.com/639868.
1450 if (windowAndroid) 1479 if (windowAndroid)
1451 windowAndroid->RequestVSyncUpdate(); 1480 source->AddObserver(this);
1452 } 1481 }
1482 outstanding_begin_frame_requests_ = requests;
1483 }
1484
1485 void RenderWidgetHostViewAndroid::ClearBeginFrameRequest(
1486 BeginFrameRequestType request) {
1487 uint32_t requests = outstanding_begin_frame_requests_ & ~request;
1488
1489 cc::BeginFrameSource* source = begin_frame_source_;
1490 if (source && !requests && outstanding_begin_frame_requests_)
1491 source->RemoveObserver(this);
1492 outstanding_begin_frame_requests_ = requests;
1453 } 1493 }
1454 1494
1455 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { 1495 void RenderWidgetHostViewAndroid::StartObservingRootWindow() {
1456 DCHECK(content_view_core_); 1496 DCHECK(content_view_core_);
1457 // TODO(yusufo): This will need to have a better fallback for cases where
1458 // setContentViewCore is called with a valid ContentViewCore without a window.
1459 DCHECK(view_.GetWindowAndroid()); 1497 DCHECK(view_.GetWindowAndroid());
1460 DCHECK(is_showing_); 1498 DCHECK(is_showing_);
1461 if (observing_root_window_) 1499 if (observing_root_window_)
1462 return; 1500 return;
1463 1501
1464 observing_root_window_ = true; 1502 observing_root_window_ = true;
1465 if (host_) 1503 if (host_)
1466 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); 1504 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false));
1467 view_.GetWindowAndroid()->AddObserver(this); 1505 view_.GetWindowAndroid()->AddObserver(this);
1468 1506 // When using browser compositor, DelegatedFrameHostAndroid provides the BFS.
1469 // Clear existing vsync requests to allow a request to the new window. 1507 if (!using_browser_compositor_)
1470 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; 1508 SetBeginFrameSource(view_.GetWindowAndroid()->GetBeginFrameSource());
1471 outstanding_vsync_requests_ = 0;
1472 RequestVSyncUpdate(outstanding_vsync_requests);
1473 1509
1474 ui::WindowAndroidCompositor* compositor = 1510 ui::WindowAndroidCompositor* compositor =
1475 view_.GetWindowAndroid()->GetCompositor(); 1511 view_.GetWindowAndroid()->GetCompositor();
1476 if (compositor) { 1512 if (compositor) {
1477 delegated_frame_host_->RegisterFrameSinkHierarchy( 1513 delegated_frame_host_->RegisterFrameSinkHierarchy(
1478 compositor->GetFrameSinkId()); 1514 compositor->GetFrameSinkId());
1479 } 1515 }
1480 } 1516 }
1481 1517
1482 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { 1518 void RenderWidgetHostViewAndroid::StopObservingRootWindow() {
1483 if (!(view_.GetWindowAndroid())) { 1519 if (!(view_.GetWindowAndroid())) {
1484 DCHECK(!observing_root_window_); 1520 DCHECK(!observing_root_window_);
1485 return; 1521 return;
1486 } 1522 }
1487 1523
1488 if (!observing_root_window_) 1524 if (!observing_root_window_)
1489 return; 1525 return;
1490 1526
1491 // Reset window state variables to their defaults. 1527 // Reset window state variables to their defaults.
1492 is_window_activity_started_ = true; 1528 is_window_activity_started_ = true;
1493 is_window_visible_ = true; 1529 is_window_visible_ = true;
1494 observing_root_window_ = false; 1530 observing_root_window_ = false;
1495 if (host_) 1531 if (host_)
1496 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); 1532 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true));
1497 view_.GetWindowAndroid()->RemoveObserver(this); 1533 view_.GetWindowAndroid()->RemoveObserver(this);
1534 if (!using_browser_compositor_)
1535 SetBeginFrameSource(nullptr);
1498 // If the DFH has already been destroyed, it will have cleaned itself up. 1536 // If the DFH has already been destroyed, it will have cleaned itself up.
1499 // This happens in some WebView cases. 1537 // This happens in some WebView cases.
1500 if (delegated_frame_host_) 1538 if (delegated_frame_host_)
1501 delegated_frame_host_->UnregisterFrameSinkHierarchy(); 1539 delegated_frame_host_->UnregisterFrameSinkHierarchy();
1540 DCHECK_EQ(nullptr, begin_frame_source_);
1502 } 1541 }
1503 1542
1504 void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time, 1543 void RenderWidgetHostViewAndroid::SendBeginFrame(cc::BeginFrameArgs args) {
1505 base::TimeDelta vsync_period) { 1544 TRACE_EVENT2("cc", "RenderWidgetHostViewAndroid::SendBeginFrame",
1506 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", 1545 "frame_number", args.sequence_number,
1507 "frame_time_us", frame_time.ToInternalValue()); 1546 "frame_time_us", args.frame_time.ToInternalValue());
1508 1547
1509 // Synchronous compositor does not use deadline-based scheduling. 1548 // Synchronous compositor does not use deadline-based scheduling.
1510 // TODO(brianderson): Replace this hardcoded deadline after Android 1549 // TODO(brianderson): Replace this hardcoded deadline after Android
1511 // switches to Surfaces and the Browser's commit isn't in the critcal path. 1550 // switches to Surfaces and the Browser's commit isn't in the critical path.
1512 base::TimeTicks deadline = 1551 args.deadline = sync_compositor_ ? base::TimeTicks()
1513 sync_compositor_ ? base::TimeTicks() : frame_time + (vsync_period * 0.6); 1552 : args.frame_time + (args.interval * 0.6);
1514 host_->Send(new ViewMsg_BeginFrame( 1553 host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args));
1515 host_->GetRoutingID(),
1516 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
1517 vsync_period, cc::BeginFrameArgs::NORMAL)));
1518 if (sync_compositor_) 1554 if (sync_compositor_)
1519 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); 1555 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid());
1520 } 1556 }
1521 1557
1522 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { 1558 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
1523 bool needs_animate = false; 1559 bool needs_animate = false;
1524 if (overscroll_controller_) { 1560 if (overscroll_controller_) {
1525 needs_animate |= overscroll_controller_->Animate( 1561 needs_animate |= overscroll_controller_->Animate(
1526 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); 1562 frame_time, content_view_core_->GetViewAndroid()->GetLayer());
1527 } 1563 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 if (shim && gpu_data && 1657 if (shim && gpu_data &&
1622 gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING)) 1658 gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING))
1623 shim->Send(new GpuMsg_WakeUpGpu); 1659 shim->Send(new GpuMsg_WakeUpGpu);
1624 } 1660 }
1625 1661
1626 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 1662 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
1627 } 1663 }
1628 1664
1629 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { 1665 void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() {
1630 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); 1666 TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput");
1631 RequestVSyncUpdate(FLUSH_INPUT); 1667 AddBeginFrameRequest(FLUSH_INPUT);
1632 } 1668 }
1633 1669
1634 BrowserAccessibilityManager* 1670 BrowserAccessibilityManager*
1635 RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager( 1671 RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager(
1636 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { 1672 BrowserAccessibilityDelegate* delegate, bool for_root_frame) {
1637 base::android::ScopedJavaLocalRef<jobject> content_view_core_obj; 1673 base::android::ScopedJavaLocalRef<jobject> content_view_core_obj;
1638 if (for_root_frame && host_ && content_view_core_) 1674 if (for_root_frame && host_ && content_view_core_)
1639 content_view_core_obj = content_view_core_->GetJavaObject(); 1675 content_view_core_obj = content_view_core_->GetJavaObject();
1640 return new BrowserAccessibilityManagerAndroid( 1676 return new BrowserAccessibilityManagerAndroid(
1641 content_view_core_obj, 1677 content_view_core_obj,
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1800 if (content_view_core_) 1836 if (content_view_core_)
1801 obj = content_view_core_->GetJavaObject(); 1837 obj = content_view_core_->GetJavaObject();
1802 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); 1838 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj);
1803 } 1839 }
1804 1840
1805 if (!content_view_core_) { 1841 if (!content_view_core_) {
1806 sync_compositor_.reset(); 1842 sync_compositor_.reset();
1807 return; 1843 return;
1808 } 1844 }
1809 1845
1810 if (is_showing_) 1846 if (is_showing_ && view_.GetWindowAndroid())
1811 StartObservingRootWindow(); 1847 StartObservingRootWindow();
1812 1848
1813 if (resize) 1849 if (resize)
1814 WasResized(); 1850 WasResized();
1815 1851
1816 if (!selection_controller_) 1852 if (!selection_controller_)
1817 selection_controller_ = CreateSelectionController(this, content_view_core_); 1853 selection_controller_ = CreateSelectionController(this, content_view_core_);
1818 1854
1819 if (!overscroll_controller_ && 1855 if (!overscroll_controller_ &&
1820 view_.GetWindowAndroid()->GetCompositor()) { 1856 view_.GetWindowAndroid()->GetCompositor()) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1880 void RenderWidgetHostViewAndroid::OnDetachedFromWindow() { 1916 void RenderWidgetHostViewAndroid::OnDetachedFromWindow() {
1881 StopObservingRootWindow(); 1917 StopObservingRootWindow();
1882 OnDetachCompositor(); 1918 OnDetachCompositor();
1883 } 1919 }
1884 1920
1885 void RenderWidgetHostViewAndroid::OnAttachCompositor() { 1921 void RenderWidgetHostViewAndroid::OnAttachCompositor() {
1886 DCHECK(content_view_core_); 1922 DCHECK(content_view_core_);
1887 if (!overscroll_controller_) 1923 if (!overscroll_controller_)
1888 overscroll_controller_ = CreateOverscrollController( 1924 overscroll_controller_ = CreateOverscrollController(
1889 content_view_core_, ui::GetScaleFactorForNativeView(GetNativeView())); 1925 content_view_core_, ui::GetScaleFactorForNativeView(GetNativeView()));
1890 ui::WindowAndroidCompositor* compositor = 1926 if (observing_root_window_) {
1891 view_.GetWindowAndroid()->GetCompositor(); 1927 ui::WindowAndroidCompositor* compositor =
1892 delegated_frame_host_->RegisterFrameSinkHierarchy( 1928 view_.GetWindowAndroid()->GetCompositor();
1893 compositor->GetFrameSinkId()); 1929 delegated_frame_host_->RegisterFrameSinkHierarchy(
1930 compositor->GetFrameSinkId());
1931 }
1894 } 1932 }
1895 1933
1896 void RenderWidgetHostViewAndroid::OnDetachCompositor() { 1934 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1897 DCHECK(content_view_core_); 1935 DCHECK(content_view_core_);
1898 DCHECK(using_browser_compositor_); 1936 DCHECK(using_browser_compositor_);
1899 RunAckCallbacks(); 1937 RunAckCallbacks();
1900 overscroll_controller_.reset(); 1938 overscroll_controller_.reset();
1901 delegated_frame_host_->UnregisterFrameSinkHierarchy(); 1939 delegated_frame_host_->UnregisterFrameSinkHierarchy();
1902 } 1940 }
1903 1941
1904 void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, 1942 void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) {
1905 base::TimeDelta vsync_period) { 1943 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame");
1906 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnVSync");
1907 if (!host_) 1944 if (!host_)
1908 return; 1945 return;
1909 1946
1910 if (outstanding_vsync_requests_ & FLUSH_INPUT) { 1947 // In sync mode, we disregard missed frame args to ensure that
1911 outstanding_vsync_requests_ &= ~FLUSH_INPUT; 1948 // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called
1949 // during an OnVSync() observer iteration.
1950 if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED)
1951 return;
1952
1953 if (outstanding_begin_frame_requests_ & FLUSH_INPUT) {
1954 ClearBeginFrameRequest(FLUSH_INPUT);
1912 host_->FlushInput(); 1955 host_->FlushInput();
1913 } 1956 }
1914 1957
1915 if (outstanding_vsync_requests_ & BEGIN_FRAME || 1958 if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) ||
1916 outstanding_vsync_requests_ & PERSISTENT_BEGIN_FRAME) { 1959 (outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) {
1917 outstanding_vsync_requests_ &= ~BEGIN_FRAME; 1960 ClearBeginFrameRequest(BEGIN_FRAME);
1918 SendBeginFrame(frame_time, vsync_period); 1961 SendBeginFrame(args);
1919 } 1962 }
1920 1963
1921 // This allows for SendBeginFrame and FlushInput to modify 1964 last_begin_frame_args_ = args;
1922 // outstanding_vsync_requests. 1965 }
1923 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; 1966
1924 outstanding_vsync_requests_ = 0; 1967 const cc::BeginFrameArgs& RenderWidgetHostViewAndroid::LastUsedBeginFrameArgs()
1925 RequestVSyncUpdate(outstanding_vsync_requests); 1968 const {
1969 return last_begin_frame_args_;
1970 }
1971
1972 void RenderWidgetHostViewAndroid::OnBeginFrameSourcePausedChanged(bool paused) {
1973 // The BeginFrameSources we listen to don't use this. For WebView, we signal
1974 // the "paused" state to the RenderWidget when our window attaches/detaches,
1975 // see |StartObservingRootWindow()| and |StopObservingRootWindow()|.
1976 DCHECK(!paused);
1926 } 1977 }
1927 1978
1928 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { 1979 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) {
1929 if (Animate(begin_frame_time)) 1980 if (Animate(begin_frame_time))
1930 SetNeedsAnimate(); 1981 SetNeedsAnimate();
1931 } 1982 }
1932 1983
1933 void RenderWidgetHostViewAndroid::OnActivityStopped() { 1984 void RenderWidgetHostViewAndroid::OnActivityStopped() {
1934 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); 1985 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped");
1935 DCHECK(observing_root_window_); 1986 DCHECK(observing_root_window_);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 case ui::MotionEvent::ACTION_UP: 2045 case ui::MotionEvent::ACTION_UP:
1995 case ui::MotionEvent::ACTION_POINTER_UP: 2046 case ui::MotionEvent::ACTION_POINTER_UP:
1996 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", 2047 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED",
1997 delta.InMicroseconds(), 1, 1000000, 50); 2048 delta.InMicroseconds(), 1, 1000000, 50);
1998 default: 2049 default:
1999 return; 2050 return;
2000 } 2051 }
2001 } 2052 }
2002 2053
2003 } // namespace content 2054 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698