summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sdm/libs/hwc2/Android.mk3
-rw-r--r--sdm/libs/hwc2/hwc_display.cpp6
-rw-r--r--sdm/libs/hwc2/hwc_display.h1
-rw-r--r--sdm/libs/hwc2/hwc_display_primary.cpp27
-rw-r--r--sdm/libs/hwc2/hwc_display_primary.h9
5 files changed, 45 insertions, 1 deletions
diff --git a/sdm/libs/hwc2/Android.mk b/sdm/libs/hwc2/Android.mk
index a671c31b..3aab819d 100644
--- a/sdm/libs/hwc2/Android.mk
+++ b/sdm/libs/hwc2/Android.mk
@@ -24,7 +24,8 @@ LOCAL_SHARED_LIBRARIES := libsdmcore libqservice libbinder libhardware li
android.hardware.graphics.mapper@2.1 \
android.hardware.graphics.composer@2.2 \
android.hardware.graphics.allocator@2.0 \
- libdisplaydebug
+ libdisplaydebug \
+ hardware.google.light@1.0
ifeq ($(display_config_version), DISPLAY_CONFIG_1_1)
LOCAL_SHARED_LIBRARIES += vendor.display.config@1.1
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 15add54d..cef6c350 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -455,6 +455,7 @@ void HWCDisplay::BuildLayerStack() {
uint32_t color_mode_count = 0;
display_intf_->GetColorModeCount(&color_mode_count);
+ hdr_largest_layer_px_ = 0.0f;
// Add one layer for fb target
// TODO(user): Add blit target layers
@@ -537,6 +538,11 @@ void HWCDisplay::BuildLayerStack() {
// In such cases, we should not handle HDR as the HDR mode isn't applied
layer->input_buffer.flags.hdr = true;
layer_stack_.flags.hdr_present = true;
+
+ // HDR area
+ auto hdr_layer_area = (layer->dst_rect.right - layer->dst_rect.left) *
+ (layer->dst_rect.bottom - layer->dst_rect.top);
+ hdr_largest_layer_px_ = std::max(hdr_largest_layer_px_, hdr_layer_area);
}
if (hwc_layer->IsNonIntegralSourceCrop() && !is_secure && !layer->flags.solid_fill) {
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 084a2a5c..61b11aaf 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -341,6 +341,7 @@ class HWCDisplay : public DisplayEventHandler {
ColorMode current_color_mode_ = ColorMode::NATIVE;
ColorPrimaries working_primaries_ = ColorPrimaries_BT709_5;
GammaTransfer working_transfer_ = Transfer_sRGB;
+ float hdr_largest_layer_px_ = 0.0f;
private:
void DumpInputBuffers(void);
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index f86fbe1d..31258ecf 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -251,6 +251,33 @@ HWC2::Error HWCDisplayPrimary::Present(int32_t *out_retire_fence) {
}
}
+ if (CC_UNLIKELY(!has_init_light_server_)) {
+ using ILight = ::hardware::google::light::V1_0::ILight;
+ vendor_ILight_ = ILight::getService();
+ if (vendor_ILight_ != nullptr) {
+ vendor_ILight_->setHbm(false);
+ } else {
+ DLOGE("failed to get vendor light service");
+ }
+
+ uint32_t panel_x, panel_y;
+ GetPanelResolution(&panel_x, &panel_y);
+ hbm_threshold_px_ = float(panel_x * panel_y) * hbm_threshold_pct_;
+ DLOGI("Configure hbm_threshold_px_ to %f", hbm_threshold_px_);
+
+ has_init_light_server_ = true;
+ }
+
+ const bool enable_hbm(hdr_largest_layer_px_ > hbm_threshold_px_);
+ if (high_brightness_mode_ != enable_hbm && vendor_ILight_ != nullptr) {
+ using ::android::hardware::light::V2_0::Status;
+ if (Status::SUCCESS == vendor_ILight_->setHbm(enable_hbm)) {
+ high_brightness_mode_ = enable_hbm;
+ } else {
+ DLOGE("failed to setHbm to %d", enable_hbm);
+ }
+ }
+
CloseFd(&output_buffer_.acquire_fence_fd);
pending_commit_ = false;
return status;
diff --git a/sdm/libs/hwc2/hwc_display_primary.h b/sdm/libs/hwc2/hwc_display_primary.h
index 7f5e50c9..6737e4db 100644
--- a/sdm/libs/hwc2/hwc_display_primary.h
+++ b/sdm/libs/hwc2/hwc_display_primary.h
@@ -30,6 +30,8 @@
#ifndef __HWC_DISPLAY_PRIMARY_H__
#define __HWC_DISPLAY_PRIMARY_H__
+#include <hardware/google/light/1.0/ILight.h>
+#include <limits>
#include <string>
#include "cpuhint.h"
@@ -107,6 +109,13 @@ class HWCDisplayPrimary : public HWCDisplay {
BufferInfo output_buffer_info_ = {};
void *output_buffer_base_ = nullptr;
int default_mode_status_ = 0;
+
+ // Members for HBM feature
+ static constexpr float hbm_threshold_pct_ = 0.5f;
+ float hbm_threshold_px_ = std::numeric_limits<float>::max();
+ android::sp<hardware::google::light::V1_0::ILight> vendor_ILight_ = nullptr;
+ bool has_init_light_server_ = false;
+ bool high_brightness_mode_ = false;
};
} // namespace sdm