Chromium Code Reviews| 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 |