OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/ozone/platform/drm/mus_thread_proxy.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/single_thread_task_runner.h" | |
9 #include "base/task_runner.h" | |
10 #include "base/thread_task_runner_handle.h" | |
11 #include "ui/ozone/platform/drm/gpu/drm_thread.h" | |
12 #include "ui/ozone/platform/drm/gpu/proxy_helpers.h" | |
13 #include "ui/ozone/platform/drm/host/drm_display_host_manager.h" | |
14 #include "ui/ozone/platform/drm/host/drm_overlay_manager.h" | |
15 | |
16 namespace ui { | |
17 | |
18 MusThreadProxy::MusThreadProxy() | |
19 : ws_task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
20 drm_thread_(nullptr), | |
21 weak_ptr_factory_(this) {} | |
22 | |
23 MusThreadProxy::~MusThreadProxy() { | |
24 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
25 FOR_EACH_OBSERVER(GpuThreadObserver, gpu_thread_observers_, | |
26 OnGpuThreadRetired()); | |
27 } | |
28 | |
29 // This is configured on the GPU thread. | |
30 void MusThreadProxy::SetDrmThread(DrmThread* thread) { | |
31 base::AutoLock acquire(lock_); | |
32 drm_thread_ = thread; | |
33 } | |
34 | |
35 void MusThreadProxy::ProvideManagers(DrmDisplayHostManager* display_manager, | |
36 DrmOverlayManager* overlay_manager) { | |
37 display_manager_ = display_manager; | |
38 overlay_manager_ = overlay_manager; | |
39 } | |
40 | |
41 void MusThreadProxy::StartDrmThread() { | |
42 DCHECK(drm_thread_); | |
43 drm_thread_->Start(); | |
44 // All ThreadChecker instances will have been created on the window server | |
45 // thread. But this method must be called on the gpu thread. | |
46 DCHECK(!on_window_server_thread_.CalledOnValidThread()); | |
47 on_gpu_thread_.DetachFromThread(); | |
48 | |
49 drm_thread_->task_runner()->PostTask( | |
50 FROM_HERE, base::Bind(&MusThreadProxy::DispatchObserversFromDrmThread, | |
51 base::Unretained(this))); | |
52 } | |
53 | |
54 void MusThreadProxy::DispatchObserversFromDrmThread() { | |
55 // We are running on the drm thread and now know that the | |
56 // DRM thread has started because this method is posted to | |
57 // it. | |
58 on_drm_thread_.DetachFromThread(); | |
59 ws_task_runner_->PostTask(FROM_HERE, base::Bind(&MusThreadProxy::RunObservers, | |
60 base::Unretained(this))); | |
61 } | |
62 | |
63 void MusThreadProxy::RunObservers() { | |
64 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
65 FOR_EACH_OBSERVER(GpuThreadObserver, gpu_thread_observers_, | |
66 OnGpuThreadReady()); | |
67 } | |
68 | |
69 void MusThreadProxy::AddGpuThreadObserver(GpuThreadObserver* observer) { | |
70 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
71 | |
72 gpu_thread_observers_.AddObserver(observer); | |
73 if (IsConnected()) | |
74 observer->OnGpuThreadReady(); | |
75 } | |
76 | |
77 void MusThreadProxy::RemoveGpuThreadObserver(GpuThreadObserver* observer) { | |
78 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
79 gpu_thread_observers_.RemoveObserver(observer); | |
80 } | |
81 | |
82 bool MusThreadProxy::IsConnected() { | |
83 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
84 base::AutoLock acquire(lock_); | |
85 if (drm_thread_) | |
86 return drm_thread_->IsRunning(); | |
87 return false; | |
88 } | |
89 | |
90 // Services needed for DrmDisplayHostMananger. | |
91 void MusThreadProxy::RegisterHandlerForDrmDisplayHostManager( | |
92 DrmDisplayHostManager* handler) { | |
93 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
94 display_manager_ = handler; | |
95 } | |
96 | |
97 void MusThreadProxy::UnRegisterHandlerForDrmDisplayHostManager() { | |
98 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
99 display_manager_ = nullptr; | |
100 } | |
101 | |
102 bool MusThreadProxy::GpuCreateWindow(gfx::AcceleratedWidget widget) { | |
103 DCHECK(drm_thread_->IsRunning()); | |
104 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
105 drm_thread_->task_runner()->PostTask( | |
106 FROM_HERE, base::Bind(&DrmThread::CreateWindow, | |
107 base::Unretained(drm_thread_), widget)); | |
108 return true; | |
109 } | |
110 | |
111 bool MusThreadProxy::GpuDestroyWindow(gfx::AcceleratedWidget widget) { | |
112 DCHECK(drm_thread_->IsRunning()); | |
113 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
114 drm_thread_->task_runner()->PostTask( | |
115 FROM_HERE, base::Bind(&DrmThread::DestroyWindow, | |
116 base::Unretained(drm_thread_), widget)); | |
117 return true; | |
118 } | |
119 | |
120 bool MusThreadProxy::GpuWindowBoundsChanged(gfx::AcceleratedWidget widget, | |
121 const gfx::Rect& bounds) { | |
122 DCHECK(drm_thread_->IsRunning()); | |
123 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
124 drm_thread_->task_runner()->PostTask( | |
125 FROM_HERE, base::Bind(&DrmThread::SetWindowBounds, | |
126 base::Unretained(drm_thread_), widget, bounds)); | |
127 return true; | |
128 } | |
129 | |
130 void MusThreadProxy::CursorSet(gfx::AcceleratedWidget widget, | |
131 const std::vector<SkBitmap>& bitmaps, | |
132 const gfx::Point& location, | |
133 int frame_delay_ms) { | |
134 DCHECK(drm_thread_->IsRunning()); | |
135 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
136 drm_thread_->task_runner()->PostTask( | |
137 FROM_HERE, | |
138 base::Bind(&DrmThread::SetCursor, base::Unretained(drm_thread_), widget, | |
139 bitmaps, location, frame_delay_ms)); | |
140 } | |
141 | |
142 void MusThreadProxy::Move(gfx::AcceleratedWidget widget, | |
143 const gfx::Point& location) { | |
144 DCHECK(drm_thread_->IsRunning()); | |
145 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
146 drm_thread_->task_runner()->PostTask( | |
147 FROM_HERE, base::Bind(&DrmThread::MoveCursor, | |
148 base::Unretained(drm_thread_), widget, location)); | |
149 } | |
150 | |
151 // Services needed for DrmOverlayManager. | |
152 void MusThreadProxy::RegisterHandlerForDrmOverlayManager( | |
153 DrmOverlayManager* handler) { | |
154 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
155 overlay_manager_ = handler; | |
156 } | |
157 | |
158 void MusThreadProxy::UnRegisterHandlerForDrmOverlayManager() { | |
159 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
160 overlay_manager_ = nullptr; | |
161 } | |
162 | |
163 bool MusThreadProxy::GpuCheckOverlayCapabilities( | |
164 gfx::AcceleratedWidget widget, | |
165 const std::vector<OverlayCheck_Params>& overlays) { | |
166 DCHECK(drm_thread_->IsRunning()); | |
167 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
168 auto callback = | |
169 base::Bind(&MusThreadProxy::GpuCheckOverlayCapabilitiesCallback, | |
170 weak_ptr_factory_.GetWeakPtr()); | |
171 drm_thread_->task_runner()->PostTask( | |
172 FROM_HERE, base::Bind(&DrmThread::CheckOverlayCapabilities, | |
173 base::Unretained(drm_thread_), widget, overlays, | |
174 CreateSafeCallback(callback))); | |
175 return true; | |
176 } | |
177 | |
178 bool MusThreadProxy::GpuRefreshNativeDisplays() { | |
179 DCHECK(drm_thread_->IsRunning()); | |
180 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
181 auto callback = base::Bind(&MusThreadProxy::GpuRefreshNativeDisplaysCallback, | |
182 weak_ptr_factory_.GetWeakPtr()); | |
183 drm_thread_->task_runner()->PostTask( | |
184 FROM_HERE, | |
185 base::Bind(&DrmThread::RefreshNativeDisplays, | |
186 base::Unretained(drm_thread_), CreateSafeCallback(callback))); | |
187 return true; | |
188 } | |
189 | |
190 bool MusThreadProxy::GpuConfigureNativeDisplay(int64_t id, | |
191 const DisplayMode_Params& mode, | |
192 const gfx::Point& origin) { | |
193 DCHECK(drm_thread_->IsRunning()); | |
194 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
195 | |
196 auto callback = base::Bind(&MusThreadProxy::GpuConfigureNativeDisplayCallback, | |
197 weak_ptr_factory_.GetWeakPtr()); | |
198 drm_thread_->task_runner()->PostTask( | |
199 FROM_HERE, base::Bind(&DrmThread::ConfigureNativeDisplay, | |
200 base::Unretained(drm_thread_), id, mode, origin, | |
201 CreateSafeCallback(callback))); | |
202 return true; | |
203 } | |
204 | |
205 bool MusThreadProxy::GpuDisableNativeDisplay(int64_t id) { | |
206 DCHECK(drm_thread_->IsRunning()); | |
207 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
208 auto callback = base::Bind(&MusThreadProxy::GpuDisableNativeDisplayCallback, | |
209 weak_ptr_factory_.GetWeakPtr()); | |
210 drm_thread_->task_runner()->PostTask( | |
211 FROM_HERE, base::Bind(&DrmThread::DisableNativeDisplay, | |
212 base::Unretained(drm_thread_), id, | |
213 CreateSafeCallback(callback))); | |
214 return true; | |
215 } | |
216 | |
217 bool MusThreadProxy::GpuTakeDisplayControl() { | |
218 DCHECK(drm_thread_->IsRunning()); | |
219 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
220 auto callback = base::Bind(&MusThreadProxy::GpuTakeDisplayControlCallback, | |
221 weak_ptr_factory_.GetWeakPtr()); | |
222 drm_thread_->task_runner()->PostTask( | |
223 FROM_HERE, | |
224 base::Bind(&DrmThread::TakeDisplayControl, base::Unretained(drm_thread_), | |
225 CreateSafeCallback(callback))); | |
226 return true; | |
227 } | |
228 | |
229 bool MusThreadProxy::GpuRelinquishDisplayControl() { | |
230 DCHECK(drm_thread_->IsRunning()); | |
231 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
232 auto callback = | |
233 base::Bind(&MusThreadProxy::GpuRelinquishDisplayControlCallback, | |
234 weak_ptr_factory_.GetWeakPtr()); | |
235 drm_thread_->task_runner()->PostTask( | |
236 FROM_HERE, | |
237 base::Bind(&DrmThread::RelinquishDisplayControl, | |
238 base::Unretained(drm_thread_), CreateSafeCallback(callback))); | |
239 return true; | |
240 } | |
241 | |
242 bool MusThreadProxy::GpuAddGraphicsDevice(const base::FilePath& path, | |
243 const base::FileDescriptor& fd) { | |
244 DCHECK(drm_thread_->IsRunning()); | |
245 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
246 drm_thread_->task_runner()->PostTask( | |
247 FROM_HERE, base::Bind(&DrmThread::AddGraphicsDevice, | |
248 base::Unretained(drm_thread_), path, fd)); | |
249 return true; | |
250 } | |
251 | |
252 bool MusThreadProxy::GpuRemoveGraphicsDevice(const base::FilePath& path) { | |
253 DCHECK(drm_thread_->IsRunning()); | |
254 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
255 drm_thread_->task_runner()->PostTask( | |
256 FROM_HERE, base::Bind(&DrmThread::RemoveGraphicsDevice, | |
257 base::Unretained(drm_thread_), path)); | |
258 return true; | |
259 } | |
260 | |
261 bool MusThreadProxy::GpuGetHDCPState(int64_t display_id) { | |
262 DCHECK(drm_thread_->IsRunning()); | |
263 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
264 auto callback = base::Bind(&MusThreadProxy::GpuGetHDCPStateCallback, | |
265 weak_ptr_factory_.GetWeakPtr()); | |
266 drm_thread_->task_runner()->PostTask( | |
267 FROM_HERE, | |
268 base::Bind(&DrmThread::GetHDCPState, base::Unretained(drm_thread_), | |
269 display_id, CreateSafeCallback(callback))); | |
270 return true; | |
271 } | |
272 | |
273 bool MusThreadProxy::GpuSetHDCPState(int64_t display_id, HDCPState state) { | |
274 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
275 DCHECK(drm_thread_->IsRunning()); | |
276 auto callback = base::Bind(&MusThreadProxy::GpuSetHDCPStateCallback, | |
277 weak_ptr_factory_.GetWeakPtr()); | |
278 drm_thread_->task_runner()->PostTask( | |
279 FROM_HERE, | |
280 base::Bind(&DrmThread::SetHDCPState, base::Unretained(drm_thread_), | |
281 display_id, state, CreateSafeCallback(callback))); | |
282 return true; | |
283 } | |
284 | |
285 bool MusThreadProxy::GpuSetGammaRamp( | |
286 int64_t id, | |
287 const std::vector<GammaRampRGBEntry>& lut) { | |
288 DCHECK(drm_thread_->IsRunning()); | |
289 DCHECK(on_window_server_thread_.CalledOnValidThread()); | |
290 drm_thread_->task_runner()->PostTask( | |
291 FROM_HERE, base::Bind(&DrmThread::SetGammaRamp, | |
292 base::Unretained(drm_thread_), id, lut)); | |
293 return true; | |
294 } | |
295 | |
296 void MusThreadProxy::GpuCheckOverlayCapabilitiesCallback( | |
297 gfx::AcceleratedWidget widget, | |
298 const std::vector<OverlayCheck_Params>& overlays) const { | |
299 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
dnicoara
2016/03/24 02:07:44
I think these DCHECKs are failing since CreateSafe
rjkroege
2016/03/28 22:53:30
Fixed here and elsewhere.
| |
300 ws_task_runner_->PostTask( | |
301 FROM_HERE, | |
302 base::Bind(&DrmOverlayManager::GpuSentOverlayResult, | |
303 base::Unretained(overlay_manager_), widget, overlays)); | |
304 } | |
305 | |
306 void MusThreadProxy::GpuConfigureNativeDisplayCallback(int64_t display_id, | |
307 bool success) const { | |
308 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
309 ws_task_runner_->PostTask( | |
310 FROM_HERE, | |
311 base::Bind(&DrmDisplayHostManager::GpuConfiguredDisplay, | |
312 base::Unretained(display_manager_), display_id, success)); | |
313 } | |
314 | |
315 void MusThreadProxy::GpuRefreshNativeDisplaysCallback( | |
316 const std::vector<DisplaySnapshot_Params>& displays) const { | |
317 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
318 ws_task_runner_->PostTask( | |
319 FROM_HERE, base::Bind(&DrmDisplayHostManager::GpuHasUpdatedNativeDisplays, | |
320 base::Unretained(display_manager_), displays)); | |
321 } | |
322 | |
323 void MusThreadProxy::GpuDisableNativeDisplayCallback(int64_t display_id, | |
324 bool success) const { | |
325 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
326 ws_task_runner_->PostTask( | |
327 FROM_HERE, | |
328 base::Bind(&DrmDisplayHostManager::GpuConfiguredDisplay, | |
329 base::Unretained(display_manager_), display_id, success)); | |
330 } | |
331 | |
332 void MusThreadProxy::GpuTakeDisplayControlCallback(bool success) const { | |
333 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
334 ws_task_runner_->PostTask( | |
335 FROM_HERE, base::Bind(&DrmDisplayHostManager::GpuTookDisplayControl, | |
336 base::Unretained(display_manager_), success)); | |
337 } | |
338 | |
339 void MusThreadProxy::GpuRelinquishDisplayControlCallback(bool success) const { | |
340 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
341 ws_task_runner_->PostTask( | |
342 FROM_HERE, | |
343 base::Bind(&DrmDisplayHostManager::GpuRelinquishedDisplayControl, | |
344 base::Unretained(display_manager_), success)); | |
345 } | |
346 | |
347 void MusThreadProxy::GpuGetHDCPStateCallback(int64_t display_id, | |
348 bool success, | |
349 HDCPState state) const { | |
350 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
351 ws_task_runner_->PostTask( | |
352 FROM_HERE, base::Bind(&DrmDisplayHostManager::GpuReceivedHDCPState, | |
353 base::Unretained(display_manager_), display_id, | |
354 success, state)); | |
355 } | |
356 | |
357 void MusThreadProxy::GpuSetHDCPStateCallback(int64_t display_id, | |
358 bool success) const { | |
359 DCHECK(on_drm_thread_.CalledOnValidThread()); | |
360 ws_task_runner_->PostTask( | |
361 FROM_HERE, | |
362 base::Bind(&DrmDisplayHostManager::GpuUpdatedHDCPState, | |
363 base::Unretained(display_manager_), display_id, success)); | |
364 } | |
365 | |
366 } // namespace ui | |
OLD | NEW |