summaryrefslogtreecommitdiff
path: root/sdm/libs/core
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-05-27 17:09:12 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-05-27 17:09:12 -0700
commit7d85edef2164a938e427d688d9c0c00881bfc80a (patch)
tree850785fc43f0a50ad76630d831d8a4af65d04b3f /sdm/libs/core
parent9d1c43fa6b8edd4e9ca9944865909ab264ec5b4f (diff)
parent7171af521236d420e3913155b56a4a4cd4f352ea (diff)
downloaddisplay-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.cpp4
-rw-r--r--sdm/libs/core/drm/hw_device_drm.cpp2
-rw-r--r--sdm/libs/core/drm/hw_device_drm.h1
-rw-r--r--sdm/libs/core/drm/hw_events_drm.cpp31
-rw-r--r--sdm/libs/core/drm/hw_events_drm.h3
-rw-r--r--sdm/libs/core/fb/hw_events.h3
-rw-r--r--sdm/libs/core/hw_events_interface.h1
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);