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 |
| 45 drm_thread_->task_runner()->PostTask( |
| 46 FROM_HERE, base::Bind(&MusThreadProxy::DispatchObserversFromDrmThread, |
| 47 base::Unretained(this))); |
| 48 } |
| 49 |
| 50 void MusThreadProxy::DispatchObserversFromDrmThread() { |
| 51 ws_task_runner_->PostTask(FROM_HERE, base::Bind(&MusThreadProxy::RunObservers, |
| 52 base::Unretained(this))); |
| 53 } |
| 54 |
| 55 void MusThreadProxy::RunObservers() { |
| 56 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 57 FOR_EACH_OBSERVER(GpuThreadObserver, gpu_thread_observers_, |
| 58 OnGpuThreadReady()); |
| 59 } |
| 60 |
| 61 void MusThreadProxy::AddGpuThreadObserver(GpuThreadObserver* observer) { |
| 62 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 63 |
| 64 gpu_thread_observers_.AddObserver(observer); |
| 65 if (IsConnected()) |
| 66 observer->OnGpuThreadReady(); |
| 67 } |
| 68 |
| 69 void MusThreadProxy::RemoveGpuThreadObserver(GpuThreadObserver* observer) { |
| 70 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 71 gpu_thread_observers_.RemoveObserver(observer); |
| 72 } |
| 73 |
| 74 bool MusThreadProxy::IsConnected() { |
| 75 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 76 base::AutoLock acquire(lock_); |
| 77 if (drm_thread_) |
| 78 return drm_thread_->IsRunning(); |
| 79 return false; |
| 80 } |
| 81 |
| 82 // Services needed for DrmDisplayHostMananger. |
| 83 void MusThreadProxy::RegisterHandlerForDrmDisplayHostManager( |
| 84 DrmDisplayHostManager* handler) { |
| 85 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 86 display_manager_ = handler; |
| 87 } |
| 88 |
| 89 void MusThreadProxy::UnRegisterHandlerForDrmDisplayHostManager() { |
| 90 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 91 display_manager_ = nullptr; |
| 92 } |
| 93 |
| 94 bool MusThreadProxy::GpuCreateWindow(gfx::AcceleratedWidget widget) { |
| 95 DCHECK(drm_thread_->IsRunning()); |
| 96 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 97 drm_thread_->task_runner()->PostTask( |
| 98 FROM_HERE, base::Bind(&DrmThread::CreateWindow, |
| 99 base::Unretained(drm_thread_), widget)); |
| 100 return true; |
| 101 } |
| 102 |
| 103 bool MusThreadProxy::GpuDestroyWindow(gfx::AcceleratedWidget widget) { |
| 104 DCHECK(drm_thread_->IsRunning()); |
| 105 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 106 drm_thread_->task_runner()->PostTask( |
| 107 FROM_HERE, base::Bind(&DrmThread::DestroyWindow, |
| 108 base::Unretained(drm_thread_), widget)); |
| 109 return true; |
| 110 } |
| 111 |
| 112 bool MusThreadProxy::GpuWindowBoundsChanged(gfx::AcceleratedWidget widget, |
| 113 const gfx::Rect& bounds) { |
| 114 DCHECK(drm_thread_->IsRunning()); |
| 115 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 116 drm_thread_->task_runner()->PostTask( |
| 117 FROM_HERE, base::Bind(&DrmThread::SetWindowBounds, |
| 118 base::Unretained(drm_thread_), widget, bounds)); |
| 119 return true; |
| 120 } |
| 121 |
| 122 void MusThreadProxy::CursorSet(gfx::AcceleratedWidget widget, |
| 123 const std::vector<SkBitmap>& bitmaps, |
| 124 const gfx::Point& location, |
| 125 int frame_delay_ms) { |
| 126 DCHECK(drm_thread_->IsRunning()); |
| 127 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 128 drm_thread_->task_runner()->PostTask( |
| 129 FROM_HERE, |
| 130 base::Bind(&DrmThread::SetCursor, base::Unretained(drm_thread_), widget, |
| 131 bitmaps, location, frame_delay_ms)); |
| 132 } |
| 133 |
| 134 void MusThreadProxy::Move(gfx::AcceleratedWidget widget, |
| 135 const gfx::Point& location) { |
| 136 DCHECK(drm_thread_->IsRunning()); |
| 137 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 138 drm_thread_->task_runner()->PostTask( |
| 139 FROM_HERE, base::Bind(&DrmThread::MoveCursor, |
| 140 base::Unretained(drm_thread_), widget, location)); |
| 141 } |
| 142 |
| 143 // Services needed for DrmOverlayManager. |
| 144 void MusThreadProxy::RegisterHandlerForDrmOverlayManager( |
| 145 DrmOverlayManager* handler) { |
| 146 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 147 overlay_manager_ = handler; |
| 148 } |
| 149 |
| 150 void MusThreadProxy::UnRegisterHandlerForDrmOverlayManager() { |
| 151 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 152 overlay_manager_ = nullptr; |
| 153 } |
| 154 |
| 155 bool MusThreadProxy::GpuCheckOverlayCapabilities( |
| 156 gfx::AcceleratedWidget widget, |
| 157 const std::vector<OverlayCheck_Params>& overlays) { |
| 158 DCHECK(drm_thread_->IsRunning()); |
| 159 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 160 auto callback = |
| 161 base::Bind(&MusThreadProxy::GpuCheckOverlayCapabilitiesCallback, |
| 162 weak_ptr_factory_.GetWeakPtr()); |
| 163 drm_thread_->task_runner()->PostTask( |
| 164 FROM_HERE, base::Bind(&DrmThread::CheckOverlayCapabilities, |
| 165 base::Unretained(drm_thread_), widget, overlays, |
| 166 CreateSafeCallback(callback))); |
| 167 return true; |
| 168 } |
| 169 |
| 170 bool MusThreadProxy::GpuRefreshNativeDisplays() { |
| 171 DCHECK(drm_thread_->IsRunning()); |
| 172 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 173 auto callback = base::Bind(&MusThreadProxy::GpuRefreshNativeDisplaysCallback, |
| 174 weak_ptr_factory_.GetWeakPtr()); |
| 175 drm_thread_->task_runner()->PostTask( |
| 176 FROM_HERE, |
| 177 base::Bind(&DrmThread::RefreshNativeDisplays, |
| 178 base::Unretained(drm_thread_), CreateSafeCallback(callback))); |
| 179 return true; |
| 180 } |
| 181 |
| 182 bool MusThreadProxy::GpuConfigureNativeDisplay(int64_t id, |
| 183 const DisplayMode_Params& mode, |
| 184 const gfx::Point& origin) { |
| 185 DCHECK(drm_thread_->IsRunning()); |
| 186 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 187 |
| 188 auto callback = base::Bind(&MusThreadProxy::GpuConfigureNativeDisplayCallback, |
| 189 weak_ptr_factory_.GetWeakPtr()); |
| 190 drm_thread_->task_runner()->PostTask( |
| 191 FROM_HERE, base::Bind(&DrmThread::ConfigureNativeDisplay, |
| 192 base::Unretained(drm_thread_), id, mode, origin, |
| 193 CreateSafeCallback(callback))); |
| 194 return true; |
| 195 } |
| 196 |
| 197 bool MusThreadProxy::GpuDisableNativeDisplay(int64_t id) { |
| 198 DCHECK(drm_thread_->IsRunning()); |
| 199 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 200 auto callback = base::Bind(&MusThreadProxy::GpuDisableNativeDisplayCallback, |
| 201 weak_ptr_factory_.GetWeakPtr()); |
| 202 drm_thread_->task_runner()->PostTask( |
| 203 FROM_HERE, base::Bind(&DrmThread::DisableNativeDisplay, |
| 204 base::Unretained(drm_thread_), id, |
| 205 CreateSafeCallback(callback))); |
| 206 return true; |
| 207 } |
| 208 |
| 209 bool MusThreadProxy::GpuTakeDisplayControl() { |
| 210 DCHECK(drm_thread_->IsRunning()); |
| 211 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 212 auto callback = base::Bind(&MusThreadProxy::GpuTakeDisplayControlCallback, |
| 213 weak_ptr_factory_.GetWeakPtr()); |
| 214 drm_thread_->task_runner()->PostTask( |
| 215 FROM_HERE, |
| 216 base::Bind(&DrmThread::TakeDisplayControl, base::Unretained(drm_thread_), |
| 217 CreateSafeCallback(callback))); |
| 218 return true; |
| 219 } |
| 220 |
| 221 bool MusThreadProxy::GpuRelinquishDisplayControl() { |
| 222 DCHECK(drm_thread_->IsRunning()); |
| 223 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 224 auto callback = |
| 225 base::Bind(&MusThreadProxy::GpuRelinquishDisplayControlCallback, |
| 226 weak_ptr_factory_.GetWeakPtr()); |
| 227 drm_thread_->task_runner()->PostTask( |
| 228 FROM_HERE, |
| 229 base::Bind(&DrmThread::RelinquishDisplayControl, |
| 230 base::Unretained(drm_thread_), CreateSafeCallback(callback))); |
| 231 return true; |
| 232 } |
| 233 |
| 234 bool MusThreadProxy::GpuAddGraphicsDevice(const base::FilePath& path, |
| 235 const base::FileDescriptor& fd) { |
| 236 DCHECK(drm_thread_->IsRunning()); |
| 237 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 238 drm_thread_->task_runner()->PostTask( |
| 239 FROM_HERE, base::Bind(&DrmThread::AddGraphicsDevice, |
| 240 base::Unretained(drm_thread_), path, fd)); |
| 241 return true; |
| 242 } |
| 243 |
| 244 bool MusThreadProxy::GpuRemoveGraphicsDevice(const base::FilePath& path) { |
| 245 DCHECK(drm_thread_->IsRunning()); |
| 246 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 247 drm_thread_->task_runner()->PostTask( |
| 248 FROM_HERE, base::Bind(&DrmThread::RemoveGraphicsDevice, |
| 249 base::Unretained(drm_thread_), path)); |
| 250 return true; |
| 251 } |
| 252 |
| 253 bool MusThreadProxy::GpuGetHDCPState(int64_t display_id) { |
| 254 DCHECK(drm_thread_->IsRunning()); |
| 255 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 256 auto callback = base::Bind(&MusThreadProxy::GpuGetHDCPStateCallback, |
| 257 weak_ptr_factory_.GetWeakPtr()); |
| 258 drm_thread_->task_runner()->PostTask( |
| 259 FROM_HERE, |
| 260 base::Bind(&DrmThread::GetHDCPState, base::Unretained(drm_thread_), |
| 261 display_id, CreateSafeCallback(callback))); |
| 262 return true; |
| 263 } |
| 264 |
| 265 bool MusThreadProxy::GpuSetHDCPState(int64_t display_id, HDCPState state) { |
| 266 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 267 DCHECK(drm_thread_->IsRunning()); |
| 268 auto callback = base::Bind(&MusThreadProxy::GpuSetHDCPStateCallback, |
| 269 weak_ptr_factory_.GetWeakPtr()); |
| 270 drm_thread_->task_runner()->PostTask( |
| 271 FROM_HERE, |
| 272 base::Bind(&DrmThread::SetHDCPState, base::Unretained(drm_thread_), |
| 273 display_id, state, CreateSafeCallback(callback))); |
| 274 return true; |
| 275 } |
| 276 |
| 277 bool MusThreadProxy::GpuSetGammaRamp( |
| 278 int64_t id, |
| 279 const std::vector<GammaRampRGBEntry>& lut) { |
| 280 DCHECK(drm_thread_->IsRunning()); |
| 281 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 282 drm_thread_->task_runner()->PostTask( |
| 283 FROM_HERE, base::Bind(&DrmThread::SetGammaRamp, |
| 284 base::Unretained(drm_thread_), id, lut)); |
| 285 return true; |
| 286 } |
| 287 |
| 288 void MusThreadProxy::GpuCheckOverlayCapabilitiesCallback( |
| 289 gfx::AcceleratedWidget widget, |
| 290 const std::vector<OverlayCheck_Params>& overlays) const { |
| 291 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 292 overlay_manager_->GpuSentOverlayResult(widget, overlays); |
| 293 } |
| 294 |
| 295 void MusThreadProxy::GpuConfigureNativeDisplayCallback(int64_t display_id, |
| 296 bool success) const { |
| 297 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 298 display_manager_->GpuConfiguredDisplay(display_id, success); |
| 299 } |
| 300 |
| 301 void MusThreadProxy::GpuRefreshNativeDisplaysCallback( |
| 302 const std::vector<DisplaySnapshot_Params>& displays) const { |
| 303 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 304 display_manager_->GpuHasUpdatedNativeDisplays(displays); |
| 305 } |
| 306 |
| 307 void MusThreadProxy::GpuDisableNativeDisplayCallback(int64_t display_id, |
| 308 bool success) const { |
| 309 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 310 display_manager_->GpuConfiguredDisplay(display_id, success); |
| 311 } |
| 312 |
| 313 void MusThreadProxy::GpuTakeDisplayControlCallback(bool success) const { |
| 314 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 315 display_manager_->GpuTookDisplayControl(success); |
| 316 } |
| 317 |
| 318 void MusThreadProxy::GpuRelinquishDisplayControlCallback(bool success) const { |
| 319 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 320 display_manager_->GpuRelinquishedDisplayControl(success); |
| 321 } |
| 322 |
| 323 void MusThreadProxy::GpuGetHDCPStateCallback(int64_t display_id, |
| 324 bool success, |
| 325 HDCPState state) const { |
| 326 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 327 display_manager_->GpuReceivedHDCPState(display_id, success, state); |
| 328 } |
| 329 |
| 330 void MusThreadProxy::GpuSetHDCPStateCallback(int64_t display_id, |
| 331 bool success) const { |
| 332 DCHECK(on_window_server_thread_.CalledOnValidThread()); |
| 333 display_manager_->GpuUpdatedHDCPState(display_id, success); |
| 334 } |
| 335 |
| 336 } // namespace ui |
OLD | NEW |