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 #include "content/common/gpu/image_transport_surface.h" | 5 #include "content/common/gpu/image_transport_surface.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 return true; | 79 return true; |
80 } | 80 } |
81 | 81 |
82 void ImageTransportHelper::Destroy() {} | 82 void ImageTransportHelper::Destroy() {} |
83 | 83 |
84 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { | 84 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
85 bool handled = true; | 85 bool handled = true; |
86 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) | 86 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) |
87 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented, | 87 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented, |
88 OnBufferPresented) | 88 OnBufferPresented) |
89 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); | |
90 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_WakeUpGpu, OnWakeUpGpu); | 89 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_WakeUpGpu, OnWakeUpGpu); |
91 IPC_MESSAGE_UNHANDLED(handled = false) | 90 IPC_MESSAGE_UNHANDLED(handled = false) |
92 IPC_END_MESSAGE_MAP() | 91 IPC_END_MESSAGE_MAP() |
93 return handled; | 92 return handled; |
94 } | 93 } |
95 | 94 |
96 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( | 95 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( |
97 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { | 96 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { |
98 // TRACE_EVENT for gpu tests: | 97 // TRACE_EVENT for gpu tests: |
99 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers", | 98 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers", |
(...skipping 11 matching lines...) Expand all Loading... |
111 params.route_id = route_id_; | 110 params.route_id = route_id_; |
112 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); | 111 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); |
113 } | 112 } |
114 | 113 |
115 void ImageTransportHelper::SendAcceleratedSurfaceRelease() { | 114 void ImageTransportHelper::SendAcceleratedSurfaceRelease() { |
116 GpuHostMsg_AcceleratedSurfaceRelease_Params params; | 115 GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
117 params.surface_id = stub_->surface_id(); | 116 params.surface_id = stub_->surface_id(); |
118 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); | 117 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); |
119 } | 118 } |
120 | 119 |
121 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { | |
122 manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(), | |
123 route_id_, | |
124 size)); | |
125 } | |
126 | |
127 void ImageTransportHelper::SendUpdateVSyncParameters( | 120 void ImageTransportHelper::SendUpdateVSyncParameters( |
128 base::TimeTicks timebase, base::TimeDelta interval) { | 121 base::TimeTicks timebase, base::TimeDelta interval) { |
129 manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(), | 122 manager_->Send(new GpuHostMsg_UpdateVSyncParameters(stub_->surface_id(), |
130 timebase, | 123 timebase, |
131 interval)); | 124 interval)); |
132 } | 125 } |
133 | 126 |
134 void ImageTransportHelper::SendLatencyInfo( | 127 void ImageTransportHelper::SendLatencyInfo( |
135 const std::vector<ui::LatencyInfo>& latency_info) { | 128 const std::vector<ui::LatencyInfo>& latency_info) { |
136 manager_->Send(new GpuHostMsg_FrameDrawn(latency_info)); | 129 manager_->Send(new GpuHostMsg_FrameDrawn(latency_info)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 if (!stub_.get()) | 177 if (!stub_.get()) |
185 return NULL; | 178 return NULL; |
186 return stub_->decoder(); | 179 return stub_->decoder(); |
187 } | 180 } |
188 | 181 |
189 void ImageTransportHelper::OnBufferPresented( | 182 void ImageTransportHelper::OnBufferPresented( |
190 const AcceleratedSurfaceMsg_BufferPresented_Params& params) { | 183 const AcceleratedSurfaceMsg_BufferPresented_Params& params) { |
191 surface_->OnBufferPresented(params); | 184 surface_->OnBufferPresented(params); |
192 } | 185 } |
193 | 186 |
194 void ImageTransportHelper::OnResizeViewACK() { | |
195 surface_->OnResizeViewACK(); | |
196 } | |
197 | |
198 void ImageTransportHelper::OnWakeUpGpu() { | 187 void ImageTransportHelper::OnWakeUpGpu() { |
199 surface_->WakeUpGpu(); | 188 surface_->WakeUpGpu(); |
200 } | 189 } |
201 | 190 |
202 void ImageTransportHelper::Resize(gfx::Size size, float scale_factor) { | 191 void ImageTransportHelper::Resize(gfx::Size size, float scale_factor) { |
203 surface_->OnResize(size, scale_factor); | 192 surface_->OnResize(size, scale_factor); |
204 | 193 |
205 #if defined(OS_ANDROID) | 194 #if defined(OS_ANDROID) |
206 manager_->gpu_memory_manager()->ScheduleManage( | 195 manager_->gpu_memory_manager()->ScheduleManage( |
207 GpuMemoryManager::kScheduleManageNow); | 196 GpuMemoryManager::kScheduleManageNow); |
208 #endif | 197 #endif |
209 } | 198 } |
210 | 199 |
211 void ImageTransportHelper::SetLatencyInfo( | 200 void ImageTransportHelper::SetLatencyInfo( |
212 const std::vector<ui::LatencyInfo>& latency_info) { | 201 const std::vector<ui::LatencyInfo>& latency_info) { |
213 surface_->SetLatencyInfo(latency_info); | 202 surface_->SetLatencyInfo(latency_info); |
214 } | 203 } |
215 | 204 |
216 PassThroughImageTransportSurface::PassThroughImageTransportSurface( | 205 PassThroughImageTransportSurface::PassThroughImageTransportSurface( |
217 GpuChannelManager* manager, | 206 GpuChannelManager* manager, |
218 GpuCommandBufferStub* stub, | 207 GpuCommandBufferStub* stub, |
219 gfx::GLSurface* surface, | 208 gfx::GLSurface* surface) |
220 bool transport) | |
221 : GLSurfaceAdapter(surface), | 209 : GLSurfaceAdapter(surface), |
222 transport_(transport), | 210 did_set_swap_interval_(false) { |
223 did_set_swap_interval_(false), | |
224 did_unschedule_(false), | |
225 is_swap_buffers_pending_(false) { | |
226 helper_.reset(new ImageTransportHelper(this, | 211 helper_.reset(new ImageTransportHelper(this, |
227 manager, | 212 manager, |
228 stub, | 213 stub, |
229 gfx::kNullPluginWindow)); | 214 gfx::kNullPluginWindow)); |
230 } | 215 } |
231 | 216 |
232 bool PassThroughImageTransportSurface::Initialize() { | 217 bool PassThroughImageTransportSurface::Initialize() { |
233 // The surface is assumed to have already been initialized. | 218 // The surface is assumed to have already been initialized. |
234 return helper_->Initialize(); | 219 return helper_->Initialize(); |
235 } | 220 } |
236 | 221 |
237 void PassThroughImageTransportSurface::Destroy() { | 222 void PassThroughImageTransportSurface::Destroy() { |
238 helper_->Destroy(); | 223 helper_->Destroy(); |
239 GLSurfaceAdapter::Destroy(); | 224 GLSurfaceAdapter::Destroy(); |
240 } | 225 } |
241 | 226 |
242 bool PassThroughImageTransportSurface::DeferDraws() { | |
243 if (is_swap_buffers_pending_) { | |
244 DCHECK(!did_unschedule_); | |
245 did_unschedule_ = true; | |
246 helper_->SetScheduled(false); | |
247 return true; | |
248 } | |
249 return false; | |
250 } | |
251 | |
252 void PassThroughImageTransportSurface::SetLatencyInfo( | 227 void PassThroughImageTransportSurface::SetLatencyInfo( |
253 const std::vector<ui::LatencyInfo>& latency_info) { | 228 const std::vector<ui::LatencyInfo>& latency_info) { |
254 for (size_t i = 0; i < latency_info.size(); i++) | 229 for (size_t i = 0; i < latency_info.size(); i++) |
255 latency_info_.push_back(latency_info[i]); | 230 latency_info_.push_back(latency_info[i]); |
256 } | 231 } |
257 | 232 |
258 bool PassThroughImageTransportSurface::SwapBuffers() { | 233 bool PassThroughImageTransportSurface::SwapBuffers() { |
259 // GetVsyncValues before SwapBuffers to work around Mali driver bug: | 234 // GetVsyncValues before SwapBuffers to work around Mali driver bug: |
260 // crbug.com/223558. | 235 // crbug.com/223558. |
261 SendVSyncUpdateIfAvailable(); | 236 SendVSyncUpdateIfAvailable(); |
262 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); | 237 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); |
263 for (size_t i = 0; i < latency_info_.size(); i++) { | 238 for (size_t i = 0; i < latency_info_.size(); i++) { |
264 latency_info_[i].AddLatencyNumber( | 239 latency_info_[i].AddLatencyNumber( |
265 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); | 240 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); |
266 } | 241 } |
267 | 242 |
268 if (transport_) { | 243 helper_->SendLatencyInfo(latency_info_); |
269 DCHECK(!is_swap_buffers_pending_); | |
270 is_swap_buffers_pending_ = true; | |
271 | |
272 // Round trip to the browser UI thread, for throttling, by sending a dummy | |
273 // SwapBuffers message. | |
274 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | |
275 params.surface_handle = 0; | |
276 params.latency_info.swap(latency_info_); | |
277 params.size = surface()->GetSize(); | |
278 helper_->SendAcceleratedSurfaceBuffersSwapped(params); | |
279 } else { | |
280 helper_->SendLatencyInfo(latency_info_); | |
281 } | |
282 latency_info_.clear(); | 244 latency_info_.clear(); |
283 return result; | 245 return result; |
284 } | 246 } |
285 | 247 |
286 bool PassThroughImageTransportSurface::PostSubBuffer( | 248 bool PassThroughImageTransportSurface::PostSubBuffer( |
287 int x, int y, int width, int height) { | 249 int x, int y, int width, int height) { |
288 SendVSyncUpdateIfAvailable(); | 250 SendVSyncUpdateIfAvailable(); |
289 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); | 251 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); |
290 for (size_t i = 0; i < latency_info_.size(); i++) { | 252 for (size_t i = 0; i < latency_info_.size(); i++) { |
291 latency_info_[i].AddLatencyNumber( | 253 latency_info_[i].AddLatencyNumber( |
292 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); | 254 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); |
293 } | 255 } |
294 | 256 |
295 if (transport_) { | 257 helper_->SendLatencyInfo(latency_info_); |
296 DCHECK(!is_swap_buffers_pending_); | |
297 is_swap_buffers_pending_ = true; | |
298 | |
299 // Round trip to the browser UI thread, for throttling, by sending a dummy | |
300 // PostSubBuffer message. | |
301 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; | |
302 params.surface_handle = 0; | |
303 params.latency_info.swap(latency_info_); | |
304 params.surface_size = surface()->GetSize(); | |
305 params.x = x; | |
306 params.y = y; | |
307 params.width = width; | |
308 params.height = height; | |
309 helper_->SendAcceleratedSurfacePostSubBuffer(params); | |
310 | |
311 helper_->SetScheduled(false); | |
312 } else { | |
313 helper_->SendLatencyInfo(latency_info_); | |
314 } | |
315 latency_info_.clear(); | 258 latency_info_.clear(); |
316 return result; | 259 return result; |
317 } | 260 } |
318 | 261 |
319 bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { | 262 bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { |
320 if (!did_set_swap_interval_) { | 263 if (!did_set_swap_interval_) { |
321 ImageTransportHelper::SetSwapInterval(context); | 264 ImageTransportHelper::SetSwapInterval(context); |
322 did_set_swap_interval_ = true; | 265 did_set_swap_interval_ = true; |
323 } | 266 } |
324 return true; | 267 return true; |
325 } | 268 } |
326 | 269 |
327 void PassThroughImageTransportSurface::OnBufferPresented( | 270 void PassThroughImageTransportSurface::OnBufferPresented( |
328 const AcceleratedSurfaceMsg_BufferPresented_Params& /* params */) { | 271 const AcceleratedSurfaceMsg_BufferPresented_Params& /* params */) { |
329 DCHECK(transport_); | 272 NOTREACHED(); |
330 DCHECK(is_swap_buffers_pending_); | |
331 is_swap_buffers_pending_ = false; | |
332 if (did_unschedule_) { | |
333 did_unschedule_ = false; | |
334 helper_->SetScheduled(true); | |
335 } | |
336 } | |
337 | |
338 void PassThroughImageTransportSurface::OnResizeViewACK() { | |
339 DCHECK(transport_); | |
340 Resize(new_size_); | |
341 | |
342 TRACE_EVENT_ASYNC_END0("gpu", "OnResize", this); | |
343 helper_->SetScheduled(true); | |
344 } | 273 } |
345 | 274 |
346 void PassThroughImageTransportSurface::OnResize(gfx::Size size, | 275 void PassThroughImageTransportSurface::OnResize(gfx::Size size, |
347 float scale_factor) { | 276 float scale_factor) { |
348 new_size_ = size; | 277 Resize(size); |
349 | |
350 if (transport_) { | |
351 helper_->SendResizeView(size); | |
352 helper_->SetScheduled(false); | |
353 TRACE_EVENT_ASYNC_BEGIN2("gpu", "OnResize", this, | |
354 "width", size.width(), "height", size.height()); | |
355 } else { | |
356 Resize(new_size_); | |
357 } | |
358 } | 278 } |
359 | 279 |
360 gfx::Size PassThroughImageTransportSurface::GetSize() { | 280 gfx::Size PassThroughImageTransportSurface::GetSize() { |
361 return GLSurfaceAdapter::GetSize(); | 281 return GLSurfaceAdapter::GetSize(); |
362 } | 282 } |
363 | 283 |
364 void PassThroughImageTransportSurface::WakeUpGpu() { | 284 void PassThroughImageTransportSurface::WakeUpGpu() { |
365 NOTIMPLEMENTED(); | 285 NOTIMPLEMENTED(); |
366 } | 286 } |
367 | 287 |
368 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {} | 288 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {} |
369 | 289 |
370 void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() { | 290 void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() { |
371 gfx::VSyncProvider* vsync_provider = GetVSyncProvider(); | 291 gfx::VSyncProvider* vsync_provider = GetVSyncProvider(); |
372 if (vsync_provider) { | 292 if (vsync_provider) { |
373 vsync_provider->GetVSyncParameters( | 293 vsync_provider->GetVSyncParameters( |
374 base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters, | 294 base::Bind(&ImageTransportHelper::SendUpdateVSyncParameters, |
375 helper_->AsWeakPtr())); | 295 helper_->AsWeakPtr())); |
376 } | 296 } |
377 } | 297 } |
378 | 298 |
379 } // namespace content | 299 } // namespace content |
OLD | NEW |