0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #include "dc.h"
0026 #include "reg_helper.h"
0027 #include "dcn10_dpp.h"
0028
0029 #include "dcn10_cm_common.h"
0030 #include "custom_float.h"
0031
0032 #define REG(reg) reg
0033
0034 #define CTX \
0035 ctx
0036
0037 #undef FN
0038 #define FN(reg_name, field_name) \
0039 reg->shifts.field_name, reg->masks.field_name
0040
0041 void cm_helper_program_color_matrices(
0042 struct dc_context *ctx,
0043 const uint16_t *regval,
0044 const struct color_matrices_reg *reg)
0045 {
0046 uint32_t cur_csc_reg;
0047 unsigned int i = 0;
0048
0049 for (cur_csc_reg = reg->csc_c11_c12;
0050 cur_csc_reg <= reg->csc_c33_c34;
0051 cur_csc_reg++) {
0052
0053 const uint16_t *regval0 = &(regval[2 * i]);
0054 const uint16_t *regval1 = &(regval[(2 * i) + 1]);
0055
0056 REG_SET_2(cur_csc_reg, 0,
0057 csc_c11, *regval0,
0058 csc_c12, *regval1);
0059
0060 i++;
0061 }
0062
0063 }
0064
0065 void cm_helper_program_xfer_func(
0066 struct dc_context *ctx,
0067 const struct pwl_params *params,
0068 const struct xfer_func_reg *reg)
0069 {
0070 uint32_t reg_region_cur;
0071 unsigned int i = 0;
0072
0073 REG_SET_2(reg->start_cntl_b, 0,
0074 exp_region_start, params->corner_points[0].blue.custom_float_x,
0075 exp_resion_start_segment, 0);
0076 REG_SET_2(reg->start_cntl_g, 0,
0077 exp_region_start, params->corner_points[0].green.custom_float_x,
0078 exp_resion_start_segment, 0);
0079 REG_SET_2(reg->start_cntl_r, 0,
0080 exp_region_start, params->corner_points[0].red.custom_float_x,
0081 exp_resion_start_segment, 0);
0082
0083 REG_SET(reg->start_slope_cntl_b, 0,
0084 field_region_linear_slope, params->corner_points[0].blue.custom_float_slope);
0085 REG_SET(reg->start_slope_cntl_g, 0,
0086 field_region_linear_slope, params->corner_points[0].green.custom_float_slope);
0087 REG_SET(reg->start_slope_cntl_r, 0,
0088 field_region_linear_slope, params->corner_points[0].red.custom_float_slope);
0089
0090 REG_SET(reg->start_end_cntl1_b, 0,
0091 field_region_end, params->corner_points[1].blue.custom_float_x);
0092 REG_SET_2(reg->start_end_cntl2_b, 0,
0093 field_region_end_slope, params->corner_points[1].blue.custom_float_slope,
0094 field_region_end_base, params->corner_points[1].blue.custom_float_y);
0095
0096 REG_SET(reg->start_end_cntl1_g, 0,
0097 field_region_end, params->corner_points[1].green.custom_float_x);
0098 REG_SET_2(reg->start_end_cntl2_g, 0,
0099 field_region_end_slope, params->corner_points[1].green.custom_float_slope,
0100 field_region_end_base, params->corner_points[1].green.custom_float_y);
0101
0102 REG_SET(reg->start_end_cntl1_r, 0,
0103 field_region_end, params->corner_points[1].red.custom_float_x);
0104 REG_SET_2(reg->start_end_cntl2_r, 0,
0105 field_region_end_slope, params->corner_points[1].red.custom_float_slope,
0106 field_region_end_base, params->corner_points[1].red.custom_float_y);
0107
0108 for (reg_region_cur = reg->region_start;
0109 reg_region_cur <= reg->region_end;
0110 reg_region_cur++) {
0111
0112 const struct gamma_curve *curve0 = &(params->arr_curve_points[2 * i]);
0113 const struct gamma_curve *curve1 = &(params->arr_curve_points[(2 * i) + 1]);
0114
0115 REG_SET_4(reg_region_cur, 0,
0116 exp_region0_lut_offset, curve0->offset,
0117 exp_region0_num_segments, curve0->segments_num,
0118 exp_region1_lut_offset, curve1->offset,
0119 exp_region1_num_segments, curve1->segments_num);
0120
0121 i++;
0122 }
0123
0124 }
0125
0126
0127
0128 bool cm_helper_convert_to_custom_float(
0129 struct pwl_result_data *rgb_resulted,
0130 struct curve_points3 *corner_points,
0131 uint32_t hw_points_num,
0132 bool fixpoint)
0133 {
0134 struct custom_float_format fmt;
0135
0136 struct pwl_result_data *rgb = rgb_resulted;
0137
0138 uint32_t i = 0;
0139
0140 fmt.exponenta_bits = 6;
0141 fmt.mantissa_bits = 12;
0142 fmt.sign = false;
0143
0144
0145
0146
0147 if (!convert_to_custom_float_format(corner_points[0].red.x, &fmt,
0148 &corner_points[0].red.custom_float_x)) {
0149 BREAK_TO_DEBUGGER();
0150 return false;
0151 }
0152 if (!convert_to_custom_float_format(corner_points[0].green.x, &fmt,
0153 &corner_points[0].green.custom_float_x)) {
0154 BREAK_TO_DEBUGGER();
0155 return false;
0156 }
0157 if (!convert_to_custom_float_format(corner_points[0].blue.x, &fmt,
0158 &corner_points[0].blue.custom_float_x)) {
0159 BREAK_TO_DEBUGGER();
0160 return false;
0161 }
0162
0163 if (!convert_to_custom_float_format(corner_points[0].red.offset, &fmt,
0164 &corner_points[0].red.custom_float_offset)) {
0165 BREAK_TO_DEBUGGER();
0166 return false;
0167 }
0168 if (!convert_to_custom_float_format(corner_points[0].green.offset, &fmt,
0169 &corner_points[0].green.custom_float_offset)) {
0170 BREAK_TO_DEBUGGER();
0171 return false;
0172 }
0173 if (!convert_to_custom_float_format(corner_points[0].blue.offset, &fmt,
0174 &corner_points[0].blue.custom_float_offset)) {
0175 BREAK_TO_DEBUGGER();
0176 return false;
0177 }
0178
0179 if (!convert_to_custom_float_format(corner_points[0].red.slope, &fmt,
0180 &corner_points[0].red.custom_float_slope)) {
0181 BREAK_TO_DEBUGGER();
0182 return false;
0183 }
0184 if (!convert_to_custom_float_format(corner_points[0].green.slope, &fmt,
0185 &corner_points[0].green.custom_float_slope)) {
0186 BREAK_TO_DEBUGGER();
0187 return false;
0188 }
0189 if (!convert_to_custom_float_format(corner_points[0].blue.slope, &fmt,
0190 &corner_points[0].blue.custom_float_slope)) {
0191 BREAK_TO_DEBUGGER();
0192 return false;
0193 }
0194
0195 fmt.mantissa_bits = 10;
0196 fmt.sign = false;
0197
0198 if (!convert_to_custom_float_format(corner_points[1].red.x, &fmt,
0199 &corner_points[1].red.custom_float_x)) {
0200 BREAK_TO_DEBUGGER();
0201 return false;
0202 }
0203 if (!convert_to_custom_float_format(corner_points[1].green.x, &fmt,
0204 &corner_points[1].green.custom_float_x)) {
0205 BREAK_TO_DEBUGGER();
0206 return false;
0207 }
0208 if (!convert_to_custom_float_format(corner_points[1].blue.x, &fmt,
0209 &corner_points[1].blue.custom_float_x)) {
0210 BREAK_TO_DEBUGGER();
0211 return false;
0212 }
0213
0214 if (fixpoint == true) {
0215 corner_points[1].red.custom_float_y =
0216 dc_fixpt_clamp_u0d14(corner_points[1].red.y);
0217 corner_points[1].green.custom_float_y =
0218 dc_fixpt_clamp_u0d14(corner_points[1].green.y);
0219 corner_points[1].blue.custom_float_y =
0220 dc_fixpt_clamp_u0d14(corner_points[1].blue.y);
0221 } else {
0222 if (!convert_to_custom_float_format(corner_points[1].red.y,
0223 &fmt, &corner_points[1].red.custom_float_y)) {
0224 BREAK_TO_DEBUGGER();
0225 return false;
0226 }
0227 if (!convert_to_custom_float_format(corner_points[1].green.y,
0228 &fmt, &corner_points[1].green.custom_float_y)) {
0229 BREAK_TO_DEBUGGER();
0230 return false;
0231 }
0232 if (!convert_to_custom_float_format(corner_points[1].blue.y,
0233 &fmt, &corner_points[1].blue.custom_float_y)) {
0234 BREAK_TO_DEBUGGER();
0235 return false;
0236 }
0237 }
0238
0239 if (!convert_to_custom_float_format(corner_points[1].red.slope, &fmt,
0240 &corner_points[1].red.custom_float_slope)) {
0241 BREAK_TO_DEBUGGER();
0242 return false;
0243 }
0244 if (!convert_to_custom_float_format(corner_points[1].green.slope, &fmt,
0245 &corner_points[1].green.custom_float_slope)) {
0246 BREAK_TO_DEBUGGER();
0247 return false;
0248 }
0249 if (!convert_to_custom_float_format(corner_points[1].blue.slope, &fmt,
0250 &corner_points[1].blue.custom_float_slope)) {
0251 BREAK_TO_DEBUGGER();
0252 return false;
0253 }
0254
0255 if (hw_points_num == 0 || rgb_resulted == NULL || fixpoint == true)
0256 return true;
0257
0258 fmt.mantissa_bits = 12;
0259 fmt.sign = true;
0260
0261 while (i != hw_points_num) {
0262 if (!convert_to_custom_float_format(rgb->red, &fmt,
0263 &rgb->red_reg)) {
0264 BREAK_TO_DEBUGGER();
0265 return false;
0266 }
0267
0268 if (!convert_to_custom_float_format(rgb->green, &fmt,
0269 &rgb->green_reg)) {
0270 BREAK_TO_DEBUGGER();
0271 return false;
0272 }
0273
0274 if (!convert_to_custom_float_format(rgb->blue, &fmt,
0275 &rgb->blue_reg)) {
0276 BREAK_TO_DEBUGGER();
0277 return false;
0278 }
0279
0280 if (!convert_to_custom_float_format(rgb->delta_red, &fmt,
0281 &rgb->delta_red_reg)) {
0282 BREAK_TO_DEBUGGER();
0283 return false;
0284 }
0285
0286 if (!convert_to_custom_float_format(rgb->delta_green, &fmt,
0287 &rgb->delta_green_reg)) {
0288 BREAK_TO_DEBUGGER();
0289 return false;
0290 }
0291
0292 if (!convert_to_custom_float_format(rgb->delta_blue, &fmt,
0293 &rgb->delta_blue_reg)) {
0294 BREAK_TO_DEBUGGER();
0295 return false;
0296 }
0297
0298 ++rgb;
0299 ++i;
0300 }
0301
0302 return true;
0303 }
0304
0305
0306 #define MAX_REGIONS_NUMBER 34
0307 #define MAX_LOW_POINT 25
0308 #define NUMBER_REGIONS 32
0309 #define NUMBER_SW_SEGMENTS 16
0310
0311 bool cm_helper_translate_curve_to_hw_format(
0312 const struct dc_transfer_func *output_tf,
0313 struct pwl_params *lut_params, bool fixpoint)
0314 {
0315 struct curve_points3 *corner_points;
0316 struct pwl_result_data *rgb_resulted;
0317 struct pwl_result_data *rgb;
0318 struct pwl_result_data *rgb_plus_1;
0319 struct pwl_result_data *rgb_minus_1;
0320
0321 int32_t region_start, region_end;
0322 int32_t i;
0323 uint32_t j, k, seg_distr[MAX_REGIONS_NUMBER], increment, start_index, hw_points;
0324
0325 if (output_tf == NULL || lut_params == NULL || output_tf->type == TF_TYPE_BYPASS)
0326 return false;
0327
0328 corner_points = lut_params->corner_points;
0329 rgb_resulted = lut_params->rgb_resulted;
0330 hw_points = 0;
0331
0332 memset(lut_params, 0, sizeof(struct pwl_params));
0333 memset(seg_distr, 0, sizeof(seg_distr));
0334
0335 if (output_tf->tf == TRANSFER_FUNCTION_PQ || output_tf->tf == TRANSFER_FUNCTION_GAMMA22) {
0336
0337
0338
0339 for (i = 0; i < NUMBER_REGIONS ; i++)
0340 seg_distr[i] = 3;
0341
0342 region_start = -MAX_LOW_POINT;
0343 region_end = NUMBER_REGIONS - MAX_LOW_POINT;
0344 } else {
0345
0346
0347
0348
0349 seg_distr[0] = 3;
0350 seg_distr[1] = 4;
0351 seg_distr[2] = 4;
0352 seg_distr[3] = 4;
0353 seg_distr[4] = 4;
0354 seg_distr[5] = 4;
0355 seg_distr[6] = 4;
0356 seg_distr[7] = 4;
0357 seg_distr[8] = 4;
0358 seg_distr[9] = 4;
0359 seg_distr[10] = 1;
0360
0361 region_start = -10;
0362 region_end = 1;
0363 }
0364
0365 for (i = region_end - region_start; i < MAX_REGIONS_NUMBER ; i++)
0366 seg_distr[i] = -1;
0367
0368 for (k = 0; k < MAX_REGIONS_NUMBER; k++) {
0369 if (seg_distr[k] != -1)
0370 hw_points += (1 << seg_distr[k]);
0371 }
0372
0373 j = 0;
0374 for (k = 0; k < (region_end - region_start); k++) {
0375 increment = NUMBER_SW_SEGMENTS / (1 << seg_distr[k]);
0376 start_index = (region_start + k + MAX_LOW_POINT) *
0377 NUMBER_SW_SEGMENTS;
0378 for (i = start_index; i < start_index + NUMBER_SW_SEGMENTS;
0379 i += increment) {
0380 if (j == hw_points - 1)
0381 break;
0382 rgb_resulted[j].red = output_tf->tf_pts.red[i];
0383 rgb_resulted[j].green = output_tf->tf_pts.green[i];
0384 rgb_resulted[j].blue = output_tf->tf_pts.blue[i];
0385 j++;
0386 }
0387 }
0388
0389
0390 start_index = (region_end + MAX_LOW_POINT) * NUMBER_SW_SEGMENTS;
0391 rgb_resulted[hw_points - 1].red = output_tf->tf_pts.red[start_index];
0392 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
0393 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
0394
0395 rgb_resulted[hw_points].red = rgb_resulted[hw_points - 1].red;
0396 rgb_resulted[hw_points].green = rgb_resulted[hw_points - 1].green;
0397 rgb_resulted[hw_points].blue = rgb_resulted[hw_points - 1].blue;
0398
0399
0400 corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0401 dc_fixpt_from_int(region_start));
0402 corner_points[0].green.x = corner_points[0].red.x;
0403 corner_points[0].blue.x = corner_points[0].red.x;
0404
0405 corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0406 dc_fixpt_from_int(region_end));
0407 corner_points[1].green.x = corner_points[1].red.x;
0408 corner_points[1].blue.x = corner_points[1].red.x;
0409
0410 corner_points[0].red.y = rgb_resulted[0].red;
0411 corner_points[0].green.y = rgb_resulted[0].green;
0412 corner_points[0].blue.y = rgb_resulted[0].blue;
0413
0414 corner_points[0].red.slope = dc_fixpt_div(corner_points[0].red.y,
0415 corner_points[0].red.x);
0416 corner_points[0].green.slope = dc_fixpt_div(corner_points[0].green.y,
0417 corner_points[0].green.x);
0418 corner_points[0].blue.slope = dc_fixpt_div(corner_points[0].blue.y,
0419 corner_points[0].blue.x);
0420
0421
0422
0423
0424 corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
0425 corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
0426 corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
0427 corner_points[1].red.slope = dc_fixpt_zero;
0428 corner_points[1].green.slope = dc_fixpt_zero;
0429 corner_points[1].blue.slope = dc_fixpt_zero;
0430
0431 if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
0432
0433
0434
0435 const struct fixed31_32 end_value =
0436 dc_fixpt_from_int(125);
0437
0438 corner_points[1].red.slope = dc_fixpt_div(
0439 dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
0440 dc_fixpt_sub(end_value, corner_points[1].red.x));
0441 corner_points[1].green.slope = dc_fixpt_div(
0442 dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
0443 dc_fixpt_sub(end_value, corner_points[1].green.x));
0444 corner_points[1].blue.slope = dc_fixpt_div(
0445 dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
0446 dc_fixpt_sub(end_value, corner_points[1].blue.x));
0447 }
0448
0449 lut_params->hw_points_num = hw_points;
0450
0451 k = 0;
0452 for (i = 1; i < MAX_REGIONS_NUMBER; i++) {
0453 if (seg_distr[k] != -1) {
0454 lut_params->arr_curve_points[k].segments_num =
0455 seg_distr[k];
0456 lut_params->arr_curve_points[i].offset =
0457 lut_params->arr_curve_points[k].offset + (1 << seg_distr[k]);
0458 }
0459 k++;
0460 }
0461
0462 if (seg_distr[k] != -1)
0463 lut_params->arr_curve_points[k].segments_num = seg_distr[k];
0464
0465 rgb = rgb_resulted;
0466 rgb_plus_1 = rgb_resulted + 1;
0467 rgb_minus_1 = rgb;
0468
0469 i = 1;
0470 while (i != hw_points + 1) {
0471
0472 if (i >= hw_points - 1) {
0473 if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
0474 rgb_plus_1->red = dc_fixpt_add(rgb->red, rgb_minus_1->delta_red);
0475 if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
0476 rgb_plus_1->green = dc_fixpt_add(rgb->green, rgb_minus_1->delta_green);
0477 if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
0478 rgb_plus_1->blue = dc_fixpt_add(rgb->blue, rgb_minus_1->delta_blue);
0479 }
0480
0481 rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
0482 rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
0483 rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
0484
0485 if (fixpoint == true) {
0486 rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
0487 rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
0488 rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
0489 rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
0490 rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
0491 rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);
0492 }
0493
0494 ++rgb_plus_1;
0495 rgb_minus_1 = rgb;
0496 ++rgb;
0497 ++i;
0498 }
0499 cm_helper_convert_to_custom_float(rgb_resulted,
0500 lut_params->corner_points,
0501 hw_points, fixpoint);
0502
0503 return true;
0504 }
0505
0506 #define NUM_DEGAMMA_REGIONS 12
0507
0508
0509 bool cm_helper_translate_curve_to_degamma_hw_format(
0510 const struct dc_transfer_func *output_tf,
0511 struct pwl_params *lut_params)
0512 {
0513 struct curve_points3 *corner_points;
0514 struct pwl_result_data *rgb_resulted;
0515 struct pwl_result_data *rgb;
0516 struct pwl_result_data *rgb_plus_1;
0517
0518 int32_t region_start, region_end;
0519 int32_t i;
0520 uint32_t j, k, seg_distr[MAX_REGIONS_NUMBER], increment, start_index, hw_points;
0521
0522 if (output_tf == NULL || lut_params == NULL || output_tf->type == TF_TYPE_BYPASS)
0523 return false;
0524
0525 corner_points = lut_params->corner_points;
0526 rgb_resulted = lut_params->rgb_resulted;
0527 hw_points = 0;
0528
0529 memset(lut_params, 0, sizeof(struct pwl_params));
0530 memset(seg_distr, 0, sizeof(seg_distr));
0531
0532 region_start = -NUM_DEGAMMA_REGIONS;
0533 region_end = 0;
0534
0535
0536 for (i = region_end - region_start; i < MAX_REGIONS_NUMBER ; i++)
0537 seg_distr[i] = -1;
0538
0539
0540
0541 for (i = 0; i < NUM_DEGAMMA_REGIONS ; i++)
0542 seg_distr[i] = 4;
0543
0544 for (k = 0; k < MAX_REGIONS_NUMBER; k++) {
0545 if (seg_distr[k] != -1)
0546 hw_points += (1 << seg_distr[k]);
0547 }
0548
0549 j = 0;
0550 for (k = 0; k < (region_end - region_start); k++) {
0551 increment = NUMBER_SW_SEGMENTS / (1 << seg_distr[k]);
0552 start_index = (region_start + k + MAX_LOW_POINT) *
0553 NUMBER_SW_SEGMENTS;
0554 for (i = start_index; i < start_index + NUMBER_SW_SEGMENTS;
0555 i += increment) {
0556 if (j == hw_points - 1)
0557 break;
0558 rgb_resulted[j].red = output_tf->tf_pts.red[i];
0559 rgb_resulted[j].green = output_tf->tf_pts.green[i];
0560 rgb_resulted[j].blue = output_tf->tf_pts.blue[i];
0561 j++;
0562 }
0563 }
0564
0565
0566 start_index = (region_end + MAX_LOW_POINT) * NUMBER_SW_SEGMENTS;
0567 rgb_resulted[hw_points - 1].red = output_tf->tf_pts.red[start_index];
0568 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
0569 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
0570
0571 rgb_resulted[hw_points].red = rgb_resulted[hw_points - 1].red;
0572 rgb_resulted[hw_points].green = rgb_resulted[hw_points - 1].green;
0573 rgb_resulted[hw_points].blue = rgb_resulted[hw_points - 1].blue;
0574
0575 corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0576 dc_fixpt_from_int(region_start));
0577 corner_points[0].green.x = corner_points[0].red.x;
0578 corner_points[0].blue.x = corner_points[0].red.x;
0579 corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0580 dc_fixpt_from_int(region_end));
0581 corner_points[1].green.x = corner_points[1].red.x;
0582 corner_points[1].blue.x = corner_points[1].red.x;
0583
0584 corner_points[0].red.y = rgb_resulted[0].red;
0585 corner_points[0].green.y = rgb_resulted[0].green;
0586 corner_points[0].blue.y = rgb_resulted[0].blue;
0587
0588
0589
0590
0591 corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
0592 corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
0593 corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
0594 corner_points[1].red.slope = dc_fixpt_zero;
0595 corner_points[1].green.slope = dc_fixpt_zero;
0596 corner_points[1].blue.slope = dc_fixpt_zero;
0597
0598 if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
0599
0600
0601
0602 const struct fixed31_32 end_value =
0603 dc_fixpt_from_int(125);
0604
0605 corner_points[1].red.slope = dc_fixpt_div(
0606 dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
0607 dc_fixpt_sub(end_value, corner_points[1].red.x));
0608 corner_points[1].green.slope = dc_fixpt_div(
0609 dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
0610 dc_fixpt_sub(end_value, corner_points[1].green.x));
0611 corner_points[1].blue.slope = dc_fixpt_div(
0612 dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
0613 dc_fixpt_sub(end_value, corner_points[1].blue.x));
0614 }
0615
0616 lut_params->hw_points_num = hw_points;
0617
0618 k = 0;
0619 for (i = 1; i < MAX_REGIONS_NUMBER; i++) {
0620 if (seg_distr[k] != -1) {
0621 lut_params->arr_curve_points[k].segments_num =
0622 seg_distr[k];
0623 lut_params->arr_curve_points[i].offset =
0624 lut_params->arr_curve_points[k].offset + (1 << seg_distr[k]);
0625 }
0626 k++;
0627 }
0628
0629 if (seg_distr[k] != -1)
0630 lut_params->arr_curve_points[k].segments_num = seg_distr[k];
0631
0632 rgb = rgb_resulted;
0633 rgb_plus_1 = rgb_resulted + 1;
0634
0635 i = 1;
0636 while (i != hw_points + 1) {
0637 rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
0638 rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
0639 rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
0640
0641 ++rgb_plus_1;
0642 ++rgb;
0643 ++i;
0644 }
0645 cm_helper_convert_to_custom_float(rgb_resulted,
0646 lut_params->corner_points,
0647 hw_points, false);
0648
0649 return true;
0650 }