| 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 |