summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface
diff options
context:
space:
mode:
authorLong Ling <longling@google.com>2020-08-05 11:06:58 -0700
committerLong Ling <longling@google.com>2020-10-14 21:13:48 -0700
commit2084d4512ba6e1046e562b6e8904c21ed3c7b61b (patch)
treec2f8e6f6af7fc7bdfa483f3139c130e9a09168e2 /libhwc2.1/libdisplayinterface
parent5c086444e5d2868163f48c60d2783f32107bb753 (diff)
downloadgs101-2084d4512ba6e1046e562b6e8904c21ed3c7b61b.tar.gz
hwc/gs101: Update for new displaycolor interface
New displaycolor interface separate config data from stage data. Change-Id: I21313ca28776850c35a3a3223634e172aa49e6ba
Diffstat (limited to 'libhwc2.1/libdisplayinterface')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp144
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h6
2 files changed, 100 insertions, 50 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
index 7c6c2ef..c4ee8d7 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
@@ -19,10 +19,8 @@
#include <drm/samsung_drm.h>
template <typename T, typename M>
-int32_t convertDqeMatrixDataToMatrix(
- const IDisplayColorGS101::MatrixData<T> &colorMatrix,
- M &mat, uint32_t dimension)
-{
+int32_t convertDqeMatrixDataToMatrix(T &colorMatrix, M &mat,
+ uint32_t dimension) {
if (colorMatrix.coeffs.size() != (dimension * dimension)) {
HWC_LOGE(nullptr, "Invalid coeff size(%zu)",
colorMatrix.coeffs.size());
@@ -82,19 +80,26 @@ int32_t ExynosDisplayDrmInterfaceModule::createCgcBlobFromIDqe(
{
struct cgc_lut cgc;
const IDisplayColorGS101::IDqe::CgcData &cgcData = dqe.Cgc();
- if ((cgcData.r_values.size() != DRM_SAMSUNG_CGC_LUT_REG_CNT) ||
- (cgcData.g_values.size() != DRM_SAMSUNG_CGC_LUT_REG_CNT) ||
- (cgcData.b_values.size() != DRM_SAMSUNG_CGC_LUT_REG_CNT)) {
+
+ if (cgcData.config == nullptr) {
+ ALOGE("no CGC config");
+ return -EINVAL;
+ }
+
+ if ((cgcData.config->r_values.size() != DRM_SAMSUNG_CGC_LUT_REG_CNT) ||
+ (cgcData.config->g_values.size() != DRM_SAMSUNG_CGC_LUT_REG_CNT) ||
+ (cgcData.config->b_values.size() != DRM_SAMSUNG_CGC_LUT_REG_CNT)) {
ALOGE("CGC data size is not same (r: %zu, g: %zu: b: %zu)",
- cgcData.r_values.size(), cgcData.g_values.size(),
- cgcData.b_values.size());
+ cgcData.config->r_values.size(),
+ cgcData.config->g_values.size(),
+ cgcData.config->b_values.size());
return -EINVAL;
}
for (uint32_t i = 0; i < DRM_SAMSUNG_CGC_LUT_REG_CNT; i++) {
- cgc.r_values[i] = cgcData.r_values[i];
- cgc.g_values[i] = cgcData.g_values[i];
- cgc.b_values[i] = cgcData.b_values[i];
+ cgc.r_values[i] = cgcData.config->r_values[i];
+ cgc.g_values[i] = cgcData.config->g_values[i];
+ cgc.b_values[i] = cgcData.config->b_values[i];
}
int ret = mDrmDevice->CreatePropertyBlob(&cgc, sizeof(cgc_lut), &blobId);
if (ret) {
@@ -109,21 +114,27 @@ int32_t ExynosDisplayDrmInterfaceModule::createDegammaLutBlobFromIDqe(
{
int ret = 0;
uint64_t lut_size = 0;
+
+ if (dqe.DegammaLut().config == nullptr) {
+ ALOGE("no degamma config");
+ return -EINVAL;
+ }
+
std::tie(ret, lut_size) = mDrmCrtc->degamma_lut_size_property().value();
if (ret < 0) {
HWC_LOGE(mExynosDisplay, "%s: there is no degamma_lut_size (ret = %d)",
__func__, ret);
return ret;
}
- if (lut_size != IDisplayColorGS101::IDqe::DegammaLutData::kLutLen) {
+ if (lut_size != IDisplayColorGS101::IDqe::DegammaLutData::ConfigType::kLutLen) {
HWC_LOGE(mExynosDisplay, "%s: invalid lut size (%" PRId64 ")",
__func__, lut_size);
return -EINVAL;
}
- struct drm_color_lut color_lut[IDisplayColorGS101::IDqe::DegammaLutData::kLutLen];
+ struct drm_color_lut color_lut[IDisplayColorGS101::IDqe::DegammaLutData::ConfigType::kLutLen];
for (uint32_t i = 0; i < lut_size; i++) {
- color_lut[i].red = dqe.DegammaLut().values[i];
+ color_lut[i].red = dqe.DegammaLut().config->values[i];
}
ret = mDrmDevice->CreatePropertyBlob(color_lut, sizeof(color_lut), &blobId);
if (ret) {
@@ -138,23 +149,29 @@ int32_t ExynosDisplayDrmInterfaceModule::createRegammaLutBlobFromIDqe(
{
int ret = 0;
uint64_t lut_size = 0;
+
+ if (dqe.RegammaLut().config == nullptr) {
+ ALOGE("no regamma config");
+ return -EINVAL;
+ }
+
std::tie(ret, lut_size) = mDrmCrtc->gamma_lut_size_property().value();
if (ret < 0) {
HWC_LOGE(mExynosDisplay, "%s: there is no gamma_lut_size (ret = %d)",
__func__, ret);
return ret;
}
- if (lut_size != IDisplayColorGS101::IDqe::DegammaLutData::kLutLen) {
+ if (lut_size != IDisplayColorGS101::IDqe::DegammaLutData::ConfigType::kLutLen) {
HWC_LOGE(mExynosDisplay, "%s: invalid lut size (%" PRId64 ")",
__func__, lut_size);
return -EINVAL;
}
- struct drm_color_lut color_lut[IDisplayColorGS101::IDqe::DegammaLutData::kLutLen];
+ struct drm_color_lut color_lut[IDisplayColorGS101::IDqe::DegammaLutData::ConfigType::kLutLen];
for (uint32_t i = 0; i < lut_size; i++) {
- color_lut[i].red = dqe.RegammaLut().r_values[i];
- color_lut[i].green = dqe.RegammaLut().g_values[i];
- color_lut[i].blue = dqe.RegammaLut().b_values[i];
+ color_lut[i].red = dqe.RegammaLut().config->r_values[i];
+ color_lut[i].green = dqe.RegammaLut().config->g_values[i];
+ color_lut[i].blue = dqe.RegammaLut().config->b_values[i];
}
ret = mDrmDevice->CreatePropertyBlob(color_lut, sizeof(color_lut), &blobId);
if (ret) {
@@ -170,7 +187,7 @@ int32_t ExynosDisplayDrmInterfaceModule::createGammaMatBlobFromIDqe(
int ret = 0;
struct exynos_matrix gamma_matrix;
if ((ret = convertDqeMatrixDataToMatrix(
- dqe.GammaMatrix(), gamma_matrix, DRM_SAMSUNG_MATRIX_DIMENS)) != NO_ERROR)
+ dqe.GammaMatrix().config->matrix_data, gamma_matrix, DRM_SAMSUNG_MATRIX_DIMENS)) != NO_ERROR)
{
HWC_LOGE(mExynosDisplay, "Failed to convert gamma matrix");
return ret;
@@ -190,7 +207,7 @@ int32_t ExynosDisplayDrmInterfaceModule::createLinearMatBlobFromIDqe(
int ret = 0;
struct exynos_matrix linear_matrix;
if ((ret = convertDqeMatrixDataToMatrix(
- dqe.LinearMatrix(), linear_matrix, DRM_SAMSUNG_MATRIX_DIMENS)) != NO_ERROR)
+ dqe.LinearMatrix().config->matrix_data, linear_matrix, DRM_SAMSUNG_MATRIX_DIMENS)) != NO_ERROR)
{
HWC_LOGE(mExynosDisplay, "Failed to convert linear matrix");
return ret;
@@ -208,15 +225,23 @@ int32_t ExynosDisplayDrmInterfaceModule::createEotfBlobFromIDpp(
const IDisplayColorGS101::IDpp &dpp, uint32_t &blobId)
{
struct hdr_eotf_lut eotf_lut;
- if ((dpp.EotfLut().posx.size() != DRM_SAMSUNG_HDR_EOTF_LUT_LEN) ||
- (dpp.EotfLut().posy.size() != DRM_SAMSUNG_HDR_EOTF_LUT_LEN)) {
+
+ if (dpp.EotfLut().config == nullptr) {
+ ALOGE("no dpp eotf config");
+ return -EINVAL;
+ }
+
+ if ((dpp.EotfLut().config->tf_data.posx.size() != DRM_SAMSUNG_HDR_EOTF_LUT_LEN) ||
+ (dpp.EotfLut().config->tf_data.posy.size() != DRM_SAMSUNG_HDR_EOTF_LUT_LEN)) {
HWC_LOGE(mExynosDisplay, "%s: eotf pos size (%zu, %zu)",
- __func__, dpp.EotfLut().posx.size(), dpp.EotfLut().posy.size());
+ __func__, dpp.EotfLut().config->tf_data.posx.size(),
+ dpp.EotfLut().config->tf_data.posy.size());
return -EINVAL;
}
+
for (uint32_t i = 0; i < DRM_SAMSUNG_HDR_EOTF_LUT_LEN; i++) {
- eotf_lut.posx[i] = dpp.EotfLut().posx[i];
- eotf_lut.posy[i] = dpp.EotfLut().posy[i];
+ eotf_lut.posx[i] = dpp.EotfLut().config->tf_data.posx[i];
+ eotf_lut.posy[i] = dpp.EotfLut().config->tf_data.posy[i];
}
int ret = mDrmDevice->CreatePropertyBlob(&eotf_lut, sizeof(eotf_lut), &blobId);
if (ret) {
@@ -231,8 +256,14 @@ int32_t ExynosDisplayDrmInterfaceModule::createGmBlobFromIDpp(
{
int ret = 0;
struct hdr_gm_data gm_matrix;
- if ((ret = convertDqeMatrixDataToMatrix(
- dpp.Gm(), gm_matrix, DRM_SAMSUNG_HDR_GM_DIMENS)) != NO_ERROR)
+
+ if (dpp.Gm().config == nullptr) {
+ ALOGE("no dpp GM config");
+ return -EINVAL;
+ }
+
+ if ((ret = convertDqeMatrixDataToMatrix(dpp.Gm().config->matrix_data, gm_matrix,
+ DRM_SAMSUNG_HDR_GM_DIMENS)) != NO_ERROR)
{
HWC_LOGE(mExynosDisplay, "Failed to convert gm matrix");
return ret;
@@ -249,25 +280,32 @@ int32_t ExynosDisplayDrmInterfaceModule::createDtmBlobFromIDpp(
const IDisplayColorGS101::IDpp &dpp, uint32_t &blobId)
{
struct hdr_tm_data tm_data;
- if ((dpp.Dtm().posx.size() != DRM_SAMSUNG_HDR_TM_LUT_LEN) ||
- (dpp.Dtm().posy.size() != DRM_SAMSUNG_HDR_TM_LUT_LEN)) {
+
+ if (dpp.Dtm().config == nullptr) {
+ ALOGE("no dpp DTM config");
+ return -EINVAL;
+ }
+
+ if ((dpp.Dtm().config->tf_data.posx.size() != DRM_SAMSUNG_HDR_TM_LUT_LEN) ||
+ (dpp.Dtm().config->tf_data.posy.size() != DRM_SAMSUNG_HDR_TM_LUT_LEN)) {
HWC_LOGE(mExynosDisplay, "%s: dtm pos size (%zu, %zu)",
- __func__, dpp.Dtm().posx.size(), dpp.Dtm().posy.size());
+ __func__, dpp.Dtm().config->tf_data.posx.size(),
+ dpp.Dtm().config->tf_data.posy.size());
return -EINVAL;
}
for (uint32_t i = 0; i < DRM_SAMSUNG_HDR_TM_LUT_LEN; i++) {
- tm_data.posx[i] = dpp.Dtm().posx[i];
- tm_data.posy[i] = dpp.Dtm().posy[i];
+ tm_data.posx[i] = dpp.Dtm().config->tf_data.posx[i];
+ tm_data.posy[i] = dpp.Dtm().config->tf_data.posy[i];
}
- tm_data.coeff_r = dpp.Dtm().coeff_r;
- tm_data.coeff_g = dpp.Dtm().coeff_g;
- tm_data.coeff_b = dpp.Dtm().coeff_b;
- tm_data.rng_x_min = dpp.Dtm().rng_x_min;
- tm_data.rng_x_max = dpp.Dtm().rng_x_max;
- tm_data.rng_y_min = dpp.Dtm().rng_y_min;
- tm_data.rng_y_max = dpp.Dtm().rng_y_max;
+ tm_data.coeff_r = dpp.Dtm().config->coeff_r;
+ tm_data.coeff_g = dpp.Dtm().config->coeff_g;
+ tm_data.coeff_b = dpp.Dtm().config->coeff_b;
+ tm_data.rng_x_min = dpp.Dtm().config->rng_x_min;
+ tm_data.rng_x_max = dpp.Dtm().config->rng_x_max;
+ tm_data.rng_y_min = dpp.Dtm().config->rng_y_min;
+ tm_data.rng_y_max = dpp.Dtm().config->rng_y_max;
int ret = mDrmDevice->CreatePropertyBlob(&tm_data, sizeof(tm_data), &blobId);
if (ret) {
@@ -281,15 +319,23 @@ int32_t ExynosDisplayDrmInterfaceModule::createOetfBlobFromIDpp(
const IDisplayColorGS101::IDpp &dpp, uint32_t &blobId)
{
struct hdr_oetf_lut oetf_lut;
- if ((dpp.OetfLut().posx.size() != DRM_SAMSUNG_HDR_OETF_LUT_LEN) ||
- (dpp.OetfLut().posy.size() != DRM_SAMSUNG_HDR_OETF_LUT_LEN)) {
+
+ if (dpp.OetfLut().config == nullptr) {
+ ALOGE("no dpp OETF config");
+ return -EINVAL;
+ }
+
+ if ((dpp.OetfLut().config->tf_data.posx.size() != DRM_SAMSUNG_HDR_OETF_LUT_LEN) ||
+ (dpp.OetfLut().config->tf_data.posy.size() != DRM_SAMSUNG_HDR_OETF_LUT_LEN)) {
HWC_LOGE(mExynosDisplay, "%s: oetf pos size (%zu, %zu)",
- __func__, dpp.OetfLut().posx.size(), dpp.OetfLut().posy.size());
+ __func__, dpp.OetfLut().config->tf_data.posx.size(),
+ dpp.OetfLut().config->tf_data.posy.size());
return -EINVAL;
}
+
for (uint32_t i = 0; i < DRM_SAMSUNG_HDR_OETF_LUT_LEN; i++) {
- oetf_lut.posx[i] = dpp.OetfLut().posx[i];
- oetf_lut.posy[i] = dpp.OetfLut().posy[i];
+ oetf_lut.posx[i] = dpp.OetfLut().config->tf_data.posx[i];
+ oetf_lut.posy[i] = dpp.OetfLut().config->tf_data.posy[i];
}
int ret = mDrmDevice->CreatePropertyBlob(&oetf_lut, sizeof(oetf_lut), &blobId);
if (ret) {
@@ -299,10 +345,11 @@ int32_t ExynosDisplayDrmInterfaceModule::createOetfBlobFromIDpp(
return NO_ERROR;
}
+template<typename StageDataType>
int32_t ExynosDisplayDrmInterfaceModule::setDisplayColorBlob(
const DrmProperty &prop,
const uint32_t type,
- const IDisplayColorGeneric::DisplayStage &stage,
+ const StageDataType &stage,
const IDisplayColorGS101::IDqe &dqe,
ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq)
{
@@ -395,11 +442,12 @@ int32_t ExynosDisplayDrmInterfaceModule::setDisplayColorSetting(
return NO_ERROR;
}
+template<typename StageDataType>
int32_t ExynosDisplayDrmInterfaceModule::setPlaneColorBlob(
const std::unique_ptr<DrmPlane> &plane,
const DrmProperty &prop,
const uint32_t type,
- const IDisplayColorGeneric::DisplayStage &stage,
+ const StageDataType &stage,
const IDisplayColorGS101::IDpp &dpp,
const uint32_t dppIndex,
ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq)
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
index ca8ccd7..43f279a 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
@@ -99,17 +99,19 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface {
SaveBlob::init(drmDevice, DPP_BLOB_NUM);
};
};
+ template<typename StageDataType>
int32_t setDisplayColorBlob(
const DrmProperty &prop,
const uint32_t type,
- const IDisplayColorGeneric::DisplayStage &stage,
+ const StageDataType &stage,
const IDisplayColorGS101::IDqe &dqe,
ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq);
+ template<typename StageDataType>
int32_t setPlaneColorBlob(
const std::unique_ptr<DrmPlane> &plane,
const DrmProperty &prop,
const uint32_t type,
- const IDisplayColorGeneric::DisplayStage &stage,
+ const StageDataType &stage,
const IDisplayColorGS101::IDpp &dpp,
const uint32_t dppIndex,
ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq);