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