diff options
author | Long Ling <longling@google.com> | 2020-08-05 11:06:58 -0700 |
---|---|---|
committer | Long Ling <longling@google.com> | 2020-10-14 21:13:48 -0700 |
commit | 2084d4512ba6e1046e562b6e8904c21ed3c7b61b (patch) | |
tree | c2f8e6f6af7fc7bdfa483f3139c130e9a09168e2 /libhwc2.1/libdisplayinterface | |
parent | 5c086444e5d2868163f48c60d2783f32107bb753 (diff) | |
download | gs101-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.cpp | 144 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h | 6 |
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); |