@@ -29,6 +29,21 @@ GpuDevice::GpuDevice() : HWCThread(-8, "GpuDevice") {
2929
3030GpuDevice::~GpuDevice () {
3131 display_manager_.reset (nullptr );
32+ HWCThread::Exit ();
33+
34+ if (-1 != lock_fd_) {
35+ close (lock_fd_);
36+ lock_fd_ = -1 ;
37+ }
38+ }
39+
40+ void GpuDevice::ResetAllDisplayCommit (bool enable) {
41+ if (enable == enable_all_display_)
42+ return ;
43+ enable_all_display_ = enable;
44+ size_t size = total_displays_.size ();
45+ for (size_t i = 0 ; i < size; i++)
46+ total_displays_.at (i)->EnableDRMCommit (enable);
3247}
3348
3449bool GpuDevice::Initialize () {
@@ -57,13 +72,19 @@ bool GpuDevice::Initialize() {
5772 display_manager_->RemoveUnreservedPlanes ();
5873 }
5974
60- lock_fd_ = open (" /vendor/hwc.lock" , O_RDONLY);
75+ // Ignore all updates by default
76+ ResetAllDisplayCommit (false );
77+ lock_fd_ = open (HWC_LOCK_FILE, O_RDONLY);
6178 if (-1 != lock_fd_) {
6279 if (!InitWorker ()) {
6380 ETRACE (" Failed to initalize thread for GpuDevice. %s" , PRINTERROR ());
6481 }
6582 } else {
66- ITRACE (" Failed to open " LOCK_DIR_PREFIX " /hwc.lock file!" );
83+ ETRACE (" Failed to open %s" , HWC_LOCK_FILE);
84+ // HWC should become drm master and start to commit.
85+ // if hwc.lock is not available
86+ display_manager_->setDrmMaster (true );
87+ ResetAllDisplayCommit (true );
6788 }
6889
6990 return true ;
@@ -103,14 +124,42 @@ void GpuDevice::GetConnectedPhysicalDisplays(
103124}
104125
105126bool GpuDevice::EnableDRMCommit (bool enable, uint32_t display_id) {
106- // TODO clean all display for commit status
107127 size_t size = total_displays_.size ();
108128 bool ret = false ;
109129 if (size > display_id)
110130 ret = total_displays_.at (display_id)->EnableDRMCommit (enable);
111131 return ret;
112132}
113133
134+ bool GpuDevice::ResetDrmMaster (bool drop_master) {
135+ bool ret = true ;
136+ if (drop_master) {
137+ ResetAllDisplayCommit (false );
138+ display_manager_->DropDrmMaster ();
139+ ITRACE (" locking %s and monitoring if %s is unlocked." , HWC_LOCK_FILE,
140+ HWC_LOCK_FILE);
141+ // Resume GpuDevice thread to check hwc.lock and re-apply drm master.
142+ lock_fd_ = open (HWC_LOCK_FILE, O_RDONLY);
143+ if (-1 != lock_fd_) {
144+ // Only resume GpuDevice thread for dropping DRM Master and
145+ // the lock file exist.
146+ Resume ();
147+ return !display_manager_->IsDrmMaster ();
148+ }
149+ }
150+ // In case of setDrmMaster or the lock file is not exist.
151+ // Re-set DRM Master true.
152+ display_manager_->setDrmMaster (false );
153+ ResetAllDisplayCommit (true );
154+ DisableWatch ();
155+
156+ if (drop_master)
157+ ret = !display_manager_->IsDrmMaster ();
158+ else
159+ ret = display_manager_->IsDrmMaster ();
160+ return ret;
161+ }
162+
114163const std::vector<NativeDisplay *> &GpuDevice::GetAllDisplays () {
115164 return total_displays_;
116165}
@@ -967,8 +1016,6 @@ uint32_t GpuDevice::GetDisplayIDFromConnectorID(const uint32_t connector_id) {
9671016}
9681017
9691018void GpuDevice::HandleRoutine () {
970- bool update_ignored = false ;
971-
9721019 // Iniitialize resources to monitor external events.
9731020 // These can be two types:
9741021 // 1) We are showing splash screen and another App
@@ -978,23 +1025,20 @@ void GpuDevice::HandleRoutine() {
9781025 // we need to take control.
9791026 // TODO: Add splash screen support.
9801027 if (lock_fd_ != -1 ) {
981- display_manager_->IgnoreUpdates ();
982- update_ignored = true ;
983-
9841028 if (flock (lock_fd_, LOCK_EX) != 0 ) {
985- ETRACE ( " Failed to wait on the hwc lock." );
1029+ ITRACE ( " Fail to grab the hwc lock." );
9861030 } else {
9871031 ITRACE (" Successfully grabbed the hwc lock." );
1032+ // Set DRM master
1033+ if (!display_manager_->IsDrmMaster ())
1034+ display_manager_->setDrmMaster (true );
1035+ // stop ignoring and force refresh
1036+ ResetAllDisplayCommit (true );
1037+ flock (lock_fd_, LOCK_UN);
1038+ close (lock_fd_);
1039+ lock_fd_ = -1 ;
9881040 }
989-
990- display_manager_->setDrmMaster ();
991-
992- close (lock_fd_);
993- lock_fd_ = -1 ;
9941041 }
995-
996- if (update_ignored)
997- display_manager_->ForceRefresh ();
9981042}
9991043
10001044void GpuDevice::HandleWait () {
@@ -1004,7 +1048,10 @@ void GpuDevice::HandleWait() {
10041048}
10051049
10061050void GpuDevice::DisableWatch () {
1007- HWCThread::Exit ();
1051+ if (lock_fd_ != -1 ) {
1052+ close (lock_fd_);
1053+ lock_fd_ = -1 ;
1054+ }
10081055}
10091056
10101057GpuDevice &GpuDevice::getInstance () {
0 commit comments