sde: Add support for hwc version 1.4
- Add support for setPowerMode.
- Treat HWC_POWER_MODE_DOZE/HWC_POWER_MODE_DOZE_SUSPEND equally.
- Support getActiveConfig/setActiveConfig only at 0th config for now.
Change-Id: I4684423bb8e3c66cb2289fcabcf13f717168dc9d
diff --git a/displayengine/include/core/display_interface.h b/displayengine/include/core/display_interface.h
index dfe161b..97f7911 100755
--- a/displayengine/include/core/display_interface.h
+++ b/displayengine/include/core/display_interface.h
@@ -235,12 +235,20 @@
/*! @brief Method to get configuration for variable properties of the display device.
- @param[in] mode index of the mode
+ @param[in] index index of the mode
@param[out] variable_info \link DisplayConfigVariableInfo \endlink
@return \link DisplayError \endlink
*/
- virtual DisplayError GetConfig(DisplayConfigVariableInfo *variable_info, uint32_t mode) = 0;
+ virtual DisplayError GetConfig(uint32_t index, DisplayConfigVariableInfo *variable_info) = 0;
+
+ /*! @brief Method to get index of active configuration of the display device.
+
+ @param[out] index index of the mode corresponding to variable properties.
+
+ @return \link DisplayError \endlink
+ */
+ virtual DisplayError GetActiveConfig(uint32_t *index) = 0;
/*! @brief Method to get VSync event state. Default event state is disabled.
@@ -260,13 +268,13 @@
*/
virtual DisplayError SetDisplayState(DisplayState state) = 0;
- /*! @brief Method to set configuration for variable properties of the display device.
+ /*! @brief Method to set active configuration for variable properties of the display device.
- @param[in] mode index of the mode corresponding to variable properties.
+ @param[in] index index of the mode corresponding to variable properties.
@return \link DisplayError \endlink
*/
- virtual DisplayError SetConfig(uint32_t mode) = 0;
+ virtual DisplayError SetActiveConfig(uint32_t index) = 0;
/*! @brief Method to set VSync event state. Default event state is disabled.
diff --git a/displayengine/libs/core/display_base.cpp b/displayengine/libs/core/display_base.cpp
index 1d032bf..aaa7990 100644
--- a/displayengine/libs/core/display_base.cpp
+++ b/displayengine/libs/core/display_base.cpp
@@ -200,14 +200,26 @@
return kErrorNone;
}
-DisplayError DisplayBase::GetConfig(DisplayConfigVariableInfo *variable_info, uint32_t mode) {
+DisplayError DisplayBase::GetConfig(uint32_t index, DisplayConfigVariableInfo *variable_info) {
SCOPE_LOCK(locker_);
- if (!variable_info || mode >= num_modes_) {
+ if (!variable_info || index >= num_modes_) {
return kErrorParameters;
}
- *variable_info = display_attributes_[mode];
+ *variable_info = display_attributes_[index];
+
+ return kErrorNone;
+}
+
+DisplayError DisplayBase::GetActiveConfig(uint32_t *index) {
+ SCOPE_LOCK(locker_);
+
+ if (!index) {
+ return kErrorParameters;
+ }
+
+ *index = active_mode_index_;
return kErrorNone;
}
@@ -265,14 +277,18 @@
return error;
}
-DisplayError DisplayBase::SetConfig(uint32_t mode) {
+DisplayError DisplayBase::SetActiveConfig(uint32_t index) {
SCOPE_LOCK(locker_);
DisplayError error = kErrorNone;
- if (mode >= num_modes_) {
- return kErrorParameters;
+ if (index >= num_modes_) {
+ return kErrorParameters;
}
- error = hw_intf_->SetDisplayAttributes(hw_device_, mode);
+
+ error = hw_intf_->SetDisplayAttributes(hw_device_, index);
+ if (error != kErrorNone) {
+ active_mode_index_ = index;
+ }
return error;
}
diff --git a/displayengine/libs/core/display_base.h b/displayengine/libs/core/display_base.h
index 2a33988..3f0e24f 100644
--- a/displayengine/libs/core/display_base.h
+++ b/displayengine/libs/core/display_base.h
@@ -46,10 +46,11 @@
virtual DisplayError GetDisplayState(DisplayState *state);
virtual DisplayError GetNumVariableInfoConfigs(uint32_t *count);
virtual DisplayError GetConfig(DisplayConfigFixedInfo *fixed_info);
- virtual DisplayError GetConfig(DisplayConfigVariableInfo *variable_info, uint32_t mode);
+ virtual DisplayError GetConfig(uint32_t index, DisplayConfigVariableInfo *variable_info);
+ virtual DisplayError GetActiveConfig(uint32_t *index);
virtual DisplayError GetVSyncState(bool *enabled);
virtual DisplayError SetDisplayState(DisplayState state);
- virtual DisplayError SetConfig(uint32_t mode);
+ virtual DisplayError SetActiveConfig(uint32_t index);
virtual DisplayError SetVSyncState(bool enable);
// Implement the HWEventHandlers
diff --git a/displayengine/libs/core/hw_framebuffer.cpp b/displayengine/libs/core/hw_framebuffer.cpp
index 1c2ea1e..36b86b6 100644
--- a/displayengine/libs/core/hw_framebuffer.cpp
+++ b/displayengine/libs/core/hw_framebuffer.cpp
@@ -86,8 +86,8 @@
fopen_ = virtual_fopen;
fclose_ = virtual_fclose;
getline_ = virtual_getline;
- read_ = ::virtual_read;
- write_ = ::virtual_write;
+ read_ = virtual_read;
+ write_ = virtual_write;
}
#endif
for (int i = 0; i < kDeviceMax; i++) {
@@ -283,7 +283,7 @@
DisplayError HWFrameBuffer::GetDisplayAttributes(Handle device,
HWDisplayAttributes *display_attributes,
- uint32_t mode) {
+ uint32_t index) {
HWContext *hw_context = reinterpret_cast<HWContext *>(device);
int &device_fd = hw_context->device_fd;
// Variable screen info
@@ -332,7 +332,7 @@
msm_hdmi_mode_timing_info *timing_mode = &supported_video_modes_[0];
for (int i = 0; i < HDMI_VFRMT_MAX; i++) {
msm_hdmi_mode_timing_info *cur = &supported_video_modes_[i];
- if (cur->video_format == hdmi_modes_[mode]) {
+ if (cur->video_format == hdmi_modes_[index]) {
timing_mode = cur;
break;
}
@@ -358,7 +358,7 @@
return kErrorNone;
}
-DisplayError HWFrameBuffer::SetDisplayAttributes(Handle device, uint32_t mode) {
+DisplayError HWFrameBuffer::SetDisplayAttributes(Handle device, uint32_t index) {
HWContext *hw_context = reinterpret_cast<HWContext *>(device);
DisplayError error = kErrorNone;
@@ -383,7 +383,7 @@
msm_hdmi_mode_timing_info *timing_mode = &supported_video_modes_[0];
for (int i = 0; i < HDMI_VFRMT_MAX; i++) {
msm_hdmi_mode_timing_info *cur = &supported_video_modes_[i];
- if (cur->video_format == hdmi_modes_[mode]) {
+ if (cur->video_format == hdmi_modes_[index]) {
timing_mode = cur;
break;
}
diff --git a/displayengine/libs/core/hw_framebuffer.h b/displayengine/libs/core/hw_framebuffer.h
index 568f2b1..5816878 100644
--- a/displayengine/libs/core/hw_framebuffer.h
+++ b/displayengine/libs/core/hw_framebuffer.h
@@ -47,8 +47,8 @@
virtual DisplayError Close(Handle device);
virtual DisplayError GetNumDisplayAttributes(Handle device, uint32_t *count);
virtual DisplayError GetDisplayAttributes(Handle device, HWDisplayAttributes *display_attributes,
- uint32_t mode);
- virtual DisplayError SetDisplayAttributes(Handle device, uint32_t mode);
+ uint32_t index);
+ virtual DisplayError SetDisplayAttributes(Handle device, uint32_t index);
virtual DisplayError PowerOn(Handle device);
virtual DisplayError PowerOff(Handle device);
virtual DisplayError Doze(Handle device);
diff --git a/displayengine/libs/core/hw_interface.h b/displayengine/libs/core/hw_interface.h
index 1c0c765..151dc4a 100644
--- a/displayengine/libs/core/hw_interface.h
+++ b/displayengine/libs/core/hw_interface.h
@@ -135,8 +135,8 @@
virtual DisplayError Close(Handle device) = 0;
virtual DisplayError GetNumDisplayAttributes(Handle device, uint32_t *count) = 0;
virtual DisplayError GetDisplayAttributes(Handle device,
- HWDisplayAttributes *display_attributes, uint32_t mode) = 0;
- virtual DisplayError SetDisplayAttributes(Handle device, uint32_t mode) = 0;
+ HWDisplayAttributes *display_attributes, uint32_t index) = 0;
+ virtual DisplayError SetDisplayAttributes(Handle device, uint32_t index) = 0;
virtual DisplayError PowerOn(Handle device) = 0;
virtual DisplayError PowerOff(Handle device) = 0;
virtual DisplayError Doze(Handle device) = 0;
diff --git a/displayengine/libs/hwc/hwc_display.cpp b/displayengine/libs/hwc/hwc_display.cpp
index 4fc36dd..3f6e713 100644
--- a/displayengine/libs/hwc/hwc_display.cpp
+++ b/displayengine/libs/hwc/hwc_display.cpp
@@ -85,10 +85,32 @@
return 0;
}
-int HWCDisplay::Blank(int blank) {
- DLOGI("blank = %d, display = %d", blank, id_);
- DisplayState state = blank ? kStateOff : kStateOn;
- return SetState(state);
+int HWCDisplay::SetPowerMode(int mode) {
+ DLOGI("display = %d, mode = %d", id_, mode);
+ DisplayState state = kStateOff;
+
+ switch (mode) {
+ case HWC_POWER_MODE_OFF:
+ state = kStateOff;
+ break;
+ case HWC_POWER_MODE_NORMAL:
+ state = kStateOn;
+ break;
+ case HWC_POWER_MODE_DOZE:
+ case HWC_POWER_MODE_DOZE_SUSPEND:
+ state = kStateDoze;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ DisplayError error = display_intf_->SetDisplayState(state);
+ if (UNLIKELY(error != kErrorNone)) {
+ DLOGE("Set state failed. Error = %d", error);
+ return -EINVAL;
+ }
+
+ return 0;
}
int HWCDisplay::GetDisplayConfigs(uint32_t *configs, size_t *num_configs) {
@@ -104,7 +126,7 @@
DisplayError error = kErrorNone;
DisplayConfigVariableInfo variable_config;
- error = display_intf_->GetConfig(&variable_config, config);
+ error = display_intf_->GetConfig(config, &variable_config);
if (UNLIKELY(error != kErrorNone)) {
DLOGE("GetConfig variable info failed. Error = %d", error);
return -EINVAL;
@@ -139,11 +161,26 @@
return 0;
}
-int HWCDisplay::SetState(DisplayState state) {
- DisplayError error = display_intf_->SetDisplayState(state);
- if (UNLIKELY(error != kErrorNone)) {
- DLOGE("Set state failed. Error = %d", error);
- return -EINVAL;
+int HWCDisplay::GetActiveConfig() {
+ DisplayError error = kErrorNone;
+ uint32_t index = 0;
+
+ error = display_intf_->GetActiveConfig(&index);
+ if (error != kErrorNone) {
+ DLOGE("GetActiveConfig failed. Error = %d", error);
+ return -1;
+ }
+
+ return index;
+}
+
+int HWCDisplay::SetActiveConfig(int index) {
+ DisplayError error = kErrorNone;
+
+ error = display_intf_->SetActiveConfig(index);
+ if (error != kErrorNone) {
+ DLOGE("SetActiveConfig failed. Error = %d", error);
+ return -1;
}
return 0;
diff --git a/displayengine/libs/hwc/hwc_display.h b/displayengine/libs/hwc/hwc_display.h
index 7f90430..3971d4d 100644
--- a/displayengine/libs/hwc/hwc_display.h
+++ b/displayengine/libs/hwc/hwc_display.h
@@ -37,10 +37,11 @@
virtual int Prepare(hwc_display_contents_1_t *content_list) = 0;
virtual int Commit(hwc_display_contents_1_t *content_list) = 0;
virtual int EventControl(int event, int enable);
- virtual int Blank(int blank);
+ virtual int SetPowerMode(int mode);
virtual int GetDisplayConfigs(uint32_t *configs, size_t *num_configs);
virtual int GetDisplayAttributes(uint32_t config, const uint32_t *attributes, int32_t *values);
- int SetState(DisplayState state);
+ virtual int GetActiveConfig();
+ virtual int SetActiveConfig(int index);
protected:
// Maximum number of layers supported by display engine.
diff --git a/displayengine/libs/hwc/hwc_display_external.cpp b/displayengine/libs/hwc/hwc_display_external.cpp
index 442e241..6705549 100644
--- a/displayengine/libs/hwc/hwc_display_external.cpp
+++ b/displayengine/libs/hwc/hwc_display_external.cpp
@@ -64,14 +64,6 @@
return 0;
}
-int HWCDisplayExternal::PowerOn() {
- return 0;
-}
-
-int HWCDisplayExternal::PowerOff() {
- return 0;
-}
-
int HWCDisplayExternal::GetDisplayConfigs(uint32_t *configs, size_t *num_configs) {
uint32_t config_count = 0;
if (*num_configs <= 0) {
diff --git a/displayengine/libs/hwc/hwc_display_external.h b/displayengine/libs/hwc/hwc_display_external.h
index c8d26fa..e268621 100644
--- a/displayengine/libs/hwc/hwc_display_external.h
+++ b/displayengine/libs/hwc/hwc_display_external.h
@@ -34,8 +34,6 @@
explicit HWCDisplayExternal(CoreInterface *core_intf, hwc_procs_t const **hwc_procs);
virtual int Prepare(hwc_display_contents_1_t *content_list);
virtual int Commit(hwc_display_contents_1_t *content_list);
- virtual int PowerOn();
- virtual int PowerOff();
virtual int GetDisplayConfigs(uint32_t *configs, size_t *num_configs);
};
diff --git a/displayengine/libs/hwc/hwc_display_primary.cpp b/displayengine/libs/hwc/hwc_display_primary.cpp
index dc98913..19a1016 100644
--- a/displayengine/libs/hwc/hwc_display_primary.cpp
+++ b/displayengine/libs/hwc/hwc_display_primary.cpp
@@ -64,13 +64,5 @@
return 0;
}
-int HWCDisplayPrimary::PowerOn() {
- return SetState(kStateOn);
-}
-
-int HWCDisplayPrimary::PowerOff() {
- return SetState(kStateOff);
-}
-
} // namespace sde
diff --git a/displayengine/libs/hwc/hwc_display_primary.h b/displayengine/libs/hwc/hwc_display_primary.h
index df5cbd3..4e9e93f 100644
--- a/displayengine/libs/hwc/hwc_display_primary.h
+++ b/displayengine/libs/hwc/hwc_display_primary.h
@@ -34,8 +34,6 @@
explicit HWCDisplayPrimary(CoreInterface *core_intf, hwc_procs_t const **hwc_procs);
virtual int Prepare(hwc_display_contents_1_t *content_list);
virtual int Commit(hwc_display_contents_1_t *content_list);
- virtual int PowerOn();
- virtual int PowerOff();
};
} // namespace sde
diff --git a/displayengine/libs/hwc/hwc_display_virtual.cpp b/displayengine/libs/hwc/hwc_display_virtual.cpp
index 6420b5a..657aecb 100755
--- a/displayengine/libs/hwc/hwc_display_virtual.cpp
+++ b/displayengine/libs/hwc/hwc_display_virtual.cpp
@@ -35,14 +35,6 @@
: HWCDisplay(core_intf, hwc_procs, kVirtual, HWC_DISPLAY_VIRTUAL, false) {
}
-int HWCDisplayVirtual::Init() {
- return 0;
-}
-
-int HWCDisplayVirtual::Deinit() {
- return 0;
-}
-
int HWCDisplayVirtual::Prepare(hwc_display_contents_1_t *content_list) {
return 0;
}
@@ -51,13 +43,5 @@
return 0;
}
-int HWCDisplayVirtual::PowerOn() {
- return 0;
-}
-
-int HWCDisplayVirtual::PowerOff() {
- return 0;
-}
-
} // namespace sde
diff --git a/displayengine/libs/hwc/hwc_display_virtual.h b/displayengine/libs/hwc/hwc_display_virtual.h
index 6159425..796ed32 100644
--- a/displayengine/libs/hwc/hwc_display_virtual.h
+++ b/displayengine/libs/hwc/hwc_display_virtual.h
@@ -32,12 +32,8 @@
class HWCDisplayVirtual : public HWCDisplay {
public:
explicit HWCDisplayVirtual(CoreInterface *core_intf, hwc_procs_t const **hwc_procs);
- virtual int Init();
- virtual int Deinit();
virtual int Prepare(hwc_display_contents_1_t *content_list);
virtual int Commit(hwc_display_contents_1_t *content_list);
- virtual int PowerOn();
- virtual int PowerOff();
};
} // namespace sde
diff --git a/displayengine/libs/hwc/hwc_session.cpp b/displayengine/libs/hwc/hwc_session.cpp
index a9603d1..3f99a23 100644
--- a/displayengine/libs/hwc/hwc_session.cpp
+++ b/displayengine/libs/hwc/hwc_session.cpp
@@ -60,18 +60,20 @@
display_primary_(NULL), display_external_(NULL), hotplug_thread_exit_(false),
hotplug_thread_name_("HWC_HotPlugThread") {
hwc_composer_device_1_t::common.tag = HARDWARE_DEVICE_TAG;
- hwc_composer_device_1_t::common.version = HWC_DEVICE_API_VERSION_1_3;
+ hwc_composer_device_1_t::common.version = HWC_DEVICE_API_VERSION_1_4;
hwc_composer_device_1_t::common.module = const_cast<hw_module_t*>(module);
hwc_composer_device_1_t::common.close = Close;
hwc_composer_device_1_t::prepare = Prepare;
hwc_composer_device_1_t::set = Set;
hwc_composer_device_1_t::eventControl = EventControl;
- hwc_composer_device_1_t::blank = Blank;
+ hwc_composer_device_1_t::setPowerMode = SetPowerMode;
hwc_composer_device_1_t::query = Query;
hwc_composer_device_1_t::registerProcs = RegisterProcs;
hwc_composer_device_1_t::dump = Dump;
hwc_composer_device_1_t::getDisplayConfigs = GetDisplayConfigs;
hwc_composer_device_1_t::getDisplayAttributes = GetDisplayAttributes;
+ hwc_composer_device_1_t::getActiveConfig = GetActiveConfig;
+ hwc_composer_device_1_t::setActiveConfig = SetActiveConfig;
}
int HWCSession::Init() {
@@ -110,7 +112,7 @@
return status;
}
- status = display_primary_->PowerOn();
+ status = display_primary_->SetPowerMode(HWC_POWER_MODE_NORMAL);
if (status) {
display_primary_->Deinit();
delete display_primary_;
@@ -130,7 +132,7 @@
}
int HWCSession::Deinit() {
- display_primary_->PowerOff();
+ display_primary_->SetPowerMode(HWC_POWER_MODE_OFF);
display_primary_->Deinit();
delete display_primary_;
hotplug_thread_exit_ = true;
@@ -275,7 +277,7 @@
return status;
}
-int HWCSession::Blank(hwc_composer_device_1 *device, int disp, int blank) {
+int HWCSession::SetPowerMode(hwc_composer_device_1 *device, int disp, int mode) {
SCOPE_LOCK(locker_);
if (!device) {
@@ -287,11 +289,11 @@
switch (disp) {
case HWC_DISPLAY_PRIMARY:
- status = hwc_session->display_primary_->Blank(blank);
+ status = hwc_session->display_primary_->SetPowerMode(mode);
break;
case HWC_DISPLAY_EXTERNAL:
if (hwc_session->display_external_) {
- status = hwc_session->display_external_->Blank(blank);
+ status = hwc_session->display_external_->SetPowerMode(mode);
}
break;
default:
@@ -378,6 +380,55 @@
return status;
}
+int HWCSession::GetActiveConfig(hwc_composer_device_1 *device, int disp) {
+ if (!device) {
+ return -1;
+ }
+
+ HWCSession *hwc_session = static_cast<HWCSession *>(device);
+ int active_config = -1;
+
+ switch (disp) {
+ case HWC_DISPLAY_PRIMARY:
+ active_config = hwc_session->display_primary_->GetActiveConfig();
+ break;
+ case HWC_DISPLAY_EXTERNAL:
+ if (hwc_session->display_external_) {
+ active_config = hwc_session->display_external_->GetActiveConfig();
+ }
+ break;
+ default:
+ active_config = -1;
+ }
+
+ return active_config;
+}
+
+int HWCSession::SetActiveConfig(hwc_composer_device_1 *device, int disp, int index) {
+ if (!device) {
+ return -EINVAL;
+ }
+
+ HWCSession *hwc_session = static_cast<HWCSession *>(device);
+ int status = -EINVAL;
+
+ switch (disp) {
+ case HWC_DISPLAY_PRIMARY:
+ status = hwc_session->display_primary_->SetActiveConfig(index);
+ break;
+ case HWC_DISPLAY_EXTERNAL:
+ if (hwc_session->display_external_) {
+ // TODO(user): Uncomment it. HDMI does not support resolution change currently.
+ status = 0; // hwc_session->display_external_->SetActiveConfig(index);
+ }
+ break;
+ default:
+ status = -EINVAL;
+ }
+
+ return status;
+}
+
DisplayError HWCSession::Hotplug(const CoreEventHotplug &hotplug) {
return kErrorNone;
}
@@ -505,7 +556,7 @@
DLOGE("HDMI not connected");
return -1;
}
- display_external_->PowerOff();
+ display_external_->SetPowerMode(HWC_POWER_MODE_OFF);
display_external_->Deinit();
delete display_external_;
display_external_ = NULL;
diff --git a/displayengine/libs/hwc/hwc_session.h b/displayengine/libs/hwc/hwc_session.h
index 380c98f..488da9d 100644
--- a/displayengine/libs/hwc/hwc_session.h
+++ b/displayengine/libs/hwc/hwc_session.h
@@ -56,7 +56,7 @@
static int Set(hwc_composer_device_1 *device, size_t num_displays,
hwc_display_contents_1_t **displays);
static int EventControl(hwc_composer_device_1 *device, int disp, int event, int enable);
- static int Blank(hwc_composer_device_1 *device, int disp, int blank);
+ static int SetPowerMode(hwc_composer_device_1 *device, int disp, int mode);
static int Query(hwc_composer_device_1 *device, int param, int *value);
static void RegisterProcs(hwc_composer_device_1 *device, hwc_procs_t const *procs);
static void Dump(hwc_composer_device_1 *device, char *buffer, int length);
@@ -64,6 +64,8 @@
size_t *numConfigs);
static int GetDisplayAttributes(hwc_composer_device_1 *device, int disp, uint32_t config,
const uint32_t *attributes, int32_t *values);
+ static int GetActiveConfig(hwc_composer_device_1 *device, int disp);
+ static int SetActiveConfig(hwc_composer_device_1 *device, int disp, int index);
// Hotplug thread for HDMI connect/disconnect
static void* HWCHotPlugThread(void *context);