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/gpu_in_process_thread_service.h" |
11 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" | 11 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" |
12 #include "gpu/ipc/service/gpu_watchdog_thread.h" | 12 #include "gpu/ipc/service/gpu_watchdog_thread.h" |
13 #include "services/ui/common/server_gpu_memory_buffer_manager.h" | 13 #include "services/ui/common/server_gpu_memory_buffer_manager.h" |
14 #include "services/ui/gpu/gpu_service_internal.h" | 14 #include "services/ui/gpu/gpu_service.h" |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 #if defined(OS_WIN) | 18 #if defined(OS_WIN) |
19 std::unique_ptr<base::MessagePump> CreateMessagePumpWin() { | 19 std::unique_ptr<base::MessagePump> CreateMessagePumpWin() { |
20 base::MessagePumpForGpu::InitFactory(); | 20 base::MessagePumpForGpu::InitFactory(); |
21 return base::MessageLoop::CreateMessagePumpForType( | 21 return base::MessageLoop::CreateMessagePumpForType( |
22 base::MessageLoop::TYPE_UI); | 22 base::MessageLoop::TYPE_UI); |
23 } | 23 } |
24 #endif // defined(OS_WIN) | 24 #endif // defined(OS_WIN) |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 | 103 |
104 void GpuMain::OnStart() { | 104 void GpuMain::OnStart() { |
105 // |this| will outlive the gpu thread and so it's safe to use | 105 // |this| will outlive the gpu thread and so it's safe to use |
106 // base::Unretained here. | 106 // base::Unretained here. |
107 gpu_thread_.task_runner()->PostTask( | 107 gpu_thread_.task_runner()->PostTask( |
108 FROM_HERE, | 108 FROM_HERE, |
109 base::Bind(&GpuMain::InitOnGpuThread, base::Unretained(this), | 109 base::Bind(&GpuMain::InitOnGpuThread, base::Unretained(this), |
110 io_thread_.task_runner(), compositor_thread_.task_runner())); | 110 io_thread_.task_runner(), compositor_thread_.task_runner())); |
111 } | 111 } |
112 | 112 |
113 void GpuMain::CreateGpuService(mojom::GpuServiceInternalRequest request, | 113 void GpuMain::CreateGpuService(mojom::GpuServiceRequest request, |
114 mojom::GpuServiceHostPtr gpu_host) { | 114 mojom::GpuHostPtr gpu_host) { |
115 // |this| will outlive the gpu thread and so it's safe to use | 115 // |this| will outlive the gpu thread and so it's safe to use |
116 // base::Unretained here. | 116 // base::Unretained here. |
117 gpu_thread_.task_runner()->PostTask( | 117 gpu_thread_.task_runner()->PostTask( |
118 FROM_HERE, | 118 FROM_HERE, |
119 base::Bind(&GpuMain::CreateGpuServiceOnGpuThread, base::Unretained(this), | 119 base::Bind(&GpuMain::CreateGpuServiceOnGpuThread, base::Unretained(this), |
120 base::Passed(std::move(request)), | 120 base::Passed(std::move(request)), |
121 base::Passed(gpu_host.PassInterface()))); | 121 base::Passed(gpu_host.PassInterface()))); |
122 } | 122 } |
123 | 123 |
124 void GpuMain::CreateDisplayCompositor( | 124 void GpuMain::CreateDisplayCompositor( |
125 cc::mojom::DisplayCompositorRequest request, | 125 cc::mojom::DisplayCompositorRequest request, |
126 cc::mojom::DisplayCompositorClientPtr client) { | 126 cc::mojom::DisplayCompositorClientPtr client) { |
127 if (!gpu_service_internal_) { | 127 if (!gpu_service_) { |
128 pending_display_compositor_request_ = std::move(request); | 128 pending_display_compositor_request_ = std::move(request); |
129 pending_display_compositor_client_info_ = client.PassInterface(); | 129 pending_display_compositor_client_info_ = client.PassInterface(); |
130 return; | 130 return; |
131 } | 131 } |
132 CreateDisplayCompositorInternal(std::move(request), client.PassInterface()); | 132 CreateDisplayCompositorInternal(std::move(request), client.PassInterface()); |
133 } | 133 } |
134 | 134 |
135 void GpuMain::InitOnGpuThread( | 135 void GpuMain::InitOnGpuThread( |
136 scoped_refptr<base::SingleThreadTaskRunner> io_runner, | 136 scoped_refptr<base::SingleThreadTaskRunner> io_runner, |
137 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { | 137 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { |
138 gpu_init_.reset(new gpu::GpuInit()); | 138 gpu_init_.reset(new gpu::GpuInit()); |
139 gpu_init_->set_sandbox_helper(this); | 139 gpu_init_->set_sandbox_helper(this); |
140 bool success = gpu_init_->InitializeAndStartSandbox( | 140 bool success = gpu_init_->InitializeAndStartSandbox( |
141 *base::CommandLine::ForCurrentProcess()); | 141 *base::CommandLine::ForCurrentProcess()); |
142 if (!success) | 142 if (!success) |
143 return; | 143 return; |
144 | 144 |
145 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { | 145 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { |
146 gpu_memory_buffer_factory_ = | 146 gpu_memory_buffer_factory_ = |
147 gpu::GpuMemoryBufferFactory::CreateNativeType(); | 147 gpu::GpuMemoryBufferFactory::CreateNativeType(); |
148 } | 148 } |
149 | 149 |
150 gpu_service_internal_ = base::MakeUnique<GpuServiceInternal>( | 150 gpu_service_ = base::MakeUnique<GpuService>( |
151 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), | 151 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), |
152 gpu_memory_buffer_factory_.get(), io_runner); | 152 gpu_memory_buffer_factory_.get(), io_runner); |
153 } | 153 } |
154 | 154 |
155 void GpuMain::CreateDisplayCompositorInternal( | 155 void GpuMain::CreateDisplayCompositorInternal( |
156 cc::mojom::DisplayCompositorRequest request, | 156 cc::mojom::DisplayCompositorRequest request, |
157 cc::mojom::DisplayCompositorClientPtrInfo client_info) { | 157 cc::mojom::DisplayCompositorClientPtrInfo client_info) { |
158 DCHECK(!gpu_command_service_); | 158 DCHECK(!gpu_command_service_); |
159 gpu_command_service_ = new gpu::GpuInProcessThreadService( | 159 gpu_command_service_ = new gpu::GpuInProcessThreadService( |
160 gpu_thread_.task_runner(), gpu_service_internal_->sync_point_manager(), | 160 gpu_thread_.task_runner(), gpu_service_->sync_point_manager(), |
161 gpu_service_internal_->mailbox_manager(), | 161 gpu_service_->mailbox_manager(), gpu_service_->share_group()); |
162 gpu_service_internal_->share_group()); | |
163 | 162 |
164 // |gpu_memory_buffer_factory_| is null in tests. | 163 // |gpu_memory_buffer_factory_| is null in tests. |
165 gpu::ImageFactory* image_factory = | 164 gpu::ImageFactory* image_factory = |
166 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() | 165 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() |
167 : nullptr; | 166 : nullptr; |
168 | 167 |
169 mojom::GpuServiceInternalPtr gpu_service; | 168 mojom::GpuServicePtr gpu_service; |
170 mojom::GpuServiceInternalRequest gpu_service_request = | 169 mojom::GpuServiceRequest gpu_service_request = mojo::GetProxy(&gpu_service); |
171 mojo::GetProxy(&gpu_service); | |
172 | 170 |
173 if (gpu_thread_.task_runner()->BelongsToCurrentThread()) { | 171 if (gpu_thread_.task_runner()->BelongsToCurrentThread()) { |
174 // If the DisplayCompositor creation was delayed because GpuServiceInternal | 172 // If the DisplayCompositor creation was delayed because GpuService |
175 // had not been created yet, then this is called, in gpu thread, right after | 173 // had not been created yet, then this is called, in gpu thread, right after |
176 // GpuServiceInternal is created. | 174 // GpuService is created. |
177 BindGpuInternalOnGpuThread(std::move(gpu_service_request)); | 175 BindGpuInternalOnGpuThread(std::move(gpu_service_request)); |
178 } else { | 176 } else { |
179 gpu_thread_.task_runner()->PostTask( | 177 gpu_thread_.task_runner()->PostTask( |
180 FROM_HERE, | 178 FROM_HERE, |
181 base::Bind(&GpuMain::BindGpuInternalOnGpuThread, base::Unretained(this), | 179 base::Bind(&GpuMain::BindGpuInternalOnGpuThread, base::Unretained(this), |
182 base::Passed(std::move(gpu_service_request)))); | 180 base::Passed(std::move(gpu_service_request)))); |
183 } | 181 } |
184 | 182 |
185 compositor_thread_.task_runner()->PostTask( | 183 compositor_thread_.task_runner()->PostTask( |
186 FROM_HERE, base::Bind(&GpuMain::CreateDisplayCompositorOnCompositorThread, | 184 FROM_HERE, base::Bind(&GpuMain::CreateDisplayCompositorOnCompositorThread, |
187 base::Unretained(this), image_factory, | 185 base::Unretained(this), image_factory, |
188 base::Passed(gpu_service.PassInterface()), | 186 base::Passed(gpu_service.PassInterface()), |
189 base::Passed(std::move(request)), | 187 base::Passed(std::move(request)), |
190 base::Passed(std::move(client_info)))); | 188 base::Passed(std::move(client_info)))); |
191 } | 189 } |
192 | 190 |
193 void GpuMain::CreateDisplayCompositorOnCompositorThread( | 191 void GpuMain::CreateDisplayCompositorOnCompositorThread( |
194 gpu::ImageFactory* image_factory, | 192 gpu::ImageFactory* image_factory, |
195 mojom::GpuServiceInternalPtrInfo gpu_service_info, | 193 mojom::GpuServicePtrInfo gpu_service_info, |
196 cc::mojom::DisplayCompositorRequest request, | 194 cc::mojom::DisplayCompositorRequest request, |
197 cc::mojom::DisplayCompositorClientPtrInfo client_info) { | 195 cc::mojom::DisplayCompositorClientPtrInfo client_info) { |
198 DCHECK(!display_compositor_); | 196 DCHECK(!display_compositor_); |
199 cc::mojom::DisplayCompositorClientPtr client; | 197 cc::mojom::DisplayCompositorClientPtr client; |
200 client.Bind(std::move(client_info)); | 198 client.Bind(std::move(client_info)); |
201 | 199 |
202 gpu_internal_.Bind(std::move(gpu_service_info)); | 200 gpu_internal_.Bind(std::move(gpu_service_info)); |
203 | 201 |
204 display_compositor_ = base::MakeUnique<DisplayCompositor>( | 202 display_compositor_ = base::MakeUnique<DisplayCompositor>( |
205 gpu_command_service_, base::MakeUnique<ServerGpuMemoryBufferManager>( | 203 gpu_command_service_, base::MakeUnique<ServerGpuMemoryBufferManager>( |
206 gpu_internal_.get(), 1 /* client_id */), | 204 gpu_internal_.get(), 1 /* client_id */), |
207 image_factory, std::move(request), std::move(client)); | 205 image_factory, std::move(request), std::move(client)); |
208 } | 206 } |
209 | 207 |
210 void GpuMain::TearDownOnCompositorThread() { | 208 void GpuMain::TearDownOnCompositorThread() { |
211 display_compositor_.reset(); | 209 display_compositor_.reset(); |
212 gpu_internal_.reset(); | 210 gpu_internal_.reset(); |
213 } | 211 } |
214 | 212 |
215 void GpuMain::TearDownOnGpuThread() { | 213 void GpuMain::TearDownOnGpuThread() { |
216 gpu_service_internal_.reset(); | 214 gpu_service_.reset(); |
217 gpu_memory_buffer_factory_.reset(); | 215 gpu_memory_buffer_factory_.reset(); |
218 gpu_init_.reset(); | 216 gpu_init_.reset(); |
219 } | 217 } |
220 | 218 |
221 void GpuMain::CreateGpuServiceOnGpuThread( | 219 void GpuMain::CreateGpuServiceOnGpuThread( |
222 mojom::GpuServiceInternalRequest request, | 220 mojom::GpuServiceRequest request, |
223 mojom::GpuServiceHostPtrInfo gpu_host_info) { | 221 mojom::GpuHostPtrInfo gpu_host_info) { |
224 mojom::GpuServiceHostPtr gpu_host; | 222 mojom::GpuHostPtr gpu_host; |
225 gpu_host.Bind(std::move(gpu_host_info)); | 223 gpu_host.Bind(std::move(gpu_host_info)); |
226 gpu_service_internal_->InitializeWithHost(std::move(gpu_host)); | 224 gpu_service_->InitializeWithHost(std::move(gpu_host)); |
227 gpu_service_internal_->Bind(std::move(request)); | 225 gpu_service_->Bind(std::move(request)); |
228 | 226 |
229 if (pending_display_compositor_request_.is_pending()) { | 227 if (pending_display_compositor_request_.is_pending()) { |
230 CreateDisplayCompositorInternal( | 228 CreateDisplayCompositorInternal( |
231 std::move(pending_display_compositor_request_), | 229 std::move(pending_display_compositor_request_), |
232 std::move(pending_display_compositor_client_info_)); | 230 std::move(pending_display_compositor_client_info_)); |
233 } | 231 } |
234 } | 232 } |
235 | 233 |
236 void GpuMain::BindGpuInternalOnGpuThread( | 234 void GpuMain::BindGpuInternalOnGpuThread(mojom::GpuServiceRequest request) { |
237 mojom::GpuServiceInternalRequest request) { | 235 gpu_service_->Bind(std::move(request)); |
238 gpu_service_internal_->Bind(std::move(request)); | |
239 } | 236 } |
240 | 237 |
241 void GpuMain::PreSandboxStartup() { | 238 void GpuMain::PreSandboxStartup() { |
242 // TODO(sad): https://crbug.com/645602 | 239 // TODO(sad): https://crbug.com/645602 |
243 } | 240 } |
244 | 241 |
245 bool GpuMain::EnsureSandboxInitialized( | 242 bool GpuMain::EnsureSandboxInitialized( |
246 gpu::GpuWatchdogThread* watchdog_thread) { | 243 gpu::GpuWatchdogThread* watchdog_thread) { |
247 // TODO(sad): https://crbug.com/645602 | 244 // TODO(sad): https://crbug.com/645602 |
248 return true; | 245 return true; |
249 } | 246 } |
250 | 247 |
251 } // namespace ui | 248 } // namespace ui |
OLD | NEW |