OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser/gpu/gpu_process_host.h" | 5 #include "content/browser/gpu/gpu_process_host.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 return true; | 309 return true; |
310 } | 310 } |
311 | 311 |
312 return BrowserChildProcessHost::Send(msg); | 312 return BrowserChildProcessHost::Send(msg); |
313 } | 313 } |
314 | 314 |
315 bool GpuProcessHost::OnMessageReceived(const IPC::Message& message) { | 315 bool GpuProcessHost::OnMessageReceived(const IPC::Message& message) { |
316 DCHECK(CalledOnValidThread()); | 316 DCHECK(CalledOnValidThread()); |
317 IPC_BEGIN_MESSAGE_MAP(GpuProcessHost, message) | 317 IPC_BEGIN_MESSAGE_MAP(GpuProcessHost, message) |
318 IPC_MESSAGE_HANDLER(GpuHostMsg_ChannelEstablished, OnChannelEstablished) | 318 IPC_MESSAGE_HANDLER(GpuHostMsg_ChannelEstablished, OnChannelEstablished) |
319 IPC_MESSAGE_HANDLER(GpuHostMsg_SynchronizeReply, OnSynchronizeReply) | |
320 IPC_MESSAGE_HANDLER(GpuHostMsg_CommandBufferCreated, OnCommandBufferCreated) | 319 IPC_MESSAGE_HANDLER(GpuHostMsg_CommandBufferCreated, OnCommandBufferCreated) |
321 IPC_MESSAGE_HANDLER(GpuHostMsg_DestroyCommandBuffer, OnDestroyCommandBuffer) | 320 IPC_MESSAGE_HANDLER(GpuHostMsg_DestroyCommandBuffer, OnDestroyCommandBuffer) |
322 IPC_MESSAGE_HANDLER(GpuHostMsg_GraphicsInfoCollected, | 321 IPC_MESSAGE_HANDLER(GpuHostMsg_GraphicsInfoCollected, |
323 OnGraphicsInfoCollected) | 322 OnGraphicsInfoCollected) |
324 IPC_MESSAGE_UNHANDLED(RouteOnUIThread(message)) | 323 IPC_MESSAGE_UNHANDLED(RouteOnUIThread(message)) |
325 IPC_END_MESSAGE_MAP() | 324 IPC_END_MESSAGE_MAP() |
326 | 325 |
327 return true; | 326 return true; |
328 } | 327 } |
329 | 328 |
(...skipping 21 matching lines...) Expand all Loading... |
351 | 350 |
352 if (Send(new GpuMsg_EstablishChannel(renderer_id))) { | 351 if (Send(new GpuMsg_EstablishChannel(renderer_id))) { |
353 channel_requests_.push(wrapped_callback); | 352 channel_requests_.push(wrapped_callback); |
354 } else { | 353 } else { |
355 EstablishChannelError( | 354 EstablishChannelError( |
356 wrapped_callback.release(), IPC::ChannelHandle(), | 355 wrapped_callback.release(), IPC::ChannelHandle(), |
357 base::kNullProcessHandle, GPUInfo()); | 356 base::kNullProcessHandle, GPUInfo()); |
358 } | 357 } |
359 } | 358 } |
360 | 359 |
361 void GpuProcessHost::Synchronize(SynchronizeCallback* callback) { | |
362 DCHECK(CalledOnValidThread()); | |
363 linked_ptr<SynchronizeCallback> wrapped_callback(callback); | |
364 | |
365 if (Send(new GpuMsg_Synchronize())) { | |
366 synchronize_requests_.push(wrapped_callback); | |
367 } else { | |
368 SynchronizeError(wrapped_callback.release()); | |
369 } | |
370 } | |
371 | |
372 void GpuProcessHost::CreateViewCommandBuffer( | 360 void GpuProcessHost::CreateViewCommandBuffer( |
373 gfx::PluginWindowHandle compositing_surface, | 361 gfx::PluginWindowHandle compositing_surface, |
374 int32 render_view_id, | 362 int32 render_view_id, |
375 int32 renderer_id, | 363 int32 renderer_id, |
376 const GPUCreateCommandBufferConfig& init_params, | 364 const GPUCreateCommandBufferConfig& init_params, |
377 CreateCommandBufferCallback* callback) { | 365 CreateCommandBufferCallback* callback) { |
378 DCHECK(CalledOnValidThread()); | 366 DCHECK(CalledOnValidThread()); |
379 linked_ptr<CreateCommandBufferCallback> wrapped_callback(callback); | 367 linked_ptr<CreateCommandBufferCallback> wrapped_callback(callback); |
380 | 368 |
381 #if defined(TOOLKIT_USES_GTK) && !defined(TOUCH_UI) | 369 #if defined(TOOLKIT_USES_GTK) && !defined(TOUCH_UI) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 logging::LOG_WARNING, | 416 logging::LOG_WARNING, |
429 "WARNING", | 417 "WARNING", |
430 "Hardware acceleration is unavailable.")); | 418 "Hardware acceleration is unavailable.")); |
431 return; | 419 return; |
432 } | 420 } |
433 | 421 |
434 callback->Run( | 422 callback->Run( |
435 channel_handle, gpu_process_, GpuDataManager::GetInstance()->gpu_info()); | 423 channel_handle, gpu_process_, GpuDataManager::GetInstance()->gpu_info()); |
436 } | 424 } |
437 | 425 |
438 void GpuProcessHost::OnSynchronizeReply() { | |
439 // Guard against race conditions in abrupt GPU process termination. | |
440 if (!synchronize_requests_.empty()) { | |
441 linked_ptr<SynchronizeCallback> callback(synchronize_requests_.front()); | |
442 synchronize_requests_.pop(); | |
443 callback->Run(); | |
444 } | |
445 } | |
446 | |
447 void GpuProcessHost::OnCommandBufferCreated(const int32 route_id) { | 426 void GpuProcessHost::OnCommandBufferCreated(const int32 route_id) { |
448 if (!create_command_buffer_requests_.empty()) { | 427 if (!create_command_buffer_requests_.empty()) { |
449 linked_ptr<CreateCommandBufferCallback> callback = | 428 linked_ptr<CreateCommandBufferCallback> callback = |
450 create_command_buffer_requests_.front(); | 429 create_command_buffer_requests_.front(); |
451 create_command_buffer_requests_.pop(); | 430 create_command_buffer_requests_.pop(); |
452 if (route_id == MSG_ROUTING_NONE) | 431 if (route_id == MSG_ROUTING_NONE) |
453 CreateCommandBufferError(callback.release(), route_id); | 432 CreateCommandBufferError(callback.release(), route_id); |
454 else | 433 else |
455 callback->Run(route_id); | 434 callback->Run(route_id); |
456 } | 435 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 void GpuProcessHost::SendOutstandingReplies() { | 564 void GpuProcessHost::SendOutstandingReplies() { |
586 // First send empty channel handles for all EstablishChannel requests. | 565 // First send empty channel handles for all EstablishChannel requests. |
587 while (!channel_requests_.empty()) { | 566 while (!channel_requests_.empty()) { |
588 linked_ptr<EstablishChannelCallback> callback = channel_requests_.front(); | 567 linked_ptr<EstablishChannelCallback> callback = channel_requests_.front(); |
589 channel_requests_.pop(); | 568 channel_requests_.pop(); |
590 EstablishChannelError(callback.release(), | 569 EstablishChannelError(callback.release(), |
591 IPC::ChannelHandle(), | 570 IPC::ChannelHandle(), |
592 base::kNullProcessHandle, | 571 base::kNullProcessHandle, |
593 GPUInfo()); | 572 GPUInfo()); |
594 } | 573 } |
595 | |
596 // Now unblock all renderers waiting for synchronization replies. | |
597 while (!synchronize_requests_.empty()) { | |
598 linked_ptr<SynchronizeCallback> callback = synchronize_requests_.front(); | |
599 synchronize_requests_.pop(); | |
600 SynchronizeError(callback.release()); | |
601 } | |
602 } | 574 } |
603 | 575 |
604 void GpuProcessHost::EstablishChannelError( | 576 void GpuProcessHost::EstablishChannelError( |
605 EstablishChannelCallback* callback, | 577 EstablishChannelCallback* callback, |
606 const IPC::ChannelHandle& channel_handle, | 578 const IPC::ChannelHandle& channel_handle, |
607 base::ProcessHandle renderer_process_for_gpu, | 579 base::ProcessHandle renderer_process_for_gpu, |
608 const GPUInfo& gpu_info) { | 580 const GPUInfo& gpu_info) { |
609 scoped_ptr<EstablishChannelCallback> wrapped_callback(callback); | 581 scoped_ptr<EstablishChannelCallback> wrapped_callback(callback); |
610 wrapped_callback->Run(channel_handle, renderer_process_for_gpu, gpu_info); | 582 wrapped_callback->Run(channel_handle, renderer_process_for_gpu, gpu_info); |
611 } | 583 } |
612 | 584 |
613 void GpuProcessHost::CreateCommandBufferError( | 585 void GpuProcessHost::CreateCommandBufferError( |
614 CreateCommandBufferCallback* callback, int32 route_id) { | 586 CreateCommandBufferCallback* callback, int32 route_id) { |
615 scoped_ptr<GpuProcessHost::CreateCommandBufferCallback> | 587 scoped_ptr<GpuProcessHost::CreateCommandBufferCallback> |
616 wrapped_callback(callback); | 588 wrapped_callback(callback); |
617 callback->Run(route_id); | 589 callback->Run(route_id); |
618 } | 590 } |
619 | |
620 void GpuProcessHost::SynchronizeError(SynchronizeCallback* callback) { | |
621 scoped_ptr<SynchronizeCallback> wrapped_callback(callback); | |
622 wrapped_callback->Run(); | |
623 } | |
OLD | NEW |