diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-05-27 17:09:12 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-05-27 17:09:12 -0700 |
commit | 7d85edef2164a938e427d688d9c0c00881bfc80a (patch) | |
tree | 850785fc43f0a50ad76630d831d8a4af65d04b3f /sdm/libs/core | |
parent | 9d1c43fa6b8edd4e9ca9944865909ab264ec5b4f (diff) | |
parent | 7171af521236d420e3913155b56a4a4cd4f352ea (diff) | |
download | display-7d85edef2164a938e427d688d9c0c00881bfc80a.tar.gz |
Merge "sdm: Add support for vsync enable/disable"
Diffstat (limited to 'sdm/libs/core')
-rw-r--r-- | sdm/libs/core/display_base.cpp | 4 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_device_drm.cpp | 2 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_device_drm.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_events_drm.cpp | 31 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_events_drm.h | 3 | ||||
-rw-r--r-- | sdm/libs/core/fb/hw_events.h | 3 | ||||
-rw-r--r-- | sdm/libs/core/hw_events_interface.h | 1 |
7 files changed, 38 insertions, 7 deletions
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp index bf370e97..618dd2e2 100644 --- a/sdm/libs/core/display_base.cpp +++ b/sdm/libs/core/display_base.cpp @@ -986,10 +986,14 @@ DisplayError DisplayBase::SetVSyncState(bool enable) { DisplayError error = kErrorNone; if (vsync_enable_ != enable) { error = hw_intf_->SetVSyncState(enable); + if (error == kErrorNotSupported) { + error = hw_events_intf_->SetEventState(HWEvent::VSYNC, enable); + } if (error == kErrorNone) { vsync_enable_ = enable; } } + return error; } diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp index 4edf4ed0..6bc44340 100644 --- a/sdm/libs/core/drm/hw_device_drm.cpp +++ b/sdm/libs/core/drm/hw_device_drm.cpp @@ -915,7 +915,7 @@ DisplayError HWDeviceDRM::SetPPFeatures(PPFeaturesConfig *feature_list) { } DisplayError HWDeviceDRM::SetVSyncState(bool enable) { - return kErrorNone; + return kErrorNotSupported; } void HWDeviceDRM::SetIdleTimeoutMs(uint32_t timeout_ms) {} diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h index cc2ae7bc..47ceb39b 100644 --- a/sdm/libs/core/drm/hw_device_drm.h +++ b/sdm/libs/core/drm/hw_device_drm.h @@ -75,6 +75,7 @@ class HWDeviceDRM : public HWInterface { virtual DisplayError Flush(); virtual DisplayError GetPPFeaturesVersion(PPFeatureVersion *vers); virtual DisplayError SetPPFeatures(PPFeaturesConfig *feature_list); + // This API is no longer supported, expectation is to call the correct API on HWEvents virtual DisplayError SetVSyncState(bool enable); virtual void SetIdleTimeoutMs(uint32_t timeout_ms); virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode); diff --git a/sdm/libs/core/drm/hw_events_drm.cpp b/sdm/libs/core/drm/hw_events_drm.cpp index 09293a9c..cea76fc3 100644 --- a/sdm/libs/core/drm/hw_events_drm.cpp +++ b/sdm/libs/core/drm/hw_events_drm.cpp @@ -160,7 +160,30 @@ DisplayError HWEventsDRM::Init(int display_type, HWEventHandler *event_handler, DisplayError HWEventsDRM::Deinit() { exit_threads_ = true; Sys::pthread_cancel_(event_thread_); + WakeUpEventThread(); + pthread_join(event_thread_, NULL); + CloseFds(); + + return kErrorNone; +} + +DisplayError HWEventsDRM::SetEventState(HWEvent event, bool enable, void *arg) { + switch (event) { + case HWEvent::VSYNC: + vsync_enabled_ = enable; + if (enable) { + WakeUpEventThread(); + } + break; + default: + DLOGE("Event not supported"); + return kErrorNotSupported; + } + return kErrorNone; +} + +void HWEventsDRM::WakeUpEventThread() { for (uint32_t i = 0; i < event_data_list_.size(); i++) { if (event_data_list_[i].event_type == HWEvent::EXIT) { uint64_t exit_value = 1; @@ -169,13 +192,9 @@ DisplayError HWEventsDRM::Deinit() { DLOGW("Error triggering exit fd (%d). write size = %d, error = %s", poll_fds_[i].fd, write_size, strerror(errno)); } + break; } } - - pthread_join(event_thread_, NULL); - CloseFds(); - - return kErrorNone; } DisplayError HWEventsDRM::CloseFds() { @@ -217,7 +236,7 @@ void *HWEventsDRM::DisplayEventHandler() { setpriority(PRIO_PROCESS, 0, kThreadPriorityUrgent); while (!exit_threads_) { - if (RegisterVSync() != kErrorNone) { + if (vsync_enabled_ && RegisterVSync() != kErrorNone) { pthread_exit(0); return nullptr; } diff --git a/sdm/libs/core/drm/hw_events_drm.h b/sdm/libs/core/drm/hw_events_drm.h index 8703321b..41050c71 100644 --- a/sdm/libs/core/drm/hw_events_drm.h +++ b/sdm/libs/core/drm/hw_events_drm.h @@ -48,6 +48,7 @@ class HWEventsDRM : public HWEventsInterface { virtual DisplayError Init(int display_type, HWEventHandler *event_handler, const vector<HWEvent> &event_list); virtual DisplayError Deinit(); + virtual DisplayError SetEventState(HWEvent event, bool enable, void *aux = nullptr); private: static const int kMaxStringLength = 1024; @@ -72,6 +73,7 @@ class HWEventsDRM : public HWEventsInterface { void HandleBlank(char *data) {} void HandleIdlePowerCollapse(char *data); void PopulateHWEventData(const vector<HWEvent> &event_list); + void WakeUpEventThread(); DisplayError SetEventParser(); DisplayError InitializePollFd(); DisplayError CloseFds(); @@ -84,6 +86,7 @@ class HWEventsDRM : public HWEventsInterface { std::string event_thread_name_ = "SDM_EventThread"; bool exit_threads_ = false; uint32_t vsync_index_ = 0; + bool vsync_enabled_ = true; }; } // namespace sdm diff --git a/sdm/libs/core/fb/hw_events.h b/sdm/libs/core/fb/hw_events.h index 347495fa..3d9cec84 100644 --- a/sdm/libs/core/fb/hw_events.h +++ b/sdm/libs/core/fb/hw_events.h @@ -44,6 +44,9 @@ class HWEvents : public HWEventsInterface { virtual DisplayError Init(int fb_num, HWEventHandler *event_handler, const vector<HWEvent> &event_list); virtual DisplayError Deinit(); + virtual DisplayError SetEventState(HWEvent event, bool enable, void *aux = nullptr) { + return kErrorNotSupported; + } private: static const int kMaxStringLength = 1024; diff --git a/sdm/libs/core/hw_events_interface.h b/sdm/libs/core/hw_events_interface.h index e6a714c2..482e0770 100644 --- a/sdm/libs/core/hw_events_interface.h +++ b/sdm/libs/core/hw_events_interface.h @@ -49,6 +49,7 @@ class HWEventsInterface { virtual DisplayError Init(int display_type, HWEventHandler *event_handler, const std::vector<HWEvent> &event_list) = 0; virtual DisplayError Deinit() = 0; + virtual DisplayError SetEventState(HWEvent event, bool enable, void *aux = nullptr) = 0; static DisplayError Create(int display_type, HWEventHandler *event_handler, const std::vector<HWEvent> &event_list, HWEventsInterface **intf); |