diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2018-07-18 07:59:43 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-07-18 07:59:43 -0700 |
commit | 01c40da9686fd4f091edfdc3a8d8e41f5b469d02 (patch) | |
tree | 89d6fd2696bfc3ee2f94a7972e611b0b08dc79df /sdm | |
parent | 664c7657569bde1b6574bb3b466a25113d7699d8 (diff) | |
parent | 9cc0940c83ce1ee479fdec3a5929062eb4889489 (diff) | |
download | android_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.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/display_base.cpp | 1 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display.cpp | 24 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display.h | 4 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.cpp | 32 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.h | 5 |
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 { |