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, ¶ms->lut_3d);
111 params->state.bits.initialized = 1;
112
113 vpe_free(rgb_area);
114 ret = true;
115 release:
116 return ret;
117 }
118