From 590e20d84d4f61b22a70163f78b3a8145ca166e9 Mon Sep 17 00:00:00 2001 From: Wan Shuang Date: Mon, 15 Oct 2018 10:40:49 +0800 Subject: [PATCH] Set HWC as DRM master when got exclusive lock of /vendor/hwc.lock. This is to ensure HWC could take over the DRM master role when earlyEvs exits and make the Android UI rendering correctly as expected. Jira: OAM-70073 Tests: Boot into Android home screen Signed-off-by: Wan Shuang --- common/core/gpudevice.cpp | 2 ++ wsi/displaymanager.h | 2 ++ wsi/drm/drmdisplaymanager.cpp | 7 +++++++ wsi/drm/drmdisplaymanager.h | 2 ++ 4 files changed, 13 insertions(+) diff --git a/common/core/gpudevice.cpp b/common/core/gpudevice.cpp index 8bf964f..170559d 100644 --- a/common/core/gpudevice.cpp +++ b/common/core/gpudevice.cpp @@ -670,6 +670,8 @@ void GpuDevice::HandleRoutine() { ITRACE("Successfully grabbed the hwc lock."); } + display_manager_->setDrmMaster(); + close(lock_fd_); lock_fd_ = -1; } diff --git a/wsi/displaymanager.h b/wsi/displaymanager.h index aa73ce4..748cf71 100644 --- a/wsi/displaymanager.h +++ b/wsi/displaymanager.h @@ -53,6 +53,8 @@ class DisplayManager { // manager until ForceRefresh is called. virtual void IgnoreUpdates() = 0; + virtual void setDrmMaster() = 0; + // Get FD associated with this DisplayManager. virtual uint32_t GetFD() const = 0; diff --git a/wsi/drm/drmdisplaymanager.cpp b/wsi/drm/drmdisplaymanager.cpp index 08d5eab..ef57996 100644 --- a/wsi/drm/drmdisplaymanager.cpp +++ b/wsi/drm/drmdisplaymanager.cpp @@ -445,6 +445,13 @@ void DrmDisplayManager::IgnoreUpdates() { } } +void DrmDisplayManager::setDrmMaster() { + int ret = drmSetMaster(fd_); + if (ret) { + ETRACE("Failed to call drmSetMaster : %s", PRINTERROR()); + } +} + void DrmDisplayManager::HandleLazyInitialization() { spin_lock_.lock(); if (release_lock_) { diff --git a/wsi/drm/drmdisplaymanager.h b/wsi/drm/drmdisplaymanager.h index d406217..e3f8ccf 100644 --- a/wsi/drm/drmdisplaymanager.h +++ b/wsi/drm/drmdisplaymanager.h @@ -63,6 +63,8 @@ class DrmDisplayManager : public HWCThread, public DisplayManager { void IgnoreUpdates() override; + void setDrmMaster() override; + uint32_t GetFD() const override { return fd_; } -- 2.11.0