xref: /aosp_15_r20/external/mesa3d/src/amd/vpelib/src/core/3dlut_builder.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /* Copyright 2022 Advanced Micro Devices, Inc.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a
4  * copy of this software and associated documentation files (the "Software"),
5  * to deal in the Software without restriction, including without limitation
6  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7  * and/or sell copies of the Software, and to permit persons to whom the
8  * Software is furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
16  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
17  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19  * OTHER DEALINGS IN THE SOFTWARE.
20  *
21  * Authors: AMD
22  *
23  */
24 
25 #include "3dlut_builder.h"
26 
convert_3dlut_to_tetrahedral_params(struct vpe_rgb * rgb,bool is_17x17x17,bool is_12_bits,struct tetrahedral_params * params)27 static void convert_3dlut_to_tetrahedral_params(
28     struct vpe_rgb *rgb, bool is_17x17x17, bool is_12_bits, struct tetrahedral_params *params)
29 {
30     struct vpe_rgb *lut0;
31     struct vpe_rgb *lut1;
32     struct vpe_rgb *lut2;
33     struct vpe_rgb *lut3;
34     int             i, lut_i;
35 
36     int num_values;
37 
38     if (is_17x17x17 == false) {
39         lut0       = params->tetrahedral_9.lut0;
40         lut1       = params->tetrahedral_9.lut1;
41         lut2       = params->tetrahedral_9.lut2;
42         lut3       = params->tetrahedral_9.lut3;
43         num_values = LUT3D_SIZE_9x9x9;
44     } else {
45         lut0       = params->tetrahedral_17.lut0;
46         lut1       = params->tetrahedral_17.lut1;
47         lut2       = params->tetrahedral_17.lut2;
48         lut3       = params->tetrahedral_17.lut3;
49         num_values = LUT3D_SIZE_17x17x17;
50     }
51 
52     for (lut_i = 0, i = 0; i < num_values - 4; lut_i++, i += 4) {
53         lut0[lut_i].red   = rgb[i].red;
54         lut0[lut_i].green = rgb[i].green;
55         lut0[lut_i].blue  = rgb[i].blue;
56 
57         lut1[lut_i].red   = rgb[i + 1].red;
58         lut1[lut_i].green = rgb[i + 1].green;
59         lut1[lut_i].blue  = rgb[i + 1].blue;
60 
61         lut2[lut_i].red   = rgb[i + 2].red;
62         lut2[lut_i].green = rgb[i + 2].green;
63         lut2[lut_i].blue  = rgb[i + 2].blue;
64 
65         lut3[lut_i].red   = rgb[i + 3].red;
66         lut3[lut_i].green = rgb[i + 3].green;
67         lut3[lut_i].blue  = rgb[i + 3].blue;
68     }
69     lut0[lut_i].red   = rgb[i].red;
70     lut0[lut_i].green = rgb[i].green;
71     lut0[lut_i].blue  = rgb[i].blue;
72 
73     params->use_12bits        = is_12_bits;
74     params->use_tetrahedral_9 = !is_17x17x17;
75 }
76 
vpe_convert_to_tetrahedral(struct vpe_priv * vpe_priv,uint16_t rgb_lib[17* 17* 17* 3],struct vpe_3dlut * params,bool enable_3dlut)77 bool vpe_convert_to_tetrahedral(struct vpe_priv *vpe_priv, uint16_t rgb_lib[17 * 17 * 17 * 3],
78     struct vpe_3dlut *params, bool enable_3dlut)
79 {
80 
81     if (!enable_3dlut) {
82         params->state.bits.initialized = 0;
83         return true;
84     }
85 
86     bool            ret      = false;
87     struct vpe_rgb *rgb_area = NULL;
88     int             ind      = 0;
89     int             ind_lut  = 0;
90     int             nir, nig, nib;
91 
92     rgb_area = (struct vpe_rgb *)vpe_zalloc(sizeof(struct vpe_rgb) * 17 * 17 * 17);
93     if (rgb_area == NULL)
94         goto release;
95 
96     memset(rgb_area, 0, 17 * 17 * 17 * sizeof(struct vpe_rgb));
97 
98     for (nib = 0; nib < 17; nib++) {
99         for (nig = 0; nig < 17; nig++) {
100             for (nir = 0; nir < 17; nir++) {
101                 ind_lut = 3 * (nib + 17 * nig + 289 * nir);
102 
103                 rgb_area[ind].red   = rgb_lib[ind_lut + 0];
104                 rgb_area[ind].green = rgb_lib[ind_lut + 1];
105                 rgb_area[ind].blue  = rgb_lib[ind_lut + 2];
106                 ind++;
107             }
108         }
109     }
110     convert_3dlut_to_tetrahedral_params(rgb_area, true, true, &params->lut_3d);
111     params->state.bits.initialized = 1;
112 
113     vpe_free(rgb_area);
114     ret = true;
115 release:
116     return ret;
117 }
118