| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "services/ui/gpu/gpu_service.h" | 5 #include "services/ui/gpu/gpu_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/crash_logging.h" | 8 #include "base/debug/crash_logging.h" |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 | 225 |
| 226 void GpuService::DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, | 226 void GpuService::DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, |
| 227 int client_id, | 227 int client_id, |
| 228 const gpu::SyncToken& sync_token) { | 228 const gpu::SyncToken& sync_token) { |
| 229 if (io_runner_->BelongsToCurrentThread()) { | 229 if (io_runner_->BelongsToCurrentThread()) { |
| 230 main_runner_->PostTask( | 230 main_runner_->PostTask( |
| 231 FROM_HERE, base::Bind(&GpuService::DestroyGpuMemoryBuffer, weak_ptr_, | 231 FROM_HERE, base::Bind(&GpuService::DestroyGpuMemoryBuffer, weak_ptr_, |
| 232 id, client_id, sync_token)); | 232 id, client_id, sync_token)); |
| 233 return; | 233 return; |
| 234 } | 234 } |
| 235 if (gpu_channel_manager_) | 235 gpu_channel_manager_->DestroyGpuMemoryBuffer(id, client_id, sync_token); |
| 236 gpu_channel_manager_->DestroyGpuMemoryBuffer(id, client_id, sync_token); | |
| 237 } | 236 } |
| 238 | 237 |
| 239 void GpuService::GetVideoMemoryUsageStats( | 238 void GpuService::GetVideoMemoryUsageStats( |
| 240 const GetVideoMemoryUsageStatsCallback& callback) { | 239 const GetVideoMemoryUsageStatsCallback& callback) { |
| 241 if (io_runner_->BelongsToCurrentThread()) { | 240 if (io_runner_->BelongsToCurrentThread()) { |
| 242 auto wrap_callback = WrapCallback(io_runner_, callback); | 241 auto wrap_callback = WrapCallback(io_runner_, callback); |
| 243 main_runner_->PostTask( | 242 main_runner_->PostTask( |
| 244 FROM_HERE, base::Bind(&GpuService::GetVideoMemoryUsageStats, weak_ptr_, | 243 FROM_HERE, base::Bind(&GpuService::GetVideoMemoryUsageStats, weak_ptr_, |
| 245 wrap_callback)); | 244 wrap_callback)); |
| 246 return; | 245 return; |
| 247 } | 246 } |
| 248 gpu::VideoMemoryUsageStats video_memory_usage_stats; | 247 gpu::VideoMemoryUsageStats video_memory_usage_stats; |
| 249 if (gpu_channel_manager_) { | 248 gpu_channel_manager_->gpu_memory_manager()->GetVideoMemoryUsageStats( |
| 250 gpu_channel_manager_->gpu_memory_manager()->GetVideoMemoryUsageStats( | 249 &video_memory_usage_stats); |
| 251 &video_memory_usage_stats); | |
| 252 } | |
| 253 callback.Run(video_memory_usage_stats); | 250 callback.Run(video_memory_usage_stats); |
| 254 } | 251 } |
| 255 | 252 |
| 256 void GpuService::RequestCompleteGpuInfo( | 253 void GpuService::RequestCompleteGpuInfo( |
| 257 const RequestCompleteGpuInfoCallback& callback) { | 254 const RequestCompleteGpuInfoCallback& callback) { |
| 258 if (io_runner_->BelongsToCurrentThread()) { | 255 if (io_runner_->BelongsToCurrentThread()) { |
| 259 auto wrap_callback = WrapCallback(io_runner_, callback); | 256 auto wrap_callback = WrapCallback(io_runner_, callback); |
| 260 main_runner_->PostTask( | 257 main_runner_->PostTask( |
| 261 FROM_HERE, base::Bind(&GpuService::RequestCompleteGpuInfo, weak_ptr_, | 258 FROM_HERE, base::Bind(&GpuService::RequestCompleteGpuInfo, weak_ptr_, |
| 262 wrap_callback)); | 259 wrap_callback)); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 base::Bind(cb, base::Passed(std::move(handle)))); | 374 base::Bind(cb, base::Passed(std::move(handle)))); |
| 378 }, | 375 }, |
| 379 io_runner_, callback); | 376 io_runner_, callback); |
| 380 main_runner_->PostTask( | 377 main_runner_->PostTask( |
| 381 FROM_HERE, | 378 FROM_HERE, |
| 382 base::Bind(&GpuService::EstablishGpuChannel, weak_ptr_, client_id, | 379 base::Bind(&GpuService::EstablishGpuChannel, weak_ptr_, client_id, |
| 383 client_tracing_id, is_gpu_host, wrap_callback)); | 380 client_tracing_id, is_gpu_host, wrap_callback)); |
| 384 return; | 381 return; |
| 385 } | 382 } |
| 386 | 383 |
| 387 if (!gpu_channel_manager_) { | |
| 388 callback.Run(mojo::ScopedMessagePipeHandle()); | |
| 389 return; | |
| 390 } | |
| 391 | |
| 392 gpu::GpuChannel* gpu_channel = gpu_channel_manager_->EstablishChannel( | 384 gpu::GpuChannel* gpu_channel = gpu_channel_manager_->EstablishChannel( |
| 393 client_id, client_tracing_id, is_gpu_host); | 385 client_id, client_tracing_id, is_gpu_host); |
| 394 | 386 |
| 395 mojo::MessagePipe pipe; | 387 mojo::MessagePipe pipe; |
| 396 gpu_channel->Init(base::MakeUnique<gpu::SyncChannelFilteredSender>( | 388 gpu_channel->Init(base::MakeUnique<gpu::SyncChannelFilteredSender>( |
| 397 pipe.handle0.release(), gpu_channel, io_runner_, shutdown_event_)); | 389 pipe.handle0.release(), gpu_channel, io_runner_, shutdown_event_)); |
| 398 | 390 |
| 399 media_gpu_channel_manager_->AddChannel(client_id); | 391 media_gpu_channel_manager_->AddChannel(client_id); |
| 400 | 392 |
| 401 callback.Run(std::move(pipe.handle1)); | 393 callback.Run(std::move(pipe.handle1)); |
| 402 } | 394 } |
| 403 | 395 |
| 404 void GpuService::CloseChannel(int32_t client_id) { | 396 void GpuService::CloseChannel(int32_t client_id) { |
| 405 if (io_runner_->BelongsToCurrentThread()) { | 397 if (io_runner_->BelongsToCurrentThread()) { |
| 406 main_runner_->PostTask( | 398 main_runner_->PostTask( |
| 407 FROM_HERE, base::Bind(&GpuService::CloseChannel, weak_ptr_, client_id)); | 399 FROM_HERE, base::Bind(&GpuService::CloseChannel, weak_ptr_, client_id)); |
| 408 return; | 400 return; |
| 409 } | 401 } |
| 410 if (!gpu_channel_manager_) | |
| 411 return; | |
| 412 gpu_channel_manager_->RemoveChannel(client_id); | 402 gpu_channel_manager_->RemoveChannel(client_id); |
| 413 } | 403 } |
| 414 | 404 |
| 415 void GpuService::LoadedShader(const std::string& data) { | 405 void GpuService::LoadedShader(const std::string& data) { |
| 416 if (io_runner_->BelongsToCurrentThread()) { | 406 if (io_runner_->BelongsToCurrentThread()) { |
| 417 main_runner_->PostTask( | 407 main_runner_->PostTask( |
| 418 FROM_HERE, base::Bind(&GpuService::LoadedShader, weak_ptr_, data)); | 408 FROM_HERE, base::Bind(&GpuService::LoadedShader, weak_ptr_, data)); |
| 419 return; | 409 return; |
| 420 } | 410 } |
| 421 if (!gpu_channel_manager_) | |
| 422 return; | |
| 423 gpu_channel_manager_->PopulateShaderCache(data); | 411 gpu_channel_manager_->PopulateShaderCache(data); |
| 424 } | 412 } |
| 425 | 413 |
| 426 void GpuService::DestroyingVideoSurface( | 414 void GpuService::DestroyingVideoSurface( |
| 427 int32_t surface_id, | 415 int32_t surface_id, |
| 428 const DestroyingVideoSurfaceCallback& callback) { | 416 const DestroyingVideoSurfaceCallback& callback) { |
| 429 DCHECK(io_runner_->BelongsToCurrentThread()); | 417 DCHECK(io_runner_->BelongsToCurrentThread()); |
| 430 #if defined(OS_ANDROID) | 418 #if defined(OS_ANDROID) |
| 431 main_runner_->PostTaskAndReply( | 419 main_runner_->PostTaskAndReply( |
| 432 FROM_HERE, | 420 FROM_HERE, |
| 433 base::Bind( | 421 base::Bind( |
| 434 [](int32_t surface_id) { | 422 [](int32_t surface_id) { |
| 435 media::ContentVideoViewOverlayAllocator::GetInstance() | 423 media::ContentVideoViewOverlayAllocator::GetInstance() |
| 436 ->OnSurfaceDestroyed(surface_id); | 424 ->OnSurfaceDestroyed(surface_id); |
| 437 }, | 425 }, |
| 438 surface_id), | 426 surface_id), |
| 439 callback); | 427 callback); |
| 440 #else | 428 #else |
| 441 NOTREACHED() << "DestroyingVideoSurface() not supported on this platform."; | 429 NOTREACHED() << "DestroyingVideoSurface() not supported on this platform."; |
| 442 #endif | 430 #endif |
| 443 } | 431 } |
| 444 | 432 |
| 445 void GpuService::WakeUpGpu() { | 433 void GpuService::WakeUpGpu() { |
| 446 if (io_runner_->BelongsToCurrentThread()) { | 434 if (io_runner_->BelongsToCurrentThread()) { |
| 447 main_runner_->PostTask(FROM_HERE, | 435 main_runner_->PostTask(FROM_HERE, |
| 448 base::Bind(&GpuService::WakeUpGpu, weak_ptr_)); | 436 base::Bind(&GpuService::WakeUpGpu, weak_ptr_)); |
| 449 return; | 437 return; |
| 450 } | 438 } |
| 451 #if defined(OS_ANDROID) | 439 #if defined(OS_ANDROID) |
| 452 if (!gpu_channel_manager_) | |
| 453 return; | |
| 454 gpu_channel_manager_->WakeUpGpu(); | 440 gpu_channel_manager_->WakeUpGpu(); |
| 455 #else | 441 #else |
| 456 NOTREACHED() << "WakeUpGpu() not supported on this platform."; | 442 NOTREACHED() << "WakeUpGpu() not supported on this platform."; |
| 457 #endif | 443 #endif |
| 458 } | 444 } |
| 459 | 445 |
| 460 void GpuService::GpuSwitched() { | 446 void GpuService::GpuSwitched() { |
| 461 DVLOG(1) << "GPU: GPU has switched"; | 447 DVLOG(1) << "GPU: GPU has switched"; |
| 462 if (!in_host_process_) | 448 if (!in_host_process_) |
| 463 ui::GpuSwitchingManager::GetInstance()->NotifyGpuSwitched(); | 449 ui::GpuSwitchingManager::GetInstance()->NotifyGpuSwitched(); |
| 464 } | 450 } |
| 465 | 451 |
| 466 void GpuService::DestroyAllChannels() { | 452 void GpuService::DestroyAllChannels() { |
| 467 if (io_runner_->BelongsToCurrentThread()) { | 453 if (io_runner_->BelongsToCurrentThread()) { |
| 468 main_runner_->PostTask( | 454 main_runner_->PostTask( |
| 469 FROM_HERE, base::Bind(&GpuService::DestroyAllChannels, weak_ptr_)); | 455 FROM_HERE, base::Bind(&GpuService::DestroyAllChannels, weak_ptr_)); |
| 470 return; | 456 return; |
| 471 } | 457 } |
| 472 if (!gpu_channel_manager_) | |
| 473 return; | |
| 474 DVLOG(1) << "GPU: Removing all contexts"; | 458 DVLOG(1) << "GPU: Removing all contexts"; |
| 475 gpu_channel_manager_->DestroyAllChannels(); | 459 gpu_channel_manager_->DestroyAllChannels(); |
| 476 } | 460 } |
| 477 | 461 |
| 478 void GpuService::Crash() { | 462 void GpuService::Crash() { |
| 479 DCHECK(io_runner_->BelongsToCurrentThread()); | 463 DCHECK(io_runner_->BelongsToCurrentThread()); |
| 480 DVLOG(1) << "GPU: Simulating GPU crash"; | 464 DVLOG(1) << "GPU: Simulating GPU crash"; |
| 481 // Good bye, cruel world. | 465 // Good bye, cruel world. |
| 482 volatile int* it_s_the_end_of_the_world_as_we_know_it = NULL; | 466 volatile int* it_s_the_end_of_the_world_as_we_know_it = NULL; |
| 483 *it_s_the_end_of_the_world_as_we_know_it = 0xdead; | 467 *it_s_the_end_of_the_world_as_we_know_it = 0xdead; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 508 | 492 |
| 509 void GpuService::Stop(const StopCallback& callback) { | 493 void GpuService::Stop(const StopCallback& callback) { |
| 510 DCHECK(io_runner_->BelongsToCurrentThread()); | 494 DCHECK(io_runner_->BelongsToCurrentThread()); |
| 511 main_runner_->PostTaskAndReply(FROM_HERE, base::Bind([] { | 495 main_runner_->PostTaskAndReply(FROM_HERE, base::Bind([] { |
| 512 base::MessageLoop::current()->QuitWhenIdle(); | 496 base::MessageLoop::current()->QuitWhenIdle(); |
| 513 }), | 497 }), |
| 514 callback); | 498 callback); |
| 515 } | 499 } |
| 516 | 500 |
| 517 } // namespace ui | 501 } // namespace ui |
| OLD | NEW |