sdm: Expose all possible configs to clients.
DispSync queries activeConfig to get accurate fps before resyncing.
Hardcoding to one config can lead to delayed resync, thereby janks when
dynamic fps kicks in. Updating right vsync period will accelerate resync.
For usecases like destination scaler, override display resolution
exposed to SurfaceFlinger.
CRs-Fixed: 2333798
Change-Id: I551fe76fb355f2f1c6374d17b805a3cc860d8c75
diff --git a/config/talos.mk b/config/talos.mk
index cf14110..7fa8444 100644
--- a/config/talos.mk
+++ b/config/talos.mk
@@ -61,8 +61,7 @@
vendor.display.disable_excl_rect=0 \
vendor.display.comp_mask=0 \
vendor.display.disable_hw_recovery=1 \
- vendor.display.enable_default_color_mode=1 \
- vendor.display.drop_skewed_vsync=1
+ vendor.display.enable_default_color_mode=1
# This matrix should be in column major order, per SurfaceFlinger requirement
# 1.16868 -0.16868 0.00000
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 7e30903..a68c708 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -106,6 +106,7 @@
error = Debug::GetMixerResolution(&mixer_attributes_.width, &mixer_attributes_.height);
if (error == kErrorNone) {
hw_intf_->SetMixerAttributes(mixer_attributes_);
+ custom_mixer_resolution_ = true;
}
error = hw_intf_->GetMixerAttributes(&mixer_attributes_);
@@ -439,6 +440,10 @@
HWDisplayAttributes attrib;
if (hw_intf_->GetDisplayAttributes(index, &attrib) == kErrorNone) {
*variable_info = attrib;
+ if (custom_mixer_resolution_) {
+ variable_info->x_pixels = fb_config_.x_pixels;
+ variable_info->y_pixels = fb_config_.y_pixels;
+ }
return kErrorNone;
}
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index 24b8967..609eeab 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -216,6 +216,7 @@
bool drop_hw_vsync_ = false;
uint32_t current_refresh_rate_ = 0;
bool drop_skewed_vsync_ = false;
+ bool custom_mixer_resolution_ = false;
static Locker display_power_reset_lock_;
static bool display_power_reset_pending_;
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 4715848..7592f36 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -771,23 +771,12 @@
}
DisplayError HWDeviceDRM::GetActiveConfig(uint32_t *active_config) {
- if (IsResolutionSwitchEnabled()) {
- *active_config = current_mode_index_;
- } else {
- *active_config = 0;
- }
+ *active_config = current_mode_index_;
return kErrorNone;
}
DisplayError HWDeviceDRM::GetNumDisplayAttributes(uint32_t *count) {
- if (IsResolutionSwitchEnabled()) {
- *count = UINT32(display_attributes_.size());
- if (*count <= 0) {
- return kErrorHardware;
- }
- } else {
- *count = 1;
- }
+ *count = UINT32(display_attributes_.size());
return kErrorNone;
}
@@ -796,11 +785,7 @@
if (index >= display_attributes_.size()) {
return kErrorParameters;
}
- if (IsResolutionSwitchEnabled()) {
- *display_attributes = display_attributes_[index];
- } else {
- *display_attributes = display_attributes_[current_mode_index_];
- }
+ *display_attributes = display_attributes_[index];
return kErrorNone;
}
@@ -810,10 +795,6 @@
}
DisplayError HWDeviceDRM::SetDisplayAttributes(uint32_t index) {
- if (!IsResolutionSwitchEnabled()) {
- return kErrorNotSupported;
- }
-
if (index >= display_attributes_.size()) {
DLOGE("Invalid mode index %d mode size %d", index, UINT32(display_attributes_.size()));
return kErrorParameters;
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 46523b9..59cae00 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -878,18 +878,9 @@
HWC2::Error HWCDisplay::GetDisplayAttribute(hwc2_config_t config, HWC2::Attribute attribute,
int32_t *out_value) {
DisplayConfigVariableInfo variable_config;
- // Get display attributes from config index only if resolution switch is supported.
- // Otherwise always send mixer attributes. This is to support destination scaler.
- if (num_configs_ > 1) {
- if (GetDisplayAttributesForConfig(INT(config), &variable_config) != kErrorNone) {
- DLOGE("Get variable config failed");
- return HWC2::Error::BadDisplay;
- }
- } else {
- if (display_intf_->GetFrameBufferConfig(&variable_config) != kErrorNone) {
- DLOGV("Get variable config failed");
- return HWC2::Error::BadDisplay;
- }
+ if (GetDisplayAttributesForConfig(INT(config), &variable_config) != kErrorNone) {
+ DLOGE("Get variable config failed");
+ return HWC2::Error::BadDisplay;
}
switch (attribute) {
@@ -992,13 +983,7 @@
return HWC2::Error::BadDisplay;
}
- uint32_t active_index = 0;
- if (GetActiveDisplayConfig(&active_index) != kErrorNone) {
- return HWC2::Error::BadConfig;
- }
-
- *out_config = active_index;
-
+ GetActiveDisplayConfig(out_config);
return HWC2::Error::None;
}
@@ -1444,7 +1429,6 @@
dump_frame_count_--;
dump_frame_index_++;
}
- config_pending_ = false;
geometry_changes_ = GeometryChanges::kNone;
flush_ = false;
@@ -1953,23 +1937,20 @@
}
int HWCDisplay::SetActiveDisplayConfig(uint32_t config) {
- if (display_config_ == config) {
+ uint32_t current_config = 0;
+ display_intf_->GetActiveConfig(¤t_config);
+ if (config == current_config) {
return 0;
}
- display_config_ = config;
- config_pending_ = true;
- validated_ = false;
+ validated_ = false;
+ display_intf_->SetActiveConfig(config);
callbacks_->Refresh(id_);
return 0;
}
int HWCDisplay::GetActiveDisplayConfig(uint32_t *config) {
- if (config_pending_) {
- *config = display_config_;
- return 0;
- }
return display_intf_->GetActiveConfig(config) == kErrorNone ? 0 : -1;
}
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 72ea0d7..f931987 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -365,8 +365,6 @@
HWCToneMapper *tone_mapper_ = nullptr;
uint32_t num_configs_ = 0;
int disable_hdr_handling_ = 0; // disables HDR handling.
- uint32_t display_config_ = 0;
- bool config_pending_ = false;
bool pending_commit_ = false;
bool is_cmd_mode_ = false;
bool partial_update_enabled_ = false;
diff --git a/sdm/libs/hwc2/hwc_display_builtin.cpp b/sdm/libs/hwc2/hwc_display_builtin.cpp
index 16de8d9..e242128 100644
--- a/sdm/libs/hwc2/hwc_display_builtin.cpp
+++ b/sdm/libs/hwc2/hwc_display_builtin.cpp
@@ -182,13 +182,6 @@
MarkLayersForClientComposition();
}
- if (config_pending_) {
- if (display_intf_->SetActiveConfig(display_config_) != kErrorNone) {
- DLOGW("Invalid display config %d", display_config_);
- // Reset the display config with active config
- display_intf_->GetActiveConfig(&display_config_);
- }
- }
// Fill in the remaining blanks in the layers and add them to the SDM layerstack
BuildLayerStack();
// Checks and replaces layer stack for solid fill
diff --git a/sdm/libs/hwc2/hwc_display_pluggable.cpp b/sdm/libs/hwc2/hwc_display_pluggable.cpp
index 43de395..ab4c1b1 100644
--- a/sdm/libs/hwc2/hwc_display_pluggable.cpp
+++ b/sdm/libs/hwc2/hwc_display_pluggable.cpp
@@ -125,14 +125,6 @@
return status;
}
- if (config_pending_) {
- if (display_intf_->SetActiveConfig(display_config_) != kErrorNone) {
- DLOGW("Invalid display config %d", display_config_);
- // Reset the display config with active config
- display_intf_->GetActiveConfig(&display_config_);
- }
- }
-
BuildLayerStack();
if (layer_set_.empty()) {