summaryrefslogtreecommitdiffstats
path: root/sdm
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-07-18 07:59:43 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2018-07-18 07:59:43 -0700
commit01c40da9686fd4f091edfdc3a8d8e41f5b469d02 (patch)
tree89d6fd2696bfc3ee2f94a7972e611b0b08dc79df /sdm
parent664c7657569bde1b6574bb3b466a25113d7699d8 (diff)
parent9cc0940c83ce1ee479fdec3a5929062eb4889489 (diff)
downloadandroid_hardware_qcom_sdm710_display-01c40da9686fd4f091edfdc3a8d8e41f5b469d02.tar.gz
android_hardware_qcom_sdm710_display-01c40da9686fd4f091edfdc3a8d8e41f5b469d02.tar.bz2
android_hardware_qcom_sdm710_display-01c40da9686fd4f091edfdc3a8d8e41f5b469d02.zip
Merge "sdm: Allow Skip Validate when Partial Update is disabled"
Diffstat (limited to 'sdm')
-rw-r--r--sdm/include/core/display_interface.h1
-rw-r--r--sdm/libs/core/display_base.cpp1
-rw-r--r--sdm/libs/hwc2/hwc_display.cpp24
-rw-r--r--sdm/libs/hwc2/hwc_display.h4
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp32
-rw-r--r--sdm/libs/hwc2/hwc_layers.h5
6 files changed, 46 insertions, 21 deletions
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 8156ca41..70f6e80a 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -158,6 +158,7 @@ struct DisplayConfigFixedInfo {
uint32_t max_luminance = 0; //!< From Panel's peak luminance
uint32_t average_luminance = 0; //!< From Panel's average luminance
uint32_t min_luminance = 0; //!< From Panel's blackness level
+ bool partial_update = false; //!< If display supports Partial Update.
};
/*! @brief This structure defines configuration for variable properties of a display device.
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index f871ccc6..67f7ac83 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -403,6 +403,7 @@ DisplayError DisplayBase::GetConfig(DisplayConfigFixedInfo *fixed_info) {
fixed_info->min_luminance = fixed_info->hdr_supported ? hw_panel_info_.blackness_level: 0;
fixed_info->hdr_eotf = hw_panel_info_.hdr_eotf;
fixed_info->hdr_metadata_type_one = hw_panel_info_.hdr_metadata_type_one;
+ fixed_info->partial_update = hw_panel_info_.partial_update;
return kErrorNone;
}
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 8cc7cb29..ebcf23fe 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -374,6 +374,12 @@ int HWCDisplay::Init() {
current_refresh_rate_ = max_refresh_rate_;
GetUnderScanConfig();
+
+ DisplayConfigFixedInfo fixed_info = {};
+ display_intf_->GetConfig(&fixed_info);
+ partial_update_enabled_ = fixed_info.partial_update;
+ client_target_->SetPartialUpdate(partial_update_enabled_);
+
DLOGI("Display created with id: %d", id_);
return 0;
@@ -407,6 +413,7 @@ HWC2::Error HWCDisplay::CreateLayer(hwc2_layer_t *out_layer_id) {
geometry_changes_ |= GeometryChanges::kAdded;
validated_ = false;
layer_stack_invalid_ = true;
+ layer->SetPartialUpdate(partial_update_enabled_);
return HWC2::Error::None;
}
@@ -577,7 +584,7 @@ void HWCDisplay::BuildLayerStack() {
layer->flags.updating = true;
if (layer_set_.size() <= kMaxLayerCount) {
- layer->flags.updating = IsLayerUpdating(layer);
+ layer->flags.updating = IsLayerUpdating(hwc_layer);
}
layer_stack_.layers.push_back(layer);
@@ -598,7 +605,7 @@ void HWCDisplay::BuildLayerStack() {
layer_stack_.flags.geometry_changed = UINT32(geometry_changes_ > 0);
// Append client target to the layer stack
Layer *sdm_client_target = client_target_->GetSDMLayer();
- sdm_client_target->flags.updating = IsLayerUpdating(sdm_client_target);
+ sdm_client_target->flags.updating = IsLayerUpdating(client_target_);
layer_stack_.layers.push_back(sdm_client_target);
// fall back frame composition to GPU when client target is 10bit
// TODO(user): clarify the behaviour from Client(SF) and SDM Extn -
@@ -2036,24 +2043,17 @@ uint32_t HWCDisplay::GetUpdatingLayersCount(void) {
return updating_count;
}
-bool HWCDisplay::IsLayerUpdating(const Layer *layer) {
+bool HWCDisplay::IsLayerUpdating(HWCLayer *hwc_layer) {
+ auto layer = hwc_layer->GetSDMLayer();
// Layer should be considered updating if
// a) layer is in single buffer mode, or
// b) valid dirty_regions(android specific hint for updating status), or
// c) layer stack geometry has changed (TODO(user): Remove when SDM accepts
// geometry_changed as bit fields).
- return (layer->flags.single_buffer || IsSurfaceUpdated(layer->dirty_regions) ||
+ return (layer->flags.single_buffer || hwc_layer->IsSurfaceUpdated() ||
geometry_changes_);
}
-bool HWCDisplay::IsSurfaceUpdated(const std::vector<LayerRect> &dirty_regions) {
- // based on dirty_regions determine if its updating
- // dirty_rect count = 0 - whole layer - updating.
- // dirty_rect count = 1 or more valid rects - updating.
- // dirty_rect count = 1 with (0,0,0,0) - not updating.
- return (dirty_regions.empty() || IsValid(dirty_regions.at(0)));
-}
-
uint32_t HWCDisplay::SanitizeRefreshRate(uint32_t req_refresh_rate) {
uint32_t refresh_rate = req_refresh_rate;
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 084a2a5c..eedd55dd 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -281,8 +281,7 @@ class HWCDisplay : public DisplayEventHandler {
void MarkLayersForClientComposition(void);
virtual void ApplyScanAdjustment(hwc_rect_t *display_frame);
uint32_t GetUpdatingLayersCount(void);
- bool IsSurfaceUpdated(const std::vector<LayerRect> &dirty_regions);
- bool IsLayerUpdating(const Layer *layer);
+ bool IsLayerUpdating(HWCLayer *layer);
uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate);
virtual void GetUnderScanConfig() { }
@@ -353,6 +352,7 @@ class HWCDisplay : public DisplayEventHandler {
bool animating_ = false;
bool has_client_composition_ = false;
DisplayValidateState validate_state_ = kNormalValidate;
+ bool partial_update_enabled_ = false;
};
inline int HWCDisplay::Perform(uint32_t operation, ...) {
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 53610204..028a3bca 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -270,7 +270,21 @@ HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fen
}
HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
- // Check if there is an update in SurfaceDamage rects
+ surface_updated_ = true;
+ if ((damage.numRects == 1) && (damage.rects[0].bottom == 0) && (damage.rects[0].right == 0)) {
+ surface_updated_ = false;
+ }
+
+ if (!layer_->flags.updating && surface_updated_) {
+ needs_validate_ = true;
+ }
+
+ if (!partial_update_enabled_) {
+ SetDirtyRegions(damage);
+ return HWC2::Error::None;
+ }
+
+ // Check if there is an update in SurfaceDamage rects.
if (layer_->dirty_regions.size() != damage.numRects) {
needs_validate_ = true;
} else {
@@ -284,12 +298,7 @@ HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
}
}
- layer_->dirty_regions.clear();
- for (uint32_t i = 0; i < damage.numRects; i++) {
- LayerRect rect;
- SetRect(damage.rects[i], &rect);
- layer_->dirty_regions.push_back(rect);
- }
+ SetDirtyRegions(damage);
return HWC2::Error::None;
}
@@ -980,4 +989,13 @@ bool HWCLayer::IsScalingPresent() {
return ((src_width != dst_width) || (dst_height != src_height));
}
+void HWCLayer::SetDirtyRegions(hwc_region_t surface_damage) {
+ layer_->dirty_regions.clear();
+ for (uint32_t i = 0; i < surface_damage.numRects; i++) {
+ LayerRect rect;
+ SetRect(surface_damage.rects[i], &rect);
+ layer_->dirty_regions.push_back(rect);
+ }
+}
+
} // namespace sdm
diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h
index 81957cbc..f4850755 100644
--- a/sdm/libs/hwc2/hwc_layers.h
+++ b/sdm/libs/hwc2/hwc_layers.h
@@ -104,8 +104,10 @@ class HWCLayer {
bool IsSingleBuffered() { return single_buffer_; }
bool IsScalingPresent();
bool IsRotationPresent();
+ bool IsSurfaceUpdated() { return surface_updated_; }
bool IsNonIntegralSourceCrop() { return non_integral_source_crop_; }
bool HasMetaDataRefreshRate() { return has_metadata_refresh_rate_; }
+ void SetPartialUpdate(bool enabled) { partial_update_enabled_ = enabled; }
private:
Layer *layer_ = nullptr;
@@ -123,6 +125,8 @@ class HWCLayer {
int buffer_fd_ = -1;
bool non_integral_source_crop_ = false;
bool has_metadata_refresh_rate_ = false;
+ bool partial_update_enabled_ = false;
+ bool surface_updated_ = true;
// Composition requested by client(SF)
HWC2::Composition client_requested_ = HWC2::Composition::Device;
@@ -139,6 +143,7 @@ class HWCLayer {
DisplayError SetMetaData(const private_handle_t *pvt_handle, Layer *layer);
DisplayError SetIGC(IGC_t source, LayerIGC *target);
uint32_t RoundToStandardFPS(float fps);
+ void SetDirtyRegions(hwc_region_t surface_damage);
};
struct SortLayersByZ {