/** ***************************************************************************** * Function: dal_transform_wide_gamut_set_yuv_adjustment * * @param [in] const struct opp_grph_csc_adjustment *adjust * * @return * void * * @note calculate and program color adjustments for YUV color spaces * * @see * ***************************************************************************** */ static void set_yuv_adjustment( struct dce110_opp *opp110, const struct opp_grph_csc_adjustment *adjust) { bool b601 = (adjust->c_space == COLOR_SPACE_YPBPR601) || (adjust->c_space == COLOR_SPACE_YCBCR601) || (adjust->c_space == COLOR_SPACE_YCBCR601_LIMITED); struct out_csc_color_matrix reg_matrix; struct fixed31_32 matrix[OUTPUT_CSC_MATRIX_SIZE]; struct dc_csc_adjustments adjustments; struct fixed31_32 ideals[OUTPUT_CSC_MATRIX_SIZE]; prepare_yuv_ideal(b601, ideals); setup_adjustments(adjust, &adjustments); if ((adjust->c_space == COLOR_SPACE_YCBCR601_LIMITED) || (adjust->c_space == COLOR_SPACE_YCBCR709_LIMITED)) calculate_adjustments_y_only( ideals, &adjustments, matrix); else calculate_adjustments( ideals, &adjustments, matrix); memset(®_matrix, 0, sizeof(struct out_csc_color_matrix)); setup_reg_format(matrix, reg_matrix.regval); program_color_matrix(opp110, ®_matrix, GRPH_COLOR_MATRIX_SW); }
void dce110_opp_set_csc_adjustment( struct transform *xfm, const struct out_csc_color_matrix *tbl_entry) { struct dce_transform *xfm_dce = TO_DCE_TRANSFORM(xfm); enum csc_color_mode config = CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC; program_color_matrix( xfm_dce, tbl_entry, GRPH_COLOR_MATRIX_SW); /* We did everything ,now program DxOUTPUT_CSC_CONTROL */ configure_graphics_mode(xfm_dce, config, GRAPHICS_CSC_ADJUST_TYPE_SW, tbl_entry->color_space); }
void dce110_opp_set_csc_default( struct transform *xfm, const struct default_adjustment *default_adjust) { struct dce_transform *xfm_dce = TO_DCE_TRANSFORM(xfm); enum csc_color_mode config = CSC_COLOR_MODE_GRAPHICS_PREDEFINED; if (default_adjust->force_hw_default == false) { const struct out_csc_color_matrix *elm; /* currently parameter not in use */ enum grph_color_adjust_option option = GRPH_COLOR_MATRIX_HW_DEFAULT; uint32_t i; /* * HW default false we program locally defined matrix * HW default true we use predefined hw matrix and we * do not need to program matrix * OEM wants the HW default via runtime parameter. */ option = GRPH_COLOR_MATRIX_SW; for (i = 0; i < ARRAY_SIZE(global_color_matrix); ++i) { elm = &global_color_matrix[i]; if (elm->color_space != default_adjust->out_color_space) continue; /* program the matrix with default values from this * file */ program_color_matrix(xfm_dce, elm, option); config = CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC; break; } } /* configure the what we programmed : * 1. Default values from this file * 2. Use hardware default from ROM_A and we do not need to program * matrix */ configure_graphics_mode(xfm_dce, config, default_adjust->csc_adjust_type, default_adjust->out_color_space); }
/** ***************************************************************************** * Function: dal_transform_wide_gamut_set_rgb_limited_range_adjustment * * @param [in] const struct opp_grph_csc_adjustment *adjust * * @return * void * * @note calculate and program color adjustments for sRGB limited color space * * @see * ***************************************************************************** */ static void set_rgb_limited_range_adjustment( struct dce110_opp *opp110, const struct opp_grph_csc_adjustment *adjust) { struct out_csc_color_matrix reg_matrix; struct fixed31_32 change_matrix[OUTPUT_CSC_MATRIX_SIZE]; struct fixed31_32 matrix[OUTPUT_CSC_MATRIX_SIZE]; struct dc_csc_adjustments adjustments; struct fixed31_32 ideals[OUTPUT_CSC_MATRIX_SIZE]; prepare_tv_rgb_ideal(ideals); setup_adjustments(adjust, &adjustments); calculate_adjustments(ideals, &adjustments, matrix); memmove(change_matrix, matrix, sizeof(matrix)); /* from 1 -> 3 */ matrix[8] = change_matrix[0]; matrix[9] = change_matrix[1]; matrix[10] = change_matrix[2]; matrix[11] = change_matrix[3]; /* from 2 -> 1 */ matrix[0] = change_matrix[4]; matrix[1] = change_matrix[5]; matrix[2] = change_matrix[6]; matrix[3] = change_matrix[7]; /* from 3 -> 2 */ matrix[4] = change_matrix[8]; matrix[5] = change_matrix[9]; matrix[6] = change_matrix[10]; matrix[7] = change_matrix[11]; memset(®_matrix, 0, sizeof(struct out_csc_color_matrix)); setup_reg_format(matrix, reg_matrix.regval); program_color_matrix(opp110, ®_matrix, GRPH_COLOR_MATRIX_SW); }
/** ***************************************************************************** * Function: dal_transform_wide_gamut_set_rgb_adjustment_legacy * * @param [in] const struct opp_grph_csc_adjustment *adjust * * @return * void * * @note calculate and program color adjustments for sRGB color space * * @see * ***************************************************************************** */ static void set_rgb_adjustment_legacy( struct dce110_opp *opp110, const struct opp_grph_csc_adjustment *adjust) { const struct fixed31_32 k1 = dal_fixed31_32_from_fraction(701000, 1000000); const struct fixed31_32 k2 = dal_fixed31_32_from_fraction(236568, 1000000); const struct fixed31_32 k3 = dal_fixed31_32_from_fraction(-587000, 1000000); const struct fixed31_32 k4 = dal_fixed31_32_from_fraction(464432, 1000000); const struct fixed31_32 k5 = dal_fixed31_32_from_fraction(-114000, 1000000); const struct fixed31_32 k6 = dal_fixed31_32_from_fraction(-701000, 1000000); const struct fixed31_32 k7 = dal_fixed31_32_from_fraction(-299000, 1000000); const struct fixed31_32 k8 = dal_fixed31_32_from_fraction(-292569, 1000000); const struct fixed31_32 k9 = dal_fixed31_32_from_fraction(413000, 1000000); const struct fixed31_32 k10 = dal_fixed31_32_from_fraction(-92482, 1000000); const struct fixed31_32 k11 = dal_fixed31_32_from_fraction(-114000, 1000000); const struct fixed31_32 k12 = dal_fixed31_32_from_fraction(385051, 1000000); const struct fixed31_32 k13 = dal_fixed31_32_from_fraction(-299000, 1000000); const struct fixed31_32 k14 = dal_fixed31_32_from_fraction(886000, 1000000); const struct fixed31_32 k15 = dal_fixed31_32_from_fraction(-587000, 1000000); const struct fixed31_32 k16 = dal_fixed31_32_from_fraction(-741914, 1000000); const struct fixed31_32 k17 = dal_fixed31_32_from_fraction(886000, 1000000); const struct fixed31_32 k18 = dal_fixed31_32_from_fraction(-144086, 1000000); const struct fixed31_32 luma_r = dal_fixed31_32_from_fraction(299, 1000); const struct fixed31_32 luma_g = dal_fixed31_32_from_fraction(587, 1000); const struct fixed31_32 luma_b = dal_fixed31_32_from_fraction(114, 1000); struct out_csc_color_matrix tbl_entry; struct fixed31_32 matrix[OUTPUT_CSC_MATRIX_SIZE]; struct fixed31_32 grph_cont; struct fixed31_32 grph_sat; struct fixed31_32 grph_bright; struct fixed31_32 sin_grph_hue; struct fixed31_32 cos_grph_hue; initialize_color_float_adj_reference_values( adjust, &grph_cont, &grph_sat, &grph_bright, &sin_grph_hue, &cos_grph_hue); /* COEF_1_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 + * Sin(GrphHue) * K2)) */ /* (Cos(GrphHue) * K1 + Sin(GrphHue) * K2) */ matrix[0] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k1), dal_fixed31_32_mul(sin_grph_hue, k2)); /* GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * K2 */ matrix[0] = dal_fixed31_32_mul(grph_sat, matrix[0]); /* (LumaR + GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * K2)) */ matrix[0] = dal_fixed31_32_add(luma_r, matrix[0]); /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * * K2)) */ matrix[0] = dal_fixed31_32_mul(grph_cont, matrix[0]); /* COEF_1_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K3 + * Sin(GrphHue) * K4)) */ /* (Cos(GrphHue) * K3 + Sin(GrphHue) * K4) */ matrix[1] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k3), dal_fixed31_32_mul(sin_grph_hue, k4)); /* GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * K4) */ matrix[1] = dal_fixed31_32_mul(grph_sat, matrix[1]); /* (LumaG + GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * K4)) */ matrix[1] = dal_fixed31_32_add(luma_g, matrix[1]); /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * * K4)) */ matrix[1] = dal_fixed31_32_mul(grph_cont, matrix[1]); /* COEF_1_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K5 + * Sin(GrphHue) * K6)) */ /* (Cos(GrphHue) * K5 + Sin(GrphHue) * K6) */ matrix[2] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k5), dal_fixed31_32_mul(sin_grph_hue, k6)); /* GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * K6) */ matrix[2] = dal_fixed31_32_mul(grph_sat, matrix[2]); /* LumaB + GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * K6) */ matrix[2] = dal_fixed31_32_add(luma_b, matrix[2]); /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * * K6)) */ matrix[2] = dal_fixed31_32_mul(grph_cont, matrix[2]); /* COEF_1_4 = GrphBright */ matrix[3] = grph_bright; /* COEF_2_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 + * Sin(GrphHue) * K8)) */ /* (Cos(GrphHue) * K7 + Sin(GrphHue) * K8) */ matrix[4] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k7), dal_fixed31_32_mul(sin_grph_hue, k8)); /* GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * K8) */ matrix[4] = dal_fixed31_32_mul(grph_sat, matrix[4]); /* (LumaR + GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * K8)) */ matrix[4] = dal_fixed31_32_add(luma_r, matrix[4]); /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * * K8)) */ matrix[4] = dal_fixed31_32_mul(grph_cont, matrix[4]); /* COEF_2_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K9 + * Sin(GrphHue) * K10)) */ /* (Cos(GrphHue) * K9 + Sin(GrphHue) * K10)) */ matrix[5] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k9), dal_fixed31_32_mul(sin_grph_hue, k10)); /* GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * K10)) */ matrix[5] = dal_fixed31_32_mul(grph_sat, matrix[5]); /* (LumaG + GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * K10)) */ matrix[5] = dal_fixed31_32_add(luma_g, matrix[5]); /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * * K10)) */ matrix[5] = dal_fixed31_32_mul(grph_cont, matrix[5]); /* COEF_2_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K11 + * Sin(GrphHue) * K12)) */ /* (Cos(GrphHue) * K11 + Sin(GrphHue) * K12)) */ matrix[6] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k11), dal_fixed31_32_mul(sin_grph_hue, k12)); /* GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * K12)) */ matrix[6] = dal_fixed31_32_mul(grph_sat, matrix[6]); /* (LumaB + GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * K12)) */ matrix[6] = dal_fixed31_32_add(luma_b, matrix[6]); /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * * K12)) */ matrix[6] = dal_fixed31_32_mul(grph_cont, matrix[6]); /* COEF_2_4 = GrphBright */ matrix[7] = grph_bright; /* COEF_3_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 + * Sin(GrphHue) * K14)) */ /* (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */ matrix[8] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k13), dal_fixed31_32_mul(sin_grph_hue, k14)); /* GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */ matrix[8] = dal_fixed31_32_mul(grph_sat, matrix[8]); /* (LumaR + GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */ matrix[8] = dal_fixed31_32_add(luma_r, matrix[8]); /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * * K14)) */ matrix[8] = dal_fixed31_32_mul(grph_cont, matrix[8]); /* COEF_3_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K15 + * Sin(GrphHue) * K16)) */ /* GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16) */ matrix[9] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k15), dal_fixed31_32_mul(sin_grph_hue, k16)); /* (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16)) */ matrix[9] = dal_fixed31_32_mul(grph_sat, matrix[9]); /* (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16)) */ matrix[9] = dal_fixed31_32_add(luma_g, matrix[9]); /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * * K16)) */ matrix[9] = dal_fixed31_32_mul(grph_cont, matrix[9]); /* COEF_3_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K17 + * Sin(GrphHue) * K18)) */ /* (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */ matrix[10] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k17), dal_fixed31_32_mul(sin_grph_hue, k18)); /* GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */ matrix[10] = dal_fixed31_32_mul(grph_sat, matrix[10]); /* (LumaB + GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */ matrix[10] = dal_fixed31_32_add(luma_b, matrix[10]); /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * * K18)) */ matrix[10] = dal_fixed31_32_mul(grph_cont, matrix[10]); /* COEF_3_4 = GrphBright */ matrix[11] = grph_bright; tbl_entry.color_space = adjust->c_space; convert_float_matrix(tbl_entry.regval, matrix, OUTPUT_CSC_MATRIX_SIZE); program_color_matrix( opp110, &tbl_entry, adjust->color_adjust_option); }