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

Side by Side Diff: content/renderer/render_widget.cc

Issue 11293121: Add latency measurement system (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor input event changes Created 8 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 | 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/renderer/render_widget.h" 5 #include "content/renderer/render_widget.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 popup_type_(popup_type), 104 popup_type_(popup_type),
105 pending_window_rect_count_(0), 105 pending_window_rect_count_(0),
106 suppress_next_char_events_(false), 106 suppress_next_char_events_(false),
107 is_accelerated_compositing_active_(false), 107 is_accelerated_compositing_active_(false),
108 animation_update_pending_(false), 108 animation_update_pending_(false),
109 invalidation_task_posted_(false), 109 invalidation_task_posted_(false),
110 screen_info_(screen_info), 110 screen_info_(screen_info),
111 device_scale_factor_(screen_info_.deviceScaleFactor), 111 device_scale_factor_(screen_info_.deviceScaleFactor),
112 throttle_input_events_(true), 112 throttle_input_events_(true),
113 next_smooth_scroll_gesture_id_(0), 113 next_smooth_scroll_gesture_id_(0),
114 is_threaded_compositing_enabled_(false) { 114 is_threaded_compositing_enabled_(false),
115 started_frame_(false),
116 got_input_(false) {
115 if (!swapped_out) 117 if (!swapped_out)
116 RenderProcess::current()->AddRefProcess(); 118 RenderProcess::current()->AddRefProcess();
117 DCHECK(RenderThread::Get()); 119 DCHECK(RenderThread::Get());
118 has_disable_gpu_vsync_switch_ = CommandLine::ForCurrentProcess()->HasSwitch( 120 has_disable_gpu_vsync_switch_ = CommandLine::ForCurrentProcess()->HasSwitch(
119 switches::kDisableGpuVsync); 121 switches::kDisableGpuVsync);
120 is_threaded_compositing_enabled_ = 122 is_threaded_compositing_enabled_ =
121 CommandLine::ForCurrentProcess()->HasSwitch( 123 CommandLine::ForCurrentProcess()->HasSwitch(
122 switches::kEnableThreadedCompositing); 124 switches::kEnableThreadedCompositing);
123 } 125 }
124 126
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose) 233 IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose)
232 IPC_MESSAGE_HANDLER(ViewMsg_CreatingNew_ACK, OnCreatingNewAck) 234 IPC_MESSAGE_HANDLER(ViewMsg_CreatingNew_ACK, OnCreatingNewAck)
233 IPC_MESSAGE_HANDLER(ViewMsg_Resize, OnResize) 235 IPC_MESSAGE_HANDLER(ViewMsg_Resize, OnResize)
234 IPC_MESSAGE_HANDLER(ViewMsg_ChangeResizeRect, OnChangeResizeRect) 236 IPC_MESSAGE_HANDLER(ViewMsg_ChangeResizeRect, OnChangeResizeRect)
235 IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden) 237 IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden)
236 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown) 238 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown)
237 IPC_MESSAGE_HANDLER(ViewMsg_WasSwappedOut, OnWasSwappedOut) 239 IPC_MESSAGE_HANDLER(ViewMsg_WasSwappedOut, OnWasSwappedOut)
238 IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) 240 IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck)
239 IPC_MESSAGE_HANDLER(ViewMsg_SwapBuffers_ACK, OnSwapBuffersComplete) 241 IPC_MESSAGE_HANDLER(ViewMsg_SwapBuffers_ACK, OnSwapBuffersComplete)
240 IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent) 242 IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent)
243 IPC_MESSAGE_HANDLER(ViewMsg_StartFrame, OnStartFrame)
241 IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost) 244 IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost)
242 IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus) 245 IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus)
243 IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive) 246 IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive)
244 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) 247 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition)
245 IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition) 248 IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition)
246 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnMsgPaintAtSize) 249 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnMsgPaintAtSize)
247 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint) 250 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint)
248 IPC_MESSAGE_HANDLER(ViewMsg_SmoothScrollCompleted, 251 IPC_MESSAGE_HANDLER(ViewMsg_SmoothScrollCompleted,
249 OnMsgSmoothScrollCompleted) 252 OnMsgSmoothScrollCompleted)
250 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) 253 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection)
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 // generated it. 542 // generated it.
540 if (!animation_update_pending_ && !paint_aggregator_.HasPendingUpdate()) { 543 if (!animation_update_pending_ && !paint_aggregator_.HasPendingUpdate()) {
541 TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate"); 544 TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate");
542 return; 545 return;
543 } 546 }
544 547
545 // Continue painting if necessary... 548 // Continue painting if necessary...
546 DoDeferredUpdateAndSendInputAck(); 549 DoDeferredUpdateAndSendInputAck();
547 } 550 }
548 551
549 void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, 552 void RenderWidget::OnHandleInputEvent(int64 input_number,
553 const WebKit::WebInputEvent* input_event,
550 bool is_keyboard_shortcut) { 554 bool is_keyboard_shortcut) {
551 TRACE_EVENT0("renderer", "RenderWidget::OnHandleInputEvent"); 555 TRACE_EVENT0("renderer", "RenderWidget::OnHandleInputEvent");
552 556
553 handling_input_event_ = true; 557 handling_input_event_ = true;
554 if (!input_event) { 558 if (!input_event) {
555 handling_input_event_ = false; 559 handling_input_event_ = false;
556 return; 560 return;
557 } 561 }
558 562
563 OnStartFrame(input_number);
564
559 bool prevent_default = false; 565 bool prevent_default = false;
560 if (WebInputEvent::isMouseEventType(input_event->type)) { 566 if (WebInputEvent::isMouseEventType(input_event->type)) {
561 const WebMouseEvent& mouse_event = 567 const WebMouseEvent& mouse_event =
562 *static_cast<const WebMouseEvent*>(input_event); 568 *static_cast<const WebMouseEvent*>(input_event);
563 TRACE_EVENT2("renderer", "HandleMouseMove", 569 TRACE_EVENT2("renderer", "HandleMouseMove",
564 "x", mouse_event.x, "y", mouse_event.y); 570 "x", mouse_event.x, "y", mouse_event.y);
565 prevent_default = WillHandleMouseEvent(mouse_event); 571 prevent_default = WillHandleMouseEvent(mouse_event);
566 } 572 }
567 573
568 if (WebInputEvent::isGestureEventType(input_event->type)) { 574 if (WebInputEvent::isGestureEventType(input_event->type)) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 if (!prevent_default) { 638 if (!prevent_default) {
633 if (WebInputEvent::isKeyboardEventType(input_event->type)) 639 if (WebInputEvent::isKeyboardEventType(input_event->type))
634 DidHandleKeyEvent(); 640 DidHandleKeyEvent();
635 if (WebInputEvent::isMouseEventType(input_event->type)) 641 if (WebInputEvent::isMouseEventType(input_event->type))
636 DidHandleMouseEvent(*(static_cast<const WebMouseEvent*>(input_event))); 642 DidHandleMouseEvent(*(static_cast<const WebMouseEvent*>(input_event)));
637 if (WebInputEvent::isTouchEventType(input_event->type)) 643 if (WebInputEvent::isTouchEventType(input_event->type))
638 DidHandleTouchEvent(*(static_cast<const WebTouchEvent*>(input_event))); 644 DidHandleTouchEvent(*(static_cast<const WebTouchEvent*>(input_event)));
639 } 645 }
640 } 646 }
641 647
648 void RenderWidget::OnStartFrame(int64 input_number) {
649 latency_info_.inputNumber = std::max(input_number, latency_info_.inputNumber);
650 if (!got_input_) {
651 TRACE_EVENT_ASYNC_BEGIN1("frame", "Input handling", this,
652 "input_number", input_number);
653 got_input_ = true;
654 }
655 }
656
657 void RenderWidget::StartingFrame() {
658 if (got_input_) {
659 TRACE_EVENT_ASYNC_END1("frame", "Input handling", this,
660 "input_number", latency_info_.inputNumber);
661 got_input_ = false;
662 }
663
664 if (!started_frame_) {
665 started_frame_ = true;
666 latency_info_.rendererMainFrameNumber++;
667 TRACE_EVENT_ASYNC_BEGIN2("frame", "Frame", this,
668 "frame_number",
669 latency_info_.rendererMainFrameNumber,
670 "input_number", latency_info_.inputNumber);
671 }
672 webwidget_->setLatencyInfo(latency_info_);
673 }
674
642 void RenderWidget::OnMouseCaptureLost() { 675 void RenderWidget::OnMouseCaptureLost() {
643 if (webwidget_) 676 if (webwidget_)
644 webwidget_->mouseCaptureLost(); 677 webwidget_->mouseCaptureLost();
645 } 678 }
646 679
647 void RenderWidget::OnSetFocus(bool enable) { 680 void RenderWidget::OnSetFocus(bool enable) {
648 has_focus_ = enable; 681 has_focus_ = enable;
649 if (webwidget_) 682 if (webwidget_)
650 webwidget_->setFocus(enable); 683 webwidget_->setFocus(enable);
651 } 684 }
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 irect.set(rect.x(), rect.y(), rect.right() - 1, rect.bottom() - 1); 830 irect.set(rect.x(), rect.y(), rect.right() - 1, rect.bottom() - 1);
798 canvas->drawIRect(irect, paint); 831 canvas->drawIRect(irect, paint);
799 } 832 }
800 833
801 void RenderWidget::AnimationCallback() { 834 void RenderWidget::AnimationCallback() {
802 TRACE_EVENT0("renderer", "RenderWidget::AnimationCallback"); 835 TRACE_EVENT0("renderer", "RenderWidget::AnimationCallback");
803 if (!animation_update_pending_) { 836 if (!animation_update_pending_) {
804 TRACE_EVENT0("renderer", "EarlyOut_NoAnimationUpdatePending"); 837 TRACE_EVENT0("renderer", "EarlyOut_NoAnimationUpdatePending");
805 return; 838 return;
806 } 839 }
840 StartingFrame();
807 if (!animation_floor_time_.is_null() && IsRenderingVSynced()) { 841 if (!animation_floor_time_.is_null() && IsRenderingVSynced()) {
808 // Record when we fired (according to base::Time::Now()) relative to when 842 // Record when we fired (according to base::Time::Now()) relative to when
809 // we posted the task to quantify how much the base::Time/base::TimeTicks 843 // we posted the task to quantify how much the base::Time/base::TimeTicks
810 // skew is affecting animations. 844 // skew is affecting animations.
811 base::TimeDelta animation_callback_delay = base::Time::Now() - 845 base::TimeDelta animation_callback_delay = base::Time::Now() -
812 (animation_floor_time_ - base::TimeDelta::FromMilliseconds(16)); 846 (animation_floor_time_ - base::TimeDelta::FromMilliseconds(16));
813 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.AnimationCallbackDelayTime", 847 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.AnimationCallbackDelayTime",
814 animation_callback_delay, 848 animation_callback_delay,
815 base::TimeDelta::FromMilliseconds(0), 849 base::TimeDelta::FromMilliseconds(0),
816 base::TimeDelta::FromMilliseconds(30), 850 base::TimeDelta::FromMilliseconds(30),
(...skipping 10 matching lines...) Expand all
827 base::TimeDelta animationInterval = IsRenderingVSynced() ? 861 base::TimeDelta animationInterval = IsRenderingVSynced() ?
828 base::TimeDelta::FromMilliseconds(16) : base::TimeDelta(); 862 base::TimeDelta::FromMilliseconds(16) : base::TimeDelta();
829 863
830 base::Time now = base::Time::Now(); 864 base::Time now = base::Time::Now();
831 865
832 // animation_floor_time_ is the earliest time that we should animate when 866 // animation_floor_time_ is the earliest time that we should animate when
833 // using the dead reckoning software scheduler. If we're using swapbuffers 867 // using the dead reckoning software scheduler. If we're using swapbuffers
834 // complete callbacks to rate limit, we can ignore this floor. 868 // complete callbacks to rate limit, we can ignore this floor.
835 if (now >= animation_floor_time_ || num_swapbuffers_complete_pending_ > 0) { 869 if (now >= animation_floor_time_ || num_swapbuffers_complete_pending_ > 0) {
836 TRACE_EVENT0("renderer", "RenderWidget::AnimateIfNeeded") 870 TRACE_EVENT0("renderer", "RenderWidget::AnimateIfNeeded")
871 StartingFrame();
837 animation_floor_time_ = now + animationInterval; 872 animation_floor_time_ = now + animationInterval;
838 // Set a timer to call us back after animationInterval before 873 // Set a timer to call us back after animationInterval before
839 // running animation callbacks so that if a callback requests another 874 // running animation callbacks so that if a callback requests another
840 // we'll be sure to run it at the proper time. 875 // we'll be sure to run it at the proper time.
841 animation_timer_.Stop(); 876 animation_timer_.Stop();
842 animation_timer_.Start(FROM_HERE, animationInterval, this, 877 animation_timer_.Start(FROM_HERE, animationInterval, this,
843 &RenderWidget::AnimationCallback); 878 &RenderWidget::AnimationCallback);
844 animation_update_pending_ = false; 879 animation_update_pending_ = false;
845 webwidget_->animate(0.0); 880 webwidget_->animate(0.0);
846 return; 881 return;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 UpdateSelectionBounds(); 965 UpdateSelectionBounds();
931 966
932 // Suppress painting if nothing is dirty. This has to be done after updating 967 // Suppress painting if nothing is dirty. This has to be done after updating
933 // animations running layout as these may generate further invalidations. 968 // animations running layout as these may generate further invalidations.
934 if (!paint_aggregator_.HasPendingUpdate()) { 969 if (!paint_aggregator_.HasPendingUpdate()) {
935 TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate"); 970 TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate");
936 webwidget_->instrumentCancelFrame(); 971 webwidget_->instrumentCancelFrame();
937 return; 972 return;
938 } 973 }
939 974
975 StartingFrame();
976
940 if (!is_accelerated_compositing_active_ && 977 if (!is_accelerated_compositing_active_ &&
941 !is_threaded_compositing_enabled_ && 978 !is_threaded_compositing_enabled_ &&
942 ForceCompositingModeEnabled()) { 979 ForceCompositingModeEnabled()) {
943 webwidget_->enterForceCompositingMode(true); 980 webwidget_->enterForceCompositingMode(true);
944 } 981 }
945 982
946 if (!last_do_deferred_update_time_.is_null()) { 983 if (!last_do_deferred_update_time_.is_null()) {
947 base::TimeDelta delay = frame_begin_ticks - last_do_deferred_update_time_; 984 base::TimeDelta delay = frame_begin_ticks - last_do_deferred_update_time_;
948 if (is_accelerated_compositing_active_) { 985 if (is_accelerated_compositing_active_) {
949 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.AccelDoDeferredUpdateDelay", 986 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.AccelDoDeferredUpdateDelay",
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 DCHECK(!pending_update_params_.get()); 1036 DCHECK(!pending_update_params_.get());
1000 pending_update_params_.reset(new ViewHostMsg_UpdateRect_Params); 1037 pending_update_params_.reset(new ViewHostMsg_UpdateRect_Params);
1001 pending_update_params_->scroll_delta = update.scroll_delta; 1038 pending_update_params_->scroll_delta = update.scroll_delta;
1002 pending_update_params_->scroll_rect = update.scroll_rect; 1039 pending_update_params_->scroll_rect = update.scroll_rect;
1003 pending_update_params_->view_size = size_; 1040 pending_update_params_->view_size = size_;
1004 pending_update_params_->plugin_window_moves.swap(plugin_window_moves_); 1041 pending_update_params_->plugin_window_moves.swap(plugin_window_moves_);
1005 pending_update_params_->flags = next_paint_flags_; 1042 pending_update_params_->flags = next_paint_flags_;
1006 pending_update_params_->scroll_offset = GetScrollOffset(); 1043 pending_update_params_->scroll_offset = GetScrollOffset();
1007 pending_update_params_->needs_ack = true; 1044 pending_update_params_->needs_ack = true;
1008 pending_update_params_->scale_factor = device_scale_factor_; 1045 pending_update_params_->scale_factor = device_scale_factor_;
1046 pending_update_params_->latency_info = latency_info_;
1009 next_paint_flags_ = 0; 1047 next_paint_flags_ = 0;
1010 need_update_rect_for_auto_resize_ = false; 1048 need_update_rect_for_auto_resize_ = false;
1011 1049
1012 if (update.scroll_rect.IsEmpty() && 1050 if (update.scroll_rect.IsEmpty() &&
1013 !is_accelerated_compositing_active_ && 1051 !is_accelerated_compositing_active_ &&
1014 GetBitmapForOptimizedPluginPaint(bounds, &dib, &optimized_copy_location, 1052 GetBitmapForOptimizedPluginPaint(bounds, &dib, &optimized_copy_location,
1015 &optimized_copy_rect, 1053 &optimized_copy_rect,
1016 &dib_scale_factor)) { 1054 &dib_scale_factor)) {
1017 // Only update the part of the plugin that actually changed. 1055 // Only update the part of the plugin that actually changed.
1018 optimized_copy_rect.Intersect(bounds); 1056 optimized_copy_rect.Intersect(bounds);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1080 Send(pending_input_event_ack_.release()); 1118 Send(pending_input_event_ack_.release());
1081 1119
1082 // If composite() called SwapBuffers, pending_update_params_ will be reset (in 1120 // If composite() called SwapBuffers, pending_update_params_ will be reset (in
1083 // OnSwapBuffersPosted), meaning a message has been added to the 1121 // OnSwapBuffersPosted), meaning a message has been added to the
1084 // updates_pending_swap_ queue, that will be sent later. Otherwise, we send 1122 // updates_pending_swap_ queue, that will be sent later. Otherwise, we send
1085 // the message now. 1123 // the message now.
1086 if (pending_update_params_.get()) { 1124 if (pending_update_params_.get()) {
1087 // sending an ack to browser process that the paint is complete... 1125 // sending an ack to browser process that the paint is complete...
1088 update_reply_pending_ = pending_update_params_->needs_ack; 1126 update_reply_pending_ = pending_update_params_->needs_ack;
1089 Send(new ViewHostMsg_UpdateRect(routing_id_, *pending_update_params_)); 1127 Send(new ViewHostMsg_UpdateRect(routing_id_, *pending_update_params_));
1128 didBeginCompositorFrame();
1090 pending_update_params_.reset(); 1129 pending_update_params_.reset();
1091 } 1130 }
1092 1131
1093 // If we're software rendering then we're done initiating the paint. 1132 // If we're software rendering then we're done initiating the paint.
1094 if (!is_accelerated_compositing_active_) 1133 if (!is_accelerated_compositing_active_)
1095 DidInitiatePaint(); 1134 DidInitiatePaint();
1096 } 1135 }
1097 1136
1098 /////////////////////////////////////////////////////////////////////////////// 1137 ///////////////////////////////////////////////////////////////////////////////
1099 // WebWidgetClient 1138 // WebWidgetClient
1100 1139
1101 void RenderWidget::didInvalidateRect(const WebRect& rect) { 1140 void RenderWidget::didInvalidateRect(const WebRect& rect) {
1102 TRACE_EVENT2("renderer", "RenderWidget::didInvalidateRect", 1141 TRACE_EVENT2("renderer", "RenderWidget::didInvalidateRect",
1103 "width", rect.width, "height", rect.height); 1142 "width", rect.width, "height", rect.height);
1143 StartingFrame();
1104 // The invalidated rect might be outside the bounds of the view. 1144 // The invalidated rect might be outside the bounds of the view.
1105 gfx::Rect view_rect(size_); 1145 gfx::Rect view_rect(size_);
1106 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, rect); 1146 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, rect);
1107 if (damaged_rect.IsEmpty()) 1147 if (damaged_rect.IsEmpty())
1108 return; 1148 return;
1109 1149
1110 paint_aggregator_.InvalidateRect(damaged_rect); 1150 paint_aggregator_.InvalidateRect(damaged_rect);
1111 1151
1112 // We may not need to schedule another call to DoDeferredUpdate. 1152 // We may not need to schedule another call to DoDeferredUpdate.
1113 if (invalidation_task_posted_) 1153 if (invalidation_task_posted_)
(...skipping 27 matching lines...) Expand all
1141 // TODO(nduca): stop WebViewImpl from sending scrolls in the first place. 1181 // TODO(nduca): stop WebViewImpl from sending scrolls in the first place.
1142 if (is_accelerated_compositing_active_) 1182 if (is_accelerated_compositing_active_)
1143 return; 1183 return;
1144 1184
1145 // The scrolled rect might be outside the bounds of the view. 1185 // The scrolled rect might be outside the bounds of the view.
1146 gfx::Rect view_rect(size_); 1186 gfx::Rect view_rect(size_);
1147 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, clip_rect); 1187 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, clip_rect);
1148 if (damaged_rect.IsEmpty()) 1188 if (damaged_rect.IsEmpty())
1149 return; 1189 return;
1150 1190
1191 StartingFrame();
1151 paint_aggregator_.ScrollRect(gfx::Vector2d(dx, dy), damaged_rect); 1192 paint_aggregator_.ScrollRect(gfx::Vector2d(dx, dy), damaged_rect);
1152 1193
1153 // We may not need to schedule another call to DoDeferredUpdate. 1194 // We may not need to schedule another call to DoDeferredUpdate.
1154 if (invalidation_task_posted_) 1195 if (invalidation_task_posted_)
1155 return; 1196 return;
1156 if (!paint_aggregator_.HasPendingUpdate()) 1197 if (!paint_aggregator_.HasPendingUpdate())
1157 return; 1198 return;
1158 if (update_reply_pending_ || 1199 if (update_reply_pending_ ||
1159 num_swapbuffers_complete_pending_ >= kMaxSwapBuffersPending) 1200 num_swapbuffers_complete_pending_ >= kMaxSwapBuffersPending)
1160 return; 1201 return;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 // In single-threaded mode, we exit force compositing mode and re-enter in 1265 // In single-threaded mode, we exit force compositing mode and re-enter in
1225 // DoDeferredUpdate() if appropriate. In threaded compositing mode, 1266 // DoDeferredUpdate() if appropriate. In threaded compositing mode,
1226 // DoDeferredUpdate() is bypassed and WebKit is responsible for exiting and 1267 // DoDeferredUpdate() is bypassed and WebKit is responsible for exiting and
1227 // entering force compositing mode at the appropriate times. 1268 // entering force compositing mode at the appropriate times.
1228 if (!is_threaded_compositing_enabled_) 1269 if (!is_threaded_compositing_enabled_)
1229 webwidget_->enterForceCompositingMode(false); 1270 webwidget_->enterForceCompositingMode(false);
1230 } 1271 }
1231 1272
1232 void RenderWidget::willBeginCompositorFrame() { 1273 void RenderWidget::willBeginCompositorFrame() {
1233 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); 1274 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame");
1275 StartingFrame();
1234 1276
1235 DCHECK(RenderThreadImpl::current()->compositor_thread()); 1277 DCHECK(RenderThreadImpl::current()->compositor_thread());
1236 1278
1237 // The following two can result in further layout and possibly 1279 // The following two can result in further layout and possibly
1238 // enable GPU acceleration so they need to be called before any painting 1280 // enable GPU acceleration so they need to be called before any painting
1239 // is done. 1281 // is done.
1240 UpdateTextInputState(DO_NOT_SHOW_IME); 1282 UpdateTextInputState(DO_NOT_SHOW_IME);
1241 UpdateSelectionBounds(); 1283 UpdateSelectionBounds();
1284 WillInitiatePaint();
1285 }
1242 1286
1243 WillInitiatePaint(); 1287 void RenderWidget::didBeginCompositorFrame() {
1288 if (started_frame_) {
1289 TRACE_EVENT_ASYNC_END2("frame", "Frame", this,
1290 "frameNumber", latency_info_.rendererMainFrameNumber,
1291 "inputNumber", latency_info_.inputNumber);
1292 started_frame_ = false;
1293 }
1244 } 1294 }
1245 1295
1246 void RenderWidget::didBecomeReadyForAdditionalInput() { 1296 void RenderWidget::didBecomeReadyForAdditionalInput() {
1247 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); 1297 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput");
1248 if (pending_input_event_ack_.get()) 1298 if (pending_input_event_ack_.get())
1249 Send(pending_input_event_ack_.release()); 1299 Send(pending_input_event_ack_.release());
1250 } 1300 }
1251 1301
1252 void RenderWidget::didCommitAndDrawCompositorFrame() { 1302 void RenderWidget::didCommitAndDrawCompositorFrame() {
1253 TRACE_EVENT0("gpu", "RenderWidget::didCommitAndDrawCompositorFrame"); 1303 TRACE_EVENT0("gpu", "RenderWidget::didCommitAndDrawCompositorFrame");
(...skipping 27 matching lines...) Expand all
1281 params.needs_ack = false; 1331 params.needs_ack = false;
1282 params.scale_factor = device_scale_factor_; 1332 params.scale_factor = device_scale_factor_;
1283 1333
1284 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); 1334 Send(new ViewHostMsg_UpdateRect(routing_id_, params));
1285 next_paint_flags_ = 0; 1335 next_paint_flags_ = 0;
1286 need_update_rect_for_auto_resize_ = false; 1336 need_update_rect_for_auto_resize_ = false;
1287 } 1337 }
1288 1338
1289 void RenderWidget::scheduleComposite() { 1339 void RenderWidget::scheduleComposite() {
1290 TRACE_EVENT0("gpu", "RenderWidget::scheduleComposite"); 1340 TRACE_EVENT0("gpu", "RenderWidget::scheduleComposite");
1341 StartingFrame();
1291 if (WebWidgetHandlesCompositorScheduling()) { 1342 if (WebWidgetHandlesCompositorScheduling()) {
1292 webwidget_->composite(false); 1343 webwidget_->composite(false);
1293 } else { 1344 } else {
1294 // TODO(nduca): replace with something a little less hacky. The reason this 1345 // TODO(nduca): replace with something a little less hacky. The reason this
1295 // hack is still used is because the Invalidate-DoDeferredUpdate loop 1346 // hack is still used is because the Invalidate-DoDeferredUpdate loop
1296 // contains a lot of host-renderer synchronization logic that is still 1347 // contains a lot of host-renderer synchronization logic that is still
1297 // important for the accelerated compositing case. The option of simply 1348 // important for the accelerated compositing case. The option of simply
1298 // duplicating all that code is less desirable than "faking out" the 1349 // duplicating all that code is less desirable than "faking out" the
1299 // invalidation path using a magical damage rect. 1350 // invalidation path using a magical damage rect.
1300 didInvalidateRect(WebRect(0, 0, 1, 1)); 1351 didInvalidateRect(WebRect(0, 0, 1, 1));
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 2020
1970 bool RenderWidget::WebWidgetHandlesCompositorScheduling() const { 2021 bool RenderWidget::WebWidgetHandlesCompositorScheduling() const {
1971 return false; 2022 return false;
1972 } 2023 }
1973 2024
1974 bool RenderWidget::HasTouchEventHandlersAt(const gfx::Point& point) const { 2025 bool RenderWidget::HasTouchEventHandlersAt(const gfx::Point& point) const {
1975 return true; 2026 return true;
1976 } 2027 }
1977 2028
1978 } // namespace content 2029 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698