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