Chromium Code Reviews| 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_main.h" | 5 #include "services/ui/gpu/gpu_main.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "gpu/ipc/common/gpu_memory_buffer_support.h" | 9 #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
| 10 #include "gpu/ipc/gpu_in_process_thread_service.h" | |
| 10 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" | 11 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" |
| 11 #include "gpu/ipc/service/gpu_watchdog_thread.h" | 12 #include "gpu/ipc/service/gpu_watchdog_thread.h" |
| 12 #include "services/ui/gpu/gpu_service_internal.h" | 13 #include "services/ui/gpu/gpu_service_internal.h" |
| 13 | 14 |
| 14 namespace { | 15 namespace { |
| 15 | 16 |
| 16 #if defined(OS_WIN) | 17 #if defined(OS_WIN) |
| 17 std::unique_ptr<base::MessagePump> CreateMessagePumpWin() { | 18 std::unique_ptr<base::MessagePump> CreateMessagePumpWin() { |
| 18 base::MessagePumpForGpu::InitFactory(); | 19 base::MessagePumpForGpu::InitFactory(); |
| 19 return base::MessageLoop::CreateMessagePumpForType( | 20 return base::MessageLoop::CreateMessagePumpForType( |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 105 io_thread_.task_runner(), compositor_thread_.task_runner())); | 106 io_thread_.task_runner(), compositor_thread_.task_runner())); |
| 106 } | 107 } |
| 107 | 108 |
| 108 void GpuMain::Create(mojom::GpuServiceInternalRequest request) { | 109 void GpuMain::Create(mojom::GpuServiceInternalRequest request) { |
| 109 gpu_thread_.task_runner()->PostTask( | 110 gpu_thread_.task_runner()->PostTask( |
| 110 FROM_HERE, | 111 FROM_HERE, |
| 111 base::Bind(&GpuMain::CreateOnGpuThread, weak_factory_.GetWeakPtr(), | 112 base::Bind(&GpuMain::CreateOnGpuThread, weak_factory_.GetWeakPtr(), |
| 112 base::Passed(std::move(request)))); | 113 base::Passed(std::move(request)))); |
| 113 } | 114 } |
| 114 | 115 |
| 116 void GpuMain::Create(cc::mojom::DisplayCompositorFactoryRequest request) { | |
| 117 // TODO(fsamuel): This must be called AFTER GpuServiceInternal has been | |
| 118 // initialized. | |
|
sadrul
2016/11/29 19:46:41
DCHECK()?
Fady Samuel
2016/11/29 20:08:58
GpuMain doesn't know about GpuServiceInternal::Ini
| |
| 119 gpu_command_service_ = new gpu::GpuInProcessThreadService( | |
| 120 gpu_thread_.task_runner(), gpu_service_internal_->sync_point_manager(), | |
| 121 gpu_service_internal_->mailbox_manager(), | |
| 122 gpu_service_internal_->share_group()); | |
| 123 | |
| 124 // |gpu_memory_buffer_factory_| is null in tests. | |
| 125 gpu::ImageFactory* image_factory = | |
| 126 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() | |
| 127 : nullptr; | |
| 128 | |
| 129 compositor_thread_.task_runner()->PostTask( | |
| 130 FROM_HERE, | |
| 131 base::Bind(&GpuMain::InitOnCompositorThread, base::Unretained(this), | |
| 132 image_factory, compositor_thread_.task_runner(), | |
| 133 base::Passed(std::move(request)))); | |
| 134 } | |
| 135 | |
| 115 void GpuMain::InitOnGpuThread( | 136 void GpuMain::InitOnGpuThread( |
| 116 scoped_refptr<base::SingleThreadTaskRunner> io_runner, | 137 scoped_refptr<base::SingleThreadTaskRunner> io_runner, |
| 117 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { | 138 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { |
| 118 gpu_init_.reset(new gpu::GpuInit()); | 139 gpu_init_.reset(new gpu::GpuInit()); |
| 119 gpu_init_->set_sandbox_helper(this); | 140 gpu_init_->set_sandbox_helper(this); |
| 120 bool success = gpu_init_->InitializeAndStartSandbox( | 141 bool success = gpu_init_->InitializeAndStartSandbox( |
| 121 *base::CommandLine::ForCurrentProcess()); | 142 *base::CommandLine::ForCurrentProcess()); |
| 122 if (success) { | 143 if (!success) |
| 123 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { | 144 return; |
| 124 gpu_memory_buffer_factory_ = | 145 |
| 125 gpu::GpuMemoryBufferFactory::CreateNativeType(); | 146 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { |
| 126 } | 147 gpu_memory_buffer_factory_ = |
| 127 gpu_service_internal_.reset(new GpuServiceInternal( | 148 gpu::GpuMemoryBufferFactory::CreateNativeType(); |
| 128 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), | |
| 129 gpu_memory_buffer_factory_.get(), io_runner, compositor_runner)); | |
| 130 } | 149 } |
| 150 | |
| 151 gpu_service_internal_ = base::MakeUnique<GpuServiceInternal>( | |
| 152 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), | |
| 153 gpu_memory_buffer_factory_.get(), io_runner); | |
| 154 } | |
| 155 | |
| 156 void GpuMain::InitOnCompositorThread( | |
| 157 gpu::ImageFactory* image_factory, | |
| 158 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner, | |
| 159 cc::mojom::DisplayCompositorFactoryRequest request) { | |
| 160 DCHECK(!display_compositor_factory_); | |
| 161 display_compositor_factory_ = base::MakeUnique<DisplayCompositorFactory>( | |
| 162 this, gpu_command_service_, compositor_runner, image_factory, | |
| 163 std::move(request)); | |
| 131 } | 164 } |
| 132 | 165 |
| 133 void GpuMain::TearDownOnCompositorThread() { | 166 void GpuMain::TearDownOnCompositorThread() { |
| 134 if (gpu_service_internal_) | 167 display_compositor_factory_.reset(); |
| 135 gpu_service_internal_->DestroyDisplayCompositor(); | |
| 136 } | 168 } |
| 137 | 169 |
| 138 void GpuMain::TearDownOnGpuThread() { | 170 void GpuMain::TearDownOnGpuThread() { |
| 139 gpu_service_internal_.reset(); | 171 gpu_service_internal_.reset(); |
| 140 gpu_memory_buffer_factory_.reset(); | 172 gpu_memory_buffer_factory_.reset(); |
| 141 gpu_init_.reset(); | 173 gpu_init_.reset(); |
| 142 } | 174 } |
| 143 | 175 |
| 144 void GpuMain::CreateOnGpuThread(mojom::GpuServiceInternalRequest request) { | 176 void GpuMain::CreateOnGpuThread(mojom::GpuServiceInternalRequest request) { |
| 145 if (gpu_service_internal_) | 177 if (gpu_service_internal_) |
| 146 gpu_service_internal_->Add(std::move(request)); | 178 gpu_service_internal_->Bind(std::move(request)); |
| 147 } | 179 } |
| 148 | 180 |
| 149 void GpuMain::PreSandboxStartup() { | 181 void GpuMain::PreSandboxStartup() { |
| 150 // TODO(sad): https://crbug.com/645602 | 182 // TODO(sad): https://crbug.com/645602 |
| 151 } | 183 } |
| 152 | 184 |
| 153 bool GpuMain::EnsureSandboxInitialized( | 185 bool GpuMain::EnsureSandboxInitialized( |
| 154 gpu::GpuWatchdogThread* watchdog_thread) { | 186 gpu::GpuWatchdogThread* watchdog_thread) { |
| 155 // TODO(sad): https://crbug.com/645602 | 187 // TODO(sad): https://crbug.com/645602 |
| 156 return true; | 188 return true; |
| 157 } | 189 } |
| 158 | 190 |
| 191 std::unique_ptr<gpu::GpuMemoryBufferManager> | |
| 192 GpuMain::CreateGpuMemoryBufferManager() { | |
| 193 if (!gpu_service_internal_) | |
| 194 return nullptr; | |
| 195 | |
| 196 if (!gpu_internal_) { | |
| 197 mojom::GpuServiceInternalRequest gpu_service_request = | |
| 198 mojo::GetProxy(&gpu_internal_); | |
| 199 | |
| 200 Create(std::move(gpu_service_request)); | |
| 201 } | |
| 202 | |
| 203 return base::MakeUnique<MusGpuMemoryBufferManager>(gpu_internal_.get(), | |
| 204 1 /* client_id */); | |
| 205 } | |
| 206 | |
| 159 } // namespace ui | 207 } // namespace ui |
| OLD | NEW |