Skip to content

Commit 6c7eeab

Browse files
committed
enable hdr
/vendor/build.prop ro.surface_flinger.has_wide_color_display=true ro.surface_flinger.has_HDR_display=true vendor.hwc.drm.enable_hdr_display=true Tracked-On: OAM-134123 Signed-off-by: Kanli Hu <kanli.hu@intel.com>
1 parent d6a7681 commit 6c7eeab

File tree

8 files changed

+296
-23
lines changed

8 files changed

+296
-23
lines changed

Android.bp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ cc_defaults {
3737

3838
static_libs: [
3939
"libaidlcommonsupport",
40+
"libdisplay_info",
4041
],
4142

4243
header_libs: [
@@ -49,6 +50,7 @@ cc_defaults {
4950
],
5051

5152
cppflags: [
53+
"-DHAS_LIBDISPLAY_INFO",
5254
"-DHWC2_INCLUDE_STRINGIFICATION",
5355
"-DHWC2_USE_CPP11",
5456
],
@@ -99,6 +101,7 @@ filegroup {
99101
"hwc2_device/hwc2_device.cpp",
100102

101103
"utils/LibdisplayEdidWrapper.cpp",
104+
"utils/H3CdisplayEdidWrapper.cpp",
102105
"utils/fd.cpp",
103106
"utils/properties.cpp",
104107
"utils/intel_blit.cpp",
@@ -296,4 +299,4 @@ cc_library_shared {
296299
proprietary: true,
297300
header_libs: ["libcutils_headers"],
298301
relative_install_path: "hw",
299-
}
302+
}

drm/DrmConnector.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,16 @@ auto DrmConnector::Init()-> bool {
9797

9898
UpdateEdidProperty();
9999
#if HAS_LIBDISPLAY_INFO
100-
auto edid = LibdisplayEdidWrapper::Create(GetEdidBlob());
101-
edid_wrapper_ = edid ? std::move(edid) : std::make_unique<EdidWrapper>();
100+
auto edid = H3CdisplayEdidWrapper::Create(GetEdidBlob());
101+
if (edid) {
102+
edid_wrapper_ = edid ? std::move(edid) : std::make_unique<EdidWrapper>();
103+
} else {
104+
auto edid_new = LibdisplayEdidWrapper::Create(GetEdidBlob());
105+
edid_wrapper_ = edid_new ? std::move(edid_new) : std::make_unique<EdidWrapper>();
106+
}
102107
#else
103-
edid_wrapper_ = std::make_unique<EdidWrapper>();
108+
auto edid = H3CdisplayEdidWrapper::Create(GetEdidBlob());
109+
edid_wrapper_ = edid ? std::move(edid) : std::make_unique<EdidWrapper>();
104110
#endif
105111

106112
if (IsWriteback() &&

hwc2_device/HwcDisplay.cpp

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ std::string HwcDisplay::Dump() {
131131
HwcDisplay::HwcDisplay(hwc2_display_t handle, HWC2::DisplayType type,
132132
DrmHwc *hwc)
133133
: hwc_(hwc), handle_(handle), type_(type), client_layer_(this, false) {
134+
hdr_metadata_ = std::make_shared<hdr_output_metadata>();
134135
if (type_ == HWC2::DisplayType::Virtual) {
135136
writeback_layer_ = std::make_unique<HwcLayer>(this, false);
136137
}
@@ -552,6 +553,12 @@ HWC2::Error HwcDisplay::GetColorModes(uint32_t *num_modes, int32_t *modes) {
552553
modes[0] = HAL_COLOR_MODE_NATIVE;
553554
return HWC2::Error::None;
554555
}
556+
if (!Properties::EnableHdrDisplay()) {
557+
*num_modes = 1;
558+
if (modes)
559+
modes[0] = HAL_COLOR_MODE_NATIVE;
560+
return HWC2::Error::None;
561+
}
555562

556563
if (!modes) {
557564
std::vector<Colormode> temp_modes;
@@ -561,16 +568,19 @@ HWC2::Error HwcDisplay::GetColorModes(uint32_t *num_modes, int32_t *modes) {
561568
}
562569

563570
std::vector<Colormode> temp_modes;
564-
std::vector<int32_t> out_modes(modes, modes + *num_modes);
571+
std::vector<int32_t> out_modes;
565572
GetEdid()->GetColorModes(temp_modes);
566573
if (temp_modes.empty()) {
567-
out_modes.emplace_back(HAL_COLOR_MODE_NATIVE);
568-
return HWC2::Error::None;
574+
out_modes.emplace_back(HAL_COLOR_MODE_NATIVE);
575+
} else {
576+
for (auto &c : temp_modes) {
577+
out_modes.emplace_back(static_cast<int32_t>(c));
578+
}
569579
}
570580

571-
for (auto &c : temp_modes)
572-
out_modes.emplace_back(static_cast<int32_t>(c));
573-
581+
for (size_t i = 0; i < out_modes.size(); ++i) {
582+
modes[i] = out_modes[i];
583+
}
574584
return HWC2::Error::None;
575585
}
576586

@@ -703,22 +713,34 @@ HWC2::Error HwcDisplay::GetHdrCapabilities(uint32_t *num_types, int32_t *types,
703713
}
704714

705715
std::vector<ui::Hdr> temp_types;
706-
std::vector<int32_t> out_types(types, types + *num_types);
716+
std::vector<int32_t> out_types;
707717
GetEdid()->GetHdrCapabilities(temp_types, max_luminance,
708718
max_average_luminance, min_luminance);
719+
709720
for (auto &t : temp_types) {
710721
switch (t) {
722+
case ui::Hdr::DOLBY_VISION:
723+
out_types.emplace_back(HAL_HDR_DOLBY_VISION);
724+
break;
711725
case ui::Hdr::HDR10:
712726
out_types.emplace_back(HAL_HDR_HDR10);
713727
break;
714728
case ui::Hdr::HLG:
715729
out_types.emplace_back(HAL_HDR_HLG);
716730
break;
731+
case ui::Hdr::HDR10_PLUS:
732+
out_types.emplace_back(HAL_HDR_HDR10_PLUS);
733+
break;
717734
default:
718735
// Ignore any other HDR types
719736
break;
720737
}
721738
}
739+
740+
for (size_t i = 0; i < out_types.size(); ++i) {
741+
types[i] = out_types[i];
742+
}
743+
722744
return HWC2::Error::None;
723745
}
724746

@@ -912,7 +934,7 @@ HWC2::Error HwcDisplay::SetColorMode(int32_t mode) {
912934
*/
913935
if (mode < HAL_COLOR_MODE_NATIVE || mode > HAL_COLOR_MODE_DISPLAY_BT2020)
914936
return HWC2::Error::BadParameter;
915-
937+
ALOGI("hwc SetColorMode %d", mode);
916938
switch (mode) {
917939
case HAL_COLOR_MODE_NATIVE:
918940
hdr_metadata_.reset();
@@ -1145,6 +1167,7 @@ HWC2::Error HwcDisplay::SetHdrOutputMetadata(ui::Hdr type) {
11451167
m->min_display_mastering_luminance = static_cast<uint64_t>(hdr_luminance[2] *
11461168
10000.F);
11471169

1170+
#if 0
11481171
auto gamut = ColorGamut::BT2020();
11491172
auto primaries = gamut.getPrimaries();
11501173
m->display_primaries[0].x = ToU16ColorValue(primaries[0].x);
@@ -1157,6 +1180,24 @@ HWC2::Error HwcDisplay::SetHdrOutputMetadata(ui::Hdr type) {
11571180
auto whitePoint = gamut.getWhitePoint();
11581181
m->white_point.x = ToU16ColorValue(whitePoint.x);
11591182
m->white_point.y = ToU16ColorValue(whitePoint.y);
1183+
#else
1184+
auto gamut = ColorGamut::BT2020();
1185+
auto primaries = gamut.getPrimaries();
1186+
auto whitePoint = gamut.getWhitePoint();
1187+
1188+
GetEdid()->GetColorGamut(primaries, whitePoint);
1189+
1190+
m->display_primaries[0].x = ToU16ColorValue(primaries[0].x);
1191+
m->display_primaries[0].y = ToU16ColorValue(primaries[0].y);
1192+
m->display_primaries[1].x = ToU16ColorValue(primaries[1].x);
1193+
m->display_primaries[1].y = ToU16ColorValue(primaries[1].y);
1194+
m->display_primaries[2].x = ToU16ColorValue(primaries[2].x);
1195+
m->display_primaries[2].y = ToU16ColorValue(primaries[2].y);
1196+
1197+
m->white_point.x = ToU16ColorValue(whitePoint.x);
1198+
m->white_point.y = ToU16ColorValue(whitePoint.y);
1199+
1200+
#endif
11601201

11611202
return HWC2::Error::None;
11621203
}

utils/EdidWrapper.h

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ extern "C" {
2424
#endif
2525

2626
#include <ui/GraphicTypes.h>
27+
#include <ui/ColorSpace.h>
2728

2829
#include "compositor/DisplayInfo.h"
2930
#include "drm/DrmUnique.h"
@@ -41,9 +42,9 @@ class EdidWrapper {
4142
types.clear();
4243
};
4344
virtual void GetHdrCapabilities(std::vector<ui::Hdr> &types,
44-
const float * /*max_luminance*/,
45-
const float * /*max_average_luminance*/,
46-
const float * /*min_luminance*/) {
45+
float * /*max_luminance*/,
46+
float * /*max_average_luminance*/,
47+
float * /*min_luminance*/) {
4748
GetSupportedHdrTypes(types);
4849
};
4950
virtual void GetColorModes(std::vector<Colormode> &color_modes) {
@@ -59,6 +60,10 @@ class EdidWrapper {
5960
virtual auto GetBoundsMm() -> std::pair<int32_t, int32_t> {
6061
return {-1, -1};
6162
}
63+
64+
virtual void GetColorGamut(
65+
std::array<float2, 3> &primaries, float2 &whitepoint) {
66+
}
6267
};
6368

6469
#if HAS_LIBDISPLAY_INFO
@@ -75,9 +80,9 @@ class LibdisplayEdidWrapper final : public EdidWrapper {
7580
void GetSupportedHdrTypes(std::vector<ui::Hdr> &types) override;
7681

7782
void GetHdrCapabilities(std::vector<ui::Hdr> &types,
78-
const float *max_luminance,
79-
const float *max_average_luminance,
80-
const float *min_luminance) override;
83+
float *max_luminance,
84+
float *max_average_luminance,
85+
float *min_luminance) override;
8186

8287
void GetColorModes(std::vector<Colormode> &color_modes) override;
8388

@@ -86,6 +91,9 @@ class LibdisplayEdidWrapper final : public EdidWrapper {
8691

8792
auto GetBoundsMm() -> std::pair<int32_t, int32_t> override;
8893

94+
void GetColorGamut(
95+
std::array<float2, 3> &primaries, float2 &whitepoint) override;
96+
8997
private:
9098
LibdisplayEdidWrapper(di_info *info) : info_(std::move(info)) {
9199
}
@@ -96,4 +104,44 @@ class LibdisplayEdidWrapper final : public EdidWrapper {
96104
};
97105
#endif
98106

107+
// Wrapper class for that uses hack H3Cdisplay-info to parse edids
108+
class H3CdisplayEdidWrapper final : public EdidWrapper {
109+
public:
110+
H3CdisplayEdidWrapper() = delete;
111+
~H3CdisplayEdidWrapper() override {
112+
}
113+
static auto Create(DrmModePropertyBlobUnique blob)
114+
-> std::unique_ptr<H3CdisplayEdidWrapper>;
115+
116+
void GetSupportedHdrTypes(std::vector<ui::Hdr> &types) override;
117+
118+
void GetHdrCapabilities(std::vector<ui::Hdr> &types,
119+
float *max_luminance,
120+
float *max_average_luminance,
121+
float *min_luminance) override;
122+
123+
void GetColorModes(std::vector<Colormode> &color_modes) override;
124+
125+
auto GetDpiX() -> int override;
126+
auto GetDpiY() -> int override;
127+
128+
auto GetBoundsMm() -> std::pair<int32_t, int32_t> override;
129+
130+
void GetColorGamut(
131+
std::array<float2, 3> &primaries, float2 &whitepoint) override;
132+
133+
private:
134+
H3CdisplayEdidWrapper(void *date, size_t length);
135+
136+
std::pair<int32_t, int32_t> GetDpi();
137+
138+
static constexpr int32_t kWidthPixels = 2880;
139+
static constexpr int32_t kHeightPixels = 1800;
140+
static constexpr int32_t kWidthMm = 301;
141+
static constexpr int32_t kHeightMm = 189;
142+
static constexpr float kMaxLuminance = 507.5f;
143+
static constexpr float kMaxAvgLuminance = 507.5f;
144+
static constexpr float kMinLuminance = 0.004f;
145+
};
146+
99147
} // namespace android

0 commit comments

Comments
 (0)