OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 outstanding_begin_frame_requests_(0), |
442 is_showing_(!widget_host->is_hidden()), | 441 is_showing_(!widget_host->is_hidden()), |
443 is_window_visible_(true), | 442 is_window_visible_(true), |
444 is_window_activity_started_(true), | 443 is_window_activity_started_(true), |
445 content_view_core_(nullptr), | 444 content_view_core_(nullptr), |
446 ime_adapter_android_(this), | 445 ime_adapter_android_(this), |
447 cached_background_color_(SK_ColorWHITE), | 446 cached_background_color_(SK_ColorWHITE), |
448 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), | 447 last_compositor_frame_sink_id_(kUndefinedCompositorFrameSinkId), |
449 gesture_provider_(ui::GetGestureProviderConfig( | 448 gesture_provider_(ui::GetGestureProviderConfig( |
450 ui::GestureProviderConfigType::CURRENT_PLATFORM), | 449 ui::GestureProviderConfigType::CURRENT_PLATFORM), |
451 this), | 450 this), |
452 stylus_text_selector_(this), | 451 stylus_text_selector_(this), |
453 using_browser_compositor_(CompositorImpl::IsInitialized()), | 452 using_browser_compositor_(CompositorImpl::IsInitialized()), |
454 synchronous_compositor_client_(nullptr), | 453 synchronous_compositor_client_(nullptr), |
455 frame_evictor_(new DelegatedFrameEvictor(this)), | 454 frame_evictor_(new DelegatedFrameEvictor(this)), |
456 locks_on_frame_count_(0), | 455 locks_on_frame_count_(0), |
457 observing_root_window_(false), | 456 observing_root_window_(false), |
458 weak_ptr_factory_(this) { | 457 weak_ptr_factory_(this) { |
459 // Set the layer which will hold the content layer for this view. The content | 458 // Set the layer which will hold the content layer for this view. The content |
460 // layer is managed by the DelegatedFrameHost. | 459 // layer is managed by the DelegatedFrameHost. |
461 view_.SetLayer(cc::Layer::Create()); | 460 view_.SetLayer(cc::Layer::Create()); |
462 if (using_browser_compositor_) { | 461 if (using_browser_compositor_) { |
463 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( | 462 delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid( |
464 &view_, cached_background_color_, | 463 &view_, cached_background_color_, this)); |
465 base::Bind(&RenderWidgetHostViewAndroid::ReturnResources, | |
466 weak_ptr_factory_.GetWeakPtr()))); | |
467 } | 464 } |
468 | 465 |
469 host_->SetView(this); | 466 host_->SetView(this); |
470 SetContentViewCore(content_view_core); | 467 SetContentViewCore(content_view_core); |
471 | 468 |
472 if (GetTextInputManager()) | 469 if (GetTextInputManager()) |
473 GetTextInputManager()->AddObserver(this); | 470 GetTextInputManager()->AddObserver(this); |
474 } | 471 } |
475 | 472 |
476 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 473 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
799 delegated_frame_host_->UpdateBackgroundColor(color); | 796 delegated_frame_host_->UpdateBackgroundColor(color); |
800 | 797 |
801 if (content_view_core_) | 798 if (content_view_core_) |
802 content_view_core_->OnBackgroundColorChanged(color); | 799 content_view_core_->OnBackgroundColorChanged(color); |
803 } | 800 } |
804 | 801 |
805 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { | 802 void RenderWidgetHostViewAndroid::SetNeedsBeginFrames(bool needs_begin_frames) { |
806 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", | 803 TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SetNeedsBeginFrames", |
807 "needs_begin_frames", needs_begin_frames); | 804 "needs_begin_frames", needs_begin_frames); |
808 if (needs_begin_frames) | 805 if (needs_begin_frames) |
809 RequestVSyncUpdate(PERSISTENT_BEGIN_FRAME); | 806 AddBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
810 else | 807 else |
811 outstanding_vsync_requests_ &= ~PERSISTENT_BEGIN_FRAME; | 808 ClearBeginFrameRequest(PERSISTENT_BEGIN_FRAME); |
812 } | 809 } |
813 | 810 |
814 void RenderWidgetHostViewAndroid::OnStartContentIntent( | 811 void RenderWidgetHostViewAndroid::OnStartContentIntent( |
815 const GURL& content_url, bool is_main_frame) { | 812 const GURL& content_url, bool is_main_frame) { |
816 if (content_view_core_) | 813 if (content_view_core_) |
817 content_view_core_->StartContentIntent(content_url, is_main_frame); | 814 content_view_core_->StartContentIntent(content_url, is_main_frame); |
818 } | 815 } |
819 | 816 |
820 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( | 817 void RenderWidgetHostViewAndroid::OnSmartClipDataExtracted( |
821 const base::string16& text, | 818 const base::string16& text, |
(...skipping 29 matching lines...) Expand all Loading... | |
851 if (!result.succeeded) | 848 if (!result.succeeded) |
852 return false; | 849 return false; |
853 | 850 |
854 blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( | 851 blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( |
855 event, result.moved_beyond_slop_region); | 852 event, result.moved_beyond_slop_region); |
856 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); | 853 ui::LatencyInfo latency_info(ui::SourceEventType::TOUCH); |
857 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); | 854 latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); |
858 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); | 855 host_->ForwardTouchEventWithLatencyInfo(web_event, latency_info); |
859 | 856 |
860 // Send a proactive BeginFrame for this vsync to reduce scroll latency for | 857 // Send a proactive BeginFrame for this vsync to reduce scroll latency for |
861 // scroll-inducing touch events. Note that Android's Choreographer ensures | 858 // 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 | 859 // BeginFrameSource prior to this, we will receive a (missed) BeginFrame for |
863 // in the same vsync phase. | 860 // the current vsync phase. |
864 if (observing_root_window_ && result.moved_beyond_slop_region) | 861 if (observing_root_window_ && result.moved_beyond_slop_region) |
865 RequestVSyncUpdate(BEGIN_FRAME); | 862 AddBeginFrameRequest(BEGIN_FRAME); |
866 | 863 |
867 return true; | 864 return true; |
868 } | 865 } |
869 | 866 |
870 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( | 867 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
871 const ui::MotionEvent& event) { | 868 const ui::MotionEvent& event) { |
872 return selection_controller_ && | 869 return selection_controller_ && |
873 selection_controller_->WillHandleTouchEvent(event); | 870 selection_controller_->WillHandleTouchEvent(event); |
874 } | 871 } |
875 | 872 |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1152 if (!delegated_frame_host_->HasDelegatedContent()) | 1149 if (!delegated_frame_host_->HasDelegatedContent()) |
1153 return; | 1150 return; |
1154 | 1151 |
1155 frame_evictor_->DiscardedFrame(); | 1152 frame_evictor_->DiscardedFrame(); |
1156 delegated_frame_host_->DestroyDelegatedContent(); | 1153 delegated_frame_host_->DestroyDelegatedContent(); |
1157 } | 1154 } |
1158 | 1155 |
1159 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 1156 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
1160 uint32_t compositor_frame_sink_id, | 1157 uint32_t compositor_frame_sink_id, |
1161 cc::CompositorFrame frame) { | 1158 cc::CompositorFrame frame) { |
1159 uint64_t begin_frame_source_id = frame.metadata.begin_frame_source_id; | |
1160 uint64_t begin_frame_number = frame.metadata.begin_frame_number; | |
1161 uint64_t oldest_incorporated_frame = frame.metadata.oldest_incorporated_frame; | |
1162 | |
1162 InternalSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); | 1163 InternalSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); |
1164 | |
1165 // DelegatedFrameHostAndroid always submits a frame. | |
1166 bool has_updates = true; | |
1167 cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number, has_updates, | |
1168 oldest_incorporated_frame, 0); | |
1169 if (begin_frame_source_) | |
1170 begin_frame_source_->DidFinishFrame(this, ack); | |
1171 } | |
1172 | |
1173 void RenderWidgetHostViewAndroid::OnBeginFrameDidNotDraw( | |
1174 cc::BeginFrameAck ack) { | |
1175 if (begin_frame_source_) | |
1176 begin_frame_source_->DidFinishFrame(this, ack); | |
1163 } | 1177 } |
1164 | 1178 |
1165 void RenderWidgetHostViewAndroid::ClearCompositorFrame() { | 1179 void RenderWidgetHostViewAndroid::ClearCompositorFrame() { |
1166 DestroyDelegatedContent(); | 1180 DestroyDelegatedContent(); |
1167 } | 1181 } |
1168 | 1182 |
1169 void RenderWidgetHostViewAndroid::RetainFrame(uint32_t compositor_frame_sink_id, | 1183 void RenderWidgetHostViewAndroid::RetainFrame(uint32_t compositor_frame_sink_id, |
1170 cc::CompositorFrame frame) { | 1184 cc::CompositorFrame frame) { |
1171 DCHECK(locks_on_frame_count_); | 1185 DCHECK(locks_on_frame_count_); |
1172 | 1186 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1383 | 1397 |
1384 frame_evictor_->SetVisible(true); | 1398 frame_evictor_->SetVisible(true); |
1385 | 1399 |
1386 if (overscroll_controller_) | 1400 if (overscroll_controller_) |
1387 overscroll_controller_->Enable(); | 1401 overscroll_controller_->Enable(); |
1388 | 1402 |
1389 host_->WasShown(ui::LatencyInfo()); | 1403 host_->WasShown(ui::LatencyInfo()); |
1390 | 1404 |
1391 if (content_view_core_) { | 1405 if (content_view_core_) { |
1392 StartObservingRootWindow(); | 1406 StartObservingRootWindow(); |
1393 RequestVSyncUpdate(BEGIN_FRAME); | 1407 AddBeginFrameRequest(BEGIN_FRAME); |
1394 } | 1408 } |
1395 } | 1409 } |
1396 | 1410 |
1397 void RenderWidgetHostViewAndroid::HideInternal() { | 1411 void RenderWidgetHostViewAndroid::HideInternal() { |
1398 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) | 1412 DCHECK(!is_showing_ || !is_window_activity_started_ || !is_window_visible_) |
1399 << "Hide called when the widget should be shown."; | 1413 << "Hide called when the widget should be shown."; |
1400 | 1414 |
1401 // Only preserve the frontbuffer if the activity was stopped while the | 1415 // Only preserve the frontbuffer if the activity was stopped while the |
1402 // window is still visible. This avoids visual artificts when transitioning | 1416 // window is still visible. This avoids visual artificts when transitioning |
1403 // between activities. | 1417 // between activities. |
(...skipping 22 matching lines...) Expand all Loading... | |
1426 if (overscroll_controller_) | 1440 if (overscroll_controller_) |
1427 overscroll_controller_->Disable(); | 1441 overscroll_controller_->Disable(); |
1428 | 1442 |
1429 RunAckCallbacks(); | 1443 RunAckCallbacks(); |
1430 | 1444 |
1431 // Inform the renderer that we are being hidden so it can reduce its resource | 1445 // Inform the renderer that we are being hidden so it can reduce its resource |
1432 // utilization. | 1446 // utilization. |
1433 host_->WasHidden(); | 1447 host_->WasHidden(); |
1434 } | 1448 } |
1435 | 1449 |
1436 void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32_t requests) { | 1450 void RenderWidgetHostViewAndroid::SetBeginFrameSource( |
1437 bool should_request_vsync = !outstanding_vsync_requests_ && requests; | 1451 cc::BeginFrameSource* begin_frame_source) { |
1438 outstanding_vsync_requests_ |= requests; | 1452 if (begin_frame_source_ == begin_frame_source) |
1453 return; | |
1439 | 1454 |
1440 // Note that if we're not currently observing the root window, outstanding | 1455 if (begin_frame_source_ && outstanding_begin_frame_requests_) |
1441 // vsync requests will be pushed if/when we resume observing in | 1456 begin_frame_source_->RemoveObserver(this); |
1442 // |StartObservingRootWindow()|. | 1457 begin_frame_source_ = begin_frame_source; |
1443 if (observing_root_window_ && should_request_vsync) { | 1458 if (begin_frame_source_ && outstanding_begin_frame_requests_) |
1459 begin_frame_source_->AddObserver(this); | |
1460 } | |
1461 | |
1462 void RenderWidgetHostViewAndroid::AddBeginFrameRequest( | |
1463 BeginFrameRequestType request) { | |
1464 DCHECK(this); | |
1465 uint32_t requests = outstanding_begin_frame_requests_ | request; | |
1466 | |
1467 // Note that if we don't currently have a BeginFrameSource, outstanding begin | |
1468 // frame requests will be pushed if/when we get one during | |
1469 // |StartObservingRootWindow()| or when the DelegatedFrameHostAndroid sets it. | |
1470 cc::BeginFrameSource* source = begin_frame_source_; | |
1471 if (source && requests && !outstanding_begin_frame_requests_) { | |
1444 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid(); | 1472 ui::WindowAndroid* windowAndroid = view_.GetWindowAndroid(); |
1445 DCHECK(windowAndroid); | 1473 DCHECK(windowAndroid); |
1446 // TODO(boliu): This check should be redundant with | 1474 // TODO(boliu): This check should be redundant with |source| check above. |
1447 // |observing_root_window_| check above. However we are receiving trickle | 1475 // 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 | 1476 // destruction, which invalidates the BeginFrameSource. See also related |
1449 // investigate more when time allows what corner case is missed. | 1477 // crash reports in crbug.com/639868. |
1450 if (windowAndroid) | 1478 if (windowAndroid) |
1451 windowAndroid->RequestVSyncUpdate(); | 1479 source->AddObserver(this); |
1452 } | 1480 } |
1481 outstanding_begin_frame_requests_ = requests; | |
1482 } | |
1483 | |
1484 void RenderWidgetHostViewAndroid::ClearBeginFrameRequest( | |
1485 BeginFrameRequestType request) { | |
1486 uint32_t requests = outstanding_begin_frame_requests_ & ~request; | |
1487 | |
1488 cc::BeginFrameSource* source = begin_frame_source_; | |
1489 if (source && !requests && outstanding_begin_frame_requests_) | |
1490 source->RemoveObserver(this); | |
1491 outstanding_begin_frame_requests_ = requests; | |
1453 } | 1492 } |
1454 | 1493 |
1455 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { | 1494 void RenderWidgetHostViewAndroid::StartObservingRootWindow() { |
1456 DCHECK(content_view_core_); | 1495 DCHECK(content_view_core_); |
1457 // TODO(yusufo): This will need to have a better fallback for cases where | 1496 // TODO(yusufo): This will need to have a better fallback for cases where |
1458 // setContentViewCore is called with a valid ContentViewCore without a window. | 1497 // setContentViewCore is called with a valid ContentViewCore without a window. |
1459 DCHECK(view_.GetWindowAndroid()); | 1498 DCHECK(view_.GetWindowAndroid()); |
1460 DCHECK(is_showing_); | 1499 DCHECK(is_showing_); |
1461 if (observing_root_window_) | 1500 if (observing_root_window_) |
1462 return; | 1501 return; |
1463 | 1502 |
1464 observing_root_window_ = true; | 1503 observing_root_window_ = true; |
1465 if (host_) | 1504 if (host_) |
1466 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); | 1505 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), false)); |
1467 view_.GetWindowAndroid()->AddObserver(this); | 1506 view_.GetWindowAndroid()->AddObserver(this); |
1468 | 1507 // When using browser compositor, DelegatedFrameHostAndroid provides the BFS. |
1469 // Clear existing vsync requests to allow a request to the new window. | 1508 if (!using_browser_compositor_) |
1470 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; | 1509 SetBeginFrameSource(view_.GetWindowAndroid()->GetBeginFrameSource()); |
1471 outstanding_vsync_requests_ = 0; | |
1472 RequestVSyncUpdate(outstanding_vsync_requests); | |
1473 | 1510 |
1474 ui::WindowAndroidCompositor* compositor = | 1511 ui::WindowAndroidCompositor* compositor = |
1475 view_.GetWindowAndroid()->GetCompositor(); | 1512 view_.GetWindowAndroid()->GetCompositor(); |
1476 if (compositor) { | 1513 if (compositor) { |
1477 delegated_frame_host_->RegisterFrameSinkHierarchy( | 1514 delegated_frame_host_->RegisterFrameSinkHierarchy( |
1478 compositor->GetFrameSinkId()); | 1515 compositor->GetFrameSinkId()); |
1479 } | 1516 } |
1480 } | 1517 } |
1481 | 1518 |
1482 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { | 1519 void RenderWidgetHostViewAndroid::StopObservingRootWindow() { |
1520 SetBeginFrameSource(nullptr); | |
1521 | |
1483 if (!(view_.GetWindowAndroid())) { | 1522 if (!(view_.GetWindowAndroid())) { |
1484 DCHECK(!observing_root_window_); | 1523 DCHECK(!observing_root_window_); |
1485 return; | 1524 return; |
1486 } | 1525 } |
1487 | 1526 |
1488 if (!observing_root_window_) | 1527 if (!observing_root_window_) |
1489 return; | 1528 return; |
1490 | 1529 |
1491 // Reset window state variables to their defaults. | 1530 // Reset window state variables to their defaults. |
1492 is_window_activity_started_ = true; | 1531 is_window_activity_started_ = true; |
1493 is_window_visible_ = true; | 1532 is_window_visible_ = true; |
1494 observing_root_window_ = false; | 1533 observing_root_window_ = false; |
1495 if (host_) | 1534 if (host_) |
1496 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); | 1535 host_->Send(new ViewMsg_SetBeginFramePaused(host_->GetRoutingID(), true)); |
1497 view_.GetWindowAndroid()->RemoveObserver(this); | 1536 view_.GetWindowAndroid()->RemoveObserver(this); |
1498 // If the DFH has already been destroyed, it will have cleaned itself up. | 1537 // If the DFH has already been destroyed, it will have cleaned itself up. |
1499 // This happens in some WebView cases. | 1538 // This happens in some WebView cases. |
1500 if (delegated_frame_host_) | 1539 if (delegated_frame_host_) |
1501 delegated_frame_host_->UnregisterFrameSinkHierarchy(); | 1540 delegated_frame_host_->UnregisterFrameSinkHierarchy(); |
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 Loading... | |
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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1891 view_.GetWindowAndroid()->GetCompositor(); | 1927 view_.GetWindowAndroid()->GetCompositor(); |
1892 delegated_frame_host_->RegisterFrameSinkHierarchy( | 1928 delegated_frame_host_->RegisterFrameSinkHierarchy( |
1893 compositor->GetFrameSinkId()); | 1929 compositor->GetFrameSinkId()); |
1894 } | 1930 } |
1895 | 1931 |
1896 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1932 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
1897 DCHECK(content_view_core_); | 1933 DCHECK(content_view_core_); |
1898 DCHECK(using_browser_compositor_); | 1934 DCHECK(using_browser_compositor_); |
1899 RunAckCallbacks(); | 1935 RunAckCallbacks(); |
1900 overscroll_controller_.reset(); | 1936 overscroll_controller_.reset(); |
1937 SetBeginFrameSource(nullptr); | |
1901 delegated_frame_host_->UnregisterFrameSinkHierarchy(); | 1938 delegated_frame_host_->UnregisterFrameSinkHierarchy(); |
1902 } | 1939 } |
1903 | 1940 |
1904 void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, | 1941 void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) { |
1905 base::TimeDelta vsync_period) { | 1942 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame"); |
Sami
2016/12/06 12:41:07
BTW if you see failing perf benchmarks when you la
| |
1906 TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnVSync"); | |
1907 if (!host_) | 1943 if (!host_) |
1908 return; | 1944 return; |
1909 | 1945 |
1910 if (outstanding_vsync_requests_ & FLUSH_INPUT) { | 1946 // In sync mode, we disregard missed frame args to ensure that |
1911 outstanding_vsync_requests_ &= ~FLUSH_INPUT; | 1947 // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called |
1948 // during an OnVSync() observer iteration. | |
1949 if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED) | |
1950 return; | |
1951 | |
1952 if (outstanding_begin_frame_requests_ & FLUSH_INPUT) { | |
1953 ClearBeginFrameRequest(FLUSH_INPUT); | |
1912 host_->FlushInput(); | 1954 host_->FlushInput(); |
1913 } | 1955 } |
1914 | 1956 |
1915 if (outstanding_vsync_requests_ & BEGIN_FRAME || | 1957 if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) || |
1916 outstanding_vsync_requests_ & PERSISTENT_BEGIN_FRAME) { | 1958 (outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) { |
1917 outstanding_vsync_requests_ &= ~BEGIN_FRAME; | 1959 ClearBeginFrameRequest(BEGIN_FRAME); |
1918 SendBeginFrame(frame_time, vsync_period); | 1960 SendBeginFrame(args); |
1919 } | 1961 } |
1920 | 1962 |
1921 // This allows for SendBeginFrame and FlushInput to modify | 1963 last_begin_frame_args_ = args; |
1922 // outstanding_vsync_requests. | 1964 } |
1923 uint32_t outstanding_vsync_requests = outstanding_vsync_requests_; | 1965 |
1924 outstanding_vsync_requests_ = 0; | 1966 const cc::BeginFrameArgs& RenderWidgetHostViewAndroid::LastUsedBeginFrameArgs() |
1925 RequestVSyncUpdate(outstanding_vsync_requests); | 1967 const { |
1968 return last_begin_frame_args_; | |
1969 } | |
1970 | |
1971 void RenderWidgetHostViewAndroid::OnBeginFrameSourcePausedChanged(bool paused) { | |
1972 // The BeginFrameSources we listen to don't use this. For WebView, we signal | |
1973 // the "paused" state to the RenderWidget when our window attaches/detaches, | |
1974 // see |StartObservingRootWindow()| and |StopObservingRootWindow()|. | |
1975 DCHECK(!paused); | |
1926 } | 1976 } |
1927 | 1977 |
1928 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { | 1978 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { |
1929 if (Animate(begin_frame_time)) | 1979 if (Animate(begin_frame_time)) |
1930 SetNeedsAnimate(); | 1980 SetNeedsAnimate(); |
1931 } | 1981 } |
1932 | 1982 |
1933 void RenderWidgetHostViewAndroid::OnActivityStopped() { | 1983 void RenderWidgetHostViewAndroid::OnActivityStopped() { |
1934 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); | 1984 TRACE_EVENT0("browser", "RenderWidgetHostViewAndroid::OnActivityStopped"); |
1935 DCHECK(observing_root_window_); | 1985 DCHECK(observing_root_window_); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1994 case ui::MotionEvent::ACTION_UP: | 2044 case ui::MotionEvent::ACTION_UP: |
1995 case ui::MotionEvent::ACTION_POINTER_UP: | 2045 case ui::MotionEvent::ACTION_POINTER_UP: |
1996 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", | 2046 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", |
1997 delta.InMicroseconds(), 1, 1000000, 50); | 2047 delta.InMicroseconds(), 1, 1000000, 50); |
1998 default: | 2048 default: |
1999 return; | 2049 return; |
2000 } | 2050 } |
2001 } | 2051 } |
2002 | 2052 |
2003 } // namespace content | 2053 } // namespace content |
OLD | NEW |