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

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: create cc::LatencyInfo Created 7 years, 11 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 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 cc::LatencyInfo&)>());
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::SendAcceleratedSurfaceBuffersSwapped( 114 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped(
106 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { 115 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) {
107 // TRACE_EVENT for gpu tests: 116 // TRACE_EVENT for gpu tests:
108 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers", 117 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers",
109 "GLImpl", static_cast<int>(gfx::GetGLImplementation()), 118 "GLImpl", static_cast<int>(gfx::GetGLImplementation()),
(...skipping 29 matching lines...) Expand all
139 size)); 148 size));
140 } 149 }
141 150
142 void ImageTransportHelper::SendUpdateVSyncParameters( 151 void ImageTransportHelper::SendUpdateVSyncParameters(
143 base::TimeTicks timebase, base::TimeDelta interval) { 152 base::TimeTicks timebase, base::TimeDelta interval) {
144 manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(), 153 manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(),
145 timebase, 154 timebase,
146 interval)); 155 interval));
147 } 156 }
148 157
158 void ImageTransportHelper::SendLatencyInfo(
159 const cc::LatencyInfo& latency_info) {
160 stub_->SetLatencyInfo(latency_info);
161 }
162
149 void ImageTransportHelper::SetScheduled(bool is_scheduled) { 163 void ImageTransportHelper::SetScheduled(bool is_scheduled) {
150 gpu::GpuScheduler* scheduler = Scheduler(); 164 gpu::GpuScheduler* scheduler = Scheduler();
151 if (!scheduler) 165 if (!scheduler)
152 return; 166 return;
153 167
154 scheduler->SetScheduled(is_scheduled); 168 scheduler->SetScheduled(is_scheduled);
155 } 169 }
156 170
157 void ImageTransportHelper::DeferToFence(base::Closure task) { 171 void ImageTransportHelper::DeferToFence(base::Closure task) {
158 gpu::GpuScheduler* scheduler = Scheduler(); 172 gpu::GpuScheduler* scheduler = Scheduler();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 #endif 236 #endif
223 237
224 #if defined(OS_WIN) 238 #if defined(OS_WIN)
225 if (handle_ != NULL) { 239 if (handle_ != NULL) {
226 Decoder()->MakeCurrent(); 240 Decoder()->MakeCurrent();
227 SetSwapInterval(Decoder()->GetGLContext()); 241 SetSwapInterval(Decoder()->GetGLContext());
228 } 242 }
229 #endif 243 #endif
230 } 244 }
231 245
246 void ImageTransportHelper::SetLatencyInfo(
247 const cc::LatencyInfo& latency_info) {
248 surface_->SetLatencyInfo(latency_info);
249 }
250
251 void ImageTransportHelper::OnFrameDisplayed(
252 const cc::LatencyInfo& latency_info) {
253 SendLatencyInfo(latency_info);
254 }
255
232 PassThroughImageTransportSurface::PassThroughImageTransportSurface( 256 PassThroughImageTransportSurface::PassThroughImageTransportSurface(
233 GpuChannelManager* manager, 257 GpuChannelManager* manager,
234 GpuCommandBufferStub* stub, 258 GpuCommandBufferStub* stub,
235 gfx::GLSurface* surface, 259 gfx::GLSurface* surface,
236 bool transport) 260 bool transport)
237 : GLSurfaceAdapter(surface), 261 : GLSurfaceAdapter(surface),
238 transport_(transport), 262 transport_(transport),
239 did_set_swap_interval_(false) { 263 did_set_swap_interval_(false) {
240 helper_.reset(new ImageTransportHelper(this, 264 helper_.reset(new ImageTransportHelper(this,
241 manager, 265 manager,
242 stub, 266 stub,
243 gfx::kNullPluginWindow)); 267 gfx::kNullPluginWindow));
244 } 268 }
245 269
246 bool PassThroughImageTransportSurface::Initialize() { 270 bool PassThroughImageTransportSurface::Initialize() {
247 // The surface is assumed to have already been initialized. 271 // The surface is assumed to have already been initialized.
248 return helper_->Initialize(); 272 return helper_->Initialize();
249 } 273 }
250 274
251 void PassThroughImageTransportSurface::Destroy() { 275 void PassThroughImageTransportSurface::Destroy() {
252 helper_->Destroy(); 276 helper_->Destroy();
253 GLSurfaceAdapter::Destroy(); 277 GLSurfaceAdapter::Destroy();
254 } 278 }
255 279
280 void PassThroughImageTransportSurface::SetLatencyInfo(
281 const cc::LatencyInfo& latency_info) {
282 if (latency_info_.rendererImplFrameNumber !=
283 latency_info.rendererImplFrameNumber)
284 TRACE_EVENT_ASYNC_BEGIN2("frame", "Frame", this,
285 "frame_number",
286 latency_info.rendererImplFrameNumber,
287 "input_number", latency_info.inputNumber);
288
289 latency_info_ = latency_info;
290 }
291
256 bool PassThroughImageTransportSurface::SwapBuffers() { 292 bool PassThroughImageTransportSurface::SwapBuffers() {
257 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); 293 bool result = gfx::GLSurfaceAdapter::SwapBuffers();
294 latency_info_.swapTimestamp = base::TimeTicks::HighResNow();
295 helper_->SendLatencyInfo(latency_info_);
296 TRACE_EVENT_ASYNC_END2("frame", "Frame", this,
297 "frame_number", latency_info_.rendererImplFrameNumber,
298 "input_number", latency_info_.inputNumber);
299
258 SendVSyncUpdateIfAvailable(); 300 SendVSyncUpdateIfAvailable();
259 301
260 if (transport_) { 302 if (transport_) {
261 // Round trip to the browser UI thread, for throttling, by sending a dummy 303 // Round trip to the browser UI thread, for throttling, by sending a dummy
262 // SwapBuffers message. 304 // SwapBuffers message.
263 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 305 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
264 params.surface_handle = 0; 306 params.surface_handle = 0;
307 params.latency_info = latency_info_;
265 params.size = surface()->GetSize(); 308 params.size = surface()->GetSize();
266 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 309 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
267 310
268 helper_->SetScheduled(false); 311 helper_->SetScheduled(false);
269 } 312 }
270 return result; 313 return result;
271 } 314 }
272 315
273 bool PassThroughImageTransportSurface::PostSubBuffer( 316 bool PassThroughImageTransportSurface::PostSubBuffer(
274 int x, int y, int width, int height) { 317 int x, int y, int width, int height) {
275 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); 318 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height);
319 latency_info_.swapTimestamp = base::TimeTicks::HighResNow();
320 helper_->SendLatencyInfo(latency_info_);
321 TRACE_EVENT_ASYNC_END2("frame", "Frame", this,
322 "frame_number", latency_info_.rendererImplFrameNumber,
323 "input_number", latency_info_.inputNumber);
276 SendVSyncUpdateIfAvailable(); 324 SendVSyncUpdateIfAvailable();
277 325
278 if (transport_) { 326 if (transport_) {
279 // Round trip to the browser UI thread, for throttling, by sending a dummy 327 // Round trip to the browser UI thread, for throttling, by sending a dummy
280 // PostSubBuffer message. 328 // PostSubBuffer message.
281 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; 329 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
282 params.surface_handle = 0; 330 params.surface_handle = 0;
331 params.latency_info = latency_info_;
283 params.surface_size = surface()->GetSize(); 332 params.surface_size = surface()->GetSize();
284 params.x = x; 333 params.x = x;
285 params.y = y; 334 params.y = y;
286 params.width = width; 335 params.width = width;
287 params.height = height; 336 params.height = height;
288 helper_->SendAcceleratedSurfacePostSubBuffer(params); 337 helper_->SendAcceleratedSurfacePostSubBuffer(params);
289 338
290 helper_->SetScheduled(false); 339 helper_->SetScheduled(false);
291 } 340 }
292 return result; 341 return result;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 381
333 void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() { 382 void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() {
334 GetVSyncParameters( 383 GetVSyncParameters(
335 base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters, 384 base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters,
336 helper_->AsWeakPtr())); 385 helper_->AsWeakPtr()));
337 } 386 }
338 387
339 } // namespace content 388 } // namespace content
340 389
341 #endif // defined(ENABLE_GPU) 390 #endif // defined(ENABLE_GPU)
OLDNEW
« no previous file with comments | « content/common/gpu/image_transport_surface.h ('k') | content/common/gpu/image_transport_surface_mac.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698