Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: ui/ozone/platform/drm/mus_thread_proxy.cc

Issue 1831693002: In-mus ozone drm platform implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698