Index: ui/ozone/platform/drm/mus_thread_proxy.cc |
diff --git a/ui/ozone/platform/drm/mus_thread_proxy.cc b/ui/ozone/platform/drm/mus_thread_proxy.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0e6529e5a4fdd222469dabf6e3d3376ed57e653a |
--- /dev/null |
+++ b/ui/ozone/platform/drm/mus_thread_proxy.cc |
@@ -0,0 +1,336 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/ozone/platform/drm/mus_thread_proxy.h" |
+ |
+#include "base/bind.h" |
+#include "base/single_thread_task_runner.h" |
+#include "base/task_runner.h" |
+#include "base/thread_task_runner_handle.h" |
+#include "ui/ozone/platform/drm/gpu/drm_thread.h" |
+#include "ui/ozone/platform/drm/gpu/proxy_helpers.h" |
+#include "ui/ozone/platform/drm/host/drm_display_host_manager.h" |
+#include "ui/ozone/platform/drm/host/drm_overlay_manager.h" |
+ |
+namespace ui { |
+ |
+MusThreadProxy::MusThreadProxy() |
+ : ws_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
+ drm_thread_(nullptr), |
+ weak_ptr_factory_(this) {} |
+ |
+MusThreadProxy::~MusThreadProxy() { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ FOR_EACH_OBSERVER(GpuThreadObserver, gpu_thread_observers_, |
+ OnGpuThreadRetired()); |
+} |
+ |
+// This is configured on the GPU thread. |
+void MusThreadProxy::SetDrmThread(DrmThread* thread) { |
+ base::AutoLock acquire(lock_); |
+ drm_thread_ = thread; |
+} |
+ |
+void MusThreadProxy::ProvideManagers(DrmDisplayHostManager* display_manager, |
+ DrmOverlayManager* overlay_manager) { |
+ display_manager_ = display_manager; |
+ overlay_manager_ = overlay_manager; |
+} |
+ |
+void MusThreadProxy::StartDrmThread() { |
+ DCHECK(drm_thread_); |
+ drm_thread_->Start(); |
+ |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&MusThreadProxy::DispatchObserversFromDrmThread, |
+ base::Unretained(this))); |
+} |
+ |
+void MusThreadProxy::DispatchObserversFromDrmThread() { |
+ ws_task_runner_->PostTask(FROM_HERE, base::Bind(&MusThreadProxy::RunObservers, |
+ base::Unretained(this))); |
+} |
+ |
+void MusThreadProxy::RunObservers() { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ FOR_EACH_OBSERVER(GpuThreadObserver, gpu_thread_observers_, |
+ OnGpuThreadReady()); |
+} |
+ |
+void MusThreadProxy::AddGpuThreadObserver(GpuThreadObserver* observer) { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ |
+ gpu_thread_observers_.AddObserver(observer); |
+ if (IsConnected()) |
+ observer->OnGpuThreadReady(); |
+} |
+ |
+void MusThreadProxy::RemoveGpuThreadObserver(GpuThreadObserver* observer) { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ gpu_thread_observers_.RemoveObserver(observer); |
+} |
+ |
+bool MusThreadProxy::IsConnected() { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ base::AutoLock acquire(lock_); |
+ if (drm_thread_) |
+ return drm_thread_->IsRunning(); |
+ return false; |
+} |
+ |
+// Services needed for DrmDisplayHostMananger. |
+void MusThreadProxy::RegisterHandlerForDrmDisplayHostManager( |
+ DrmDisplayHostManager* handler) { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_ = handler; |
+} |
+ |
+void MusThreadProxy::UnRegisterHandlerForDrmDisplayHostManager() { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_ = nullptr; |
+} |
+ |
+bool MusThreadProxy::GpuCreateWindow(gfx::AcceleratedWidget widget) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::CreateWindow, |
+ base::Unretained(drm_thread_), widget)); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuDestroyWindow(gfx::AcceleratedWidget widget) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::DestroyWindow, |
+ base::Unretained(drm_thread_), widget)); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuWindowBoundsChanged(gfx::AcceleratedWidget widget, |
+ const gfx::Rect& bounds) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::SetWindowBounds, |
+ base::Unretained(drm_thread_), widget, bounds)); |
+ return true; |
+} |
+ |
+void MusThreadProxy::CursorSet(gfx::AcceleratedWidget widget, |
+ const std::vector<SkBitmap>& bitmaps, |
+ const gfx::Point& location, |
+ int frame_delay_ms) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DrmThread::SetCursor, base::Unretained(drm_thread_), widget, |
+ bitmaps, location, frame_delay_ms)); |
+} |
+ |
+void MusThreadProxy::Move(gfx::AcceleratedWidget widget, |
+ const gfx::Point& location) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::MoveCursor, |
+ base::Unretained(drm_thread_), widget, location)); |
+} |
+ |
+// Services needed for DrmOverlayManager. |
+void MusThreadProxy::RegisterHandlerForDrmOverlayManager( |
+ DrmOverlayManager* handler) { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ overlay_manager_ = handler; |
+} |
+ |
+void MusThreadProxy::UnRegisterHandlerForDrmOverlayManager() { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ overlay_manager_ = nullptr; |
+} |
+ |
+bool MusThreadProxy::GpuCheckOverlayCapabilities( |
+ gfx::AcceleratedWidget widget, |
+ const std::vector<OverlayCheck_Params>& overlays) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ auto callback = |
+ base::Bind(&MusThreadProxy::GpuCheckOverlayCapabilitiesCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::CheckOverlayCapabilities, |
+ base::Unretained(drm_thread_), widget, overlays, |
+ CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuRefreshNativeDisplays() { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ auto callback = base::Bind(&MusThreadProxy::GpuRefreshNativeDisplaysCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DrmThread::RefreshNativeDisplays, |
+ base::Unretained(drm_thread_), CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuConfigureNativeDisplay(int64_t id, |
+ const DisplayMode_Params& mode, |
+ const gfx::Point& origin) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ |
+ auto callback = base::Bind(&MusThreadProxy::GpuConfigureNativeDisplayCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::ConfigureNativeDisplay, |
+ base::Unretained(drm_thread_), id, mode, origin, |
+ CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuDisableNativeDisplay(int64_t id) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ auto callback = base::Bind(&MusThreadProxy::GpuDisableNativeDisplayCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::DisableNativeDisplay, |
+ base::Unretained(drm_thread_), id, |
+ CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuTakeDisplayControl() { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ auto callback = base::Bind(&MusThreadProxy::GpuTakeDisplayControlCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DrmThread::TakeDisplayControl, base::Unretained(drm_thread_), |
+ CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuRelinquishDisplayControl() { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ auto callback = |
+ base::Bind(&MusThreadProxy::GpuRelinquishDisplayControlCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DrmThread::RelinquishDisplayControl, |
+ base::Unretained(drm_thread_), CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuAddGraphicsDevice(const base::FilePath& path, |
+ const base::FileDescriptor& fd) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::AddGraphicsDevice, |
+ base::Unretained(drm_thread_), path, fd)); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuRemoveGraphicsDevice(const base::FilePath& path) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::RemoveGraphicsDevice, |
+ base::Unretained(drm_thread_), path)); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuGetHDCPState(int64_t display_id) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ auto callback = base::Bind(&MusThreadProxy::GpuGetHDCPStateCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DrmThread::GetHDCPState, base::Unretained(drm_thread_), |
+ display_id, CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuSetHDCPState(int64_t display_id, HDCPState state) { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ DCHECK(drm_thread_->IsRunning()); |
+ auto callback = base::Bind(&MusThreadProxy::GpuSetHDCPStateCallback, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DrmThread::SetHDCPState, base::Unretained(drm_thread_), |
+ display_id, state, CreateSafeCallback(callback))); |
+ return true; |
+} |
+ |
+bool MusThreadProxy::GpuSetGammaRamp( |
+ int64_t id, |
+ const std::vector<GammaRampRGBEntry>& lut) { |
+ DCHECK(drm_thread_->IsRunning()); |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ drm_thread_->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&DrmThread::SetGammaRamp, |
+ base::Unretained(drm_thread_), id, lut)); |
+ return true; |
+} |
+ |
+void MusThreadProxy::GpuCheckOverlayCapabilitiesCallback( |
+ gfx::AcceleratedWidget widget, |
+ const std::vector<OverlayCheck_Params>& overlays) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ overlay_manager_->GpuSentOverlayResult(widget, overlays); |
+} |
+ |
+void MusThreadProxy::GpuConfigureNativeDisplayCallback(int64_t display_id, |
+ bool success) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuConfiguredDisplay(display_id, success); |
+} |
+ |
+void MusThreadProxy::GpuRefreshNativeDisplaysCallback( |
+ const std::vector<DisplaySnapshot_Params>& displays) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuHasUpdatedNativeDisplays(displays); |
+} |
+ |
+void MusThreadProxy::GpuDisableNativeDisplayCallback(int64_t display_id, |
+ bool success) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuConfiguredDisplay(display_id, success); |
+} |
+ |
+void MusThreadProxy::GpuTakeDisplayControlCallback(bool success) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuTookDisplayControl(success); |
+} |
+ |
+void MusThreadProxy::GpuRelinquishDisplayControlCallback(bool success) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuRelinquishedDisplayControl(success); |
+} |
+ |
+void MusThreadProxy::GpuGetHDCPStateCallback(int64_t display_id, |
+ bool success, |
+ HDCPState state) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuReceivedHDCPState(display_id, success, state); |
+} |
+ |
+void MusThreadProxy::GpuSetHDCPStateCallback(int64_t display_id, |
+ bool success) const { |
+ DCHECK(on_window_server_thread_.CalledOnValidThread()); |
+ display_manager_->GpuUpdatedHDCPState(display_id, success); |
+} |
+ |
+} // namespace ui |