1ec7e6bb8SLeo (Sunpeng) Li /*
2ec7e6bb8SLeo (Sunpeng) Li  * Copyright 2016 Advanced Micro Devices, Inc.
3ec7e6bb8SLeo (Sunpeng) Li  *
4ec7e6bb8SLeo (Sunpeng) Li  * Permission is hereby granted, free of charge, to any person obtaining a
5ec7e6bb8SLeo (Sunpeng) Li  * copy of this software and associated documentation files (the "Software"),
6ec7e6bb8SLeo (Sunpeng) Li  * to deal in the Software without restriction, including without limitation
7ec7e6bb8SLeo (Sunpeng) Li  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8ec7e6bb8SLeo (Sunpeng) Li  * and/or sell copies of the Software, and to permit persons to whom the
9ec7e6bb8SLeo (Sunpeng) Li  * Software is furnished to do so, subject to the following conditions:
10ec7e6bb8SLeo (Sunpeng) Li  *
11ec7e6bb8SLeo (Sunpeng) Li  * The above copyright notice and this permission notice shall be included in
12ec7e6bb8SLeo (Sunpeng) Li  * all copies or substantial portions of the Software.
13ec7e6bb8SLeo (Sunpeng) Li  *
14ec7e6bb8SLeo (Sunpeng) Li  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ec7e6bb8SLeo (Sunpeng) Li  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ec7e6bb8SLeo (Sunpeng) Li  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17ec7e6bb8SLeo (Sunpeng) Li  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18ec7e6bb8SLeo (Sunpeng) Li  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ec7e6bb8SLeo (Sunpeng) Li  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20ec7e6bb8SLeo (Sunpeng) Li  * OTHER DEALINGS IN THE SOFTWARE.
21ec7e6bb8SLeo (Sunpeng) Li  *
22ec7e6bb8SLeo (Sunpeng) Li  * Authors: AMD
23ec7e6bb8SLeo (Sunpeng) Li  *
24ec7e6bb8SLeo (Sunpeng) Li  */
25ec7e6bb8SLeo (Sunpeng) Li 
26ec7e6bb8SLeo (Sunpeng) Li #ifndef COLOR_MOD_COLOR_GAMMA_H_
27ec7e6bb8SLeo (Sunpeng) Li #define COLOR_MOD_COLOR_GAMMA_H_
28ec7e6bb8SLeo (Sunpeng) Li 
298ae5b155SLewis Huang #include "color_table.h"
308ae5b155SLewis Huang 
31ec7e6bb8SLeo (Sunpeng) Li struct dc_transfer_func;
32ec7e6bb8SLeo (Sunpeng) Li struct dc_gamma;
33ec7e6bb8SLeo (Sunpeng) Li struct dc_transfer_func_distributed_points;
34ec7e6bb8SLeo (Sunpeng) Li struct dc_rgb_fixed;
35a8bf7164SKrunoslav Kovac struct dc_color_caps;
36ec7e6bb8SLeo (Sunpeng) Li enum dc_transfer_func_predefined;
37ec7e6bb8SLeo (Sunpeng) Li 
3855a01d40SKrunoslav Kovac /* For SetRegamma ADL interface support
3955a01d40SKrunoslav Kovac  * Must match escape type
4055a01d40SKrunoslav Kovac  */
4155a01d40SKrunoslav Kovac union regamma_flags {
4255a01d40SKrunoslav Kovac 	unsigned int raw;
4355a01d40SKrunoslav Kovac 	struct {
4455a01d40SKrunoslav Kovac 		unsigned int gammaRampArray       :1;    // RegammaRamp is in use
4555a01d40SKrunoslav Kovac 		unsigned int gammaFromEdid        :1;    //gamma from edid is in use
4655a01d40SKrunoslav Kovac 		unsigned int gammaFromEdidEx      :1;    //gamma from edid is in use , but only for Display Id 1.2
4755a01d40SKrunoslav Kovac 		unsigned int gammaFromUser        :1;    //user custom gamma is used
4855a01d40SKrunoslav Kovac 		unsigned int coeffFromUser        :1;    //coeff. A0-A3 from user is in use
4955a01d40SKrunoslav Kovac 		unsigned int coeffFromEdid        :1;    //coeff. A0-A3 from edid is in use
5055a01d40SKrunoslav Kovac 		unsigned int applyDegamma         :1;    //flag for additional degamma correction in driver
5155a01d40SKrunoslav Kovac 		unsigned int gammaPredefinedSRGB  :1;    //flag for SRGB gamma
5255a01d40SKrunoslav Kovac 		unsigned int gammaPredefinedPQ    :1;    //flag for PQ gamma
5355a01d40SKrunoslav Kovac 		unsigned int gammaPredefinedPQ2084Interim :1;    //flag for PQ gamma, lower max nits
5455a01d40SKrunoslav Kovac 		unsigned int gammaPredefined36    :1;    //flag for 3.6 gamma
5555a01d40SKrunoslav Kovac 		unsigned int gammaPredefinedReset :1;    //flag to return to previous gamma
5655a01d40SKrunoslav Kovac 	} bits;
5755a01d40SKrunoslav Kovac };
5855a01d40SKrunoslav Kovac 
5955a01d40SKrunoslav Kovac struct regamma_ramp {
6055a01d40SKrunoslav Kovac 	unsigned short gamma[256*3];  // gamma ramp packed  in same way as OS windows ,r , g & b
6155a01d40SKrunoslav Kovac };
6255a01d40SKrunoslav Kovac 
6355a01d40SKrunoslav Kovac struct regamma_coeff {
6455a01d40SKrunoslav Kovac 	int    gamma[3];
6555a01d40SKrunoslav Kovac 	int    A0[3];
6655a01d40SKrunoslav Kovac 	int    A1[3];
6755a01d40SKrunoslav Kovac 	int    A2[3];
6855a01d40SKrunoslav Kovac 	int    A3[3];
6955a01d40SKrunoslav Kovac };
7055a01d40SKrunoslav Kovac 
7155a01d40SKrunoslav Kovac struct regamma_lut {
7255a01d40SKrunoslav Kovac 	union regamma_flags flags;
7355a01d40SKrunoslav Kovac 	union {
7455a01d40SKrunoslav Kovac 		struct regamma_ramp ramp;
7555a01d40SKrunoslav Kovac 		struct regamma_coeff coeff;
7655a01d40SKrunoslav Kovac 	};
7755a01d40SKrunoslav Kovac };
7855a01d40SKrunoslav Kovac 
79*6b91a404SKrunoslav Kovac struct hdr_tm_params {
80e1e8a020SSivapiriyanKumarasamy 	unsigned int sdr_white_level;
81e1e8a020SSivapiriyanKumarasamy 	unsigned int min_content; // luminance in 1/10000 nits
82e1e8a020SSivapiriyanKumarasamy 	unsigned int max_content; // luminance in nits
83e1e8a020SSivapiriyanKumarasamy 	unsigned int min_display; // luminance in 1/10000 nits
84e1e8a020SSivapiriyanKumarasamy 	unsigned int max_display; // luminance in nits
85f62b09b1SVitaly Prosyak 	unsigned int skip_tm; // skip tm
86e1e8a020SSivapiriyanKumarasamy };
87e1e8a020SSivapiriyanKumarasamy 
888ae5b155SLewis Huang struct calculate_buffer {
898ae5b155SLewis Huang 	int buffer_index;
908ae5b155SLewis Huang 	struct fixed31_32 buffer[NUM_PTS_IN_REGION];
918ae5b155SLewis Huang 	struct fixed31_32 gamma_of_2;
928ae5b155SLewis Huang };
938ae5b155SLewis Huang 
94e752058bSKrunoslav Kovac struct translate_from_linear_space_args {
95e752058bSKrunoslav Kovac 	struct fixed31_32 arg;
96e752058bSKrunoslav Kovac 	struct fixed31_32 a0;
97e752058bSKrunoslav Kovac 	struct fixed31_32 a1;
98e752058bSKrunoslav Kovac 	struct fixed31_32 a2;
99e752058bSKrunoslav Kovac 	struct fixed31_32 a3;
100e752058bSKrunoslav Kovac 	struct fixed31_32 gamma;
1018ae5b155SLewis Huang 	struct calculate_buffer *cal_buffer;
102e752058bSKrunoslav Kovac };
103e752058bSKrunoslav Kovac 
104ec7e6bb8SLeo (Sunpeng) Li void setup_x_points_distribution(void);
105bbdd620dSWyatt Wood void log_x_points_distribution(struct dal_logger *logger);
106ec7e6bb8SLeo (Sunpeng) Li void precompute_pq(void);
107792474b7SVitaly Prosyak void precompute_de_pq(void);
108ec7e6bb8SLeo (Sunpeng) Li 
109ec7e6bb8SLeo (Sunpeng) Li bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
110e1e8a020SSivapiriyanKumarasamy 		const struct dc_gamma *ramp, bool mapUserRamp, bool canRomBeUsed,
111*6b91a404SKrunoslav Kovac 		const struct hdr_tm_params *fs_params,
1128ae5b155SLewis Huang 		struct calculate_buffer *cal_buffer);
113ec7e6bb8SLeo (Sunpeng) Li 
114a8bf7164SKrunoslav Kovac bool mod_color_calculate_degamma_params(struct dc_color_caps *dc_caps,
115a8bf7164SKrunoslav Kovac 		struct dc_transfer_func *output_tf,
116792474b7SVitaly Prosyak 		const struct dc_gamma *ramp, bool mapUserRamp);
117792474b7SVitaly Prosyak 
11855a01d40SKrunoslav Kovac bool calculate_user_regamma_coeff(struct dc_transfer_func *output_tf,
1198ae5b155SLewis Huang 		const struct regamma_lut *regamma,
1205d1b3211SDerek Lai 		struct calculate_buffer *cal_buffer,
1215d1b3211SDerek Lai 		const struct dc_gamma *ramp);
12255a01d40SKrunoslav Kovac 
12355a01d40SKrunoslav Kovac bool calculate_user_regamma_ramp(struct dc_transfer_func *output_tf,
1248ae5b155SLewis Huang 		const struct regamma_lut *regamma,
1255d1b3211SDerek Lai 		struct calculate_buffer *cal_buffer,
1265d1b3211SDerek Lai 		const struct dc_gamma *ramp);
127792474b7SVitaly Prosyak 
128ec7e6bb8SLeo (Sunpeng) Li 
129ec7e6bb8SLeo (Sunpeng) Li #endif /* COLOR_MOD_COLOR_GAMMA_H_ */
130