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