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

Side by Side Diff: content/common/gpu/image_transport_surface.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 #if defined(ENABLE_GPU) 5 #if defined(ENABLE_GPU)
6 6
7 #include "content/common/gpu/image_transport_surface.h" 7 #include "content/common/gpu/image_transport_surface.h"
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 gfx::PluginWindowHandle handle) 67 gfx::PluginWindowHandle handle)
68 : surface_(surface), 68 : surface_(surface),
69 manager_(manager), 69 manager_(manager),
70 stub_(stub->AsWeakPtr()), 70 stub_(stub->AsWeakPtr()),
71 handle_(handle) { 71 handle_(handle) {
72 route_id_ = manager_->GenerateRouteID(); 72 route_id_ = manager_->GenerateRouteID();
73 manager_->AddRoute(route_id_, this); 73 manager_->AddRoute(route_id_, this);
74 } 74 }
75 75
76 ImageTransportHelper::~ImageTransportHelper() { 76 ImageTransportHelper::~ImageTransportHelper() {
77 if (stub_)
78 stub_->SetLatencyInfoCallback(
79 base::Callback<void(const WebKit::WebLatencyInfoImpl&)>());
77 manager_->RemoveRoute(route_id_); 80 manager_->RemoveRoute(route_id_);
78 } 81 }
79 82
80 bool ImageTransportHelper::Initialize() { 83 bool ImageTransportHelper::Initialize() {
81 gpu::gles2::GLES2Decoder* decoder = Decoder(); 84 gpu::gles2::GLES2Decoder* decoder = Decoder();
82 85
83 if (!decoder) 86 if (!decoder)
84 return false; 87 return false;
85 88
86 decoder->SetResizeCallback( 89 decoder->SetResizeCallback(
87 base::Bind(&ImageTransportHelper::Resize, base::Unretained(this))); 90 base::Bind(&ImageTransportHelper::Resize, base::Unretained(this)));
88 91
92 if (stub_)
93 stub_->SetLatencyInfoCallback(
94 base::Bind(&ImageTransportHelper::SetLatencyInfo,
95 base::Unretained(this)));
96
89 return true; 97 return true;
90 } 98 }
91 99
92 void ImageTransportHelper::Destroy() {} 100 void ImageTransportHelper::Destroy() {}
93 101
94 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { 102 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) {
95 bool handled = true; 103 bool handled = true;
96 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) 104 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message)
97 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented, 105 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented,
98 OnBufferPresented) 106 OnBufferPresented)
99 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); 107 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK);
108 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_FrameDisplayed, OnFrameDisplayed);
100 IPC_MESSAGE_UNHANDLED(handled = false) 109 IPC_MESSAGE_UNHANDLED(handled = false)
101 IPC_END_MESSAGE_MAP() 110 IPC_END_MESSAGE_MAP()
102 return handled; 111 return handled;
103 } 112 }
104 113
105 void ImageTransportHelper::SendAcceleratedSurfaceNew( 114 void ImageTransportHelper::SendAcceleratedSurfaceNew(
106 GpuHostMsg_AcceleratedSurfaceNew_Params params) { 115 GpuHostMsg_AcceleratedSurfaceNew_Params params) {
107 params.surface_id = stub_->surface_id(); 116 params.surface_id = stub_->surface_id();
108 params.route_id = route_id_; 117 params.route_id = route_id_;
109 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params)); 118 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 size)); 155 size));
147 } 156 }
148 157
149 void ImageTransportHelper::SendUpdateVSyncParameters( 158 void ImageTransportHelper::SendUpdateVSyncParameters(
150 base::TimeTicks timebase, base::TimeDelta interval) { 159 base::TimeTicks timebase, base::TimeDelta interval) {
151 manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(), 160 manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(),
152 timebase, 161 timebase,
153 interval)); 162 interval));
154 } 163 }
155 164
165 void ImageTransportHelper::SendLatencyInfo(
166 const WebKit::WebLatencyInfoImpl& latency_info) {
167 stub_->SetLatencyInfo(latency_info);
168 }
169
156 void ImageTransportHelper::SetScheduled(bool is_scheduled) { 170 void ImageTransportHelper::SetScheduled(bool is_scheduled) {
157 gpu::GpuScheduler* scheduler = Scheduler(); 171 gpu::GpuScheduler* scheduler = Scheduler();
158 if (!scheduler) 172 if (!scheduler)
159 return; 173 return;
160 174
161 scheduler->SetScheduled(is_scheduled); 175 scheduler->SetScheduled(is_scheduled);
162 } 176 }
163 177
164 void ImageTransportHelper::DeferToFence(base::Closure task) { 178 void ImageTransportHelper::DeferToFence(base::Closure task) {
165 gpu::GpuScheduler* scheduler = Scheduler(); 179 gpu::GpuScheduler* scheduler = Scheduler();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 #endif 243 #endif
230 244
231 #if defined(OS_WIN) 245 #if defined(OS_WIN)
232 if (handle_ != NULL) { 246 if (handle_ != NULL) {
233 Decoder()->MakeCurrent(); 247 Decoder()->MakeCurrent();
234 SetSwapInterval(Decoder()->GetGLContext()); 248 SetSwapInterval(Decoder()->GetGLContext());
235 } 249 }
236 #endif 250 #endif
237 } 251 }
238 252
253 void ImageTransportHelper::SetLatencyInfo(
254 const WebKit::WebLatencyInfoImpl& latency_info) {
255 surface_->SetLatencyInfo(latency_info);
256 }
257
258 void ImageTransportHelper::OnFrameDisplayed(
259 const WebKit::WebLatencyInfoImpl& latency_info) {
260 SendLatencyInfo(latency_info);
261 }
262
239 PassThroughImageTransportSurface::PassThroughImageTransportSurface( 263 PassThroughImageTransportSurface::PassThroughImageTransportSurface(
240 GpuChannelManager* manager, 264 GpuChannelManager* manager,
241 GpuCommandBufferStub* stub, 265 GpuCommandBufferStub* stub,
242 gfx::GLSurface* surface, 266 gfx::GLSurface* surface,
243 bool transport) 267 bool transport)
244 : GLSurfaceAdapter(surface), 268 : GLSurfaceAdapter(surface),
245 transport_(transport), 269 transport_(transport),
246 did_set_swap_interval_(false) { 270 did_set_swap_interval_(false) {
247 helper_.reset(new ImageTransportHelper(this, 271 helper_.reset(new ImageTransportHelper(this,
248 manager, 272 manager,
249 stub, 273 stub,
250 gfx::kNullPluginWindow)); 274 gfx::kNullPluginWindow));
251 } 275 }
252 276
253 bool PassThroughImageTransportSurface::Initialize() { 277 bool PassThroughImageTransportSurface::Initialize() {
254 // The surface is assumed to have already been initialized. 278 // The surface is assumed to have already been initialized.
255 return helper_->Initialize(); 279 return helper_->Initialize();
256 } 280 }
257 281
258 void PassThroughImageTransportSurface::Destroy() { 282 void PassThroughImageTransportSurface::Destroy() {
259 helper_->Destroy(); 283 helper_->Destroy();
260 GLSurfaceAdapter::Destroy(); 284 GLSurfaceAdapter::Destroy();
261 } 285 }
262 286
287 void PassThroughImageTransportSurface::SetLatencyInfo(
288 const WebKit::WebLatencyInfoImpl& latency_info) {
289 if (latency_info_.rendererImplFrameNumber !=
290 latency_info.rendererImplFrameNumber)
291 TRACE_EVENT_ASYNC_BEGIN2("frame", "Frame", this,
292 "frame_number",
293 latency_info.rendererImplFrameNumber,
294 "input_number", latency_info.inputNumber);
295
296 latency_info_ = latency_info;
297 }
298
263 bool PassThroughImageTransportSurface::SwapBuffers() { 299 bool PassThroughImageTransportSurface::SwapBuffers() {
264 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); 300 bool result = gfx::GLSurfaceAdapter::SwapBuffers();
301 latency_info_.swapTimestamp = base::TimeTicks::HighResNow();
302 helper_->SendLatencyInfo(latency_info_);
303 TRACE_EVENT_ASYNC_END2("frame", "Frame", this,
304 "frame_number", latency_info_.rendererImplFrameNumber,
305 "input_number", latency_info_.inputNumber);
306
265 SendVSyncUpdateIfAvailable(); 307 SendVSyncUpdateIfAvailable();
266 308
267 if (transport_) { 309 if (transport_) {
268 // Round trip to the browser UI thread, for throttling, by sending a dummy 310 // Round trip to the browser UI thread, for throttling, by sending a dummy
269 // SwapBuffers message. 311 // SwapBuffers message.
270 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 312 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
271 params.surface_handle = 0; 313 params.surface_handle = 0;
314 params.latency_info = latency_info_;
272 params.size = surface()->GetSize(); 315 params.size = surface()->GetSize();
273 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 316 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
274 317
275 helper_->SetScheduled(false); 318 helper_->SetScheduled(false);
276 } 319 }
277 return result; 320 return result;
278 } 321 }
279 322
280 bool PassThroughImageTransportSurface::PostSubBuffer( 323 bool PassThroughImageTransportSurface::PostSubBuffer(
281 int x, int y, int width, int height) { 324 int x, int y, int width, int height) {
282 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); 325 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height);
326 latency_info_.swapTimestamp = base::TimeTicks::HighResNow();
327 helper_->SendLatencyInfo(latency_info_);
328 TRACE_EVENT_ASYNC_END2("frame", "Frame", this,
329 "frame_number", latency_info_.rendererImplFrameNumber,
330 "input_number", latency_info_.inputNumber);
283 SendVSyncUpdateIfAvailable(); 331 SendVSyncUpdateIfAvailable();
284 332
285 if (transport_) { 333 if (transport_) {
286 // Round trip to the browser UI thread, for throttling, by sending a dummy 334 // Round trip to the browser UI thread, for throttling, by sending a dummy
287 // PostSubBuffer message. 335 // PostSubBuffer message.
288 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; 336 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
289 params.surface_handle = 0; 337 params.surface_handle = 0;
338 params.latency_info = latency_info_;
290 params.surface_size = surface()->GetSize(); 339 params.surface_size = surface()->GetSize();
291 params.x = x; 340 params.x = x;
292 params.y = y; 341 params.y = y;
293 params.width = width; 342 params.width = width;
294 params.height = height; 343 params.height = height;
295 helper_->SendAcceleratedSurfacePostSubBuffer(params); 344 helper_->SendAcceleratedSurfacePostSubBuffer(params);
296 345
297 helper_->SetScheduled(false); 346 helper_->SetScheduled(false);
298 } 347 }
299 return result; 348 return result;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 389
341 void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() { 390 void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() {
342 GetVSyncParameters( 391 GetVSyncParameters(
343 base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters, 392 base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters,
344 helper_->AsWeakPtr())); 393 helper_->AsWeakPtr()));
345 } 394 }
346 395
347 } // namespace content 396 } // namespace content
348 397
349 #endif // defined(ENABLE_GPU) 398 #endif // defined(ENABLE_GPU)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698