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