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

Unified Diff: content/renderer/render_widget.cc

Issue 11293121: Add latency measurement system (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: create cc::LatencyInfo Created 7 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_widget.h ('k') | ui/aura/bench/bench_main.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « content/renderer/render_widget.h ('k') | ui/aura/bench/bench_main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698