Chromium Code Reviews| Index: services/ui/gpu/gpu_main.cc |
| diff --git a/services/ui/gpu/gpu_main.cc b/services/ui/gpu/gpu_main.cc |
| index b41369f45d85a834243b8cf3a351427c97496280..3b9ef3f97fe917b15e1fc1f723d73ef204ebd581 100644 |
| --- a/services/ui/gpu/gpu_main.cc |
| +++ b/services/ui/gpu/gpu_main.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/command_line.h" |
| #include "base/message_loop/message_loop.h" |
| #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
| +#include "gpu/ipc/gpu_in_process_thread_service.h" |
| #include "gpu/ipc/service/gpu_memory_buffer_factory.h" |
| #include "gpu/ipc/service/gpu_watchdog_thread.h" |
| #include "services/ui/gpu/gpu_service_internal.h" |
| @@ -112,6 +113,26 @@ void GpuMain::Create(mojom::GpuServiceInternalRequest request) { |
| base::Passed(std::move(request)))); |
| } |
| +void GpuMain::Create(cc::mojom::DisplayCompositorFactoryRequest request) { |
| + // TODO(fsamuel): This must be called AFTER GpuServiceInternal has been |
| + // initialized. |
|
sadrul
2016/11/29 19:46:41
DCHECK()?
Fady Samuel
2016/11/29 20:08:58
GpuMain doesn't know about GpuServiceInternal::Ini
|
| + gpu_command_service_ = new gpu::GpuInProcessThreadService( |
| + gpu_thread_.task_runner(), gpu_service_internal_->sync_point_manager(), |
| + gpu_service_internal_->mailbox_manager(), |
| + gpu_service_internal_->share_group()); |
| + |
| + // |gpu_memory_buffer_factory_| is null in tests. |
| + gpu::ImageFactory* image_factory = |
| + gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() |
| + : nullptr; |
| + |
| + compositor_thread_.task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&GpuMain::InitOnCompositorThread, base::Unretained(this), |
| + image_factory, compositor_thread_.task_runner(), |
| + base::Passed(std::move(request)))); |
| +} |
| + |
| void GpuMain::InitOnGpuThread( |
| scoped_refptr<base::SingleThreadTaskRunner> io_runner, |
| scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { |
| @@ -119,20 +140,31 @@ void GpuMain::InitOnGpuThread( |
| gpu_init_->set_sandbox_helper(this); |
| bool success = gpu_init_->InitializeAndStartSandbox( |
| *base::CommandLine::ForCurrentProcess()); |
| - if (success) { |
| - if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { |
| - gpu_memory_buffer_factory_ = |
| - gpu::GpuMemoryBufferFactory::CreateNativeType(); |
| - } |
| - gpu_service_internal_.reset(new GpuServiceInternal( |
| - gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), |
| - gpu_memory_buffer_factory_.get(), io_runner, compositor_runner)); |
| + if (!success) |
| + return; |
| + |
| + if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { |
| + gpu_memory_buffer_factory_ = |
| + gpu::GpuMemoryBufferFactory::CreateNativeType(); |
| } |
| + |
| + gpu_service_internal_ = base::MakeUnique<GpuServiceInternal>( |
| + gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), |
| + gpu_memory_buffer_factory_.get(), io_runner); |
| +} |
| + |
| +void GpuMain::InitOnCompositorThread( |
| + gpu::ImageFactory* image_factory, |
| + scoped_refptr<base::SingleThreadTaskRunner> compositor_runner, |
| + cc::mojom::DisplayCompositorFactoryRequest request) { |
| + DCHECK(!display_compositor_factory_); |
| + display_compositor_factory_ = base::MakeUnique<DisplayCompositorFactory>( |
| + this, gpu_command_service_, compositor_runner, image_factory, |
| + std::move(request)); |
| } |
| void GpuMain::TearDownOnCompositorThread() { |
| - if (gpu_service_internal_) |
| - gpu_service_internal_->DestroyDisplayCompositor(); |
| + display_compositor_factory_.reset(); |
| } |
| void GpuMain::TearDownOnGpuThread() { |
| @@ -143,7 +175,7 @@ void GpuMain::TearDownOnGpuThread() { |
| void GpuMain::CreateOnGpuThread(mojom::GpuServiceInternalRequest request) { |
| if (gpu_service_internal_) |
| - gpu_service_internal_->Add(std::move(request)); |
| + gpu_service_internal_->Bind(std::move(request)); |
| } |
| void GpuMain::PreSandboxStartup() { |
| @@ -156,4 +188,20 @@ bool GpuMain::EnsureSandboxInitialized( |
| return true; |
| } |
| +std::unique_ptr<gpu::GpuMemoryBufferManager> |
| +GpuMain::CreateGpuMemoryBufferManager() { |
| + if (!gpu_service_internal_) |
| + return nullptr; |
| + |
| + if (!gpu_internal_) { |
| + mojom::GpuServiceInternalRequest gpu_service_request = |
| + mojo::GetProxy(&gpu_internal_); |
| + |
| + Create(std::move(gpu_service_request)); |
| + } |
| + |
| + return base::MakeUnique<MusGpuMemoryBufferManager>(gpu_internal_.get(), |
| + 1 /* client_id */); |
| +} |
| + |
| } // namespace ui |