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/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "gpu/ipc/common/gpu_memory_buffer_support.h" | 10 #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 #elif defined(OS_MACOSX) | 64 #elif defined(OS_MACOSX) |
65 thread_options.message_pump_factory = base::Bind(&CreateMessagePumpMac); | 65 thread_options.message_pump_factory = base::Bind(&CreateMessagePumpMac); |
66 #else | 66 #else |
67 thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 67 thread_options.message_loop_type = base::MessageLoop::TYPE_IO; |
68 #endif | 68 #endif |
69 | 69 |
70 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) | 70 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
71 thread_options.priority = base::ThreadPriority::DISPLAY; | 71 thread_options.priority = base::ThreadPriority::DISPLAY; |
72 #endif | 72 #endif |
73 CHECK(gpu_thread_.StartWithOptions(thread_options)); | 73 CHECK(gpu_thread_.StartWithOptions(thread_options)); |
| 74 gpu_thread_task_runner_ = gpu_thread_.task_runner(); |
74 | 75 |
75 // TODO(sad): We do not need the IO thread once gpu has a separate process. It | 76 // TODO(sad): We do not need the IO thread once gpu has a separate process. It |
76 // should be possible to use |main_task_runner_| for doing IO tasks. | 77 // should be possible to use |main_task_runner_| for doing IO tasks. |
77 thread_options = base::Thread::Options(base::MessageLoop::TYPE_IO, 0); | 78 thread_options = base::Thread::Options(base::MessageLoop::TYPE_IO, 0); |
78 thread_options.priority = base::ThreadPriority::NORMAL; | 79 thread_options.priority = base::ThreadPriority::NORMAL; |
79 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) | 80 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
80 // TODO(reveman): Remove this in favor of setting it explicitly for each type | 81 // TODO(reveman): Remove this in favor of setting it explicitly for each type |
81 // of process. | 82 // of process. |
82 thread_options.priority = base::ThreadPriority::DISPLAY; | 83 thread_options.priority = base::ThreadPriority::DISPLAY; |
83 #endif | 84 #endif |
84 CHECK(io_thread_.StartWithOptions(thread_options)); | 85 CHECK(io_thread_.StartWithOptions(thread_options)); |
85 | 86 |
86 // Start the compositor thread. | 87 // Start the compositor thread. |
87 compositor_thread_.Start(); | 88 compositor_thread_.Start(); |
| 89 compositor_thread_task_runner_ = compositor_thread_.task_runner(); |
88 } | 90 } |
89 | 91 |
90 GpuMain::~GpuMain() { | 92 GpuMain::~GpuMain() { |
91 // Unretained() is OK here since the thread/task runner is owned by |this|. | 93 // Unretained() is OK here since the thread/task runner is owned by |this|. |
92 compositor_thread_.task_runner()->PostTask( | 94 compositor_thread_task_runner_->PostTask( |
93 FROM_HERE, | 95 FROM_HERE, |
94 base::Bind(&GpuMain::TearDownOnCompositorThread, base::Unretained(this))); | 96 base::Bind(&GpuMain::TearDownOnCompositorThread, base::Unretained(this))); |
95 | 97 |
96 // Block the main thread until the compositor thread terminates which blocks | 98 // Block the main thread until the compositor thread terminates which blocks |
97 // on the gpu thread. The Stop must be initiated from here instead of the gpu | 99 // on the gpu thread. The Stop must be initiated from here instead of the gpu |
98 // thread to avoid deadlock. | 100 // thread to avoid deadlock. |
99 compositor_thread_.Stop(); | 101 compositor_thread_.Stop(); |
100 | 102 |
101 gpu_thread_.task_runner()->PostTask( | 103 gpu_thread_task_runner_->PostTask( |
102 FROM_HERE, | 104 FROM_HERE, |
103 base::Bind(&GpuMain::TearDownOnGpuThread, base::Unretained(this))); | 105 base::Bind(&GpuMain::TearDownOnGpuThread, base::Unretained(this))); |
104 gpu_thread_.Stop(); | 106 gpu_thread_.Stop(); |
105 io_thread_.Stop(); | 107 io_thread_.Stop(); |
106 } | 108 } |
107 | 109 |
108 void GpuMain::OnStart() { | 110 void GpuMain::OnStart() { |
109 // |this| will outlive the gpu thread and so it's safe to use | 111 // |this| will outlive the gpu thread and so it's safe to use |
110 // base::Unretained here. | 112 // base::Unretained here. |
111 gpu_thread_.task_runner()->PostTask( | 113 gpu_thread_task_runner_->PostTask( |
112 FROM_HERE, | 114 FROM_HERE, |
113 base::Bind(&GpuMain::InitOnGpuThread, base::Unretained(this), | 115 base::Bind(&GpuMain::InitOnGpuThread, base::Unretained(this), |
114 io_thread_.task_runner(), compositor_thread_.task_runner())); | 116 io_thread_.task_runner(), compositor_thread_task_runner_)); |
115 } | 117 } |
116 | 118 |
117 void GpuMain::CreateGpuService(mojom::GpuServiceRequest request, | 119 void GpuMain::CreateGpuService(mojom::GpuServiceRequest request, |
118 mojom::GpuHostPtr gpu_host, | 120 mojom::GpuHostPtr gpu_host, |
119 const gpu::GpuPreferences& preferences) { | 121 const gpu::GpuPreferences& preferences) { |
120 // |this| will outlive the gpu thread and so it's safe to use | 122 // |this| will outlive the gpu thread and so it's safe to use |
121 // base::Unretained here. | 123 // base::Unretained here. |
122 gpu_thread_.task_runner()->PostTask( | 124 gpu_thread_task_runner_->PostTask( |
123 FROM_HERE, | 125 FROM_HERE, |
124 base::Bind(&GpuMain::CreateGpuServiceOnGpuThread, base::Unretained(this), | 126 base::Bind(&GpuMain::CreateGpuServiceOnGpuThread, base::Unretained(this), |
125 base::Passed(std::move(request)), | 127 base::Passed(std::move(request)), |
126 base::Passed(gpu_host.PassInterface()), preferences)); | 128 base::Passed(gpu_host.PassInterface()), preferences)); |
127 } | 129 } |
128 | 130 |
129 void GpuMain::CreateDisplayCompositor( | 131 void GpuMain::CreateDisplayCompositor( |
130 cc::mojom::DisplayCompositorRequest request, | 132 cc::mojom::DisplayCompositorRequest request, |
131 cc::mojom::DisplayCompositorClientPtr client) { | 133 cc::mojom::DisplayCompositorClientPtr client) { |
132 if (!gpu_service_) { | 134 if (!gpu_service_) { |
(...skipping 23 matching lines...) Expand all Loading... |
156 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), | 158 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), |
157 gpu_memory_buffer_factory_.get(), io_runner, | 159 gpu_memory_buffer_factory_.get(), io_runner, |
158 gpu_init_->gpu_feature_info()); | 160 gpu_init_->gpu_feature_info()); |
159 } | 161 } |
160 | 162 |
161 void GpuMain::CreateDisplayCompositorInternal( | 163 void GpuMain::CreateDisplayCompositorInternal( |
162 cc::mojom::DisplayCompositorRequest request, | 164 cc::mojom::DisplayCompositorRequest request, |
163 cc::mojom::DisplayCompositorClientPtrInfo client_info) { | 165 cc::mojom::DisplayCompositorClientPtrInfo client_info) { |
164 DCHECK(!gpu_command_service_); | 166 DCHECK(!gpu_command_service_); |
165 gpu_command_service_ = new gpu::GpuInProcessThreadService( | 167 gpu_command_service_ = new gpu::GpuInProcessThreadService( |
166 gpu_thread_.task_runner(), gpu_service_->sync_point_manager(), | 168 gpu_thread_task_runner_, gpu_service_->sync_point_manager(), |
167 gpu_service_->mailbox_manager(), gpu_service_->share_group()); | 169 gpu_service_->mailbox_manager(), gpu_service_->share_group()); |
168 | 170 |
169 // |gpu_memory_buffer_factory_| is null in tests. | 171 // |gpu_memory_buffer_factory_| is null in tests. |
170 gpu::ImageFactory* image_factory = | 172 gpu::ImageFactory* image_factory = |
171 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() | 173 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() |
172 : nullptr; | 174 : nullptr; |
173 | 175 |
174 mojom::GpuServicePtr gpu_service; | 176 mojom::GpuServicePtr gpu_service; |
175 mojom::GpuServiceRequest gpu_service_request(&gpu_service); | 177 mojom::GpuServiceRequest gpu_service_request(&gpu_service); |
176 | 178 |
177 if (gpu_thread_.task_runner()->BelongsToCurrentThread()) { | 179 if (gpu_thread_task_runner_->BelongsToCurrentThread()) { |
178 // If the DisplayCompositor creation was delayed because GpuService | 180 // If the DisplayCompositor creation was delayed because GpuService |
179 // had not been created yet, then this is called, in gpu thread, right after | 181 // had not been created yet, then this is called, in gpu thread, right after |
180 // GpuService is created. | 182 // GpuService is created. |
181 BindGpuInternalOnGpuThread(std::move(gpu_service_request)); | 183 BindGpuInternalOnGpuThread(std::move(gpu_service_request)); |
182 } else { | 184 } else { |
183 gpu_thread_.task_runner()->PostTask( | 185 gpu_thread_task_runner_->PostTask( |
184 FROM_HERE, | 186 FROM_HERE, |
185 base::Bind(&GpuMain::BindGpuInternalOnGpuThread, base::Unretained(this), | 187 base::Bind(&GpuMain::BindGpuInternalOnGpuThread, base::Unretained(this), |
186 base::Passed(std::move(gpu_service_request)))); | 188 base::Passed(std::move(gpu_service_request)))); |
187 } | 189 } |
188 | 190 |
189 compositor_thread_.task_runner()->PostTask( | 191 compositor_thread_task_runner_->PostTask( |
190 FROM_HERE, base::Bind(&GpuMain::CreateDisplayCompositorOnCompositorThread, | 192 FROM_HERE, base::Bind(&GpuMain::CreateDisplayCompositorOnCompositorThread, |
191 base::Unretained(this), image_factory, | 193 base::Unretained(this), image_factory, |
192 base::Passed(gpu_service.PassInterface()), | 194 base::Passed(gpu_service.PassInterface()), |
193 base::Passed(std::move(request)), | 195 base::Passed(std::move(request)), |
194 base::Passed(std::move(client_info)))); | 196 base::Passed(std::move(client_info)))); |
195 } | 197 } |
196 | 198 |
197 void GpuMain::CreateDisplayCompositorOnCompositorThread( | 199 void GpuMain::CreateDisplayCompositorOnCompositorThread( |
198 gpu::ImageFactory* image_factory, | 200 gpu::ImageFactory* image_factory, |
199 mojom::GpuServicePtrInfo gpu_service_info, | 201 mojom::GpuServicePtrInfo gpu_service_info, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 // TODO(sad): https://crbug.com/645602 | 248 // TODO(sad): https://crbug.com/645602 |
247 } | 249 } |
248 | 250 |
249 bool GpuMain::EnsureSandboxInitialized( | 251 bool GpuMain::EnsureSandboxInitialized( |
250 gpu::GpuWatchdogThread* watchdog_thread) { | 252 gpu::GpuWatchdogThread* watchdog_thread) { |
251 // TODO(sad): https://crbug.com/645602 | 253 // TODO(sad): https://crbug.com/645602 |
252 return true; | 254 return true; |
253 } | 255 } |
254 | 256 |
255 } // namespace ui | 257 } // namespace ui |
OLD | NEW |