1 /*
2 * Copyright (c) 2019, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 
23 #include "ColorE.h"
24 
ColorE(CURBE_INPUT_OUTPUT,GLOBAL_BUFFER_INPUT_OUTPUT)25 _GENX_MAIN_ _CM_CALLABLE_ void ColorE(
26     CURBE_INPUT_OUTPUT,
27     GLOBAL_BUFFER_INPUT_OUTPUT)
28 {
29     /*
30     Buffer layout after shuffle
31     _________________________________________________
32     |_______Block0__________|_______Block1__________|
33     |_______Block2__________|_______Block3__________|
34     |_______Block4__________|_______Block5__________|
35     |_______Block6__________|_______Block7__________|
36 
37     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
38     _______________________________________________
39     |____R0_________R1_____|____R2_________R3_____|
40     |____G0_________G1_____|____G2_________G3_____|
41     |____B0_________B1_____|____B2_________B3_____|
42     |____A0_________A1_____|____A2_________A3_____|
43     |____R4_________R5_____|____R6_________R7_____|
44     |____G4_________G5_____|____G6_________G7_____|
45     |____B4_________B5_____|____B6_________B7_____|
46     |____A4_________A5_____|____A6_________A7_____|
47     */
48     uint desc_y = nCOLOR_ENHENCEMENT_DSC + MDF_FC_COLORE_LUT_BTI + (MDF_FC_COLORE_nSI_LINEAR << 8);
49     matrix_ref<ushort, 16, 16> WriteBackBuffer = DataBuffer.select<4, 1, 64, 1>(Buffer_Index << 2, 0).format<ushort, 16, 16>();
50 
51     matrix_ref<uint, 7, 8> msg1 = DataBuffer.format<uint, 96, 8>().select<7, 1, 8, 1>(64, 0);
52     matrix_ref<uint, 7, 8> msg2 = DataBuffer.format<uint, 96, 8>().select<7, 1, 8, 1>(71, 0);
53     matrix_ref<uint, 7, 8> msg3 = DataBuffer.format<uint, 96, 8>().select<7, 1, 8, 1>(78, 0);
54     matrix_ref<uint, 7, 8> msg4 = DataBuffer.format<uint, 96, 8>().select<7, 1, 8, 1>(85, 0);
55 
56     msg1.select<1, 1, 8, 1>(0, 0) = cm_get_r0<uint>();
57     msg2.select<1, 1, 8, 1>(0, 0) = cm_get_r0<uint>();
58     msg3.select<1, 1, 8, 1>(0, 0) = cm_get_r0<uint>();
59     msg4.select<1, 1, 8, 1>(0, 0) = cm_get_r0<uint>();
60 
61     msg1.select<1, 1, 1, 1>(0, 2) = nSAMPLER_BGR_CHANNELS;
62     msg2.select<1, 1, 1, 1>(0, 2) = nSAMPLER_BGR_CHANNELS;
63     msg3.select<1, 1, 1, 1>(0, 2) = nSAMPLER_BGR_CHANNELS;
64     msg4.select<1, 1, 1, 1>(0, 2) = nSAMPLER_BGR_CHANNELS;
65 
66     matrix_ref<float, 6, 8> Coordinates1 = msg1.format<float, 7, 8>().select<6, 1, 8, 1>(1, 0);
67 
68     matrix_ref<float, 1, 16> CoordinateB1 = Coordinates1.format<float, 3, 16>().select<1, 1, 16, 1>(0, 0);
69     matrix_ref<float, 1, 16> CoordinateG1 = Coordinates1.format<float, 3, 16>().select<1, 1, 16, 1>(1, 0);
70     matrix_ref<float, 1, 16> CoordinateR1 = Coordinates1.format<float, 3, 16>().select<1, 1, 16, 1>(2, 0);
71 
72     matrix_ref<float, 6, 8> Coordinates2 = msg2.format<float, 7, 8>().select<6, 1, 8, 1>(1, 0);
73 
74     matrix_ref<float, 1, 16> CoordinateB2 = Coordinates2.format<float, 3, 16>().select<1, 1, 16, 1>(0, 0);
75     matrix_ref<float, 1, 16> CoordinateG2 = Coordinates2.format<float, 3, 16>().select<1, 1, 16, 1>(1, 0);
76     matrix_ref<float, 1, 16> CoordinateR2 = Coordinates2.format<float, 3, 16>().select<1, 1, 16, 1>(2, 0);
77 
78     matrix_ref<float, 6, 8> Coordinates3 = msg3.format<float, 7, 8>().select<6, 1, 8, 1>(1, 0);
79 
80     matrix_ref<float, 1, 16> CoordinateB3 = Coordinates3.format<float, 3, 16>().select<1, 1, 16, 1>(0, 0);
81     matrix_ref<float, 1, 16> CoordinateG3 = Coordinates3.format<float, 3, 16>().select<1, 1, 16, 1>(1, 0);
82     matrix_ref<float, 1, 16> CoordinateR3 = Coordinates3.format<float, 3, 16>().select<1, 1, 16, 1>(2, 0);
83 
84     matrix_ref<float, 6, 8> Coordinates4 = msg4.format<float, 7, 8>().select<6, 1, 8, 1>(1, 0);
85 
86     matrix_ref<float, 1, 16> CoordinateB4 = Coordinates4.format<float, 3, 16>().select<1, 1, 16, 1>(0, 0);
87     matrix_ref<float, 1, 16> CoordinateG4 = Coordinates4.format<float, 3, 16>().select<1, 1, 16, 1>(1, 0);
88     matrix_ref<float, 1, 16> CoordinateR4 = Coordinates4.format<float, 3, 16>().select<1, 1, 16, 1>(2, 0);
89 
90     CoordinateR1 = WriteBackBuffer.select<1, 1, 16, 1>(0, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
91     CoordinateG1 = WriteBackBuffer.select<1, 1, 16, 1>(2, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
92     CoordinateB1 = WriteBackBuffer.select<1, 1, 16, 1>(4, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
93 
94     cm_send(Coordinates1,
95         msg1,
96         nSMPL_ENGINE,
97         desc_y,
98         0);
99 
100     WriteBackBuffer.select<1, 1, 16, 1>(0, 0) = matrix<ushort, 1, 16>(CoordinateB1 * 65280.0f, SAT);
101     WriteBackBuffer.select<1, 1, 16, 1>(2, 0) = matrix<ushort, 1, 16>(CoordinateG1 * 65280.0f, SAT);
102     WriteBackBuffer.select<1, 1, 16, 1>(4, 0) = matrix<ushort, 1, 16>(CoordinateR1 * 65280.0f, SAT);
103 
104     CoordinateR2 = WriteBackBuffer.select<1, 1, 16, 1>(1, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
105     CoordinateG2 = WriteBackBuffer.select<1, 1, 16, 1>(3, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
106     CoordinateB2 = WriteBackBuffer.select<1, 1, 16, 1>(5, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
107 
108     cm_send(Coordinates2,
109         msg2,
110         nSMPL_ENGINE,
111         desc_y,
112         0);
113 
114     WriteBackBuffer.select<1, 1, 16, 1>(1, 0) = matrix<ushort, 1, 16>(CoordinateB2 * 65280.0f, SAT);
115     WriteBackBuffer.select<1, 1, 16, 1>(3, 0) = matrix<ushort, 1, 16>(CoordinateG2 * 65280.0f, SAT);
116     WriteBackBuffer.select<1, 1, 16, 1>(5, 0) = matrix<ushort, 1, 16>(CoordinateR2 * 65280.0f, SAT);
117 
118     CoordinateR3 = WriteBackBuffer.select<1, 1, 16, 1>(8, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
119     CoordinateG3 = WriteBackBuffer.select<1, 1, 16, 1>(10, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
120     CoordinateB3 = WriteBackBuffer.select<1, 1, 16, 1>(12, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
121 
122     cm_send(Coordinates3,
123         msg3,
124         nSMPL_ENGINE,
125         desc_y,
126         0);
127 
128     WriteBackBuffer.select<1, 1, 16, 1>(8, 0) = matrix<ushort, 1, 16>(CoordinateB3 * 65280.0f, SAT);
129     WriteBackBuffer.select<1, 1, 16, 1>(10, 0) = matrix<ushort, 1, 16>(CoordinateG3 * 65280.0f, SAT);
130     WriteBackBuffer.select<1, 1, 16, 1>(12, 0) = matrix<ushort, 1, 16>(CoordinateR3 * 65280.0f, SAT);
131 
132     CoordinateR4 = WriteBackBuffer.select<1, 1, 16, 1>(9, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
133     CoordinateG4 = WriteBackBuffer.select<1, 1, 16, 1>(11, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
134     CoordinateB4 = WriteBackBuffer.select<1, 1, 16, 1>(13, 0) * 0.000015318627450980392156862745098039f + 0.0126582278481013f;
135 
136     cm_send(Coordinates4,
137         msg4,
138         nSMPL_ENGINE,
139         desc_y,
140         0);
141 
142     WriteBackBuffer.select<1, 1, 16, 1>(9, 0) = matrix<ushort, 1, 16>(CoordinateB4 * 65280.0f, SAT);
143     WriteBackBuffer.select<1, 1, 16, 1>(11, 0) = matrix<ushort, 1, 16>(CoordinateG4 * 65280.0f, SAT);
144     WriteBackBuffer.select<1, 1, 16, 1>(13, 0) = matrix<ushort, 1, 16>(CoordinateR4 * 65280.0f, SAT);
145 }
146