Merge "sdm: Handle disable partial update and display config change"
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
commit
af258e6e07
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user