drm/amd/display: Don't use optimized gamma22 with eetf
authorAidan Yang <Aidan.Yang@amd.com>
Wed, 25 Sep 2019 20:57:37 +0000 (16:57 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 25 Oct 2019 20:50:07 +0000 (16:50 -0400)
[why]
Optimized gamma22 assumes fixed point distribution which is not true
for eetf true.

[how]
Use long calculation for eetf.

Signed-off-by: Aidan Yang <Aidan.Yang@amd.com>
Reviewed-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
Acked-by: Reza Amini <Reza.Amini@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/modules/color/color_gamma.c

index 2d8f14b69117474d472bca5dcc4f03de8c3e25a9..85dad356c9d5636c6b1b404eff8df741e970a0ab 100644 (file)
@@ -373,7 +373,42 @@ static struct fixed31_32 translate_from_linear_space(
                return dc_fixpt_mul(args->arg, args->a1);
 }
 
-static struct fixed31_32 calculate_gamma22(struct fixed31_32 arg)
+
+static struct fixed31_32 translate_from_linear_space_long(
+               struct translate_from_linear_space_args *args)
+{
+       const struct fixed31_32 one = dc_fixpt_from_int(1);
+
+       if (dc_fixpt_lt(one, args->arg))
+               return one;
+
+       if (dc_fixpt_le(args->arg, dc_fixpt_neg(args->a0)))
+               return dc_fixpt_sub(
+                       args->a2,
+                       dc_fixpt_mul(
+                               dc_fixpt_add(
+                                       one,
+                                       args->a3),
+                               dc_fixpt_pow(
+                                       dc_fixpt_neg(args->arg),
+                                       dc_fixpt_recip(args->gamma))));
+       else if (dc_fixpt_le(args->a0, args->arg))
+               return dc_fixpt_sub(
+                       dc_fixpt_mul(
+                               dc_fixpt_add(
+                                       one,
+                                       args->a3),
+                               dc_fixpt_pow(
+                                               args->arg,
+                                       dc_fixpt_recip(args->gamma))),
+                                       args->a2);
+       else
+               return dc_fixpt_mul(
+                       args->arg,
+                       args->a1);
+}
+
+static struct fixed31_32 calculate_gamma22(struct fixed31_32 arg, bool use_eetf)
 {
        struct fixed31_32 gamma = dc_fixpt_from_fraction(22, 10);
 
@@ -384,9 +419,13 @@ static struct fixed31_32 calculate_gamma22(struct fixed31_32 arg)
        scratch_gamma_args.a3 = dc_fixpt_zero;
        scratch_gamma_args.gamma = gamma;
 
+       if (use_eetf)
+               return translate_from_linear_space_long(&scratch_gamma_args);
+
        return translate_from_linear_space(&scratch_gamma_args);
 }
 
+
 static struct fixed31_32 translate_to_linear_space(
        struct fixed31_32 arg,
        struct fixed31_32 a0,
@@ -950,7 +989,7 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
                                if (dc_fixpt_lt(scaledX, dc_fixpt_zero))
                                        output = dc_fixpt_zero;
                                else
-                                       output = calculate_gamma22(scaledX);
+                                       output = calculate_gamma22(scaledX, use_eetf);
 
                                rgb->r = output;
                                rgb->g = output;
@@ -2173,5 +2212,3 @@ bool  mod_color_calculate_degamma_curve(enum dc_transfer_func_predefined trans,
 rgb_degamma_alloc_fail:
        return ret;
 }
-
-