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_impl.h" | 5 #include "content/browser/renderer_host/render_widget_host_impl.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 using blink::WebKeyboardEvent; | 82 using blink::WebKeyboardEvent; |
83 using blink::WebMouseEvent; | 83 using blink::WebMouseEvent; |
84 using blink::WebMouseWheelEvent; | 84 using blink::WebMouseWheelEvent; |
85 using blink::WebTextDirection; | 85 using blink::WebTextDirection; |
86 | 86 |
87 namespace content { | 87 namespace content { |
88 namespace { | 88 namespace { |
89 | 89 |
90 bool g_check_for_pending_resize_ack = true; | 90 bool g_check_for_pending_resize_ack = true; |
91 | 91 |
| 92 const size_t kBrowserCompositeLatencyHistorySize = 60; |
| 93 const double kBrowserCompositeLatencyEstimationPercentile = 90.0; |
| 94 const double kBrowserCompositeLatencyEstimationSlack = 1.1; |
| 95 |
92 typedef std::pair<int32, int32> RenderWidgetHostID; | 96 typedef std::pair<int32, int32> RenderWidgetHostID; |
93 typedef base::hash_map<RenderWidgetHostID, RenderWidgetHostImpl*> | 97 typedef base::hash_map<RenderWidgetHostID, RenderWidgetHostImpl*> |
94 RoutingIDWidgetMap; | 98 RoutingIDWidgetMap; |
95 base::LazyInstance<RoutingIDWidgetMap> g_routing_id_widget_map = | 99 base::LazyInstance<RoutingIDWidgetMap> g_routing_id_widget_map = |
96 LAZY_INSTANCE_INITIALIZER; | 100 LAZY_INSTANCE_INITIALIZER; |
97 | 101 |
98 int GetInputRouterViewFlagsFromCompositorFrameMetadata( | 102 int GetInputRouterViewFlagsFromCompositorFrameMetadata( |
99 const cc::CompositorFrameMetadata metadata) { | 103 const cc::CompositorFrameMetadata metadata) { |
100 int view_flags = InputRouter::VIEW_FLAGS_NONE; | 104 int view_flags = InputRouter::VIEW_FLAGS_NONE; |
101 | 105 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 input_method_active_(false), | 183 input_method_active_(false), |
180 text_direction_updated_(false), | 184 text_direction_updated_(false), |
181 text_direction_(blink::WebTextDirectionLeftToRight), | 185 text_direction_(blink::WebTextDirectionLeftToRight), |
182 text_direction_canceled_(false), | 186 text_direction_canceled_(false), |
183 suppress_next_char_events_(false), | 187 suppress_next_char_events_(false), |
184 pending_mouse_lock_request_(false), | 188 pending_mouse_lock_request_(false), |
185 allow_privileged_mouse_lock_(false), | 189 allow_privileged_mouse_lock_(false), |
186 has_touch_handler_(false), | 190 has_touch_handler_(false), |
187 last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32), | 191 last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32), |
188 next_browser_snapshot_id_(1), | 192 next_browser_snapshot_id_(1), |
| 193 browser_composite_latency_history_(kBrowserCompositeLatencyHistorySize), |
189 weak_factory_(this) { | 194 weak_factory_(this) { |
190 CHECK(delegate_); | 195 CHECK(delegate_); |
191 if (routing_id_ == MSG_ROUTING_NONE) { | 196 if (routing_id_ == MSG_ROUTING_NONE) { |
192 routing_id_ = process_->GetNextRoutingID(); | 197 routing_id_ = process_->GetNextRoutingID(); |
193 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( | 198 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( |
194 process_->GetID(), | 199 process_->GetID(), |
195 routing_id_); | 200 routing_id_); |
196 } else { | 201 } else { |
197 // TODO(piman): This is a O(N) lookup, where we could forward the | 202 // TODO(piman): This is a O(N) lookup, where we could forward the |
198 // information from the RenderWidgetHelper. The problem is that doing so | 203 // information from the RenderWidgetHelper. The problem is that doing so |
(...skipping 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 param.b.AssignTo(frame.get()); | 1497 param.b.AssignTo(frame.get()); |
1493 std::vector<IPC::Message> messages_to_deliver_with_frame; | 1498 std::vector<IPC::Message> messages_to_deliver_with_frame; |
1494 messages_to_deliver_with_frame.swap(param.c); | 1499 messages_to_deliver_with_frame.swap(param.c); |
1495 | 1500 |
1496 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) | 1501 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) |
1497 AddLatencyInfoComponentIds(&frame->metadata.latency_info[i]); | 1502 AddLatencyInfoComponentIds(&frame->metadata.latency_info[i]); |
1498 | 1503 |
1499 input_router_->OnViewUpdated( | 1504 input_router_->OnViewUpdated( |
1500 GetInputRouterViewFlagsFromCompositorFrameMetadata(frame->metadata)); | 1505 GetInputRouterViewFlagsFromCompositorFrameMetadata(frame->metadata)); |
1501 | 1506 |
| 1507 for (size_t i = 0; i < frame->metadata.latency_info.size(); ++i) { |
| 1508 frame->metadata.latency_info[i].AddLatencyNumber( |
| 1509 ui::INPUT_EVENT_BROWSER_COMPOSITE_COMPONENT, 0, 0); |
| 1510 } |
| 1511 |
1502 if (view_) { | 1512 if (view_) { |
1503 view_->OnSwapCompositorFrame(output_surface_id, frame.Pass()); | 1513 view_->OnSwapCompositorFrame(output_surface_id, frame.Pass()); |
1504 view_->DidReceiveRendererFrame(); | 1514 view_->DidReceiveRendererFrame(); |
1505 } else { | 1515 } else { |
1506 cc::CompositorFrameAck ack; | 1516 cc::CompositorFrameAck ack; |
1507 if (frame->gl_frame_data) { | 1517 if (frame->gl_frame_data) { |
1508 ack.gl_frame_data = frame->gl_frame_data.Pass(); | 1518 ack.gl_frame_data = frame->gl_frame_data.Pass(); |
1509 ack.gl_frame_data->sync_point = 0; | 1519 ack.gl_frame_data->sync_point = 0; |
1510 } else if (frame->delegated_frame_data) { | 1520 } else if (frame->delegated_frame_data) { |
1511 cc::TransferableResource::ReturnResources( | 1521 cc::TransferableResource::ReturnResources( |
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2172 swap_component.event_time - original_component.event_time; | 2182 swap_component.event_time - original_component.event_time; |
2173 for (size_t i = 0; i < original_component.event_count; i++) { | 2183 for (size_t i = 0; i < original_component.event_count; i++) { |
2174 UMA_HISTOGRAM_CUSTOM_COUNTS( | 2184 UMA_HISTOGRAM_CUSTOM_COUNTS( |
2175 "Event.Latency.TouchToScrollUpdateSwap", | 2185 "Event.Latency.TouchToScrollUpdateSwap", |
2176 delta.InMicroseconds(), | 2186 delta.InMicroseconds(), |
2177 1, | 2187 1, |
2178 1000000, | 2188 1000000, |
2179 100); | 2189 100); |
2180 } | 2190 } |
2181 } | 2191 } |
| 2192 |
| 2193 ui::LatencyInfo::LatencyComponent gpu_swap_component; |
| 2194 if (!latency_info.FindLatency( |
| 2195 ui::INPUT_EVENT_GPU_SWAP_BUFFER_COMPONENT, 0, &gpu_swap_component)) { |
| 2196 return; |
| 2197 } |
| 2198 |
| 2199 ui::LatencyInfo::LatencyComponent composite_component; |
| 2200 if (latency_info.FindLatency(ui::INPUT_EVENT_BROWSER_COMPOSITE_COMPONENT, |
| 2201 0, |
| 2202 &composite_component)) { |
| 2203 base::TimeDelta delta = |
| 2204 gpu_swap_component.event_time - composite_component.event_time; |
| 2205 browser_composite_latency_history_.InsertSample(delta); |
| 2206 } |
2182 } | 2207 } |
2183 | 2208 |
2184 void RenderWidgetHostImpl::DidReceiveRendererFrame() { | 2209 void RenderWidgetHostImpl::DidReceiveRendererFrame() { |
2185 view_->DidReceiveRendererFrame(); | 2210 view_->DidReceiveRendererFrame(); |
2186 } | 2211 } |
2187 | 2212 |
2188 void RenderWidgetHostImpl::WindowSnapshotAsyncCallback( | 2213 void RenderWidgetHostImpl::WindowSnapshotAsyncCallback( |
2189 int routing_id, | 2214 int routing_id, |
2190 int snapshot_id, | 2215 int snapshot_id, |
2191 gfx::Size snapshot_size, | 2216 gfx::Size snapshot_size, |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2345 RenderWidgetHostImpl::GetRootBrowserAccessibilityManager() { | 2370 RenderWidgetHostImpl::GetRootBrowserAccessibilityManager() { |
2346 return delegate_ ? delegate_->GetRootBrowserAccessibilityManager() : NULL; | 2371 return delegate_ ? delegate_->GetRootBrowserAccessibilityManager() : NULL; |
2347 } | 2372 } |
2348 | 2373 |
2349 BrowserAccessibilityManager* | 2374 BrowserAccessibilityManager* |
2350 RenderWidgetHostImpl::GetOrCreateRootBrowserAccessibilityManager() { | 2375 RenderWidgetHostImpl::GetOrCreateRootBrowserAccessibilityManager() { |
2351 return delegate_ ? | 2376 return delegate_ ? |
2352 delegate_->GetOrCreateRootBrowserAccessibilityManager() : NULL; | 2377 delegate_->GetOrCreateRootBrowserAccessibilityManager() : NULL; |
2353 } | 2378 } |
2354 | 2379 |
| 2380 base::TimeDelta RenderWidgetHostImpl::GetEstimatedBrowserCompositeTime() { |
| 2381 // TODO(orglofch) remove lower bound on estimate once we're sure it won't |
| 2382 // cause regressions |
| 2383 return std::max( |
| 2384 browser_composite_latency_history_.Percentile( |
| 2385 kBrowserCompositeLatencyEstimationPercentile) * |
| 2386 kBrowserCompositeLatencyEstimationSlack, |
| 2387 base::TimeDelta::FromMicroseconds( |
| 2388 (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60))); |
| 2389 } |
| 2390 |
2355 #if defined(OS_WIN) | 2391 #if defined(OS_WIN) |
2356 gfx::NativeViewAccessible | 2392 gfx::NativeViewAccessible |
2357 RenderWidgetHostImpl::GetParentNativeViewAccessible() { | 2393 RenderWidgetHostImpl::GetParentNativeViewAccessible() { |
2358 return delegate_ ? delegate_->GetParentNativeViewAccessible() : NULL; | 2394 return delegate_ ? delegate_->GetParentNativeViewAccessible() : NULL; |
2359 } | 2395 } |
2360 #endif | 2396 #endif |
2361 | 2397 |
2362 SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() { | 2398 SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() { |
2363 if (view_) | 2399 if (view_) |
2364 return view_->PreferredReadbackFormat(); | 2400 return view_->PreferredReadbackFormat(); |
2365 return kN32_SkColorType; | 2401 return kN32_SkColorType; |
2366 } | 2402 } |
2367 | 2403 |
2368 } // namespace content | 2404 } // namespace content |
OLD | NEW |