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:
|
default:
|
||||||
DLOGE("Spurious state = %d transition requested.", state);
|
DLOGE("Spurious state = %d transition requested.", state);
|
||||||
break;
|
return kErrorParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisablePartialUpdateOneFrame();
|
||||||
|
|
||||||
if (error == kErrorNone) {
|
if (error == kErrorNone) {
|
||||||
active_ = active;
|
active_ = active;
|
||||||
state_ = state;
|
state_ = state;
|
||||||
|
|||||||
@@ -738,6 +738,7 @@ DisplayError HWDeviceDRM::PowerOff() {
|
|||||||
return kErrorUndefined;
|
return kErrorUndefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetFullROI();
|
||||||
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_POWER_MODE, token_.conn_id, DRMPowerMode::OFF);
|
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);
|
drm_atomic_intf_->Perform(DRMOps::CRTC_SET_ACTIVE, token_.crtc_id, 0);
|
||||||
int ret = drm_atomic_intf_->Commit(true /* synchronous */, false /* retain_planes */);
|
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
|
} // namespace sdm
|
||||||
|
|||||||
@@ -133,6 +133,7 @@ class HWDeviceDRM : public HWInterface {
|
|||||||
bool IsResolutionSwitchEnabled() const { return resolution_switch_enabled_; }
|
bool IsResolutionSwitchEnabled() const { return resolution_switch_enabled_; }
|
||||||
void SetTopology(sde_drm::DRMTopology drm_topology, HWTopology *hw_topology);
|
void SetTopology(sde_drm::DRMTopology drm_topology, HWTopology *hw_topology);
|
||||||
void SetMultiRectMode(const uint32_t flags, sde_drm::DRMMultiRectMode *target);
|
void SetMultiRectMode(const uint32_t flags, sde_drm::DRMMultiRectMode *target);
|
||||||
|
void SetFullROI();
|
||||||
|
|
||||||
class Registry {
|
class Registry {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -1334,6 +1334,7 @@ HWC2::Error HWCDisplay::PostCommitLayerStack(int32_t *out_retire_fence) {
|
|||||||
dump_frame_index_++;
|
dump_frame_index_++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
config_pending_ = false;
|
||||||
|
|
||||||
geometry_changes_ = GeometryChanges::kNone;
|
geometry_changes_ = GeometryChanges::kNone;
|
||||||
flush_ = false;
|
flush_ = false;
|
||||||
@@ -1940,9 +1941,16 @@ void HWCDisplay::SetSecureDisplay(bool secure_display_active) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int HWCDisplay::SetActiveDisplayConfig(uint32_t config) {
|
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;
|
validated_ = false;
|
||||||
return status;
|
|
||||||
|
callbacks_->Refresh(id_);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HWCDisplay::GetActiveDisplayConfig(uint32_t *config) {
|
int HWCDisplay::GetActiveDisplayConfig(uint32_t *config) {
|
||||||
|
|||||||
@@ -304,6 +304,8 @@ class HWCDisplay : public DisplayEventHandler {
|
|||||||
HWCToneMapper *tone_mapper_ = nullptr;
|
HWCToneMapper *tone_mapper_ = nullptr;
|
||||||
uint32_t num_configs_ = 0;
|
uint32_t num_configs_ = 0;
|
||||||
int disable_hdr_handling_ = 0; // disables HDR handling.
|
int disable_hdr_handling_ = 0; // disables HDR handling.
|
||||||
|
uint32_t display_config_ = 0;
|
||||||
|
bool config_pending_ = false;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DumpInputBuffers(void);
|
void DumpInputBuffers(void);
|
||||||
|
|||||||
@@ -115,6 +115,14 @@ HWC2::Error HWCDisplayExternal::Validate(uint32_t *out_num_types, uint32_t *out_
|
|||||||
return status;
|
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();
|
BuildLayerStack();
|
||||||
|
|
||||||
if (layer_set_.empty()) {
|
if (layer_set_.empty()) {
|
||||||
|
|||||||
@@ -178,6 +178,13 @@ HWC2::Error HWCDisplayPrimary::Validate(uint32_t *out_num_types, uint32_t *out_n
|
|||||||
MarkLayersForClientComposition();
|
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
|
// Fill in the remaining blanks in the layers and add them to the SDM layerstack
|
||||||
BuildLayerStack();
|
BuildLayerStack();
|
||||||
// Checks and replaces layer stack for solid fill
|
// Checks and replaces layer stack for solid fill
|
||||||
|
|||||||
Reference in New Issue
Block a user