Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index 6e38df8a0b6014a1ff1af08e59e25169cdc0b91d..0f91183347fd3e8439e41471a01bc500509e7189 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -111,7 +111,9 @@ RenderWidget::RenderWidget(WebKit::WebPopupType popup_type, |
device_scale_factor_(screen_info_.deviceScaleFactor), |
throttle_input_events_(true), |
next_smooth_scroll_gesture_id_(0), |
- is_threaded_compositing_enabled_(false) { |
+ is_threaded_compositing_enabled_(false), |
+ started_frame_(false), |
+ got_input_(false) { |
if (!swapped_out) |
RenderProcess::current()->AddRefProcess(); |
DCHECK(RenderThread::Get()); |
@@ -238,6 +240,7 @@ bool RenderWidget::OnMessageReceived(const IPC::Message& message) { |
IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) |
IPC_MESSAGE_HANDLER(ViewMsg_SwapBuffers_ACK, OnSwapBuffersComplete) |
IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent) |
+ IPC_MESSAGE_HANDLER(ViewMsg_StartFrame, OnStartFrame) |
IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost) |
IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus) |
IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive) |
@@ -545,7 +548,8 @@ void RenderWidget::OnSwapBuffersComplete() { |
DoDeferredUpdateAndSendInputAck(); |
} |
-void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
+void RenderWidget::OnHandleInputEvent(int64 input_number, |
+ const WebKit::WebInputEvent* input_event, |
bool is_keyboard_shortcut) { |
TRACE_EVENT0("renderer", "RenderWidget::OnHandleInputEvent"); |
@@ -555,6 +559,8 @@ void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
return; |
} |
+ OnStartFrame(input_number); |
+ |
bool prevent_default = false; |
if (WebInputEvent::isMouseEventType(input_event->type)) { |
const WebMouseEvent& mouse_event = |
@@ -638,6 +644,35 @@ void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
} |
} |
+void RenderWidget::OnStartFrame(int64 input_number) { |
+ latency_info_.inputNumber = std::max(input_number, latency_info_.inputNumber); |
+ if (!got_input_) { |
+ TRACE_EVENT_ASYNC_BEGIN1("frame", "Input handling", this, |
+ "input_number", input_number); |
+ got_input_ = true; |
+ } |
+} |
+ |
+void RenderWidget::StartingFrame() { |
+ if (got_input_) { |
+ TRACE_EVENT_ASYNC_END1("frame", "Input handling", this, |
+ "input_number", latency_info_.inputNumber); |
+ got_input_ = false; |
+ } |
+ |
+ if (!started_frame_) { |
+ started_frame_ = true; |
+ latency_info_.rendererMainFrameNumber++; |
+ TRACE_EVENT_ASYNC_BEGIN2("frame", "Frame", this, |
+ "frame_number", |
+ latency_info_.rendererMainFrameNumber, |
+ "input_number", latency_info_.inputNumber); |
+ } |
+ WebKit::WebLatencyInfoImpl latency_info; |
+ latency_info.latency_info = latency_info_; |
+ webwidget_->setLatencyInfo(latency_info); |
+} |
+ |
void RenderWidget::OnMouseCaptureLost() { |
if (webwidget_) |
webwidget_->mouseCaptureLost(); |
@@ -803,6 +838,7 @@ void RenderWidget::AnimationCallback() { |
TRACE_EVENT0("renderer", "EarlyOut_NoAnimationUpdatePending"); |
return; |
} |
+ StartingFrame(); |
if (!animation_floor_time_.is_null() && IsRenderingVSynced()) { |
// Record when we fired (according to base::Time::Now()) relative to when |
// we posted the task to quantify how much the base::Time/base::TimeTicks |
@@ -833,6 +869,7 @@ void RenderWidget::AnimateIfNeeded() { |
// complete callbacks to rate limit, we can ignore this floor. |
if (now >= animation_floor_time_ || num_swapbuffers_complete_pending_ > 0) { |
TRACE_EVENT0("renderer", "RenderWidget::AnimateIfNeeded") |
+ StartingFrame(); |
animation_floor_time_ = now + animationInterval; |
// Set a timer to call us back after animationInterval before |
// running animation callbacks so that if a callback requests another |
@@ -936,6 +973,8 @@ void RenderWidget::DoDeferredUpdate() { |
return; |
} |
+ StartingFrame(); |
+ |
if (!is_accelerated_compositing_active_ && |
!is_threaded_compositing_enabled_ && |
ForceCompositingModeEnabled()) { |
@@ -1005,6 +1044,7 @@ void RenderWidget::DoDeferredUpdate() { |
pending_update_params_->scroll_offset = GetScrollOffset(); |
pending_update_params_->needs_ack = true; |
pending_update_params_->scale_factor = device_scale_factor_; |
+ pending_update_params_->latency_info = latency_info_; |
next_paint_flags_ = 0; |
need_update_rect_for_auto_resize_ = false; |
@@ -1086,6 +1126,7 @@ void RenderWidget::DoDeferredUpdate() { |
// sending an ack to browser process that the paint is complete... |
update_reply_pending_ = pending_update_params_->needs_ack; |
Send(new ViewHostMsg_UpdateRect(routing_id_, *pending_update_params_)); |
+ didBeginCompositorFrame(); |
pending_update_params_.reset(); |
} |
@@ -1100,6 +1141,7 @@ void RenderWidget::DoDeferredUpdate() { |
void RenderWidget::didInvalidateRect(const WebRect& rect) { |
TRACE_EVENT2("renderer", "RenderWidget::didInvalidateRect", |
"width", rect.width, "height", rect.height); |
+ StartingFrame(); |
// The invalidated rect might be outside the bounds of the view. |
gfx::Rect view_rect(size_); |
gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, rect); |
@@ -1147,6 +1189,7 @@ void RenderWidget::didScrollRect(int dx, int dy, |
if (damaged_rect.IsEmpty()) |
return; |
+ StartingFrame(); |
paint_aggregator_.ScrollRect(gfx::Vector2d(dx, dy), damaged_rect); |
// We may not need to schedule another call to DoDeferredUpdate. |
@@ -1230,6 +1273,7 @@ void RenderWidget::didDeactivateCompositor() { |
void RenderWidget::willBeginCompositorFrame() { |
TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); |
+ StartingFrame(); |
DCHECK(RenderThreadImpl::current()->compositor_thread()); |
@@ -1238,10 +1282,18 @@ void RenderWidget::willBeginCompositorFrame() { |
// is done. |
UpdateTextInputState(DO_NOT_SHOW_IME); |
UpdateSelectionBounds(); |
- |
WillInitiatePaint(); |
} |
+void RenderWidget::didBeginCompositorFrame() { |
+ if (started_frame_) { |
+ TRACE_EVENT_ASYNC_END2("frame", "Frame", this, |
+ "frameNumber", latency_info_.rendererMainFrameNumber, |
+ "inputNumber", latency_info_.inputNumber); |
+ started_frame_ = false; |
+ } |
+} |
+ |
void RenderWidget::didBecomeReadyForAdditionalInput() { |
TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); |
if (pending_input_event_ack_.get()) |
@@ -1287,6 +1339,7 @@ void RenderWidget::didCompleteSwapBuffers() { |
void RenderWidget::scheduleComposite() { |
TRACE_EVENT0("gpu", "RenderWidget::scheduleComposite"); |
+ StartingFrame(); |
if (WebWidgetHandlesCompositorScheduling()) { |
webwidget_->composite(false); |
} else { |