Merge "sdm: Handle disable partial update and display config change"

This commit is contained in:
Linux Build Service Account
2018-03-08 16:02:07 -08:00
committed by Gerrit - the friendly Code Review server
7 changed files with 45 additions and 3 deletions

View File

@@ -488,9 +488,11 @@ DisplayError DisplayBase::SetDisplayState(DisplayState state) {
default:
DLOGE("Spurious state = %d transition requested.", state);
break;
return kErrorParameters;
}
DisablePartialUpdateOneFrame();
if (error == kErrorNone) {
active_ = active;
state_ = state;

View File

@@ -738,6 +738,7 @@ DisplayError HWDeviceDRM::PowerOff() {
return kErrorUndefined;
}
SetFullROI();
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_POWER_MODE, token_.conn_id, DRMPowerMode::OFF);
drm_atomic_intf_->Perform(DRMOps::CRTC_SET_ACTIVE, token_.crtc_id, 0);
int ret = drm_atomic_intf_->Commit(true /* synchronous */, false /* retain_planes */);
@@ -1559,4 +1560,17 @@ void HWDeviceDRM::SetMultiRectMode(const uint32_t flags, DRMMultiRectMode *targe
}
}
void HWDeviceDRM::SetFullROI() {
// Reset the CRTC ROI and connector ROI only for the panel that supports partial update
if (!hw_panel_info_.partial_update) {
return;
}
uint32_t index = current_mode_index_;
DRMRect crtc_rects = {0, 0, mixer_attributes_.width, mixer_attributes_.height};
DRMRect conn_rects = {0, 0, display_attributes_[index].x_pixels,
display_attributes_[index].y_pixels};
drm_atomic_intf_->Perform(DRMOps::CRTC_SET_ROI, token_.crtc_id, 1, &crtc_rects);
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_ROI, token_.conn_id, 1, &conn_rects);
}
} // namespace sdm

View File

@@ -133,6 +133,7 @@ class HWDeviceDRM : public HWInterface {
bool IsResolutionSwitchEnabled() const { return resolution_switch_enabled_; }
void SetTopology(sde_drm::DRMTopology drm_topology, HWTopology *hw_topology);
void SetMultiRectMode(const uint32_t flags, sde_drm::DRMMultiRectMode *target);
void SetFullROI();
class Registry {
public:

View File

@@ -1334,6 +1334,7 @@ HWC2::Error HWCDisplay::PostCommitLayerStack(int32_t *out_retire_fence) {
dump_frame_index_++;
}
}
config_pending_ = false;
geometry_changes_ = GeometryChanges::kNone;
flush_ = false;
@@ -1940,9 +1941,16 @@ void HWCDisplay::SetSecureDisplay(bool secure_display_active) {
}
int HWCDisplay::SetActiveDisplayConfig(uint32_t config) {
int status = (display_intf_->SetActiveConfig(config) == kErrorNone) ? 0 : -1;
if (display_config_ == config) {
return 0;
}
display_config_ = config;
config_pending_ = true;
validated_ = false;
return status;
callbacks_->Refresh(id_);
return 0;
}
int HWCDisplay::GetActiveDisplayConfig(uint32_t *config) {

View File

@@ -304,6 +304,8 @@ class HWCDisplay : public DisplayEventHandler {
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;
private:
void DumpInputBuffers(void);

View File

@@ -115,6 +115,14 @@ HWC2::Error HWCDisplayExternal::Validate(uint32_t *out_num_types, uint32_t *out_
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()) {

View File

@@ -178,6 +178,13 @@ HWC2::Error HWCDisplayPrimary::Validate(uint32_t *out_num_types, uint32_t *out_n
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