summaryrefslogtreecommitdiffstats
path: root/sdm
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-05-08 23:08:57 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2018-05-08 23:08:57 -0700
commit13944ed415a7357ef39c19562936fd0588df161e (patch)
tree026c166b4c9fe5c0451b7463e11da0332d314a69 /sdm
parent1f4f1bdbb98b15af2abc48cbf5764931f0f1e26f (diff)
parent648ef743024c5ed1a5787a7bf9a2ee6cad9e659e (diff)
downloadandroid_hardware_qcom_sdm710_display-13944ed415a7357ef39c19562936fd0588df161e.tar.gz
android_hardware_qcom_sdm710_display-13944ed415a7357ef39c19562936fd0588df161e.tar.bz2
android_hardware_qcom_sdm710_display-13944ed415a7357ef39c19562936fd0588df161e.zip
Merge "hwc2: Avoid overwriting metadata refresh rate."
Diffstat (limited to 'sdm')
-rw-r--r--sdm/libs/core/display_base.cpp10
-rw-r--r--sdm/libs/hwc2/hwc_display.cpp16
-rw-r--r--sdm/libs/hwc2/hwc_display.h1
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp1
-rw-r--r--sdm/libs/hwc2/hwc_layers.h2
5 files changed, 25 insertions, 5 deletions
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 0422b586..656a8743 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -404,8 +404,14 @@ DisplayError DisplayBase::GetConfig(DisplayConfigFixedInfo *fixed_info) {
HWResourceInfo hw_resource_info = HWResourceInfo();
hw_info_intf_->GetHWResourceInfo(&hw_resource_info);
- // hdr can be supported by display when target and panel supports HDR.
- fixed_info->hdr_supported = (hw_resource_info.has_hdr && hw_panel_info_.hdr_enabled);
+ bool hdr_supported = hw_resource_info.has_hdr;
+ HWDisplayInterfaceInfo hw_disp_info = {};
+ hw_info_intf_->GetFirstDisplayInterfaceType(&hw_disp_info);
+ if (hw_disp_info.type == kHDMI) {
+ hdr_supported = (hdr_supported && hw_panel_info_.hdr_enabled);
+ }
+
+ fixed_info->hdr_supported = hdr_supported;
// Populate luminance values only if hdr will be supported on that display
fixed_info->max_luminance = fixed_info->hdr_supported ? hw_panel_info_.peak_luminance: 0;
fixed_info->average_luminance = fixed_info->hdr_supported ? hw_panel_info_.average_luminance : 0;
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 28a2a5ef..8888f114 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -596,11 +596,10 @@ void HWCDisplay::BuildLayerStack() {
layer->src_rect.bottom = layer_buffer->height;
}
- if (layer->frame_rate > metadata_refresh_rate_) {
+ if (hwc_layer->HasMetaDataRefreshRate() && layer->frame_rate > metadata_refresh_rate_) {
metadata_refresh_rate_ = SanitizeRefreshRate(layer->frame_rate);
- } else {
- layer->frame_rate = current_refresh_rate_;
}
+
display_rect_ = Union(display_rect_, layer->dst_rect);
geometry_changes_ |= hwc_layer->GetGeometryChanges();
@@ -1054,6 +1053,7 @@ HWC2::Error HWCDisplay::PrepareLayerStack(uint32_t *out_num_types, uint32_t *out
return HWC2::Error::BadDisplay;
}
+ UpdateRefreshRate();
if (!skip_prepare_) {
DisplayError error = display_intf_->Prepare(&layer_stack_);
if (error != kErrorNone) {
@@ -2145,4 +2145,14 @@ HWC2::Error HWCDisplay::GetValidateDisplayOutput(uint32_t *out_num_types,
return ((*out_num_types > 0) ? HWC2::Error::HasChanges : HWC2::Error::None);
}
+void HWCDisplay::UpdateRefreshRate() {
+ for (auto hwc_layer : layer_set_) {
+ if (hwc_layer->HasMetaDataRefreshRate()) {
+ continue;
+ }
+ auto layer = hwc_layer->GetSDMLayer();
+ layer->frame_rate = current_refresh_rate_;
+ }
+}
+
} // namespace sdm
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index d2620efb..86d9462f 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -328,6 +328,7 @@ class HWCDisplay : public DisplayEventHandler {
private:
void DumpInputBuffers(void);
+ void UpdateRefreshRate();
qService::QService *qservice_ = NULL;
DisplayClass display_class_;
uint32_t geometry_changes_ = GeometryChanges::kNone;
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 6dcfa233..3fb1afab 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -736,6 +736,7 @@ DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *la
uint32_t frame_rate = layer->frame_rate;
if (getMetaData(handle, GET_REFRESH_RATE, &fps) == 0) {
frame_rate = (fps != 0) ? RoundToStandardFPS(fps) : layer->frame_rate;
+ has_metadata_refresh_rate_ = true;
}
int32_t interlaced = 0;
diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h
index 92267445..41ec6ede 100644
--- a/sdm/libs/hwc2/hwc_layers.h
+++ b/sdm/libs/hwc2/hwc_layers.h
@@ -99,6 +99,7 @@ class HWCLayer {
bool IsScalingPresent();
bool IsRotationPresent();
bool IsNonIntegralSourceCrop() { return non_integral_source_crop_; }
+ bool HasMetaDataRefreshRate() { return has_metadata_refresh_rate_; }
private:
Layer *layer_ = nullptr;
@@ -115,6 +116,7 @@ class HWCLayer {
bool single_buffer_ = false;
int buffer_fd_ = -1;
bool non_integral_source_crop_ = false;
+ bool has_metadata_refresh_rate_ = false;
// Composition requested by client(SF)
HWC2::Composition client_requested_ = HWC2::Composition::Device;