Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions backend/Backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ std::tuple<int, size_t> Backend::GetClientLayers(
status = false;
}
if (!status) {
ALOGE("status is abnormal");
return GetExtraClientRange(display, layers, client_start, client_size);
}
return GetExtraClientRange2(display, layers, client_start, client_size, device_start, device_size);
Expand Down Expand Up @@ -234,7 +233,6 @@ std::tuple<int, int> Backend::GetExtraClientRange2(
return GetExtraClientRange(display, layers, client_start, client_size);
} else if (avail_planes == device_size) {
if (device_start != 0 && (device_start + device_size) != layers.size()) {
ALOGE("status is abnormal");
return GetExtraClientRange(display, layers, client_start, client_size);
}

Expand All @@ -248,7 +246,6 @@ std::tuple<int, int> Backend::GetExtraClientRange2(
int prepend = device_start;
int append = layers.size() - (device_start + device_size);
if (std::min(prepend, append) > extra_device) {
ALOGE("status is abnormal");
return GetExtraClientRange(display, layers, client_start, client_size);
}

Expand All @@ -266,7 +263,6 @@ std::tuple<int, int> Backend::GetExtraClientRange2(
int midpend = client_start - (device_start + device_size);
int append = layers.size() - (client_start + client_size);
if (prepend > extra_device) {
ALOGE("status is abnormal");
return GetExtraClientRange(display, layers, client_start, client_size);
}
int remain = extra_device - prepend;
Expand All @@ -287,7 +283,6 @@ std::tuple<int, int> Backend::GetExtraClientRange2(
int midpend = device_start - (client_start + client_size);
int append = layers.size() - (device_start + device_size);
if (append > extra_device) {
ALOGE("status is abnormal");
return GetExtraClientRange(display, layers, client_start, client_size);
}
int remain = extra_device - append;
Expand Down
114 changes: 108 additions & 6 deletions drm/DrmConnector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,11 @@
#include <sstream>
#include <math.h>

//#define ATRACE_TAG ATRACE_TAG_ALWAYS
#include "DrmDevice.h"
#include "utils/log.h"
#include "utils/Trace.h"


#ifndef DRM_MODE_CONNECTOR_SPI
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
Expand Down Expand Up @@ -333,6 +336,15 @@ void DrmConnector::SetActiveMode(DrmMode &mode) {
active_mode_ = mode;
}

static uint16_t flout2Primary(double f)
{
uint16_t output = f * 50000;
if (output > 50000)
output = 50000;

return output;
}

uint16_t DrmConnector::ColorPrimary(short val) {
short temp = val & 0x3FF;
short count = 1;
Expand Down Expand Up @@ -432,6 +444,42 @@ void DrmConnector::GetColorPrimaries( uint8_t *b, struct cta_display_color_prima
p->white_point_y = ColorPrimary(val);
}

void DrmConnector::ParseColorPrimariesForDisplayID20(
uint8_t *b, struct cta_display_color_primaries *p) {
double colorM[4][2];
if (!b || !p)
return;
uint8_t *x = b;
colorM[0][0] = 0.683838;
colorM[0][1] = 0.315918;
colorM[1][0] = 0.244873;
colorM[1][1] = 0.729980;
colorM[2][0] = 0.138916;
colorM[2][1] = 0.041992;
colorM[3][0] = 0.312988;
colorM[3][1] = 0.328857;

p->display_primary_r_x = flout2Primary(colorM[0][0]);
p->display_primary_r_y = flout2Primary(colorM[0][1]);
p->display_primary_g_x = flout2Primary(colorM[1][0]);
p->display_primary_g_y = flout2Primary(colorM[1][1]);
p->display_primary_b_x = flout2Primary(colorM[2][0]);
p->display_primary_b_y = flout2Primary(colorM[2][1]);
p->white_point_x = flout2Primary(colorM[3][0]);
p->white_point_y = flout2Primary(colorM[3][1]);
}

void DrmConnector::ParseHDRStaticMetadataForDisplayID20(
uint8_t *b, size_t size
) {
double outmaxluminance, outmaxaverageluminance, outminluminance;
ALOGD("Found HDR Static Metadata in EDID extension block.");
edid_contains_hdr_tag_ = true;
outmaxluminance = 507.500;
outmaxaverageluminance = 507.500;
outminluminance = 10.0000;
}

void DrmConnector::ParseCTAFromExtensionBlock(uint8_t *edid) {
int current_block;
uint8_t *cta_ext_blk;
Expand All @@ -449,8 +497,7 @@ void DrmConnector::ParseCTAFromExtensionBlock(uint8_t *edid) {

for (current_block = 1; current_block <= num_blocks; current_block++) {
cta_ext_blk = edid + 128 * current_block;
if (cta_ext_blk[0] != CTA_EXTENSION_TAG)
continue;
if (cta_ext_blk[0] == CTA_EXTENSION_TAG) {
d = cta_ext_blk[2];
cta_db_start = cta_ext_blk + 4;
cta_db_end = cta_ext_blk + d - 1;
Expand All @@ -474,7 +521,44 @@ void DrmConnector::ParseCTAFromExtensionBlock(uint8_t *edid) {
DrmConnector::GetColorPrimaries(dbptr + 2, &primaries_);
}
}
}
//for H3C case
if (cta_ext_blk[0] == 0x70
&& cta_ext_blk[1] == 0x20
&& cta_ext_blk[8] == 0x94
&& cta_ext_blk[9] == 0x0b
&& cta_ext_blk[10] == 0xd5) {
isDisplayID20HDR_ = true;
DrmConnector::ParseHDRStaticMetadataForDisplayID20(cta_ext_blk, 0);
DrmConnector::ParseColorPrimariesForDisplayID20(cta_ext_blk, &primaries_);
}
}
}

bool DrmConnector::GetHdrCapabilitiesFromDisplayID20(
uint32_t *outNumTypes, int32_t *outTypes,
float *outMaxLuminance,
float *outMaxAverageLuminance,
float *outMinLuminance
) {

if(outTypes) {
*(outTypes + *outNumTypes) = (uint32_t)EOTF_ST2084;
(*outNumTypes)+=1;
}
double outmaxluminance, outmaxaverageluminance, outminluminance;
outmaxluminance = 507.500;
outmaxaverageluminance = 507.500;
outminluminance = 10.0;

if (outMaxLuminance)
*outMaxLuminance = float(outmaxluminance);
if (outMaxLuminance)
*outMaxAverageLuminance = float(outmaxaverageluminance);
if (outMinLuminance)
*outMinLuminance = float(outminluminance);

return true;
}

bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes,
Expand All @@ -485,14 +569,14 @@ bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes,
ALOGE("outNumTypes couldn't be NULL!");
return false;
}

#if 0
if (NULL == outTypes) {
ALOGE("outTypes couldn't be NULL!");
//TODO: clarify SF's logic here
//kindly skip this check now and return nothing if it's NULL
return false;
}

#endif
if (NULL == outMaxLuminance) {
ALOGE("outMaxLuminance couldn't be NULL!");
return false;
Expand All @@ -508,6 +592,16 @@ bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes,
return false;
}

if (isDisplayID20HDR_) {
int ret = GetConnectorProperty(*drm_, *this, "HDR_OUTPUT_METADATA", &hdr_op_metadata_prop_);
if (!ret) {
ALOGE("%s Could not get HDR_OUTPUT_METADATA property\n", __FUNCTION__);
}
return GetHdrCapabilitiesFromDisplayID20(
outNumTypes, outTypes,
outMaxLuminance, outMaxAverageLuminance, outMinLuminance);
}

if (display_hdrMd_) {
// HDR meta block bit 3 of byte 3: STPTE ST 2084
if (display_hdrMd_->eotf & 0x04) {
Expand Down Expand Up @@ -537,7 +631,7 @@ bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes,
*outMinLuminance = float(outminluminance);

int ret = GetConnectorProperty(*drm_, *this, "HDR_OUTPUT_METADATA", &hdr_op_metadata_prop_);
if (ret) {
if (!ret) {
ALOGE("%s Could not get HDR_OUTPUT_METADATA property\n", __FUNCTION__);
}
return true;
Expand All @@ -553,8 +647,16 @@ bool DrmConnector::GetRenderIntents(uint32_t *outNumIntents, int32_t *outIntents
*(outNumIntents)+=1;
*(outIntents + *outNumIntents) = HAL_RENDER_INTENT_TONE_MAP_ENHANCE;
*(outNumIntents)+=1;
return true;
}
return true;
if (isDisplayID20HDR_) {
*(outIntents + *outNumIntents) = HAL_RENDER_INTENT_TONE_MAP_COLORIMETRIC;
*(outNumIntents)+=1;
*(outIntents + *outNumIntents) = HAL_RENDER_INTENT_TONE_MAP_ENHANCE;
*(outNumIntents)+=1;
return true;
}
return true;
}

#define MIN(x, y) (((x) < (y)) ? (x) : (y))
Expand Down
15 changes: 15 additions & 0 deletions drm/DrmConnector.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,19 @@ class DrmConnector : public PipelineBindable<DrmConnector> {
float *outMaxLuminance,
float *outMaxAverageLuminance,
float *outMinLuminance);
bool GetHdrCapabilitiesFromDisplayID20(
uint32_t *outNumTypes, int32_t *outTypes,
float *outMaxLuminance,
float *outMaxAverageLuminance,
float *outMinLuminance
);
void ParseHDRStaticMetadataForDisplayID20(
uint8_t *b, size_t size
);
void ParseColorPrimariesForDisplayID20(
uint8_t *b, struct cta_display_color_primaries *p
);

bool GetRenderIntents( uint32_t *outNumIntents, int32_t *outIntents);

void PrepareHdrMetadata(hdr_md *layer_hdr_metadata,
Expand Down Expand Up @@ -181,6 +194,8 @@ class DrmConnector : public PipelineBindable<DrmConnector> {
struct cta_edid_hdr_metadata_static *display_hdrMd_ = nullptr;

hdr_md hdr_metadata_;

bool isDisplayID20HDR_ = false;
};
} // namespace android

Expand Down
2 changes: 1 addition & 1 deletion drm/DrmDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ bool DrmDevice::IsHdrSupportedDevice() {
} else {
std::string name(ver->name);
ALOGD("drm device name is : %s\n", name.c_str());
if (name == "i915") {
if (name == "i915" || name == "xe") {
is_hdr_supported_ = true;
} else {
is_hdr_supported_ = false;
Expand Down
2 changes: 1 addition & 1 deletion hwc2_device/HwcDisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -984,7 +984,7 @@ HWC2::Error HwcDisplay::GetRenderIntents(
int32_t mode, uint32_t *outNumIntents,
int32_t * /*android_render_intent_v1_1_t*/ outIntents) {

if (NULL == outNumIntents || mode < HAL_COLOR_MODE_NATIVE || mode > HAL_COLOR_MODE_DISPLAY_P3) {
if (NULL == outNumIntents || mode < HAL_COLOR_MODE_NATIVE || mode > HAL_COLOR_MODE_BT2100_HLG) {
return HWC2::Error::BadParameter;
}

Expand Down