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 #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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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) |
OLD | NEW |